summaryrefslogtreecommitdiffstats
path: root/loader/devices.c
diff options
context:
space:
mode:
Diffstat (limited to 'loader/devices.c')
-rw-r--r--loader/devices.c109
1 files changed, 58 insertions, 51 deletions
diff --git a/loader/devices.c b/loader/devices.c
index 4ce27dd3d..0d2db111b 100644
--- a/loader/devices.c
+++ b/loader/devices.c
@@ -120,46 +120,47 @@ static int getModuleArgs(struct moduleInfo * mod, char *** argPtr) {
return 0;
}
-int devCopyDriverDisk(moduleInfoSet modInfo, moduleList modLoaded,
+int devInitDriverDisk(moduleInfoSet modInfo, moduleList modLoaded,
moduleDeps *modDepsPtr, int flags, char * mntPoint) {
- char * files[] = { "pcitable", "modules.cgz", "modinfo", "modules.dep",
- NULL };
- char * dirName;
- char ** file;
int badDisk = 0;
- static int diskNum = 0;
- char from[200], to[200];
+ char from[200];
+ struct stat sb;
+ char * diskName;
+ int fd;
+ char * fileCheck[] = { "rhdd-6.1", "modinfo", "modules.dep", "pcitable",
+ NULL };
+ char ** fnPtr;
+
+ for (fnPtr = fileCheck; *fnPtr; fnPtr++) {
+ sprintf(from, "%s/%s", mntPoint, *fnPtr);
+ if (access(from, R_OK)) {
+ logMessage("cannot find %s; bad driver disk", from);
+ badDisk = 1;
+ }
+ }
sprintf(from, "%s/rhdd-6.1", mntPoint);
- if (access(from, R_OK))
+ stat(from, &sb);
+ if (!sb.st_size)
badDisk = 1;
- dirName = malloc(80);
- sprintf(dirName, "/tmp/DD-%d", diskNum);
- mkdir(dirName, 0755);
- for (file = files; *file; file++) {
- sprintf(from, "%s/%s", mntPoint, *file);
- sprintf(to, "%s/%s", dirName, *file);
-
- if (copyFile(from, to))
- badDisk = 1;
- }
+ if (badDisk) return 1;
- umount("/tmp/drivers");
+ diskName = malloc(sb.st_size + 1);
+ fd = open(from, O_RDONLY);
+ read(fd, diskName, sb.st_size);
+ if (diskName[sb.st_size - 1] == '\n')
+ sb.st_size--;
+ diskName[sb.st_size] = '\0';
+ close(fd);
- if (badDisk) {
- return 1;
- }
+ sprintf(from, "%s/modinfo", mntPoint);
+ fd = isysReadModuleInfo(from, modInfo, diskName);
- sprintf(from, "%s/modinfo", dirName);
- isysReadModuleInfo(from, modInfo, dirName);
- sprintf(from, "%s/modules.dep", dirName);
+ sprintf(from, "%s/modules.dep", mntPoint);
mlLoadDeps(modDepsPtr, from);
- sprintf(from, "%s/pcitable", dirName);
- badDisk = pciReadDrivers(from);
- logMessage("read %s, rc %d", from, badDisk);
-
- diskNum++;
+ sprintf(from, "%s/pcitable", mntPoint);
+ pciReadDrivers(from);
return 0;
}
@@ -177,6 +178,7 @@ int devLoadDriverDisk(moduleInfoSet modInfo, moduleList modLoaded,
if (rc == 2) return LOADER_BACK;
}
+ ejectFloppy();
rc = newtWinChoice(_("Devices"), _("OK"),
cancelNotBack ? _("Cancel") : _("Back"),
_("Insert your driver disk and press \"OK\" to continue."));
@@ -191,15 +193,17 @@ int devLoadDriverDisk(moduleInfoSet modInfo, moduleList modLoaded,
if (doPwMount("/tmp/fd0", "/tmp/drivers", "vfat", 1, 0, NULL, NULL))
if (doPwMount("/tmp/fd0", "/tmp/drivers", "ext2", 1, 0, NULL, NULL))
newtWinMessage(_("Error"), _("OK"),
- _("Failed to mount floppy disk."));
+ _("Failed to mount driver disk."));
- if (devCopyDriverDisk(modInfo, modLoaded, modDepsPtr,
+ if (devInitDriverDisk(modInfo, modLoaded, modDepsPtr,
flags, "/tmp/drivers"))
newtWinMessage(_("Error"), _("OK"),
_("The floppy disk you inserted is not a valid driver disk "
"for this release of Red Hat Linux."));
else
done = 1;
+
+ umount("/tmp/drivers");
} while (!done);
return 0;
@@ -219,7 +223,7 @@ static int sortDrivers(const void * a, const void * b) {
}
static int pickModule(moduleInfoSet modInfo, enum driverMajor type,
- moduleList modLoaded, moduleDeps modDeps,
+ moduleList modLoaded, moduleDeps * modDepsPtr,
struct moduleInfo * suggestion,
struct moduleInfo ** modp, int * specifyParams,
int flags) {
@@ -229,21 +233,22 @@ static int pickModule(moduleInfoSet modInfo, enum driverMajor type,
char specifyParameters = *specifyParams ? '*' : ' ';
struct newtExitStruct es;
struct sortModuleList * sortedOrder;
- int numSorted = 0;
-
- sortedOrder = alloca(sizeof(*sortedOrder) * modInfo->numModules);
+ int numSorted;
- for (i = 0; i < modInfo->numModules; i++) {
- if (modInfo->moduleList[i].major == type &&
- !mlModuleInList(modInfo->moduleList[i].moduleName, modLoaded)) {
- sortedOrder[numSorted].index = i;
- sortedOrder[numSorted++].modInfo = modInfo;
- }
- }
+ do {
+ sortedOrder = malloc(sizeof(*sortedOrder) * modInfo->numModules);
+ numSorted = 0;
+
+ for (i = 0; i < modInfo->numModules; i++) {
+ if (modInfo->moduleList[i].major == type &&
+ !mlModuleInList(modInfo->moduleList[i].moduleName, modLoaded)) {
+ sortedOrder[numSorted].index = i;
+ sortedOrder[numSorted++].modInfo = modInfo;
+ }
+ }
- qsort(sortedOrder, numSorted, sizeof(*sortedOrder), sortDrivers);
+ qsort(sortedOrder, numSorted, sizeof(*sortedOrder), sortDrivers);
- do {
if (FL_MODDISK(flags)) {
text = newtTextboxReflowed(-1, -1, _("Which driver should I try?. "
"If the driver you need does not appear in this list, and "
@@ -290,10 +295,12 @@ static int pickModule(moduleInfoSet modInfo, enum driverMajor type,
newtFormDestroy(form);
newtPopWindow();
+ free(sortedOrder);
+
if (es.reason == NEWT_EXIT_COMPONENT && es.u.co == back) {
return LOADER_BACK;
} else if (es.reason == NEWT_EXIT_HOTKEY && es.u.key == NEWT_KEY_F2) {
- devLoadDriverDisk(modInfo, modLoaded, &modDeps, flags, 0);
+ devLoadDriverDisk(modInfo, modLoaded, modDepsPtr, flags, 0);
continue;
} else {
break;
@@ -307,7 +314,7 @@ static int pickModule(moduleInfoSet modInfo, enum driverMajor type,
}
int devDeviceMenu(enum driverMajor type, moduleInfoSet modInfo,
- moduleList modLoaded, moduleDeps modDeps, int flags,
+ moduleList modLoaded, moduleDeps * modDepsPtr, int flags,
char ** moduleName) {
struct moduleInfo * mod = NULL;
enum { S_MODULE, S_ARGS, S_DONE } stage = S_MODULE;
@@ -318,8 +325,8 @@ int devDeviceMenu(enum driverMajor type, moduleInfoSet modInfo,
while (stage != S_DONE) {
switch (stage) {
case S_MODULE:
- if ((rc = pickModule(modInfo, type, modLoaded, modDeps, mod, &mod,
- &specifyArgs, flags)))
+ if ((rc = pickModule(modInfo, type, modLoaded, modDepsPtr, mod,
+ &mod, &specifyArgs, flags)))
return LOADER_BACK;
stage = S_ARGS;
break;
@@ -343,8 +350,8 @@ int devDeviceMenu(enum driverMajor type, moduleInfoSet modInfo,
scsiWindow(mod->moduleName);
sleep(1);
}
- rc = mlLoadModule(mod->moduleName, mod->path, modLoaded, modDeps, args,
- modInfo, flags);
+ rc = mlLoadModule(mod->moduleName, mod->locationID, modLoaded, *modDepsPtr,
+ args, modInfo, flags);
if (mod->major == DRIVER_SCSI) newtPopWindow();
if (args) {