blob: ae25a7d6d20f179db8616422ad6335318df460f6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
#!/bin/bash
#
# This program is run by /hurd/init at boot time after the essential
# servers are up. It does some initialization of its own and then
# execs /hurd/init or any other roughly SysV init-compatible program
# to bring up the "userland" parts of a normal system.
#
###
### 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
# The init program to call.
#
# Can be overridden using init=something in the kernel command line.
init=/hurd/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 ()
{
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
}
# Print a newline.
echo
# See whether pflocal is set up already, and do so if not (install case)
#
# 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
# The root filesystem should be read-only at this point.
if fsysopts / --update --writable ; then
settrans -c /servers/socket/1 /hurd/pflocal
else
singleuser "Failed to create /servers/socket/1."
fi
fi
# 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=
single=
while [ $# -gt 0 ]; do
arg="$1"
shift
case "$arg" in
--*) ;;
init=*)
eval "${arg}"
;;
*=*) ;;
-*)
flags="${flags}${arg#-}"
;;
'single')
single="-s"
;;
'fastboot'|'emergency')
;;
esac
done
# Check boot flags.
case "$flags" in
*s*)
single="-s" # force single-user
;;
esac
# Start the default pager. It will bail if there is already one running.
/hurd/mach-defpager
# 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 # XXX
fsysopts / --update --readonly
# Finally, start the actual init.
exec ${init} ${single} -a
|