We used to have kernel-modules-<version> = anything, but we want to change it to make writing spec files more developer friendly. RPM exports the versions under different tag, so we basicly iterate two loops at once.. --- docs/driverdisc.txt | 2 +- loader/driverdisk.c | 12 ++++++------ loader/rpmextract.c | 46 ++++++++++++++++++++++++++++++++++------------ loader/rpmextract.h | 2 +- 4 files changed, 42 insertions(+), 20 deletions(-) diff --git a/docs/driverdisc.txt b/docs/driverdisc.txt index 5075989..779e71e 100644 --- a/docs/driverdisc.txt +++ b/docs/driverdisc.txt @@ -76,7 +76,7 @@ any anaconda's supported filesystem (vfat, squashfs, ext2 and ext3). | /... - any other architecture the DD provides drivers for There is a special requirement for the RPMs used to update drivers. Anaconda -picks up only RPMs which provide kernel-modules-<running kernel version>. +picks up only RPMs which provide "kernel-modules = <running kernel version>". Initrd overlay driverdisc image ------------------------------- diff --git a/loader/driverdisk.c b/loader/driverdisk.c index 8fa950a..71ec279 100644 --- a/loader/driverdisk.c +++ b/loader/driverdisk.c @@ -68,13 +68,13 @@ extern uint64_t flags; * Provides: userptr * we use it to check kernel-modules-<kernelversion> */ -int dlabelProvides(const char* dep, void *userptr) +int dlabelProvides(const char* dep, const char* version, void *userptr) { char *kernelver = (char*)userptr; - logMessage(DEBUGLVL, "Provides: %s\n", dep); + logMessage(DEBUGLVL, "Provides: %s = %s", dep, version); - return strcmp(dep, kernelver); + return version!=NULL || strcmp(dep, "kernel-modules") || strcmp(version, kernelver); } /* @@ -85,7 +85,7 @@ int dlabelFilter(const char* name, const struct stat *fstat, void *userptr) { int l = strlen(name); - logMessage(DEBUGLVL, "Unpacking %s\n", name); + logMessage(DEBUGLVL, "Unpacking %s", name); /* we want firmware files */ if (!strncmp("lib/firmware/", name, 13)) return 0; @@ -164,9 +164,9 @@ int dlabelUnpackRPMDir(char* rpmdir, char* destination) /* get running kernel version */ rc = uname(&unamedata); - checked_asprintf(&kernelver, "kernel-modules-%s", + checked_asprintf(&kernelver, "%s", rc ? "unknown" : unamedata.release); - logMessage(DEBUGLVL, "Kernel version: %s\n", kernelver); + logMessage(DEBUGLVL, "Kernel version: %s", kernelver); checked_asprintf(&globpattern, "%s/*.rpm", rpmdir); glob_t globres; diff --git a/loader/rpmextract.c b/loader/rpmextract.c index 2ce0e6b..0d99a38 100644 --- a/loader/rpmextract.c +++ b/loader/rpmextract.c @@ -152,45 +152,67 @@ int explodeRPM(const char *source, /* Retrieve all dependencies and run them through deps function */ while (deps) { - struct rpmtd_s td; + struct rpmtd_s tddep; + struct rpmtd_s tdver; const char *depname; + const char *depversion; - if (!headerGet(h, RPMTAG_REQUIRENAME, &td, HEADERGET_MINMEM)) + if (!headerGet(h, RPMTAG_PROVIDES, &tddep, HEADERGET_MINMEM)) break; + if (!headerGet(h, RPMTAG_PROVIDEVERSION, &tdver, HEADERGET_MINMEM)){ + rpmtdFreeData(&tddep); + break; + } + /* iterator */ - while ((depname = rpmtdNextString(&td))) { - if (deps(depname, userptr)) { + while ((depname = rpmtdNextString(&tddep))) { + depversion = rpmtdNextString(&tdver); + if (deps(depname, depversion, userptr)) { + rpmtdFreeData(&tddep); + rpmtdFreeData(&tdver); Fclose(fdi); return EXIT_BADDEPS; } } - rpmtdFreeData(&td); + + rpmtdFreeData(&tddep); + rpmtdFreeData(&tdver); + break; } /* Retrieve all provides and run them through provides function */ while (provides) { - struct rpmtd_s td; + struct rpmtd_s tddep; + struct rpmtd_s tdver; const char *depname; + const char *depversion; int found = 0; - if (!headerGet(h, RPMTAG_PROVIDES, &td, HEADERGET_MINMEM)) + if (!headerGet(h, RPMTAG_PROVIDES, &tddep, HEADERGET_MINMEM)) break; + if (!headerGet(h, RPMTAG_PROVIDEVERSION, &tdver, HEADERGET_MINMEM)){ + rpmtdFreeData(&tddep); + break; + } + /* iterator */ - while ((depname = rpmtdNextString(&td))) { - if (!provides(depname, userptr)) { + while ((depname = rpmtdNextString(&tddep))) { + depversion = rpmtdNextString(&tdver); + if (!provides(depname, depversion, userptr)) { found++; } } - rpmtdFreeData(&td); - if (found<=0) { + rpmtdFreeData(&tddep); + rpmtdFreeData(&tdver); + + if (found<=0){ Fclose(fdi); return EXIT_BADDEPS; } - break; } diff --git a/loader/rpmextract.h b/loader/rpmextract.h index 53a90cf..20a5cc8 100644 --- a/loader/rpmextract.h +++ b/loader/rpmextract.h @@ -32,7 +32,7 @@ /* both filter functions return 0 - match, 1 - match not found */ typedef int (*filterfunc)(const char* name, const struct stat *fstat, void *userptr); -typedef int (*dependencyfunc)(const char* depends, void *userptr); +typedef int (*dependencyfunc)(const char* depname, const char* depversion, void *userptr); int explodeRPM(const char* file, filterfunc filter, -- 1.6.6.1 _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list