diff options
Diffstat (limited to 'mdk-stage1/stage1.c')
-rw-r--r-- | mdk-stage1/stage1.c | 180 |
1 files changed, 142 insertions, 38 deletions
diff --git a/mdk-stage1/stage1.c b/mdk-stage1/stage1.c index 16b848a9c..16d896f3b 100644 --- a/mdk-stage1/stage1.c +++ b/mdk-stage1/stage1.c @@ -19,6 +19,7 @@ * */ +#include <sys/mount.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> @@ -29,11 +30,24 @@ #include <stdio.h> #include <string.h> #include <errno.h> +#include <ctype.h> + +#include "stage1.h" #include "log.h" +#include "probing.h" +#include "frontend.h" +#include "modules.h" + +#include "cdrom.h" +#include "network.h" +#include "disk.h" + +/* globals */ -int testing; +int stage1_mode = 0; +struct cmdline_elem params[500]; void fatal_error(char *msg) @@ -42,26 +56,63 @@ void fatal_error(char *msg) while (1); } + void process_cmdline(void) { - char buf[512]; - int fd; - int size; - - - log_message("opening /proc/cmdline... "); - - if ((fd = open("/proc/cmdline", O_RDONLY, 0)) < 0) fatal_error("could not open /proc/cmdline"); + char buf[512]; + int fd, size, i, p; + + log_message("opening /proc/cmdline... "); + + if ((fd = open("/proc/cmdline", O_RDONLY, 0)) == -1) + fatal_error("could not open /proc/cmdline"); + + size = read(fd, buf, sizeof(buf)); + buf[size-1] = 0; + close(fd); + + log_message("\t%s", buf); + + i = 0; p = 0; + while (buf[i] != 0) { + char *name, *value = NULL; + int j = i; + while (buf[i] != ' ' && buf[i] != '=' && buf[i] != 0) + i++; + if (i == j) { + i++; + continue; + } + name = (char *) malloc(i-j + 1); + memcpy(name, &buf[j], i-j); + name[i-j] = 0; + + if (buf[i] == '=') { + int k = i+1; + i++; + while (buf[i] != ' ' && buf[i] != 0) + i++; + value = (char *) malloc(i-k + 1); + memcpy(value, &buf[k], i-k); + value[i-k] = 0; + } - size = read(fd, buf, sizeof(buf) - 1); - buf[size] = '\0'; - close(fd); + params[p].name = name; + params[p].value = value; + p++; + i++; + if (!strcmp(name, "expert")) stage1_mode |= MODE_EXPERT; + if (!strcmp(name, "text")) stage1_mode |= MODE_TEXT; + if (!strcmp(name, "rescue")) stage1_mode |= MODE_RESCUE; + if (!strcmp(name, "pcmcia")) stage1_mode |= MODE_PCMCIA; + if (!strcmp(name, "cdrom")) stage1_mode |= MODE_CDROM; + } + params[p].name = NULL; - log_message("\t%s", buf); + log_message("\tgot %d args", p); } -#ifdef SPAWN_SHELL /* spawns a shell on console #2 */ void spawn_shell(void) { @@ -69,23 +120,20 @@ void spawn_shell(void) int fd; char * shell_name = "/sbin/sash"; - if (!testing) - { + log_message("spawning a shell.."); + + if (!IS_TESTING) { fd = open("/dev/tty2", O_RDWR); - if (fd < 0) - { + if (fd == -1) { log_message("cannot open /dev/tty2 -- no shell will be provided"); return; } - else - if (access(shell_name, X_OK)) - { - log_message("cannot open shell - /usr/bin/sh doesn't exist"); - return; - } + else if (access(shell_name, X_OK)) { + log_message("cannot open shell - %s doesn't exist", shell_name); + return; + } - if (!(pid = fork())) - { + if (!(pid = fork())) { dup2(fd, 0); dup2(fd, 1); dup2(fd, 2); @@ -94,36 +142,92 @@ void spawn_shell(void) setsid(); if (ioctl(0, TIOCSCTTY, NULL)) perror("could not set new controlling tty"); - + execl(shell_name, shell_name, NULL); log_message("execl of %s failed: %s", shell_name, strerror(errno)); } close(fd); } - else - log_message("I should be spawning a shell"); } + +enum return_type method_select_and_prepare(void) +{ + char * disk_install = "Hard disk"; + char * cdrom_install = "CDROM drive"; + char * network_nfs_install = "NFS server"; + char * network_ftp_install = "FTP server"; + char * network_http_install = "HTTP server"; + enum return_type results; + char * choice; + char * means[10]; + int i; + + i = 0; +#ifndef DISABLE_NETWORK + means[i] = network_nfs_install; i++; + means[i] = network_ftp_install; i++; + means[i] = network_http_install; i++; +#endif +#ifndef DISABLE_DISK + means[i] = disk_install; i++; +#endif +#ifndef DISABLE_CDROM + means[i] = cdrom_install; i++; #endif + means[i] = NULL; + results = ask_from_list("Please choose the mean of installation.", means, &choice); + + if (results != RETURN_OK) + return results; + + if (!strcmp(choice, cdrom_install)) + return cdrom_prepare(); + else if (!strcmp(choice, disk_install)) + return disk_prepare(); + else if (!strcmp(choice, network_nfs_install)) + return nfs_prepare(); + else if (!strcmp(choice, network_ftp_install)) + return ftp_prepare(); + else if (!strcmp(choice, network_http_install)) + return http_prepare(); + + return RETURN_ERROR; +} -int -main(int argc, char **argv) + +int main(int argc, char **argv) { - /* getpid() != 1 should work, by linuxrc tends to get a larger pid */ - testing = (getpid() > 50); + enum return_type ret; + + if (getpid() > 50) + stage1_mode |= MODE_TESTING; - open_log(testing); + open_log(IS_TESTING); log_message("welcome to the Linux-Mandrake install (stage1, version " VERSION " built " __DATE__ " " __TIME__")"); process_cmdline(); spawn_shell(); + if (load_modules_dependencies()) + fatal_error("could not open and parse modules dependencies"); - - printf("Temporary end of stage1 binary -- entering an infinite loop\n"); - log_message("Temporary end of stage1 binary -- entering an infinite loop"); - while(1); + init_frontend(); + + if (IS_CDROM) + ret = cdrom_prepare(); + else + ret = method_select_and_prepare(); + + while (ret == RETURN_BACK) + ret = method_select_and_prepare(); + + finish_frontend(); + close_log(); + + if (ret == RETURN_ERROR) + fatal_error("could not select an installation method"); return 0; } |