From 3ef4b2ee26bc41cdd392b1e3feb82ab6cf587669 Mon Sep 17 00:00:00 2001 From: Guillaume Cottenceau Date: Tue, 21 Nov 2000 17:14:00 +0000 Subject: first draft --- mdk-stage1/Makefile | 48 ++++---- mdk-stage1/init-data/emptyboot.img.bz2 | Bin 0 -> 6342 bytes .../init-data/msgboot-graphicallogo-2880.img.bz2 | Bin 0 -> 30301 bytes mdk-stage1/init-data/msgboot-graphicallogo.img.bz2 | Bin 0 -> 29067 bytes mdk-stage1/init-data/msgboot.img.bz2 | Bin 0 -> 30378 bytes mdk-stage1/init.c | 32 +++-- mdk-stage1/log.c | 74 ++++++++++++ mdk-stage1/log.h | 35 ++++++ mdk-stage1/stage1-data/stage1-with-sash.tar.bz2 | Bin 0 -> 345061 bytes mdk-stage1/stage1-data/stage1.tar.bz2 | Bin 0 -> 1998 bytes mdk-stage1/stage1.c | 129 +++++++++++++++++++++ 11 files changed, 277 insertions(+), 41 deletions(-) create mode 100644 mdk-stage1/init-data/emptyboot.img.bz2 create mode 100644 mdk-stage1/init-data/msgboot-graphicallogo-2880.img.bz2 create mode 100644 mdk-stage1/init-data/msgboot-graphicallogo.img.bz2 create mode 100644 mdk-stage1/init-data/msgboot.img.bz2 create mode 100644 mdk-stage1/log.c create mode 100644 mdk-stage1/log.h create mode 100644 mdk-stage1/stage1-data/stage1-with-sash.tar.bz2 create mode 100644 mdk-stage1/stage1-data/stage1.tar.bz2 create mode 100644 mdk-stage1/stage1.c diff --git a/mdk-stage1/Makefile b/mdk-stage1/Makefile index ca707070a..a1b2fc68f 100644 --- a/mdk-stage1/Makefile +++ b/mdk-stage1/Makefile @@ -29,7 +29,7 @@ ARCH := $(patsubst sparc%,sparc,$(ARCH)) #- We can leave "-g" forever since stripping will remove everything CFLAGS = -Os -g -Wall -Werror -fomit-frame-pointer INCLUDES = -I. -DEFS = -D_GNU_SOURCE=1 -DVERSION=\"$(VERSION)\" -DUSE_LOGDEV +DEFS = -D_GNU_SOURCE=1 -DVERSION=\"$(VERSION)\" -DUSE_LOGDEV -DSPAWN_SHELL COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CFLAGS) @@ -37,31 +37,32 @@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CFLAGS) #- stage1 "loader" INITSRC = minilibc.c init.c - #- stage1 itself -STAGE1SRC = #stage1.c cdrom.c devices.c +INITOBJS = $(subst .c,.o,$(INITSRC)) -ALLSRC = $(INITSRC) $(STAGE1SRC) + #- stage1 itself (minus stage1.c) +STAGE1SRC = log.c #cdrom.c devices.c + +STAGE1OBJS = $(subst .c,.o,$(STAGE1SRC)) + +ALLSRC = $(INITSRC) $(STAGE1SRC) -STATIC = -static ifeq (i386, $(ARCH)) -MINILIBC=minilibc.o -LDFLAGS = -nostdlib /usr/lib/crt1.o +MINILIC=minilibc.o +LDFLAGS_INIT = -static -nostdlib /usr/lib/crt1.o +LDFLAGS_STAGE1 = -static STATIC=-static -else +endif ifeq (sparc, $(ARCH)) MINILIBC=minilibc.o /usr/lib/libc.a -LDFLAGS = -nostdlib /usr/lib/crt1.o -STATIC=-static -else -STATIC=-static -endif +LDFLAGS_INIT = -static -nostdlib /usr/lib/crt1.o +LDFLAGS_STAGE1 = -static endif -BINS = init +BINS = init stage1-network #ifeq (i386, $(ARCH)) @@ -91,24 +92,27 @@ dirs: [ "$$n" = "." ] || make -C $$n ;\ done + +init: $(INITOBJS) + $(CC) $(LDFLAGS_INIT) -o $@ $(INITOBJS) + +stage1-network: $(STAGE1OBJS) stage1-network.o $(NETOBJS) + $(CC) $(LDFLAGS_STAGE1) -o $@ $(STAGE1OBJS) stage1-network.o $(NETOBJS) + + .c.o: $(COMPILE) -c $< -init: init.o $(MINILIBC) - $(CC) $(STATIC) $(LDFLAGS) -o $@ init.o $(MINILIBC) +stage1-network.o: stage1.c + $(COMPILE) -DNETWORK_INSTALL -o $@ -c $< -stage1-network: stage1-network.o $(OBJS) $(NETOBJS) - $(CC) -g $(STATIC) -o $@ $^ -lpopt \ - -lkudzu_loader ../isys/libisys.a ../balkan/libbalkan.a \ - $(MODULELINKAGE) \ - -lpump -lbz2 -lz -lresolv -lnewt -lslang -lpci clean: @echo -e "*** CLEANING in all directories\n" @for n in $(DIRS); do \ (cd $$n; make clean) \ done - rm -f *.o .depend $(BINS) + rm -f *.o .depend *.rdz *.img $(BINS) deps: $(CPP) $(CFLAGS) -DHAVE_CONFIG_H -M $(ALLSRC) > .depend diff --git a/mdk-stage1/init-data/emptyboot.img.bz2 b/mdk-stage1/init-data/emptyboot.img.bz2 new file mode 100644 index 000000000..6ae939c1b Binary files /dev/null and b/mdk-stage1/init-data/emptyboot.img.bz2 differ diff --git a/mdk-stage1/init-data/msgboot-graphicallogo-2880.img.bz2 b/mdk-stage1/init-data/msgboot-graphicallogo-2880.img.bz2 new file mode 100644 index 000000000..9d5d276fb Binary files /dev/null and b/mdk-stage1/init-data/msgboot-graphicallogo-2880.img.bz2 differ diff --git a/mdk-stage1/init-data/msgboot-graphicallogo.img.bz2 b/mdk-stage1/init-data/msgboot-graphicallogo.img.bz2 new file mode 100644 index 000000000..c650dce8b Binary files /dev/null and b/mdk-stage1/init-data/msgboot-graphicallogo.img.bz2 differ diff --git a/mdk-stage1/init-data/msgboot.img.bz2 b/mdk-stage1/init-data/msgboot.img.bz2 new file mode 100644 index 000000000..c5f3a7ed7 Binary files /dev/null and b/mdk-stage1/init-data/msgboot.img.bz2 differ diff --git a/mdk-stage1/init.c b/mdk-stage1/init.c index 6fbaac8be..7a0363c3f 100644 --- a/mdk-stage1/init.c +++ b/mdk-stage1/init.c @@ -58,7 +58,7 @@ int testing; void fatal_error(char *msg) { - printf("FATAL ERROR: %s\n\nI can't recover from this, please reboot manually and send bugreport.\n", msg); + printf("FATAL ERROR IN INIT: %s\n\nI can't recover from this, please reboot manually and send bugreport.\n", msg); while (1); } @@ -102,7 +102,6 @@ void doklog(char * fn) { print_error("error opening /tmp/syslog"); sleep(5); - close(in); return; } @@ -113,9 +112,12 @@ void doklog(char * fn) close(in); close(out); close(log); + sleep(1); return; } + printf("logging process forked.\n"); + close(0); close(1); close(2); @@ -205,8 +207,9 @@ void doklog(char * fn) readfd = accept(sock, (struct sockaddr *) &sockaddr, &s); if (readfd < 0) { - if (out >= 0) write(out, "error in accept\n", 16); - write(log, "error in accept\n", 16); + char * msg_error = "error in accept\n"; + if (out >= 0) write(out, msg_error, strlen(msg_error)); + write(log, msg_error, strlen(msg_error)); close(sock); sock = -1; } @@ -387,21 +390,21 @@ int main(int argc, char **argv) int fd; int abnormal_termination = 0; int end_stage2 = 0; - char * child_argv[20]; /* getpid() != 1 should work, by linuxrc tends to get a larger pid */ testing = (getpid() > 50); - printf("*** TESTING MODE ***\n"); - if (!testing) { /* turn off screen blanking */ printf("\033[9;0]"); printf("\033[8]"); } + else + printf("*** TESTING MODE ***\n"); + - printf("--- Hi. Linux-Mandrake install initializer starting. ---\n"); + printf("\n--- Hi. Linux-Mandrake install initializer starting. ---\n"); printf("VERSION: %s\n", VERSION); @@ -453,7 +456,6 @@ int main(int argc, char **argv) if (!testing) doklog("/dev/tty4"); - /* Go into normal init mode - keep going, and then do a orderly shutdown when: @@ -466,17 +468,9 @@ int main(int argc, char **argv) if (!(installpid = fork())) { /* child */ - int index; + char * child_argv[2]; child_argv[0] = "/sbin/stage1"; - - index = 1; - while (argv[index]) - { - /* should be strdup but I don't have malloc */ - child_argv[index] = argv[index]; - index++; - } - child_argv[index] = NULL; + child_argv[1] = NULL; printf("execing: %s\n", child_argv[0]); execve(child_argv[0], child_argv, env); diff --git a/mdk-stage1/log.c b/mdk-stage1/log.c new file mode 100644 index 000000000..27e77bf02 --- /dev/null +++ b/mdk-stage1/log.c @@ -0,0 +1,74 @@ +/* + * 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 "log.h" + +static FILE * logfile = NULL; + + +void do_log_message(const char * s, va_list args) +{ + if (!logfile) return; + + fprintf(logfile, "* "); + vfprintf(logfile, s, args); + fprintf(logfile, "\n"); + + fflush(logfile); +} + + +void log_message(const char * s, ...) +{ + va_list args; + + va_start(args, s); + do_log_message(s, args); + va_end(args); + + return; +} + + +void open_log(int testing) +{ + if (!testing) + { + logfile = fopen("/dev/tty3", "w"); + if (!logfile) + logfile = fopen("/tmp/install.log", "a"); + } + else + logfile = fopen("debug.log", "w"); +} + +void close_log(void) +{ + if (logfile) + fclose(logfile); +} diff --git a/mdk-stage1/log.h b/mdk-stage1/log.h new file mode 100644 index 000000000..61daa41be --- /dev/null +++ b/mdk-stage1/log.h @@ -0,0 +1,35 @@ +/* + * 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 _LOG_H_ +#define _LOG_H_ + +#include + +extern FILE * log; +extern int logfd; + +void log_message(const char * s, ...); +void open_log(int useLocal); +void close_log(void); + +#endif diff --git a/mdk-stage1/stage1-data/stage1-with-sash.tar.bz2 b/mdk-stage1/stage1-data/stage1-with-sash.tar.bz2 new file mode 100644 index 000000000..1398f0146 Binary files /dev/null and b/mdk-stage1/stage1-data/stage1-with-sash.tar.bz2 differ diff --git a/mdk-stage1/stage1-data/stage1.tar.bz2 b/mdk-stage1/stage1-data/stage1.tar.bz2 new file mode 100644 index 000000000..29dd9cad1 Binary files /dev/null and b/mdk-stage1/stage1-data/stage1.tar.bz2 differ diff --git a/mdk-stage1/stage1.c b/mdk-stage1/stage1.c new file mode 100644 index 000000000..16b848a9c --- /dev/null +++ b/mdk-stage1/stage1.c @@ -0,0 +1,129 @@ +/* + * 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 +#include +#include + +#include "log.h" + + +int testing; + + +void fatal_error(char *msg) +{ + printf("FATAL ERROR IN STAGE1: %s\n\nI can't recover from this, please reboot manually and send bugreport.\n", 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"); + + size = read(fd, buf, sizeof(buf) - 1); + buf[size] = '\0'; + close(fd); + + log_message("\t%s", buf); +} + + +#ifdef SPAWN_SHELL +/* spawns a shell on console #2 */ +void spawn_shell(void) +{ + pid_t pid; + int fd; + char * shell_name = "/sbin/sash"; + + if (!testing) + { + fd = open("/dev/tty2", O_RDWR); + if (fd < 0) + { + 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; + } + + if (!(pid = fork())) + { + dup2(fd, 0); + dup2(fd, 1); + dup2(fd, 2); + + close(fd); + 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"); +} +#endif + + +int +main(int argc, char **argv) +{ + /* getpid() != 1 should work, by linuxrc tends to get a larger pid */ + testing = (getpid() > 50); + + open_log(testing); + + log_message("welcome to the Linux-Mandrake install (stage1, version " VERSION " built " __DATE__ " " __TIME__")"); + + process_cmdline(); + spawn_shell(); + + + printf("Temporary end of stage1 binary -- entering an infinite loop\n"); + log_message("Temporary end of stage1 binary -- entering an infinite loop"); + while(1); + + return 0; +} -- cgit v1.2.1