Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sbin/init Rename MSDOSFS_ROOT to MFS_DEV_IF_NO_CONSOLE, and ...
details: https://anonhg.NetBSD.org/src/rev/1e880983315a
branches: trunk
changeset: 520968:1e880983315a
user: abs <abs%NetBSD.org@localhost>
date: Mon Jan 21 15:57:40 2002 +0000
description:
Rename MSDOSFS_ROOT to MFS_DEV_IF_NO_CONSOLE, and rework:
- Always attempt mfs dev if missing /dev/console
- Save and run both MAKEDEV and MAKEDEV.local
- After creating the mfs dev, mknod() and freopen() /dev/console.
- If MAKEDEV is missing do not fail out early, but still create the mfs,
/dev/console.
- If we hit any errors fail out to single user.
This change _only_ affects systems booting without /dev/console.
diffstat:
sbin/init/Makefile | 4 +-
sbin/init/init.c | 148 +++++++++++++++++++++++++++-------------------------
2 files changed, 79 insertions(+), 73 deletions(-)
diffs (247 lines):
diff -r 2c4ec1d34d7f -r 1e880983315a sbin/init/Makefile
--- a/sbin/init/Makefile Mon Jan 21 15:55:36 2002 +0000
+++ b/sbin/init/Makefile Mon Jan 21 15:57:40 2002 +0000
@@ -1,11 +1,11 @@
-# $NetBSD: Makefile,v 1.25 2001/12/28 01:32:40 lukem Exp $
+# $NetBSD: Makefile,v 1.26 2002/01/21 15:57:40 abs Exp $
# @(#)Makefile 8.1 (Berkeley) 7/19/93
PROG= init
MAN= init.8
DPADD= ${LIBUTIL} ${LIBCRYPT}
LDADD= -lutil -lcrypt
-CPPFLAGS+=-DALTSHELL -DSECURE -DMSDOSFS_ROOT
+CPPFLAGS+=-DALTSHELL -DSECURE -DMFS_DEV_IF_NO_CONSOLE
.include <bsd.prog.mk>
diff -r 2c4ec1d34d7f -r 1e880983315a sbin/init/init.c
--- a/sbin/init/init.c Mon Jan 21 15:55:36 2002 +0000
+++ b/sbin/init/init.c Mon Jan 21 15:57:40 2002 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: init.c,v 1.44 2002/01/16 18:30:57 abs Exp $ */
+/* $NetBSD: init.c,v 1.45 2002/01/21 15:57:40 abs Exp $ */
/*-
* Copyright (c) 1991, 1993
@@ -46,7 +46,7 @@
#if 0
static char sccsid[] = "@(#)init.c 8.2 (Berkeley) 4/28/95";
#else
-__RCSID("$NetBSD: init.c,v 1.44 2002/01/16 18:30:57 abs Exp $");
+__RCSID("$NetBSD: init.c,v 1.45 2002/01/21 15:57:40 abs Exp $");
#endif
#endif /* not lint */
@@ -173,8 +173,8 @@
session_t *find_session(pid_t);
DB *session_db;
-#ifdef MSDOSFS_ROOT
-static void msdosfs_root(void);
+#ifdef MFS_DEV_IF_NO_CONSOLE
+static int mfs_dev(void);
#endif
/*
@@ -213,8 +213,9 @@
warn("setlogin() failed");
-#ifdef MSDOSFS_ROOT
- msdosfs_root();
+#ifdef MFS_DEV_IF_NO_CONSOLE
+ if (mfs_dev() == -1)
+ requested_transition = single_user;
#endif
#ifndef LETS_GET_SMALL
@@ -1274,44 +1275,47 @@
}
#endif /* LETS_GET_SMALL */
-#ifdef MSDOSFS_ROOT
+#ifdef MFS_DEV_IF_NO_CONSOLE
-static void
-msdosfs_root(void)
+static int
+mfs_dev(void)
{
/*
* We cannot print errors so we bail out silently...
*/
- int fd = -1;
+ int fd;
struct stat st;
pid_t pid;
int status;
- void *ptr;
- struct statfs sfs;
-
- if (statfs("/", &sfs) == -1)
- return;
+ void *makedev = 0;
+ void *makedev_local = 0;
+ off_t makedev_size;
+ off_t makedev_local_size;
+ dev_t dev;
- if (strcmp(sfs.f_fstypename, MOUNT_MSDOS) != 0)
- return;
-
- /* If we have devices, we cannot be on msdosfs */
+ /* If we have /dev/console, assume all is OK */
if (access(_PATH_CONSOLE, F_OK) != -1)
- return;
+ return(0);
/* Grab the contents of MAKEDEV */
- if ((fd = open("/dev/MAKEDEV", O_RDONLY)) == -1)
- return;
-
- if (fstat(fd, &st) == -1)
- goto done;
+ if ((fd = open("/dev/MAKEDEV", O_RDONLY)) != -1) {
+ if (fstat(fd, &st) != -1 && (makedev = mmap(0, st.st_size,
+ PROT_READ, MAP_FILE|MAP_SHARED, fd, 0)) != (void *)-1)
+ makedev_size = st.st_size;
+ else
+ makedev = 0;
+ (void) close(fd);
+ }
- if ((ptr = mmap(0,
- st.st_size, PROT_READ, MAP_FILE|MAP_SHARED, fd, 0)) == (void *) -1)
- goto done;
-
- (void) close(fd);
- fd = -1;
+ /* Grab the contents of MAKEDEV.local */
+ if ((fd = open("/dev/MAKEDEV.local", O_RDONLY)) != -1) {
+ if (fstat(fd, &st) != -1 && (makedev_local = mmap(0, st.st_size,
+ PROT_READ, MAP_FILE|MAP_SHARED, fd, 0)) != (void *)-1)
+ makedev_local_size = st.st_size;
+ else
+ makedev_local = 0;
+ (void) close(fd);
+ }
/* Mount an mfs over /dev so we can create devices */
switch ((pid = fork())) {
@@ -1319,73 +1323,75 @@
(void) execl("/sbin/mount_mfs", "mount_mfs", "-i", "192",
"-s", "512", "-b", "4096", "-f", "512", "swap", "/dev",
NULL);
- goto done;
+ _exit(0);
case -1:
- goto done;
+ return(-1);
default:
if (waitpid(pid, &status, 0) == -1)
- goto done;
+ return(-1);
if (status != 0)
- goto done;
+ return(-1);
break;
}
- /* Create a MAKEDEV script in /dev */
- if ((fd = open("/dev/MAKEDEV", O_WRONLY|O_CREAT|O_TRUNC, 0755)) == -1)
- goto done;
-
- if (write(fd, ptr, st.st_size) != st.st_size)
- goto done;
-
- (void) munmap(ptr, st.st_size);
-
- (void) close(fd);
- fd = -1;
+#ifdef CPU_CONSDEV
+ int s = sizeof(dev);
+ static int name[2] = { CTL_MACHDEP, CPU_CONSDEV };
-#ifdef DEBUG
- {
- mode_t mode = 0666 | S_IFCHR;
- dev_t dev;
-#ifdef CPU_CONSDEV
- int s = sizeof(dev);
- static int name[2] = { CTL_MACHDEP, CPU_CONSDEV };
-
- if (sysctl(name, sizeof(name) / sizeof(name[0]), &dev, &s,
- NULL, 0) == -1)
- goto done;
+ if (sysctl(name, sizeof(name) / sizeof(name[0]), &dev, &s,
+ NULL, 0) == -1)
+ dev = makedev(0, 0);
#else
- dev = makedev(0, 0);
+ dev = makedev(0, 0);
#endif
- /* Make a console for us, so we can see things happening */
- if (mknod(_PATH_CONSOLE, mode, dev) == -1)
- goto done;
+ /* Make a console for us, so we can see things happening */
+ if (mknod(_PATH_CONSOLE, 0666 | S_IFCHR, dev) == -1)
+ return(-1);
+
+ freopen(_PATH_CONSOLE, "a", stderr);
+
+ fprintf(stderr, "init: Creating mfs /dev\n");
+
+ /* Create a MAKEDEV script in the mfs /dev */
+ if (makedev && (fd = open("/dev/MAKEDEV", O_WRONLY|O_CREAT|O_TRUNC,
+ 0755)) != -1) {
+ (void) write(fd, makedev, makedev_size);
+ (void) munmap(makedev, makedev_size);
+ (void) close(fd);
}
-#endif
+
+ /* Create a MAKEDEV.local script in the mfs /dev */
+ if (makedev_local && (fd = open("/dev/MAKEDEV.local",
+ O_WRONLY|O_CREAT|O_TRUNC, 0755)) != -1) {
+ (void) write(fd, makedev_local, makedev_local_size);
+ (void) munmap(makedev_local, makedev_local_size);
+ (void) close(fd);
+ }
/* Run the makedev script to create devices */
switch ((pid = fork())) {
case 0:
if (chdir("/dev") == -1)
- goto done;
+ goto fail;
(void) execl("/bin/sh", "sh", "./MAKEDEV", "all", NULL);
- goto done;
+ goto fail;
case -1:
- goto done;
+ goto fail;
default:
if (waitpid(pid, &status, 0) == -1)
- goto done;
+ goto fail;
if (status != 0)
- goto done;
+ goto fail;
break;
}
-
-done:
- if (fd != -1)
- (void) close(fd);
+ return(0);
+fail:
+ fprintf(stderr, "init: Unable to run MAKEDEV\n");
+ return(-1);
}
#endif
Home |
Main Index |
Thread Index |
Old Index