From 2c34d1a1a491861b68b76d6dbb449771d1cf114c Mon Sep 17 00:00:00 2001 From: Guillaume Cottenceau Date: Fri, 8 Dec 2000 19:26:57 +0000 Subject: mdk-stage1 can now run the Install from CDROM --- mdk-stage1/Makefile | 2 +- mdk-stage1/cdrom.c | 38 +++++++++++-- mdk-stage1/frontend.h | 1 + mdk-stage1/log.c | 9 ++-- mdk-stage1/log.h | 2 +- mdk-stage1/mount.c | 68 ++++++++++++++++++++++++ mdk-stage1/mount.h | 27 ++++++++++ mdk-stage1/newt-frontend.c | 13 +++++ mdk-stage1/probing.c | 1 - mdk-stage1/stage1-data/stage1-with-sash.tar.bz2 | Bin 345061 -> 346027 bytes mdk-stage1/stage1.c | 29 ++++++++-- mdk-stage1/stage1.h | 3 ++ 12 files changed, 178 insertions(+), 15 deletions(-) create mode 100644 mdk-stage1/mount.c create mode 100644 mdk-stage1/mount.h diff --git a/mdk-stage1/Makefile b/mdk-stage1/Makefile index beefda163..7e02acb78 100644 --- a/mdk-stage1/Makefile +++ b/mdk-stage1/Makefile @@ -41,7 +41,7 @@ INITOBJS = $(subst .c,.o,$(INITSRC)) #- stage1 itself (minus stage1.c) -STAGE1SRC = log.c tools.c modules.c probing.c newt-frontend.c cdrom.c disk.c network.c +STAGE1SRC = log.c tools.c modules.c probing.c newt-frontend.c cdrom.c disk.c network.c mount.c STAGE1OBJS = $(subst .c,.o,$(STAGE1SRC)) insmod-busybox/libinsmod.a mar/libmar.a /usr/lib/libnewt.a /usr/lib/libslang.a /usr/lib/libz.a diff --git a/mdk-stage1/cdrom.c b/mdk-stage1/cdrom.c index e794dc9f5..1ac84979c 100644 --- a/mdk-stage1/cdrom.c +++ b/mdk-stage1/cdrom.c @@ -21,20 +21,48 @@ #include #include +#include +#include #include "stage1.h" #include "frontend.h" #include "modules.h" #include "probing.h" #include "log.h" +#include "mount.h" #include "cdrom.h" + + static enum return_type try_with_device(char *dev_name) { - log_message("with dev %s", dev_name); + char device_fullname[50]; - error_message("Should be trying with sucking device."); + strcpy(device_fullname, "/dev/"); + strcat(device_fullname, dev_name); + if (my_mount(device_fullname, "/tmp/image", "iso9660") == -1) { + enum return_type results; + results = ask_yes_no("I can't access a CDROM disc in your drive.\nRetry?"); + if (results == RETURN_OK) + return try_with_device(dev_name); + return results; + } + + if (access("/tmp/image/Mandrake", R_OK)) { + enum return_type results; + umount("/tmp/image"); + results = ask_yes_no("That CDROM disc does not seem to be a Linux-Mandrake Installation CDROM.\nRetry with another disc?"); + if (results == RETURN_OK) + return try_with_device(dev_name); + return results; + } + + log_message("found a Linux-Mandrake CDROM, good news!"); +/* + if (special_stage2 || total_memory() > 52 * 1024) loadMdkinstStage2(); + if (rescue) umount("/tmp/rhimage"); +*/ return RETURN_OK; } @@ -50,10 +78,11 @@ enum return_type cdrom_prepare(void) my_insmod("isofs"); medias = get_medias(CDROM, QUERY_NAME); + medias_models = get_medias(CDROM, QUERY_MODEL); ptr = medias; while (ptr && *ptr) { - log_message("found CDROM %s", *ptr); + log_message("have CDROM %s", *ptr); count++; ptr++; } @@ -67,6 +96,7 @@ enum return_type cdrom_prepare(void) } if (count == 1) { + log_message("Only one CDROM detected: %s (%s)", *medias, *medias_models); results = try_with_device(*medias); if (results == RETURN_OK) return RETURN_OK; @@ -76,8 +106,6 @@ enum return_type cdrom_prepare(void) return cdrom_prepare(); } - medias_models = get_medias(CDROM, QUERY_MODEL); - results = ask_from_list_comments("Please choose the CDROM drive to use for the installation.", medias, medias_models, &choice); if (results != RETURN_OK) diff --git a/mdk-stage1/frontend.h b/mdk-stage1/frontend.h index 27b858a51..95f5fb58f 100644 --- a/mdk-stage1/frontend.h +++ b/mdk-stage1/frontend.h @@ -28,6 +28,7 @@ void error_message(char *msg); void wait_message(char *msg, ...); void remove_wait_message(void); +enum return_type ask_yes_no(char *msg); enum return_type ask_from_list(char *msg, char ** elems, char ** choice); enum return_type ask_from_list_comments(char *msg, char ** elems, char ** elems_comments, char ** choice); diff --git a/mdk-stage1/log.c b/mdk-stage1/log.c index 7536d0a08..173ebe520 100644 --- a/mdk-stage1/log.c +++ b/mdk-stage1/log.c @@ -27,6 +27,7 @@ #include #include #include +#include "stage1.h" #include "log.h" @@ -68,9 +69,9 @@ void log_perror(char *msg) } -void open_log(int testing) +void open_log(void) { - if (!testing) { + if (!IS_TESTING) { logfile = fopen("/dev/tty3", "w"); if (!logfile) logfile = fopen("/tmp/install.log", "a"); @@ -81,6 +82,8 @@ void open_log(int testing) void close_log(void) { - if (logfile) + if (logfile) { + log_message("stage1: disconnecting life support systems"); fclose(logfile); + } } diff --git a/mdk-stage1/log.h b/mdk-stage1/log.h index 9be73e83c..65e0a2416 100644 --- a/mdk-stage1/log.h +++ b/mdk-stage1/log.h @@ -29,7 +29,7 @@ void log_message(const char * s, ...); void vlog_message(const char * s, va_list args); void vlog_message_nobs(const char * s, va_list args); void log_perror(char *msg); -void open_log(int useLocal); +void open_log(void); void close_log(void); #endif diff --git a/mdk-stage1/mount.c b/mdk-stage1/mount.c new file mode 100644 index 000000000..9a5dfca55 --- /dev/null +++ b/mdk-stage1/mount.c @@ -0,0 +1,68 @@ +/* + * Guillaume Cottenceau (gc@mandrakesoft.com) + * + * Copyright 2000 MandrakeSoft + * + * 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. + * + */ + +/* + * Portions from Erik Troan (ewt@redhat.com) + * + * Copyright 1996 Red Hat Software + * + */ + +#include +#include +#include +#include +#include +#include +#include "log.h" + +#include "mount.h" + + +int my_mount(char *dev, char *location, char *fs) +{ + unsigned long flags; + char * opts = NULL; + struct stat buf; + + log_message("mounting %s on %s as type %s", dev, location, fs); + + if (stat(location, &buf)) { + log_message("creating dir %s", location); + if (mkdir(location, 0755)) { + log_message("could not create location dir"); + return -1; + } + } else if (!S_ISDIR(buf.st_mode)) { + log_message("not a dir %s, will unlink and mkdir", location); + if (unlink(location)) { + log_message("could not unlink %s", location); + return -1; + } + if (mkdir(location, 0755)) { + log_message("could not create location dir"); + return -1; + } + } + + flags = MS_MGC_VAL; + + if (!strcmp(fs, "vfat")) + opts = "check=relaxed"; + + if (!strcmp(fs, "iso9660")) + flags |= MS_RDONLY; + + return mount(dev, location, fs, flags, opts); +} diff --git a/mdk-stage1/mount.h b/mdk-stage1/mount.h new file mode 100644 index 000000000..6ab4da559 --- /dev/null +++ b/mdk-stage1/mount.h @@ -0,0 +1,27 @@ +/* + * Guillaume Cottenceau (gc@mandrakesoft.com) + * + * Copyright 2000 MandrakeSoft + * + * 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. + * + */ + +/* + * Portions from Erik Troan (ewt@redhat.com) + * + * Copyright 1996 Red Hat Software + * + */ + +#ifndef _MOUNT_H_ +#define _MOUNT_H_ + +int my_mount(char *dev, char *location, char *fs); + +#endif diff --git a/mdk-stage1/newt-frontend.c b/mdk-stage1/newt-frontend.c index 2c7e5434b..9321108d6 100644 --- a/mdk-stage1/newt-frontend.c +++ b/mdk-stage1/newt-frontend.c @@ -147,3 +147,16 @@ enum return_type ask_from_list(char *msg, char ** elems, char ** choice) return RETURN_OK; } + +enum return_type ask_yes_no(char *msg) +{ + int rc; + + rc = newtWinTernary("Please answer..", "Yes", "No", "Back", msg); + + if (rc == 1) + return RETURN_OK; + else if (rc == 3) + return RETURN_BACK; + else return RETURN_ERROR; +} diff --git a/mdk-stage1/probing.c b/mdk-stage1/probing.c index 29ffdcd7c..e2bd61aae 100644 --- a/mdk-stage1/probing.c +++ b/mdk-stage1/probing.c @@ -48,7 +48,6 @@ static void pci_probing(enum driver_type type) error_message("You should be asked if you have some SCSI."); } else { wait_message("Installing SCSI module..."); - my_insmod("advansys"); remove_wait_message(); } } diff --git a/mdk-stage1/stage1-data/stage1-with-sash.tar.bz2 b/mdk-stage1/stage1-data/stage1-with-sash.tar.bz2 index 1398f0146..52c15a238 100644 Binary files a/mdk-stage1/stage1-data/stage1-with-sash.tar.bz2 and b/mdk-stage1/stage1-data/stage1-with-sash.tar.bz2 differ diff --git a/mdk-stage1/stage1.c b/mdk-stage1/stage1.c index 16d896f3b..f984b3058 100644 --- a/mdk-stage1/stage1.c +++ b/mdk-stage1/stage1.c @@ -46,8 +46,9 @@ /* globals */ -int stage1_mode = 0; struct cmdline_elem params[500]; +int stage1_mode = 0; +char * method_name; void fatal_error(char *msg) @@ -200,11 +201,14 @@ enum return_type method_select_and_prepare(void) int main(int argc, char **argv) { enum return_type ret; + char ** argptr; + char * stage2_args[30]; + if (getpid() > 50) stage1_mode |= MODE_TESTING; - open_log(IS_TESTING); + open_log(); log_message("welcome to the Linux-Mandrake install (stage1, version " VERSION " built " __DATE__ " " __TIME__")"); @@ -224,10 +228,27 @@ int main(int argc, char **argv) ret = method_select_and_prepare(); finish_frontend(); - close_log(); if (ret == RETURN_ERROR) fatal_error("could not select an installation method"); - return 0; + if (!IS_LIVE) { + if (symlink("/tmp/image/Mandrake/mdkinst", "/tmp/stage2") != 0) + fatal_error("symlink to /tmp/stage2 failed"); + } + + close_log(); + + argptr = stage2_args; + *argptr++ = "/usr/bin/runinstall2"; + *argptr++ = "--method"; + *argptr++ = method_name; + *argptr++ = NULL; + + execv(stage2_args[0], stage2_args); + + printf("error in exec of stage2 :-("); + fatal_error(strerror(errno)); + + return 0; /* shut up compiler (we can't get here) */ } diff --git a/mdk-stage1/stage1.h b/mdk-stage1/stage1.h index 108fe14aa..2f193a065 100644 --- a/mdk-stage1/stage1.h +++ b/mdk-stage1/stage1.h @@ -37,6 +37,7 @@ extern struct cmdline_elem params[500]; enum return_type { RETURN_OK, RETURN_BACK, RETURN_ERROR }; extern int stage1_mode; +extern char * method_name; #define MODE_TESTING (1 << 0) #define MODE_EXPERT (1 << 1) @@ -45,6 +46,7 @@ extern int stage1_mode; #define MODE_KICKSTART (1 << 4) #define MODE_PCMCIA (1 << 5) #define MODE_CDROM (1 << 6) +#define MODE_LIVE (1 << 7) #define IS_TESTING ((stage1_mode) & MODE_TESTING) #define IS_EXPERT ((stage1_mode) & MODE_EXPERT) @@ -53,6 +55,7 @@ extern int stage1_mode; #define IS_KICKSTART ((stage1_mode) & MODE_KICKSTART) #define IS_PCMCIA ((stage1_mode) & MODE_PCMCIA) #define IS_CDROM ((stage1_mode) & MODE_CDROM) +#define IS_LIVE ((stage1_mode) & MODE_LIVE) void fatal_error(char *msg); -- cgit v1.2.1