diff options
author | Roland McGrath <roland@gnu.org> | 2001-08-20 22:44:13 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2001-08-20 22:44:13 +0000 |
commit | 316d5f8c58fb7ebc3d9ab31bfd2fde869ff80358 (patch) | |
tree | ef469d36745d422f2a6987626ea8854edd526e4c | |
parent | 273b1e42491dfd89c318b6dae43901f429d2b51e (diff) |
2001-08-20 Roland McGrath <roland@frob.com>
* opts-std-startup.c: diskfs_boot_flags -> diskfs_boot_command_line.
(OPT_BOOT_CMDLINE): Renamed from OPT_BOOTFLAGS.
(startup_options): --bootflags -> --multiboot-command-line
(parse_startup_opt): Parse it.
* diskfs.h: diskfs_boot_flags -> diskfs_boot_command_line.
(diskfs_boot_filesystem): New macro.
* init-main.c (diskfs_init_main): Use it.
* init-init.c (diskfs_init_diskfs): Likewise.
* console.c (diskfs_console_stdio): Likewise.
* boot-start.c (_diskfs_boot_privports): Likewise.
(diskfs_start_bootstrap): Split boot_command_line into words and pass
those arguments to init instead of diskfs_bootflags.
* diskfs.h: Declare it.
* boot-start.c (diskfs_start_bootstrap, start_execserver): Use it.
* boot-start.c (diskfs_boot_init_program): New variable.
* diskfs.h: Declare it.
* boot-start.c (default_init): Variable removed.
(diskfs_start_bootstrap): Use diskfs_boot_init_program instead
of default_init or prompting under -i.
* opts-std-startup.c (OPT_BOOT_INIT_PROGRAM): New macro.
(startup_options): Add --boot-init-program.
(parse_startup_opt): Parse it.
-rw-r--r-- | libdiskfs/boot-start.c | 61 | ||||
-rw-r--r-- | libdiskfs/diskfs.h | 16 |
2 files changed, 29 insertions, 48 deletions
diff --git a/libdiskfs/boot-start.c b/libdiskfs/boot-start.c index 829994d1..a2e7fb4e 100644 --- a/libdiskfs/boot-start.c +++ b/libdiskfs/boot-start.c @@ -1,5 +1,5 @@ /* - Copyright (C) 1993,94,95,96,97,98,99,2000 Free Software Foundation, Inc. + Copyright (C) 1993,94,95,96,97,98,99,2000,01 Free Software Foundation, Inc. This file is part of the GNU Hurd. @@ -42,7 +42,7 @@ static task_t parent_task = MACH_PORT_NULL; static struct mutex execstartlock; static struct condition execstarted; -static char *default_init = "hurd/init"; +const char *diskfs_boot_init_program = _HURD_INIT; static void start_execserver (); @@ -68,7 +68,7 @@ get_console () void _diskfs_boot_privports (void) { - assert (diskfs_boot_flags); + assert (diskfs_boot_filesystem ()); if (_hurd_host_priv == MACH_PORT_NULL) { /* We are the boot command run by the real bootstrap filesystem. @@ -96,7 +96,8 @@ diskfs_start_bootstrap () mach_port_t fdarray[3]; /* XXX */ task_t newt; error_t err; - char *exec_argv, *exec_env, *initname; + char *exec_argv, *exec_env; + const char *initname; size_t exec_argvlen, exec_envlen; struct port_info *bootinfo; struct protid *rootpi; @@ -201,44 +202,16 @@ diskfs_start_bootstrap () else { /* Choose the name of the startup server to execute. */ - char *initnamebuf; - if (index (diskfs_boot_flags, 'i')) - { - size_t bufsz; - ssize_t len; - initname = default_init; - prompt: - initnamebuf = NULL; - printf ("\nInit name [%s]: ", initname); - fflush (stdout); - bufsz = 0; - switch (len = getline (&initnamebuf, &bufsz, stdin)) - { - case -1: - perror ("getline"); - printf ("Using default of `%s'.\n", initname); - case 0: /* Hmm. */ - case 1: /* Empty line, just a newline. */ - /* Use default. */ - break; - default: - initnamebuf[len - 1] = '\0'; /* Remove the newline. */ - initname = initnamebuf; - while (*initname == '/') - initname++; - break; - } - } - else - { - initname = default_init; - initnamebuf = NULL; - } + initname = diskfs_boot_init_program; + while (*initname == '/') + initname++; + + exec_argvlen = asprintf (&exec_argv, "/%s%c", initname, '\0'); + assert (exec_argvlen != -1); + err = argz_add_sep (&exec_argv, &exec_argvlen, + diskfs_boot_command_line, ' '); + assert_perror (err); - exec_argvlen = asprintf (&exec_argv, "/%s%c%s%c", - initname, '\0', diskfs_boot_flags, '\0'); - if (initname != default_init) - free (initnamebuf); initname = exec_argv + 1; } @@ -250,7 +223,7 @@ diskfs_start_bootstrap () initname, strerror (err)); fflush (stdout); free (exec_argv); - goto prompt; + assert_perror (err); /* XXX this won't reboot properly */ } assert (retry == FS_RETRY_NORMAL); assert (pathbuf[0] == '\0'); @@ -275,7 +248,7 @@ diskfs_start_bootstrap () err = task_create (mach_task_self (), 0, &newt); assert_perror (err); - if (index (diskfs_boot_flags, 'd')) + if (_diskfs_boot_pause) { printf ("pausing for %s...\n", exec_argv); getc (stdin); @@ -641,7 +614,7 @@ start_execserver (void) task_set_special_port (diskfs_exec_server_task, TASK_BOOTSTRAP_PORT, right); mach_port_deallocate (mach_task_self (), right); - if (index (diskfs_boot_flags, 'd')) + if (_diskfs_boot_pause) { printf ("pausing for exec\n"); getc (stdin); diff --git a/libdiskfs/diskfs.h b/libdiskfs/diskfs.h index c067f576..d32484da 100644 --- a/libdiskfs/diskfs.h +++ b/libdiskfs/diskfs.h @@ -149,10 +149,18 @@ extern mach_port_t diskfs_fsys_identity; file systems, to give the procserver. */ extern char **diskfs_argv; -/* When this is a bootstrap filesystem, the command line options passed from - the kernel. If not a bootstrap filesystem, it is 0, so it can be used to - distinguish between the two cases. */ -extern char *diskfs_boot_flags; +/* When this is a bootstrap filesystem, the multiboot kernel command line + passed from the kernel. If not a bootstrap filesystem, it is 0, so it + can be used to distinguish between the two cases. */ +extern const char *diskfs_boot_command_line; +#define diskfs_boot_filesystem() (diskfs_boot_command_line != 0) + +/* When this is a bootstrap filesystem, nonzero if starting each bootstrap + program should pause for a keystroke, for debugging purposes. */ +extern int _diskfs_boot_pause; + +/* Name of the init program run when this is a bootstrap filesystem. */ +extern const char *diskfs_boot_init_program; /* Hold this lock while do fsys level operations. Innocuous users can just hold a reader lock, and anyone who's going to do nasty things that would |