diff options
Diffstat (limited to 'loader/kickstart.c')
-rw-r--r-- | loader/kickstart.c | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/loader/kickstart.c b/loader/kickstart.c new file mode 100644 index 000000000..1caaf9a2a --- /dev/null +++ b/loader/kickstart.c @@ -0,0 +1,166 @@ +#include <alloca.h> +#include <ctype.h> +#include <errno.h> +#include <fcntl.h> +#include <sys/stat.h> +#include <sys/wait.h> +#include <stdlib.h> +#include <string.h> +#include <newt.h> +#include <popt.h> +#include <unistd.h> + +#include "lang.h" +#include "loader.h" +#include "kickstart.h" + +struct ksCommandNames { + int code; + char * name; +} ; + +struct ksCommand { + int code, argc; + char ** argv; +}; + +struct ksCommandNames ksTable[] = { + { KS_CMD_NFS, "nfs" }, + { KS_CMD_CDROM, "cdrom" }, + { KS_CMD_HD, "harddrive" }, + { KS_CMD_URL, "url" }, + { KS_CMD_NETWORK, "network" }, + { KS_CMD_DEVICE, "device" }, + { KS_CMD_NONE, 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 inPackages = 0; + struct ksCommandNames * cmd; + int commandsAlloced = 5; + + if ((fd = open(cmdFile, O_RDONLY)) < 0) { + 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) { + 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 && !inPackages) { + 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 == '#') { + /* no nothing */ + } else if (!strcmp(start, "%packages")) { + inPackages = 1; + } else { + if (poptParseArgvString(start, &argc, &argv) || !argc) { + newtWinMessage(_("Kickstart Error"), _("Ok"), + _("Error 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 = 0; + + while (i < numCommands) { + if (commands[i].code == cmd) return 1; + i++; + } + + 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++; + } + + while (i < numCommands) { + if (commands[i].code == cmd) { + if (argv) *argv = commands[i].argv; + if (argc) *argc = commands[i].argc; + return 0; + } + i++; + } + + return 1; +} |