📄 kickstart.c
字号:
/* * 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 + -