diff options
| author | Justus Winter <4winter@informatik.uni-hamburg.de> | 2014-09-03 13:43:49 +0200 |
|---|---|---|
| committer | Justus Winter <4winter@informatik.uni-hamburg.de> | 2014-09-03 13:43:49 +0200 |
| commit | 4be4a53c75860eccd4c1a512618b938da37fe937 (patch) | |
| tree | b2da852271300d108cc5924dd57c54da16dc47f9 /debian/patches/0004-Add-a-minimalist-init-program.patch | |
| parent | 5cdc91ae6bfcaeb559f9849a2f2087196b84eb27 (diff) | |
drop old patch series
Diffstat (limited to 'debian/patches/0004-Add-a-minimalist-init-program.patch')
| -rw-r--r-- | debian/patches/0004-Add-a-minimalist-init-program.patch | 537 |
1 files changed, 0 insertions, 537 deletions
diff --git a/debian/patches/0004-Add-a-minimalist-init-program.patch b/debian/patches/0004-Add-a-minimalist-init-program.patch deleted file mode 100644 index 98185b53..00000000 --- a/debian/patches/0004-Add-a-minimalist-init-program.patch +++ /dev/null @@ -1,537 +0,0 @@ -From 78672310f29185d1a9605dfc1b2fc4f4c8d6def3 Mon Sep 17 00:00:00 2001 -From: Justus Winter <4winter@informatik.uni-hamburg.de> -Date: Wed, 18 Sep 2013 15:29:36 +0200 -Subject: [PATCH 4/8] Add a minimalist init program - ---- - Makefile | 1 + - daemons/runsystem.hurd | 142 ++++++++++++++++++++++++++++++++++++++++++++ - daemons/runsystem.sh | 90 ++++++++++------------------ - init/Makefile | 24 ++++++++ - init/init.c | 155 +++++++++++++++++++++++++++++++++++++++++++++++++ - 5 files changed, 352 insertions(+), 60 deletions(-) - create mode 100644 daemons/runsystem.hurd - create mode 100644 init/Makefile - create mode 100644 init/init.c - -diff --git a/Makefile b/Makefile -index 455df67..3178740 100644 ---- a/Makefile -+++ b/Makefile -@@ -41,6 +41,7 @@ prog-subdirs = auth proc exec term \ - random \ - procfs \ - startup \ -+ init \ - - ifeq ($(HAVE_SUN_RPC),yes) - prog-subdirs += nfs nfsd -diff --git a/daemons/runsystem.hurd b/daemons/runsystem.hurd -new file mode 100644 -index 0000000..c3cb2d6 ---- /dev/null -+++ b/daemons/runsystem.hurd -@@ -0,0 +1,142 @@ -+#!/bin/bash -+# -+# This program is run by /hurd/init at boot time after the essential -+# servers are up, and is responsible for running the "userland" parts of a -+# normal system. This includes running the single-user shell as well as a -+# multi-user system. This program is expected never to exit. -+# -+ -+ -+### -+### Where to find programs, etc. -+### -+ -+PATH=/bin:/sbin -+export PATH -+ -+umask 022 -+ -+# If we lose badly, try to exec each of these in turn. -+fallback_shells='/bin/sh /bin/bash /bin/csh /bin/ash /bin/shd' -+ -+# Shell used for normal single-user startup. -+SHELL=/bin/sh -+ -+# Programs that do multi-user startup. -+RUNCOM=/libexec/rc -+RUNTTYS=/libexec/runttys -+# Signals that we should pass down to runttys. -+runttys_sigs='TERM INT HUP TSTP' -+ -+### -+ -+ -+# If we get a SIGLOST, attempt to reopen the console in case -+# our console ports were revoked. This lets us print messages. -+function reopen_console () -+{ -+ exec 1>/dev/console 2>&1 || exit 3 -+} -+trap 'reopen_console' SIGLOST -+ -+ -+# Call this when we are losing badly enough that we want to punt normal -+# startup entirely. We exec a single-user shell, so we will not come back -+# here. The only way to get to multi-user from that shell will be -+# explicitly exec this script or something like that. -+function singleuser () -+{ -+ test $# -eq 0 || echo "$0: $*" -+ for try in ${fallback_shells}; do -+ SHELL=${try} -+ exec ${SHELL} -+ done -+ exit 127 -+} -+ -+ -+# We expect to be started by console-run, which gives us no arguments and -+# puts FALLBACK_CONSOLE=file-name in the environment if our console is -+# other than a normal /dev/console. -+ -+if [ "${FALLBACK_CONSOLE+set}" = set ]; then -+ singleuser "Running on fallback console ${FALLBACK_CONSOLE}" -+fi -+ -+ -+### -+### Normal startup procedures -+### -+ -+# Parse the multiboot command line. We only pay attention to -s and -f. -+# The first argument is the kernel file name; skip that. -+shift -+flags= -+while [ $# -gt 0 ]; do -+ arg="$1" -+ shift -+ case "$arg" in -+ --*) ;; -+ *=*) ;; -+ -*) -+ flags="${flags}${arg#-}" -+ ;; -+ 'single'|'emergency') # Linux compat -+ flags="${flags}s" -+ ;; -+ 'fastboot') -+ flags="${flags}f" -+ ;; -+ esac -+done -+ -+# Check boot flags. -+case "$flags" in -+*s*) -+ rc=false # force single-user -+ ;; -+*f*) -+ rc="${RUNCOM}" # fastboot -+ ;; -+*) -+ rc="${RUNCOM} autoboot" # multi-user default -+ ;; -+esac -+ -+# Large infinite loop. If this script ever exits, init considers that -+# a serious bogosity and punts to a fallback single-user shell. -+# We handle here the normal transitions between single-user and multi-user. -+while : ; do -+ -+ # Run the rc script. As long as it exits nonzero, punt to single-user. -+ # After the single-user shell exits, we will start over attempting to -+ # run rc; but later invocations strip the `autoboot' argument. -+ until $rc; do -+ rc=${RUNCOM} -+ -+ # Run single-user shell and repeat as long as it dies with a signal. -+ until ${SHELL} || test $? -lt 128; do -+ : -+ done -+ done -+ -+ # Now we are officially ready for normal multi-user operation. -+ -+ # Trap certain signals and send them on to runttys. For this to work, we -+ # must run it asynchronously and wait for it with the `wait' built-in. -+ runttys_pid=0 -+ for sig in $runttys_sigs; do -+ trap "kill -$sig \${runttys_pid}" $sig -+ done -+ -+ # This program reads /etc/ttys and starts the programs it says to. -+ ${RUNTTYS} & -+ runttys_pid=$! -+ -+ # Wait for runttys to die, meanwhile handling trapped signals. -+ wait -+ -+ # Go back to the top of the infinite loop, as if booting single-user. -+ rc=false -+ -+done -diff --git a/daemons/runsystem.sh b/daemons/runsystem.sh -index f4f2771..39447ca 100644 ---- a/daemons/runsystem.sh -+++ b/daemons/runsystem.sh -@@ -1,9 +1,9 @@ - #!/bin/bash - # - # This program is run by /hurd/init at boot time after the essential --# servers are up, and is responsible for running the "userland" parts of a --# normal system. This includes running the single-user shell as well as a --# multi-user system. This program is expected never to exit. -+# servers are up. It does some initialization of its own and then -+# execs the SysV init to bring up the "userland" parts of a normal -+# system. - # - - -@@ -22,29 +22,27 @@ fallback_shells='/bin/sh /bin/bash /bin/csh /bin/ash /bin/shd' - # Shell used for normal single-user startup. - SHELL=/bin/sh - --# Programs that do multi-user startup. --RUNCOM=/libexec/rc --RUNTTYS=/libexec/runttys --# Signals that we should pass down to runttys. --runttys_sigs='TERM INT HUP TSTP' -+# The init program to call. -+# -+# Can be overridden using init=something in the kernel command line. -+init=/sbin/init - - ### - -- - # If we get a SIGLOST, attempt to reopen the console in case - # our console ports were revoked. This lets us print messages. --function reopen_console () -+reopen_console () - { - exec 1>/dev/console 2>&1 || exit 3 - } --trap 'reopen_console' SIGLOST -+trap 'reopen_console' 32 # SIGLOST = server died on GNU - - - # Call this when we are losing badly enough that we want to punt normal - # startup entirely. We exec a single-user shell, so we will not come back - # here. The only way to get to multi-user from that shell will be - # explicitly exec this script or something like that. --function singleuser () -+singleuser() - { - test $# -eq 0 || echo "$0: $*" - for try in ${fallback_shells}; do -@@ -54,12 +52,14 @@ function singleuser () - exit 127 - } - -+# Print a newline. -+echo - --# See whether pflocal is set up already, and do so if not (install case) -+# See whether pflocal is setup - # - # Normally this should be the case, but we better make sure since - # without the pflocal server, pipe(2) does not work. --if ! test -e /servers/socket/1 ; then -+if ! test -e /servers/socket/1 && which settrans >/dev/null ; then - # The root filesystem should be read-only at this point. - if fsysopts / --update --writable ; then - settrans -c /servers/socket/1 /hurd/pflocal -@@ -76,7 +76,6 @@ if [ "${FALLBACK_CONSOLE+set}" = set ]; then - singleuser "Running on fallback console ${FALLBACK_CONSOLE}" - fi - -- - ### - ### Normal startup procedures - ### -@@ -85,20 +84,23 @@ fi - # The first argument is the kernel file name; skip that. - shift - flags= -+single= - while [ $# -gt 0 ]; do - arg="$1" - shift - case "$arg" in - --*) ;; -+ init=*) -+ eval "${arg}" -+ ;; - *=*) ;; - -*) - flags="${flags}${arg#-}" - ;; -- 'single'|'emergency') # Linux compat -- flags="${flags}s" -+ 'single') -+ single="-s" - ;; -- 'fastboot') -- flags="${flags}f" -+ 'fastboot'|'emergency') - ;; - esac - done -@@ -106,50 +108,18 @@ done - # Check boot flags. - case "$flags" in - *s*) -- rc=false # force single-user -- ;; --*f*) -- rc="${RUNCOM}" # fastboot -- ;; --*) -- rc="${RUNCOM} autoboot" # multi-user default -+ single="-s" # force single-user - ;; - esac - --# Large infinite loop. If this script ever exits, init considers that --# a serious bogosity and punts to a fallback single-user shell. --# We handle here the normal transitions between single-user and multi-user. --while : ; do -- -- # Run the rc script. As long as it exits nonzero, punt to single-user. -- # After the single-user shell exits, we will start over attempting to -- # run rc; but later invocations strip the `autoboot' argument. -- until $rc; do -- rc=${RUNCOM} -- -- # Run single-user shell and repeat as long as it dies with a signal. -- until ${SHELL} || test $? -lt 128; do -- : -- done -- done -- -- # Now we are officially ready for normal multi-user operation. -- -- # Trap certain signals and send them on to runttys. For this to work, we -- # must run it asynchronously and wait for it with the `wait' built-in. -- runttys_pid=0 -- for sig in $runttys_sigs; do -- trap "kill -$sig \${runttys_pid}" $sig -- done -- -- # This program reads /etc/ttys and starts the programs it says to. -- ${RUNTTYS} & -- runttys_pid=$! -+# Start the default pager. It will bail if there is already one running. -+/hurd/mach-defpager - -- # Wait for runttys to die, meanwhile handling trapped signals. -- wait -+# This is necessary to make stat / return the correct device ids. -+# Work around a race condition (probably in the root translator). -+for i in `seq 1 100000` ; do : ; done - -- # Go back to the top of the infinite loop, as if booting single-user. -- rc=false -+fsysopts / --update --readonly - --done -+# Finally, start the actual SysV init. -+exec ${init} ${single} -a -diff --git a/init/Makefile b/init/Makefile -new file mode 100644 -index 0000000..07b8026 ---- /dev/null -+++ b/init/Makefile -@@ -0,0 +1,24 @@ -+# -+# Copyright (C) 2013 Free Software Foundation, Inc. -+# -+# This program is free software; you can redistribute it and/or -+# modify it under the terms of the GNU General Public License as -+# published by the Free Software Foundation; either version 2, or (at -+# your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, but -+# WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+# General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see <http://www.gnu.org/licenses/>. -+ -+dir := init -+makemode := server -+ -+SRCS = init.c -+OBJS = $(SRCS:.c=.o) -+target = init -+ -+include ../Makeconf -diff --git a/init/init.c b/init/init.c -new file mode 100644 -index 0000000..b3d3301 ---- /dev/null -+++ b/init/init.c -@@ -0,0 +1,155 @@ -+/* A minimalist init for the Hurd -+ -+ Copyright (C) 2013,14 Free Software Foundation, Inc. -+ This file is part of the GNU Hurd. -+ -+ The GNU Hurd is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2, or (at your option) -+ any later version. -+ -+ The GNU Hurd is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with the Hurd. If not, see <http://www.gnu.org/licenses/>. */ -+ -+#include <argp.h> -+#include <error.h> -+#include <hurd.h> -+#include <signal.h> -+#include <stdio.h> -+#include <string.h> -+#include <sys/types.h> -+#include <sys/wait.h> -+#include <unistd.h> -+#include <version.h> -+ -+const char *argp_program_version = STANDARD_HURD_VERSION (init); -+static pid_t child_pid; -+static int single; -+ -+static struct argp_option -+options[] = -+{ -+ /* XXX: Currently, -s does nothing. */ -+ {"single-user", 's', NULL, 0, "Startup system in single-user mode", 0}, -+ {NULL, 'a', NULL, 0, "Ignored for compatibility with sysvinit", 0}, -+ {0} -+}; -+ -+static char doc[] = "A minimalist init for the Hurd"; -+ -+static error_t -+parse_opt (int key, char *arg, struct argp_state *state) -+{ -+ switch (key) -+ { -+ case 's': -+ single = 1; -+ break; -+ -+ case 'a': -+ /* Ignored. */ -+ break; -+ -+ default: -+ return ARGP_ERR_UNKNOWN; -+ } -+ -+ return 0; -+} -+ -+void -+sigchld_handler(int signal) -+{ -+ /* A child died. Find its status. */ -+ int status; -+ pid_t pid; -+ -+ while (1) -+ { -+ pid = waitpid (WAIT_ANY, &status, WNOHANG | WUNTRACED); -+ if (pid <= 0) -+ break; /* No more children. */ -+ -+ /* Since we are init, orphaned processes get reparented to us and -+ alas, all our adopted children eventually die. Woe is us. We -+ just need to reap the zombies to relieve the proc server of -+ its burden, and then we can forget about the little varmints. */ -+ -+ if (pid == child_pid) -+ { -+ /* The big magilla bit the dust. */ -+ child_pid = -1; -+ -+ char *desc = NULL; -+ if (WIFSIGNALED (status)) -+ asprintf (&desc, "terminated abnormally (%s)", -+ strsignal (WTERMSIG (status))); -+ else if (WIFSTOPPED (status)) -+ asprintf (&desc, "stopped abnormally (%s)", -+ strsignal (WTERMSIG (status))); -+ else if (WEXITSTATUS (status) == 0) -+ desc = strdup ("finished"); -+ else -+ asprintf (&desc, "exited with status %d", -+ WEXITSTATUS (status)); -+ -+ error (0, 0, "child %s", desc); -+ free (desc); -+ -+ /* XXX: launch emergency shell. */ -+ error (23, 0, "panic!!"); -+ } -+ } -+} -+ -+int -+main (int argc, char **argv) -+{ -+ struct argp argp = -+ { -+ .options = options, -+ .parser = parse_opt, -+ .doc = doc, -+ }; -+ argp_parse (&argp, argc, argv, 0, 0, 0); -+ -+ if (getpid () != 1) -+ error (1, 0, "can only be run as PID 1"); -+ -+ struct sigaction sa; -+ sa.sa_handler = SIG_IGN; -+ sa.sa_flags = 0; -+ sigemptyset (&sa.sa_mask); -+ -+ sigaction (SIGHUP, &sa, NULL); -+ sigaction (SIGINT, &sa, NULL); -+ sigaction (SIGQUIT, &sa, NULL); -+ sigaction (SIGTERM, &sa, NULL); -+ sigaction (SIGUSR1, &sa, NULL); -+ sigaction (SIGUSR2, &sa, NULL); -+ sigaction (SIGTSTP, &sa, NULL); -+ -+ sa.sa_handler = sigchld_handler; -+ sa.sa_flags |= SA_RESTART; -+ sigaction (SIGCHLD, &sa, NULL); -+ -+ char *args[] = { "/etc/hurd/runsystem.hurd", NULL }; -+ -+ switch (child_pid = fork ()) -+ { -+ case -1: -+ error (1, errno, "failed to fork"); -+ case 0: -+ execv (args[0], args); -+ error (2, errno, "failed to execv child"); -+ } -+ -+ select (0, NULL, NULL, NULL, NULL); -+ /* Not reached. */ -+ return 0; -+} --- -2.1.0 - |
