--- rpm-4.3/build/rpmfc.c.orig Wed May 19 11:30:29 2004 +++ rpm-4.3/build/rpmfc.c Wed May 19 17:03:01 2004 @@ -1,6 +1,7 @@ #include "system.h" #include /* getOutputFrom() */ +#include #include #include @@ -9,6 +10,8 @@ #define _RPMDS_INTERNAL #include #include +#include +#include #if HAVE_GELF_H #include @@ -301,14 +304,83 @@ return buf; }; +static regex_t * rpmfcExpandRegexps(const char * str,int *count){ + int i,j,r; + const char *s; + ARGV_t patterns=NULL; + regex_t *compiled=NULL; + + s=rpmExpand(str,NULL); + if (s) { + poptParseArgvString(s,count,(const char ***)&patterns); + s = _free(s); + } + if (patterns==NULL){ + *count=0; + return NULL; + } + if (*count==0){ + _free(patterns); + return NULL; + } + + compiled=malloc(sizeof(regex_t)*(*count)); + j=0; + for(i=0;i<*count;i++){ + r=regcomp(&compiled[j],patterns[i],REG_NOSUB); + if (r==0) j++; + else { + rpmMessage(RPMMESS_NORMAL, + _("Compilation of regular expresion '%s'" + " (expanded from '%s') failed. Skipping it.\n"), + patterns[i],str); + } + } + patterns=_free(patterns); + if (j==0) { + compiled=_free(compiled); + *count=0; + return NULL; + } + *count=j; + return compiled; +} + +static int rpmfcMatchRegexps(regex_t *regexps, int count, const char *str, char deptype) +{ + int j; + for(j = 0; j < count; j++) { + rpmMessage(RPMMESS_DEBUG, + _("Checking %c: '%s' against _noauto expr. #%i\n"), deptype, str, j); + if (!regexec(®exps[j], str, 0, NULL, 0)) { + rpmMessage(RPMMESS_NORMAL, + _("Skipping %c: '%s' as it matches _noauto expr. #%i\n"), deptype, str, j); + return 1; + } + } + return 0; +} + +static regex_t * rpmfcFreeRegexps(regex_t *regexps,int count){ + int i; + + if (regexps) + for(i=0;itracked && deptype == 'P' && *EVR != '\0') { @@ -637,9 +711,16 @@ /** * Extract script dependencies. * @param fc file classifier + * @param findprov 1 to enable provides + * @param findreq 1 to enable requires + * @param noautoprov _noautoprov regexps + * @param noautoprov_c # of _noautoprov regexps + * @param noautoreq _noautoreq regexps + * @param noautoreq_c # of _noautoreq regexps * @return 0 on success */ -static int rpmfcSCRIPT(rpmfc fc) +static int rpmfcSCRIPT(rpmfc fc, int findprov, int findreq, + regex_t *noautoprov, int noautoprov_c, regex_t *noautoreq, int noautoreq_c) /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /*@modifies fc, rpmGlobalMacroContext, fileSystem, internalState @*/ { @@ -691,7 +772,7 @@ *se = '\0'; se++; - if (is_executable) { + if (is_executable && findreq && !rpmfcMatchRegexps(noautoreq, noautoreq_c, s, 'R')) { /* Add to package requires. */ ds = rpmdsSingle(RPMTAG_REQUIRENAME, s, "", RPMSENSE_FIND_REQUIRES); xx = rpmdsMerge(&fc->requires, ds); @@ -718,19 +799,22 @@ (void) fclose(fp); if (fc->fcolor->vals[fc->ix] & RPMFC_PERL) { - if (fc->fcolor->vals[fc->ix] & RPMFC_MODULE) - xx = rpmfcHelper(fc, 'P', "perl"); - if (is_executable || (fc->fcolor->vals[fc->ix] & RPMFC_MODULE)) - xx = rpmfcHelper(fc, 'R', "perl"); + if (findprov && fc->fcolor->vals[fc->ix] & RPMFC_MODULE) + xx = rpmfcHelper(fc, 'P', "perl", noautoprov, noautoprov_c); + if (findreq && (is_executable || (fc->fcolor->vals[fc->ix] & RPMFC_MODULE))) + xx = rpmfcHelper(fc, 'R', "perl", noautoreq, noautoreq_c); } if (fc->fcolor->vals[fc->ix] & RPMFC_PYTHON) { - xx = rpmfcHelper(fc, 'P', "python"); - if (is_executable) - xx = rpmfcHelper(fc, 'R', "python"); + if (findprov) + xx = rpmfcHelper(fc, 'P', "python", noautoprov, noautoprov_c); + if (findreq && is_executable) + xx = rpmfcHelper(fc, 'R', "python", noautoreq, noautoreq_c); } if (fc->fcolor->vals[fc->ix] & RPMFC_PHP) { - xx = rpmfcHelper(fc, 'P', "php"); - xx = rpmfcHelper(fc, 'R', "php"); + if (findprov) + xx = rpmfcHelper(fc, 'P', "php", noautoprov, noautoprov_c); + if (findreq) + xx = rpmfcHelper(fc, 'R', "php", noautoreq, noautoreq_c); } return 0; @@ -739,9 +823,16 @@ /** * Extract Elf dependencies. * @param fc file classifier + * @param findprov 1 to enable provides + * @param findreq 1 to enable requires + * @param noautoprov _noautoprov regexps + * @param noautoprov_c # of _noautoprov regexps + * @param noautoreq _noautoreq regexps + * @param noautoreq_c # of _noautoreq regexps * @return 0 on success */ -static int rpmfcELF(rpmfc fc) +static int rpmfcELF(rpmfc fc, int findprov, int findreq, + regex_t *noautoprov, int noautoprov_c, regex_t *noautoreq, int noautoreq_c) /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /*@modifies fc, rpmGlobalMacroContext, fileSystem, internalState @*/ { @@ -844,26 +935,31 @@ && !(filter_GLIBC_PRIVATE != 0 && !strcmp(s, "GLIBC_PRIVATE"))) { + int doauto; + buf[0] = '\0'; t = buf; t = stpcpy( stpcpy( stpcpy( stpcpy(t, soname), "("), s), ")"); + doauto = findprov && !rpmfcMatchRegexps(noautoprov, noautoprov_c, buf, 'P'); #if !defined(__alpha__) if (isElf64) t = stpcpy(t, "(64bit)"); #endif t++; + + if (doauto) { + /* Add to package provides. */ + ds = rpmdsSingle(RPMTAG_PROVIDES, + buf, "", RPMSENSE_FIND_PROVIDES); + xx = rpmdsMerge(&fc->provides, ds); + + /* Add to file dependencies. */ + xx = rpmfcSaveArg(&fc->ddict, + rpmfcFileDep(t, fc->ix, ds)); - /* Add to package provides. */ - ds = rpmdsSingle(RPMTAG_PROVIDES, - buf, "", RPMSENSE_FIND_PROVIDES); - xx = rpmdsMerge(&fc->provides, ds); - - /* Add to file dependencies. */ - xx = rpmfcSaveArg(&fc->ddict, - rpmfcFileDep(t, fc->ix, ds)); - - ds = rpmdsFree(ds); + ds = rpmdsFree(ds); + } } auxoffset += aux->vda_next; } @@ -904,25 +1000,30 @@ && !(filter_GLIBC_PRIVATE != 0 && !strcmp(s, "GLIBC_PRIVATE"))) { + int doauto; + buf[0] = '\0'; t = buf; t = stpcpy( stpcpy( stpcpy( stpcpy(t, soname), "("), s), ")"); + doauto = findreq && !rpmfcMatchRegexps(noautoreq, noautoreq_c, buf, 'R'); #if !defined(__alpha__) if (isElf64) t = stpcpy(t, "(64bit)"); #endif t++; - /* Add to package dependencies. */ - ds = rpmdsSingle(RPMTAG_REQUIRENAME, - buf, "", RPMSENSE_FIND_REQUIRES); - xx = rpmdsMerge(&fc->requires, ds); - - /* Add to file dependencies. */ - xx = rpmfcSaveArg(&fc->ddict, - rpmfcFileDep(t, fc->ix, ds)); - ds = rpmdsFree(ds); + if (doauto) { + /* Add to package dependencies. */ + ds = rpmdsSingle(RPMTAG_REQUIRENAME, + buf, "", RPMSENSE_FIND_REQUIRES); + xx = rpmdsMerge(&fc->requires, ds); + + /* Add to file dependencies. */ + xx = rpmfcSaveArg(&fc->ddict, + rpmfcFileDep(t, fc->ix, ds)); + ds = rpmdsFree(ds); + } } auxoffset += aux->vna_next; } @@ -947,23 +1048,30 @@ /* Files with executable bit set only. */ if (fc->skipReq || !(st->st_mode & (S_IXUSR|S_IXGRP|S_IXOTH))) /*@innercontinue@*/ continue; + if (!findreq) + continue; /* Add to package requires. */ depsp = &fc->requires; tagN = RPMTAG_REQUIRENAME; dsContext = RPMSENSE_FIND_REQUIRES; s = elf_strptr(elf, shdr->sh_link, dyn->d_un.d_val); assert(s != NULL); + if(rpmfcMatchRegexps(noautoreq, noautoreq_c, s, 'R')) + continue; /*@switchbreak@*/ break; case DT_SONAME: gotSONAME = 1; /* Add to package provides. */ if (fc->skipProv) /*@innercontinue@*/ continue; + if (!findprov) continue; depsp = &fc->provides; tagN = RPMTAG_PROVIDENAME; dsContext = RPMSENSE_FIND_PROVIDES; s = elf_strptr(elf, shdr->sh_link, dyn->d_un.d_val); assert(s != NULL); + if(rpmfcMatchRegexps(noautoprov, noautoprov_c, s, 'P')) + continue; /*@switchbreak@*/ break; } if (s == NULL) @@ -997,7 +1105,7 @@ /*@=branchstate =uniondef @*/ /* For DSO's, provide the basename of the file if DT_SONAME not found. */ - if (!fc->skipProv && isDSO && !gotDEBUG && !gotSONAME) { + if (findprov && !fc->skipProv && isDSO && !gotDEBUG && !gotSONAME) { depsp = &fc->provides; tagN = RPMTAG_PROVIDENAME; dsContext = RPMSENSE_FIND_PROVIDES; @@ -1015,6 +1123,8 @@ t = stpcpy(t, s); /*@=nullpass@*/ + if(!rpmfcMatchRegexps(noautoprov, noautoprov_c, buf, 'P')) { + #if !defined(__alpha__) if (isElf64) t = stpcpy(t, "()(64bit)"); @@ -1032,6 +1142,7 @@ /*@=boundswrite@*/ ds = rpmdsFree(ds); + } } exit: @@ -1045,7 +1156,8 @@ } typedef struct rpmfcApplyTbl_s { - int (*func) (rpmfc fc); + int (*func) (rpmfc fc, int findprov, int findreq, + regex_t *noautoprov, int noautoprov_c, regex_t *noautoreq, int noautoreq_c); int colormask; } * rpmfcApplyTbl; @@ -1058,6 +1170,109 @@ { NULL, 0 } }; +static int rpmfcFindRequiredPackages(rpmfc fc) +{ + rpmts ts=NULL; + const char * s; + char * se; + rpmds ds; + const char * N; + const char * EVR; + int_32 Flags; + unsigned char deptype; + int nddict; + int previx; + int ix; + int i; + int j; + int xx; + int r; + const char * hname; + rpmdbMatchIterator it; + Header hdr; + regex_t *noautoreqdep; + int noautoreqdep_c; + + noautoreqdep=rpmfcExpandRegexps("%{_noautoreqdep}",&noautoreqdep_c); + + ts = rpmtsCreate(); /* XXX ts created in main() should be used */ + + rpmMessage(RPMMESS_NORMAL, _("Searching for required packages....\n")); + + nddict = argvCount(fc->ddict); + previx = -1; + for (i = 0; i < nddict; i++) { + s = fc->ddict[i]; + + /* Parse out (file#,deptype,N,EVR,Flags) */ + ix = strtol(s, &se, 10); + assert(se != NULL); + deptype = *se++; + se++; + N = se; + while (*se && *se != ' ') + se++; + *se++ = '\0'; + EVR = se; + while (*se && *se != ' ') + se++; + *se++ = '\0'; + Flags = strtol(se, NULL, 16); + + if (deptype!='R') continue; + + rpmMessage(RPMMESS_DEBUG, _("#%i requires: %s,%s,%i\n"),ix,N,EVR,Flags); + if (EVR && EVR[0]) { + rpmMessage(RPMMESS_DEBUG, _("skipping #%i require\n")); + continue; + } + for(j=0;j not found\n"),N); + continue; + } + rpmMessage(RPMMESS_DEBUG, _("Iterator: %p\n"),it); + if (rpmdbGetIteratorCount(it)>1) { + rpmMessage(RPMMESS_DEBUG, _("%s -> multiple (skipping)\n"),N); + rpmdbFreeIterator(it); + continue; + } + hdr=rpmdbNextIterator(it); + assert(hdr!=NULL); + r=rpmHeaderGetEntry(hdr,RPMTAG_NAME,NULL,(void **)&hname, NULL); + assert(r<2); + if (!strcmp(hname,N)) { + rpmMessage(RPMMESS_DEBUG, _("%s -> %s (skipping)\n"),N,hname); + rpmdbFreeIterator(it); + continue; + } + + rpmMessage(RPMMESS_DEBUG, "%s -> %s\n",N,hname); + + ds = rpmdsSingle(RPMTAG_REQUIRENAME, hname, "", RPMSENSE_FIND_REQUIRES); + xx = rpmdsMerge(&fc->requires, ds); + ds = rpmdsFree(ds); + + rpmdbFreeIterator(it); + } + + noautoreqdep=rpmfcFreeRegexps(noautoreqdep,noautoreqdep_c); + ts = rpmtsFree(ts); + return 0; +} + int rpmfcApply(rpmfc fc) { rpmfcApplyTbl fcat; @@ -1075,6 +1290,29 @@ int ix; int i; int xx; + int j; + int findprov; + int findreq; + regex_t *noautoprovfiles = NULL; + int noautoprovfiles_c; + regex_t *noautoreqfiles = NULL; + int noautoreqfiles_c; + regex_t *noautoprov = NULL; + int noautoprov_c; + regex_t *noautoreq = NULL; + int noautoreq_c; + const char *buildroot; + int buildroot_l; + + buildroot = rpmExpand("%{buildroot}",NULL); + buildroot_l = strlen(buildroot); + + noautoprovfiles = rpmfcExpandRegexps("%{_noautoprovfiles}",&noautoprovfiles_c); + noautoreqfiles = rpmfcExpandRegexps("%{_noautoreqfiles}",&noautoreqfiles_c); + noautoprov = rpmfcExpandRegexps("%{_noautoprov}",&noautoprov_c); + noautoreq = rpmfcExpandRegexps("%{_noautoreq}",&noautoreq_c); + rpmMessage(RPMMESS_DEBUG, _("%i _noautoprov patterns.\n"),noautoprov_c); + rpmMessage(RPMMESS_DEBUG, _("%i _noautoreq patterns.\n"),noautoreq_c); /* Generate package and per-file dependencies. */ for (fc->ix = 0; fc->fn[fc->ix] != NULL; fc->ix++) { @@ -1082,10 +1320,44 @@ for (fcat = rpmfcApplyTable; fcat->func != NULL; fcat++) { if (!(fc->fcolor->vals[fc->ix] & fcat->colormask)) /*@innercontinue@*/ continue; - xx = (*fcat->func) (fc); + findprov = 1; + findreq = 1; + if (strncmp(fc->fn[fc->ix],buildroot,buildroot_l)==0) {/* sanity check */ + for(j = 0; j < noautoprovfiles_c; j++) { + if (!regexec(&noautoprovfiles[j], + fc->fn[fc->ix] + buildroot_l, 0, NULL, 0)) { + rpmMessage(RPMMESS_NORMAL, + _("skipping %s provides detection" + " (matches noautoprovfiles pattern #%i)\n"), + fc->fn[fc->ix], j); + findprov = 0; + break; + } + } + for(j = 0; j < noautoreqfiles_c; j++) { + if (!regexec(&noautoreqfiles[j], + fc->fn[fc->ix] + buildroot_l, 0, NULL, 0)) { + rpmMessage(RPMMESS_NORMAL, + _("skipping %s requires detection" + " (matches noautoreqfiles pattern #%i)\n"), + fc->fn[fc->ix], j); + findreq = 0; + break; + } + } + } + xx = (*fcat->func) (fc, findprov, findreq, + noautoprov, noautoprov_c, noautoreq, noautoreq_c); } } + noautoprovfiles = rpmfcFreeRegexps(noautoprovfiles,noautoprovfiles_c); + noautoreqfiles = rpmfcFreeRegexps(noautoreqfiles,noautoreqfiles_c); + noautoprov = rpmfcFreeRegexps(noautoprov, noautoprov_c); + noautoreq = rpmfcFreeRegexps(noautoreq, noautoreq_c); + + rpmfcFindRequiredPackages(fc); + /*@-boundswrite@*/ /* Generate per-file indices into package dependencies. */ nddict = argvCount(fc->ddict); --- rpm-4.3/po/POTFILES.in.orig 2004-01-04 03:13:02.000000000 +0100 +++ rpm-4.3/po/POTFILES.in 2004-02-01 21:05:50.567248776 +0100 @@ -22,6 +22,7 @@ build/parseSpec.c build/poptBT.c build/reqprov.c +build/rpmfc.c build/spec.c lib/cpio.c lib/depends.c --- rpm-4.3/po/pl.po.orig 2004-02-01 20:53:10.000000000 +0100 +++ rpm-4.3/po/pl.po 2004-02-01 21:20:36.532561576 +0100 @@ -1295,6 +1295,127 @@ msgid "lookup i18N strings in specfile catalog" msgstr "wyszukaj wpisy I18N w katalogu pliku spec" +#: build/rpmfc.c:94 +#, c-format +msgid "\texecv(%s) pid %d\n" +msgstr "\texecv(%s) pid %d\n" + +#. XXX this error message is probably not seen. +#: build/rpmfc.c:100 +#, c-format +msgid "Couldn't exec %s: %s\n" +msgstr "Nie można uruchomić %s: %s\n" + +#: build/rpmfc.c:105 +#, c-format +msgid "Couldn't fork %s: %s\n" +msgstr "Nie można wykonać fork %s: %s\n" + +#: build/rpmfc.c:190 +#, c-format +msgid "\twaitpid(%d) rc %d status %x\n" +msgstr "\twaitpid(%d) rc %d status %x\n" + +#: build/rpmfc.c:194 +#, c-format +msgid "%s failed\n" +msgstr "%s nie powiodło się\n" + +#: build/rpmfc.c:198 +#, c-format +msgid "failed to write all data to %s\n" +msgstr "Nie udało się zapisać wszystkich danych do %s\n" + +#: build/rpmfc.c:334 +#, c-format +msgid "Compilation of regular expresion '%s' (expanded from '%s') failed. Skipping it.\n" +msgstr "Kompilacja wyrażenia regularnego '%s' (powstałego z '%s') nie powiodła się; pominięto.\n" + +#: build/rpmfc.c:395 +#, c-format +msgid "%i _noautoprov patterns.\n" +msgstr "%i wzorców _noautoprov.\n" + +#: build/rpmfc.c:405 +#, c-format +msgid "%i _noautoreq patterns.\n" +msgstr "%i wzorców _noautoreq.\n" + +#: build/rpmfc.c:459 +#, c-format +msgid "Checking %c: '%s' against _noauto expr. #%i\n" +msgstr "Sprawdzanie %c: '%s' z wyrażeniem _noauto #%i\n" + +#: build/rpmfc.c:462 +#, c-format +msgid "Skipping %c: '%s' as it matches _noauto expr. #%i\n" +msgstr "Pominięto %c: '%s' pasujące do wyrażenia _noauto #%i\n" + +#. XXX ts created in main() should be used +#: build/rpmfc.c:1173 +msgid "Searching for required packages....\n" +msgstr "Poszukiwanie wymaganych pakietów...\n" + +#: build/rpmfc.c:1197 +#, c-format +msgid "#%i requires: %s,%s,%i\n" +msgstr "#%i wymaga: %s,%s,%i\n" + +#: build/rpmfc.c:1199 +#, c-format +msgid "skipping #%i require\n" +msgstr "pominięto zależność #%i\n" + +#: build/rpmfc.c:1205 +#, c-format +msgid "skipping %s requirement processing (matches noautoreqdep pattern #%i)\n" +msgstr "pominięto przetwarzanie zależności %s (pasuje do wzorca noautoreqdep #%i)\n" + +#: build/rpmfc.c:1211 +#, c-format +msgid "skipping #%i require (is file requirement)\n" +msgstr "pominięto zależność #%i (zależność od pliku)\n" + +#: build/rpmfc.c:1216 +#, c-format +msgid "%s -> not found\n" +msgstr "%s -> nie znaleziono\n" + +#: build/rpmfc.c:1219 +#, c-format +msgid "Iterator: %p\n" +msgstr "Iterator: %p\n" + +#: build/rpmfc.c:1221 +#, c-format +msgid "%s -> multiple (skipping)\n" +msgstr "%s -> wiele (pominięto)\n" + +#: build/rpmfc.c:1230 +#, c-format +msgid "%s -> %s (skipping)\n" +msgstr "%s -> %s (pominięto)\n" + +#: build/rpmfc.c:1295 +#, c-format +msgid "skipping %s provides detection (matches noautoprovfiles pattern #%i)\n" +msgstr "pominięto wykrywanie własności %s (pasuje do wzorca noautoprovfiles #%i)\n" + +#: build/rpmfc.c:1306 +#, c-format +msgid "skipping %s requires detection (matches noautoreqfiles pattern #%i)\n" +msgstr "pominięto wykrywanie własności %s (pasuje do wzorca noautoreqfiles #%i)\n" + +#: build/rpmfc.c:1642 +#, c-format +msgid "Finding %s: %s\n" +msgstr "Poszukiwanie %s: %s\n" + +#: build/rpmfc.c:1648 build/rpmfc.c:1657 +#, c-format +msgid "Failed to find %s:\n" +msgstr "Nie udało się odnaleźć %s:\n" + #: build/spec.c:237 #, c-format msgid "line %d: Bad number: %s\n"