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

📄 kickstart.c

📁 linux 安装程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * kickstart.c - kickstart file handling * * Erik Troan <ewt@redhat.com> * Matt Wilson <msw@redhat.com> * Michael Fulbright <msf@redhat.com> * Jeremy Katz <katzj@redhat.com> * * Copyright 1999-2003 Red Hat, Inc. * * This software may be freely redistributed under the terms of the GNU * public license. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */#include <alloca.h>#include <ctype.h>#include <errno.h>#include <fcntl.h>#include <kudzu/kudzu.h>#include <newt.h>#include <popt.h>#include <stdlib.h>#include <string.h>#include <sys/stat.h>#include <unistd.h>#include "loader.h"#include "loadermisc.h"#include "lang.h"#include "log.h"#include "kickstart.h"#include "kbd.h"#include "driverdisk.h"#include "net.h"#include "method.h"#include "nfsinstall.h"#include "urlinstall.h"#include "cdinstall.h"#include "hdinstall.h"#include "../isys/imount.h"#include "../isys/isys.h"/* boot flags */extern int flags;struct ksCommandNames {    int code;    char * name;    void (*setupData) (struct loaderData_s *loaderData,                       int argc, char ** argv);} ;struct ksCommand {    int code, argc;    char ** argv;};static void setTextMode(struct loaderData_s * loaderData, int argc,                         char ** argv);static void setGraphicalMode(struct loaderData_s * loaderData, int argc,                              char ** argv);static void setCmdlineMode(struct loaderData_s * loaderData, int argc,                            char ** argv);static void setSELinux(struct loaderData_s * loaderData, int argc,                        char ** argv);static void setPowerOff(struct loaderData_s * loaderData, int argc,                         char ** argv);static void setHalt(struct loaderData_s * loaderData, int argc,                     char ** argv);static void setShutdown(struct loaderData_s * loaderData, int argc,                         char ** argv);static void setMediaCheck(struct loaderData_s * loaderData, int argc,                           char ** argv);static void setUpdates(struct loaderData_s * loaderData, int argc,                       char ** argv);void loadKickstartModule(struct loaderData_s * loaderData, int argc,                          char ** argv);struct ksCommandNames ksTable[] = {    { KS_CMD_NFS, "nfs", setKickstartNfs },    { KS_CMD_CDROM, "cdrom", setKickstartCD },    { KS_CMD_HD, "harddrive", setKickstartHD },    { KS_CMD_TEXT, "text", setTextMode },    { KS_CMD_GRAPHICAL, "graphical", setGraphicalMode },    { KS_CMD_URL, "url", setKickstartUrl },    { KS_CMD_NETWORK, "network", setKickstartNetwork },    { KS_CMD_KEYBOARD, "keyboard", setKickstartKeyboard },    { KS_CMD_LANG, "lang", setKickstartLanguage },    { KS_CMD_DD, "driverdisk", useKickstartDD },    { KS_CMD_DEVICE, "device", loadKickstartModule },    { KS_CMD_CMDLINE, "cmdline", setCmdlineMode },    { KS_CMD_SELINUX, "selinux", setSELinux },    { KS_CMD_POWEROFF, "poweroff", setPowerOff },    { KS_CMD_HALT, "halt", setHalt },    { KS_CMD_SHUTDOWN, "shutdown", setShutdown },    { KS_CMD_MEDIACHECK, "mediacheck", setMediaCheck },    { KS_CMD_UPDATES, "updates", setUpdates },    { KS_CMD_NONE, NULL, NULL }};struct ksCommand * commands = NULL;int numCommands = 0;int ksReadCommands(char * cmdFile) {    int fd;    char * buf;    struct stat sb;    char * start, * end, * chptr;    char oldch;    int line = 0;    char ** argv;     int argc;    int inSection = 0; /* in a section such as %post, %pre or %packages */    struct ksCommandNames * cmd;    int commandsAlloced = 5;    if ((fd = open(cmdFile, O_RDONLY)) < 0) {        startNewt();        newtWinMessage(_("Kickstart Error"), _("OK"),                       _("Error opening kickstart file %s: %s"),                       cmdFile, strerror(errno));        return LOADER_ERROR;    }    fstat(fd, &sb);    buf = alloca(sb.st_size + 1);    if (read(fd, buf, sb.st_size) != sb.st_size) {        startNewt();        newtWinMessage(_("Kickstart Error"), _("OK"),                       _("Error reading contents of kickstart file %s: %s"),                       cmdFile, strerror(errno));        close(fd);        return LOADER_ERROR;    }    close(fd);    buf[sb.st_size] = '\0';    commands = malloc(sizeof(*commands) * commandsAlloced);    start = buf;    while (*start && !inSection) {        line++;        if (!(end = strchr(start, '\n')))            end = start + strlen(start);        oldch = *end;        *end = '\0';        while (*start && isspace(*start)) start++;        chptr = end - 1;        while (chptr > start && isspace(*chptr)) chptr--;                if (isspace(*chptr))             *chptr = '\0';        else            *(chptr + 1) = '\0';        if (!*start || *start == '#' || !strncmp(start, "%include", 8)) {            /* keep parsing the file */        } else if (*start == '%') {            /* assumed - anything starting with %something is a section */            inSection = 1;        } else if  (*chptr == '\\') {            /* JKFIXME: this should be handled better, but at least we              * won't segfault now */        } else {            if (poptParseArgvString(start, &argc,                                     (const char ***) &argv) || !argc) {                newtWinMessage(_("Kickstart Error"), _("OK"),                                _("Error in %s on line %d of kickstart file %s."),                               argv[0], line, cmdFile);            } else {                for (cmd = ksTable; cmd->name; cmd++)                    if (!strcmp(cmd->name, argv[0])) break;                                if (cmd->name) {                    if (numCommands == commandsAlloced) {                        commandsAlloced += 5;                        commands = realloc(commands,                                           sizeof(*commands) * commandsAlloced);                    }                                        commands[numCommands].code = cmd->code;                    commands[numCommands].argc = argc;                    commands[numCommands].argv = argv;                    numCommands++;                }            }        }                if (oldch)            start = end + 1;        else            start = end;    }        return 0;}int ksHasCommand(int cmd) {    int i;    for(i = 0; i < numCommands; i++)	if (commands[i].code == cmd) return 1;    return 0;}int ksGetCommand(int cmd, char ** last, int * argc, char *** argv) {    int i = 0;        if (last) {        for (i = 0; i < numCommands; i++) {            if (commands[i].argv == last) break;        }                i++;    }    for (; i < numCommands; i++) {            if (commands[i].code == cmd) {            if (argv) *argv = commands[i].argv;            if (argc) *argc = commands[i].argc;            return 0;        }    }        return 1;}int kickstartFromFloppy(char *kssrc) {    struct device ** devices;    char *p, *kspath;    int i, rc;    logMessage(INFO, "doing kickstart from floppy");    devices = probeDevices(CLASS_FLOPPY, BUS_MISC | BUS_IDE | BUS_SCSI, PROBE_LOADED);    if (!devices) {        logMessage(ERROR, "no floppy devices");        return 1;    }    for (i = 0; devices[i]; i++) {        if (devices[i]->detached == 0) {            logMessage(INFO, "first non-detached floppy is %s", devices[i]->device);            break;        }    }    if (!devices[i] || (devices[i]->detached != 0)) {        logMessage(ERROR, "no floppy devices");        return 1;    }    /* format is floppy:[/path/to/ks.cfg] */    kspath = "";    p = strchr(kssrc, ':');    if (p)	kspath = p + 1;    if (!p || strlen(kspath) < 1)	kspath = "/ks.cfg";

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -