diff options
| author | Martin Sivak <msivak@redhat.com> | 2010-05-24 17:34:40 +0200 |
|---|---|---|
| committer | Martin Sivak <msivak@redhat.com> | 2010-05-24 18:21:49 +0200 |
| commit | cbcb0d07f22f4055dc7feb7269eba12c32da5131 (patch) | |
| tree | 7c7b9e467513693d5ca4bdf45d8d82a631ecf9a7 /loader/driverdisk.c | |
| parent | 2f4eeebd17b33406aaa79a0e4c5f989db9a4a455 (diff) | |
Change the configuration of depmod and link modules to better place (#593941)
Depmod doesn't support absolute paths so far, so we have to use small workaround. COnfigure it to prefer lib/modules/<kernel>/updates and make updates a symlink to /tmp/DD/lib/modules.
This way depmod -a should see the modules and modprobe too...
Diffstat (limited to 'loader/driverdisk.c')
| -rw-r--r-- | loader/driverdisk.c | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/loader/driverdisk.c b/loader/driverdisk.c index 5b27e6edf..1072f4694 100644 --- a/loader/driverdisk.c +++ b/loader/driverdisk.c @@ -143,13 +143,11 @@ int globErrFunc(const char *epath, int eerrno) return 0; } -int dlabelUnpackRPMDir(char* rpmdir, char* destination) +int dlabelUnpackRPMDir(char* rpmdir, char* destination, char *kernelver) { - char *kernelver; - struct utsname unamedata; char *oldcwd; char *globpattern; - int rc; + int rc = 0; /* get current working directory */ oldcwd = getcwd(NULL, 0); @@ -165,12 +163,6 @@ int dlabelUnpackRPMDir(char* rpmdir, char* destination) return 1; } - /* get running kernel version */ - rc = uname(&unamedata); - checked_asprintf(&kernelver, "%s", - rc ? "unknown" : unamedata.release); - logMessage(DEBUGLVL, "Kernel version: %s", kernelver); - checked_asprintf(&globpattern, "%s/*.rpm", rpmdir); glob_t globres; char** globitem; @@ -192,7 +184,6 @@ int dlabelUnpackRPMDir(char* rpmdir, char* destination) } /* cleanup */ - free(kernelver); free(oldcwd); return rc; } @@ -247,7 +238,9 @@ static int loadDriverDisk(struct loaderData_s *loaderData, char *mntpt) { struct moduleBallLocation * location; struct stat sb; static int disknum = 0; - int fd, ret; + int rc, fd, ret; + char *kernelver; + struct utsname unamedata; /* check for new version */ sprintf(file, "%s/rhdd3", mntpt); @@ -265,6 +258,12 @@ static int loadDriverDisk(struct loaderData_s *loaderData, char *mntpt) { title[sb.st_size] = '\0'; close(fd); + /* get running kernel version */ + rc = uname(&unamedata); + checked_asprintf(&kernelver, "%s", + rc ? "unknown" : unamedata.release); + logMessage(DEBUGLVL, "Kernel version: %s", kernelver); + sprintf(file, DD_RPMDIR_TEMPLATE, disknum); mkdirChain(file); mkdirChain(DD_MODULES); @@ -284,13 +283,25 @@ static int loadDriverDisk(struct loaderData_s *loaderData, char *mntpt) { copyDirectory(src, dest, copyWarnFn, copyErrorFn); /* unpack packages from dest into location->path */ - if (dlabelUnpackRPMDir(dest, DD_EXTRACTED)) { + if (dlabelUnpackRPMDir(dest, DD_EXTRACTED, kernelver)) { /* fatal error, log this and jump to exception handler */ logMessage(ERROR, "Error unpacking RPMs from driver disc no.%d", disknum); goto loadDriverDiscException; } + + /* ensure updates directory exists */ + sprintf(file, "/lib/modules/%s/updates", kernelver); + mkdirChain(file); + + /* make sure driver update are referenced from system module dir + but from a different subdir, initrd overlays use the main + /lib/modules/<kernel>/updates + */ + sprintf(file, "/lib/modules/%s/updates/DD", kernelver); + rc = symlink(DD_MODULES, file); + /* run depmod to refresh modules db */ if (system("depmod -a")) { /* this is not really fatal error, it might still work, log it */ @@ -313,6 +324,9 @@ static int loadDriverDisk(struct loaderData_s *loaderData, char *mntpt) { loadDriverDiscException: + /* cleanup */ + free(kernelver); + if (!FL_CMDLINE(flags)) newtPopWindow(); |
