/*@observer@*/ static char *doPatch(Spec spec, rpmuint32_t c, int strip, const char *db, int reverse, int removeEmpties, int fuzz, const char *subdir) /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /*@modifies rpmGlobalMacroContext, fileSystem, internalState @*/ { const char *fn, *Lurlfn; static char buf[BUFSIZ]; char args[BUFSIZ], *t = args; struct Source *sp; rpmCompressedMagic compressed = COMPRESSED_NOT; int urltype; const char *patch, *flags; *t = '\0'; if (db) t = stpcpy( stpcpy(t, "-b --suffix "), db); #if defined(RPM_VENDOR_OPENPKG) /* always-backup-on-patching */ /* always create backup files in OpenPKG */ else t = stpcpy(t, "-b --suffix .orig "); #endif if (subdir) t = stpcpy( stpcpy(t, "-d "), subdir); if (fuzz >= 0) { t = stpcpy(t, "-F "); sprintf(t, "%10.10d", fuzz); t += strlen(t); } if (reverse) t = stpcpy(t, " -R"); if (removeEmpties) t = stpcpy(t, " -E"); for (sp = spec->sources; sp != NULL; sp = sp->next) { if ((sp->flags & RPMFILE_PATCH) && (sp->num == c)) break; } if (sp == NULL) { rpmlog(RPMLOG_ERR, _("No patch number %d\n"), c); return NULL; } Lurlfn = rpmGenPath(NULL, "%{_patchdir}/", sp->source); /* 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; } patch = rpmGetPath("%{?__patch}", NULL); if (!(patch && *patch != '\0')) { patch = _free(patch); patch = xstrdup("patch"); } flags = rpmExpand("%{?_default_patch_flags}%{!?_default_patch_flags:-s}", NULL); if (compressed) { const char *zipper; switch (compressed) { default: case COMPRESSED_NOT: /* XXX can't happen */ case COMPRESSED_OTHER: case COMPRESSED_ZIP: /* XXX wrong */ zipper = "%{__gzip}"; break; case COMPRESSED_BZIP2: zipper = "%{__bzip2}"; break; case COMPRESSED_LZOP: zipper = "%{__lzop}"; break; case COMPRESSED_LZMA: zipper = "%{__lzma}"; break; case COMPRESSED_XZ: zipper = "%{__xz}"; break; } zipper = rpmGetPath(zipper, NULL); sprintf(buf, "echo \"Patch #%d (%s):\"\n" "%s -d < '%s' | %s -p%d %s %s\n" "STATUS=$?\n" "if [ $STATUS -ne 0 ]; then\n" " exit $STATUS\n" "fi", c, /*@-moduncon@*/ (const char *) basename((char *)fn), /*@=moduncon@*/ zipper, fn, patch, strip, args, flags); zipper = _free(zipper); } else { sprintf(buf, "echo \"Patch #%d (%s):\"\n" "%s -p%d %s %s < '%s'", c, /*@-moduncon@*/ (const char *) basename((char *)fn), /*@=moduncon@*/ patch, strip, args, flags, fn); } patch = _free(patch); flags = _free(flags); Lurlfn = _free(Lurlfn); return buf; }
static char *doPatch(rpmSpec spec, uint32_t c, int strip, const char *db, int reverse, int removeEmpties, int fuzz, const char *dir) { char *fn = NULL; char *buf = NULL; char *arg_backup = NULL; char *arg_fuzz = NULL; char *arg_dir = NULL; char *args = NULL; char *arg_patch_flags = rpmExpand("%{?_default_patch_flags}", NULL); struct Source *sp; char *patchcmd; for (sp = spec->sources; sp != NULL; sp = sp->next) { if ((sp->flags & RPMBUILD_ISPATCH) && (sp->num == c)) { break; } } if (sp == NULL) { if (c != INT_MAX) { rpmlog(RPMLOG_ERR, _("No patch number %u\n"), c); } else { rpmlog(RPMLOG_ERR, _("%%patch without corresponding \"Patch:\" tag\n")); } goto exit; } fn = rpmGetPath("%{_sourcedir}/", sp->source, NULL); /* On non-build parse's, file cannot be stat'd or read. */ if (spec->force || checkOwners(fn)) goto exit; if (db) { rasprintf(&arg_backup, #if HAVE_OLDPATCH_21 == 0 "-b " #endif "--suffix %s", db); } else arg_backup = xstrdup(""); if (dir) { rasprintf(&arg_dir, " -d %s", dir); } else arg_dir = xstrdup(""); if (fuzz >= 0) { rasprintf(&arg_fuzz, " --fuzz=%d", fuzz); } else arg_fuzz = xstrdup(""); rasprintf(&args, "%s -p%d %s%s%s%s%s", arg_patch_flags, strip, arg_backup, arg_fuzz, arg_dir, reverse ? " -R" : "", removeEmpties ? " -E" : ""); patchcmd = rpmExpand("%{uncompress: ", fn, "} | %{__patch} ", args, NULL); free(arg_patch_flags); free(arg_fuzz); free(arg_dir); free(arg_backup); free(args); if (c != INT_MAX) { rasprintf(&buf, "echo \"Patch #%u (%s):\"\n" "%s\n", c, basename(fn), patchcmd); } else { rasprintf(&buf, "echo \"Patch (%s):\"\n" "%s\n", basename(fn), patchcmd); } free(patchcmd); exit: free(fn); return buf; }
/*@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; }
/** * Expand %setup macro into %prep scriptlet. * @param spec build info * @param c source index * @param quietly should -vv be omitted from tar? * @return expanded %setup macro (NULL on error) */ static char *doUntar(rpmSpec spec, uint32_t c, int quietly) { char *fn; char *buf = NULL; char *tar, *taropts; struct Source *sp; rpmCompressedMagic compressed = COMPRESSED_NOT; for (sp = spec->sources; sp != NULL; sp = sp->next) { if ((sp->flags & RPMBUILD_ISSOURCE) && (sp->num == c)) { break; } } if (sp == NULL) { if (c) { rpmlog(RPMLOG_ERR, _("No source number %u\n"), c); } else { rpmlog(RPMLOG_ERR, _("No \"Source:\" tag in the spec file\n")); } return NULL; } fn = rpmGetPath("%{_sourcedir}/", sp->source, NULL); /* FIX: shrug */ taropts = ((rpmIsVerbose() && !quietly) ? "-xvvf" : "-xf"); #ifdef AUTOFETCH_NOT /* XXX don't expect this code to be enabled */ /* XXX * XXX If nosource file doesn't exist, try to fetch from url. * XXX TODO: add a "--fetch" enabler. */ if (sp->flags & RPMTAG_NOSOURCE && autofetchnosource) { struct stat st; int rc; if (lstat(fn, &st) != 0 && errno == ENOENT && urlIsUrl(sp->fullSource) != URL_IS_UNKNOWN) { if ((rc = urlGetFile(sp->fullSource, fn)) != 0) { rpmlog(RPMLOG_ERR, _("Couldn't download nosource %s: %s\n"), sp->fullSource); return NULL; } } } #endif /* XXX On non-build parse's, file cannot be stat'd or read */ if (!spec->force && (rpmFileIsCompressed(fn, &compressed) || checkOwners(fn))) { fn = _free(fn); return NULL; } tar = rpmGetPath("%{__tar}", NULL); if (compressed != COMPRESSED_NOT) { char *zipper, *t = NULL; 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_ZIP: if (rpmIsVerbose() && !quietly) t = "%{__unzip}"; else t = "%{__unzip} -qq"; needtar = 0; break; case COMPRESSED_LZMA: case COMPRESSED_XZ: t = "%{__xz} -dc"; break; } zipper = rpmGetPath(t, NULL); if (needtar) { rasprintf(&buf, "%s '%s' | %s %s - \n" "STATUS=$?\n" "if [ $STATUS -ne 0 ]; then\n" " exit $STATUS\n" "fi", zipper, fn, tar, taropts); } else { rasprintf(&buf, "%s '%s'\n" "STATUS=$?\n" "if [ $STATUS -ne 0 ]; then\n" " exit $STATUS\n" "fi", zipper, fn); } zipper = _free(zipper); } else { rasprintf(&buf, "%s %s %s", tar, taropts, fn); } fn = _free(fn); tar = _free(tar); return buf; }