summaryrefslogtreecommitdiffstats
path: root/loader/driverdisk.c
diff options
context:
space:
mode:
authorMartin Sivak <msivak@redhat.com>2010-05-24 17:34:40 +0200
committerMartin Sivak <msivak@redhat.com>2010-05-24 18:21:49 +0200
commitcbcb0d07f22f4055dc7feb7269eba12c32da5131 (patch)
tree7c7b9e467513693d5ca4bdf45d8d82a631ecf9a7 /loader/driverdisk.c
parent2f4eeebd17b33406aaa79a0e4c5f989db9a4a455 (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.c40
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();