summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Sivak <msivak@redhat.com>2010-05-17 16:21:38 +0200
committerMartin Sivak <msivak@redhat.com>2010-05-18 11:03:44 +0200
commit3e4a6cd74933b6b4fc72f688bd1c470d8531d0c3 (patch)
tree9f5c44159ba43c1afc6957c528bad64d8fb884b3
parenta1a49c8ab785ba3893f3da3a116aac9976162824 (diff)
downloadanaconda-3e4a6cd74933b6b4fc72f688bd1c470d8531d0c3.tar.gz
anaconda-3e4a6cd74933b6b4fc72f688bd1c470d8531d0c3.tar.xz
anaconda-3e4a6cd74933b6b4fc72f688bd1c470d8531d0c3.zip
Use "kernel-modules = version" style for locating rpms providing driver updates
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 over two arrays at once.. Related: rhbz#508242
-rw-r--r--docs/driverdisc.txt2
-rw-r--r--loader/driverdisk.c19
-rw-r--r--loader/rpmextract.c46
-rw-r--r--loader/rpmextract.h2
4 files changed, 47 insertions, 22 deletions
diff --git a/docs/driverdisc.txt b/docs/driverdisc.txt
index 507598970..779e71e35 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 18b88acb8..5b27e6edf 100644
--- a/loader/driverdisk.c
+++ b/loader/driverdisk.c
@@ -65,16 +65,19 @@ extern uint64_t flags;
/*
* check if the RPM in question provides
- * Provides: userptr
- * we use it to check kernel-modules-<kernelversion>
+ * Provides: <dep> = <version>
+ * we use it to check if 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);
+ if (version == NULL)
+ return -1;
+
+ return strcmp(dep, "kernel-modules") || strcmp(version, kernelver);
}
/*
@@ -85,7 +88,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 +167,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 cdc038bac..2a6d1e83a 100644
--- a/loader/rpmextract.c
+++ b/loader/rpmextract.c
@@ -153,45 +153,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 53a90cf92..20a5cc837 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,