⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 driverdisk.c

📁 linux 安装程序
💻 C
📖 第 1 页 / 共 2 页
字号:
                        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 + -