/* --- Object ctors/dtors */ static rpmmg rpmmg_init(JSContext *cx, JSObject *obj, const char * _magicfile, int _flags) { rpmmg mg = rpmmgNew(_magicfile, _flags); /* XXX error msg */ if (!JS_SetPrivate(cx, obj, (void *)mg)) { /* XXX error msg */ if (mg) mg = rpmmgFree(mg); } if (_debug) fprintf(stderr, "<== %s(%p,%p,\"%s\",0x%x) mg %p\n", __FUNCTION__, cx, obj, _magicfile, _flags, mg); return mg; }
/*@observer@*/ static const char *doUntar(Spec spec, rpmuint32_t c, int quietly) /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /*@modifies rpmGlobalMacroContext, fileSystem, internalState @*/ { const char *fn, *Lurlfn; static char buf[BUFSIZ]; char taropts[8]; char *t = NULL; struct Source *sp; rpmCompressedMagic compressed = COMPRESSED_NOT; int urltype; const char *tar; int rubygem = 0; for (sp = spec->sources; sp != NULL; sp = sp->next) { if ((sp->flags & RPMFILE_SOURCE) && (sp->num == c)) { break; } } if (sp == NULL) { rpmlog(RPMLOG_ERR, _("No source number %d\n"), c); return NULL; } t = strrchr(sp->source, '.'); if(t && !strcasecmp(t, ".gem")) rubygem = 1; t = stpcpy(taropts, "-x"); /*@-internalglobs@*/ /* FIX: shrug */ if(rpmIsVerbose() && !quietly) t = stpcpy(t, "vv"); if(rubygem) t = stpcpy(t, "m"); t = stpcpy(t, "f"); /*@=internalglobs@*/ #if defined(RPM_VENDOR_OPENPKG) /* splitted-source-directory */ Lurlfn = rpmGenPath(NULL, getSourceDir(sp->flags, sp->source), sp->source); #else Lurlfn = rpmGenPath(NULL, getSourceDir(sp->flags), sp->source); #endif /* XXX On non-build parse's, file cannot be stat'd or read */ if (!spec->force && (isCompressed(Lurlfn, &compressed) || checkOwners(Lurlfn))) { Lurlfn = _free(Lurlfn); return NULL; } fn = NULL; urltype = urlPath(Lurlfn, &fn); switch (urltype) { case URL_IS_HTTPS: /* XXX WRONG WRONG WRONG */ case URL_IS_HTTP: /* XXX WRONG WRONG WRONG */ case URL_IS_FTP: /* XXX WRONG WRONG WRONG */ case URL_IS_HKP: /* XXX WRONG WRONG WRONG */ case URL_IS_MONGO: /* XXX FIXME */ case URL_IS_PATH: case URL_IS_UNKNOWN: break; case URL_IS_DASH: Lurlfn = _free(Lurlfn); return NULL; /*@notreached@*/ break; } #ifdef NOTYET { rpmmg mg; _rpmmg_debug = 1; mg = rpmmgNew(NULL, 0); t = (char *) rpmmgFile(mg, fn); mg = rpmmgFree(mg); fprintf(stderr, "==> %s: %s\n", fn, t); t = _free(t); _rpmmg_debug = 0; } #endif tar = rpmGetPath("%{?__tar}", NULL); if (!(tar && *tar != '\0')) { tar = _free(tar); tar = xstrdup("tar"); } #if defined(RPM_VENDOR_ARK) /* use-gnu-tar-compression-detection */ /* We leave compression handling for all tar based files up to GNU tar */ if (compressed == COMPRESSED_ZIP) #else if (compressed != COMPRESSED_NOT) #endif { const char *zipper; int needtar = 1; switch (compressed) { case COMPRESSED_NOT: /* XXX can't happen */ case COMPRESSED_OTHER: t = "%{__gzip} -dc"; break; case COMPRESSED_BZIP2: t = "%{__bzip2} -dc"; break; case COMPRESSED_LZOP: t = "%{__lzop} -dc"; break; case COMPRESSED_LZMA: t = "%{__lzma} -dc"; break; case COMPRESSED_XZ: t = "%{__xz} -dc"; break; case COMPRESSED_LZIP: t = "%{__lzip} -dc"; break; case COMPRESSED_LRZIP: t = "%{__lrzip} -dqo-"; break; case COMPRESSED_7ZIP: t = "%{__7zip} x"; needtar = 0; break; case COMPRESSED_ZIP: #if defined(RPM_VENDOR_OPENPKG) /* use-bsdtar-for-zip-files */ t = "%{__bsdtar} -x -f"; #else if (rpmIsVerbose() && !quietly) t = "%{__unzip}"; else t = "%{__unzip} -qq"; #endif needtar = 0; break; } zipper = rpmGetPath(t, NULL); buf[0] = '\0'; t = stpcpy(buf, zipper); zipper = _free(zipper); *t++ = ' '; *t++ = '\''; t = stpcpy(t, fn); *t++ = '\''; if (needtar) { t = stpcpy(t, " | "); t = stpcpy(t, tar); t = stpcpy(t, " "); t = stpcpy(t, taropts); t = stpcpy(t, " -"); } t = stpcpy(t, "\n" "STATUS=$?\n" "if [ $STATUS -ne 0 ]; then\n" " exit $STATUS\n" "fi"); } else { buf[0] = '\0'; t = stpcpy(buf, tar); t = stpcpy(t, " "); t = stpcpy(t, taropts); *t++ = ' '; t = stpcpy(t, fn); if(rubygem) { t = stpcpy(t, "\n" "if [ -f data.tar.gz ]; then\n" " tar "); t = stpcpy(t, taropts); t = stpcpy(t, " data.tar.gz\n" "fi"); } } tar = _free(tar); Lurlfn = _free(Lurlfn); return buf; }