📄 driverdisk.c
字号:
break; } } } ddfile = newt_select_file(_("Select driver disk image"), _("Select the file which is your driver " "disk image."), "/tmp/dpart", NULL); if (ddfile == NULL) { umount("/tmp/dpart"); stage = DEV_PART; dir = -1; break; } dir = 1; stage = DEV_LOADFILE; } case DEV_LOADFILE: { if(ddfile == NULL) { logMessage(DEBUGLVL, "trying to load dd from NULL"); stage = DEV_CHOOSEFILE; break; } if (dir == -1) { umountLoopback("/tmp/drivers", "loop6"); unlink("/tmp/drivers"); ddfile = NULL; stage = DEV_CHOOSEFILE; break; } if (mountLoopback(ddfile, "/tmp/drivers", "loop6")) { newtWinMessage(_("Error"), _("OK"), _("Failed to load driver disk from file.")); stage = DEV_CHOOSEFILE; break; } stage = DEV_LOAD; break; } case DEV_INSERT: { char * buf; buf = sdupprintf(_("Insert your driver disk into /dev/%s " "and press \"OK\" to continue."), device); rc = newtWinChoice(_("Insert Driver Disk"), _("OK"), _("Back"), buf); if (rc == 2) { stage = DEV_DEVICE; dir = -1; break; } dir = 1; devMakeInode(device, "/tmp/dddev"); logMessage(INFO, "trying to mount %s", device); if (doPwMount("/tmp/dddev", "/tmp/drivers", "vfat", IMOUNT_RDONLY, NULL)) { if (doPwMount("/tmp/dddev", "/tmp/drivers", "ext2", IMOUNT_RDONLY, NULL)) { if (doPwMount("/tmp/dddev", "/tmp/drivers", "iso9660", IMOUNT_RDONLY, NULL)) { newtWinMessage(_("Error"), _("OK"), _("Failed to mount driver disk.")); stage = DEV_INSERT; break; } } } rc = verifyDriverDisk("/tmp/drivers"); if (rc == LOADER_BACK) { newtWinMessage(_("Error"), _("OK"), _("Driver disk is invalid for this " "release of %s."), getProductName()); umount("/tmp/drivers"); stage = DEV_INSERT; break; } stage = DEV_LOAD; break; } case DEV_LOAD: { struct device ** devices; before = 0; found = 0; devices = probeDevices(class, BUS_UNSPEC, PROBE_LOADED); if (devices) for(; devices[before]; before++); rc = loadDriverDisk(modInfo, modLoaded, modDepsPtr, "/tmp/drivers"); umount("/tmp/drivers"); if (rc == LOADER_BACK) { dir = -1; if (ddfile != NULL) stage = DEV_CHOOSEFILE; else stage = DEV_INSERT; break; } /* fall through to probing */ stage = DEV_PROBE; if (ddfile != NULL) { umountLoopback("/tmp/drivers", "loop6"); unlink("/tmp/drivers"); umount("/tmp/dpart"); } } case DEV_PROBE: { struct device ** devices; /* if they didn't specify that we should probe, then we should * just fall out */ if (noprobe) { stage = DEV_DONE; break; } busProbe(modInfo, modLoaded, *modDepsPtr, 0); devices = probeDevices(class, BUS_UNSPEC, PROBE_LOADED); if (devices) for(; devices[found]; found++); if (found > before) { stage = DEV_DONE; break; } /* we don't have any more modules of the proper class. ask * them to manually load */ rc = newtWinTernary(_("Error"), _("Manually choose"), _("Continue"), _("Load another disk"), _("No devices of the appropriate type were " "found on this driver disk. Would you " "like to manually select the driver, " "continue anyway, or load another " "driver disk?")); if (rc == 2) { /* if they choose to continue, just go ahead and continue */ stage = DEV_DONE; } else if (rc == 3) { /* if they choose to load another disk, back to the * beginning with them */ stage = DEV_DEVICE; } else { rc = chooseManualDriver(class, modLoaded, modDepsPtr, modInfo); /* if they go back from a manual driver, we'll ask again. * if they load something, assume it's what we need */ if (rc == LOADER_OK) { stage = DEV_DONE; } } break; } case DEV_DONE: break; } } return LOADER_OK;}/* looping way to load driver disks */int loadDriverDisks(int class, moduleList modLoaded, moduleDeps * modDepsPtr, moduleInfoSet modInfo) { int rc; rc = newtWinChoice(_("Driver disk"), _("Yes"), _("No"), _("Do you have a driver disk?")); if (rc != 1) return LOADER_OK; rc = loadDriverFromMedia(CLASS_UNSPEC, modLoaded, modDepsPtr, modInfo, 1, 0); if (rc == LOADER_BACK) return LOADER_OK; do { rc = newtWinChoice(_("More Driver Disks?"), _("Yes"), _("No"), _("Do you wish to load any more driver disks?")); if (rc != 1) break; loadDriverFromMedia(CLASS_UNSPEC, modLoaded, modDepsPtr, modInfo, 0, 0); } while (1); return LOADER_OK;}static void loadFromLocation(struct loaderData_s * loaderData, char * dir) { if (verifyDriverDisk(dir) == LOADER_BACK) { logMessage(ERROR, "not a valid driver disk"); return; } loadDriverDisk(loaderData->modInfo, loaderData->modLoaded, loaderData->modDepsPtr, dir); busProbe(loaderData->modInfo, loaderData->modLoaded, * loaderData->modDepsPtr, 0);}void getDDFromSource(struct loaderData_s * loaderData, char * src) { char *path = "/tmp/dd.img"; int unlinkf = 0; if (!strncmp(src, "nfs:", 4)) { unlinkf = 1; if (getFileFromNfs(src + 4, "/tmp/dd.img", loaderData)) { logMessage(ERROR, "unable to retrieve driver disk: %s", src); return; } } else if (!strncmp(src, "ftp://", 6) || !strncmp(src, "http://", 7)) { unlinkf = 1; if (getFileFromUrl(src, "/tmp/dd.img", loaderData)) { logMessage(ERROR, "unable to retrieve driver disk: %s", src); return; } /* FIXME: this is a hack so that you can load a driver disk from, eg, * scsi cdrom drives */#if !defined(__s390__) && !defined(__s390x__) } else if (!strncmp(src, "cdrom", 5)) { loadDriverDisks(CLASS_UNSPEC, loaderData->modLoaded, loaderData->modDepsPtr, loaderData->modInfo); return;#endif } else if (!strncmp(src, "path:", 5)) { path = src + 5; } else { newtWinMessage(_("Kickstart Error"), _("OK"), _("Unknown driver disk kickstart source: %s"), src); return; } if (!mountLoopback(path, "/tmp/drivers", "loop6")) { loadFromLocation(loaderData, "/tmp/drivers"); umountLoopback("/tmp/drivers", "loop6"); unlink("/tmp/drivers"); if (unlinkf) unlink(path); }}static void getDDFromDev(struct loaderData_s * loaderData, char * dev, char * fstype);void useKickstartDD(struct loaderData_s * loaderData, int argc, char ** argv) { char * fstype = NULL; char * dev = NULL; char * src = NULL; char * biospart = NULL, * p = NULL; int usebiosdev = 0; poptContext optCon; int rc; struct poptOption ksDDOptions[] = { { "type", '\0', POPT_ARG_STRING, &fstype, 0, NULL, NULL }, { "source", '\0', POPT_ARG_STRING, &src, 0, NULL, NULL }, { "biospart", '\0', POPT_ARG_NONE, &usebiosdev, 0, NULL, NULL }, { 0, 0, 0, 0, 0, 0, 0 } }; optCon = poptGetContext(NULL, argc, (const char **) argv, ksDDOptions, 0); if ((rc = poptGetNextOpt(optCon)) < -1) { newtWinMessage(_("Kickstart Error"), _("OK"), _("The following invalid argument was specified for " "the kickstart driver disk command: %s:%s"), poptBadOption(optCon, POPT_BADOPTION_NOALIAS), poptStrerror(rc)); return; } dev = (char *) poptGetArg(optCon); if (!dev && !src) { logMessage(ERROR, "bad arguments to kickstart driver disk command"); return; } if (usebiosdev != 0) { p = strchr(dev,'p'); if (!p){ logMessage(ERROR, "Bad argument for biospart"); return; } *p = '\0'; biospart = getBiosDisk(dev); if (biospart == NULL) { logMessage(ERROR, "Unable to locate BIOS dev %s",dev); return; } dev = malloc(strlen(biospart) + strlen(p + 1) + 2); sprintf(dev, "%s%s", biospart, p + 1); } if (dev) { return getDDFromDev(loaderData, dev, fstype); } else { return getDDFromSource(loaderData, src); }}static void getDDFromDev(struct loaderData_s * loaderData, char * dev, char * fstype) { devMakeInode(dev, "/tmp/dddev"); if (fstype) { if (doPwMount("/tmp/dddev", "/tmp/drivers", fstype, IMOUNT_RDONLY, NULL)) { logMessage(ERROR, "unable to mount %s as %s", dev, fstype); return; } } else if (doPwMount("/tmp/dddev", "/tmp/drivers", "vfat", IMOUNT_RDONLY, NULL)) { if (doPwMount("/tmp/dddev", "/tmp/drivers", "ext2", IMOUNT_RDONLY, NULL)) { if (doPwMount("/tmp/dddev", "/tmp/drivers", "iso9660", IMOUNT_RDONLY, NULL)) { logMessage(ERROR, "unable to mount driver disk %s", dev); return; } } } loadFromLocation(loaderData, "/tmp/drivers"); umount("/tmp/drivers"); unlink("/tmp/drivers"); unlink("/tmp/dddev");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -