blob: 98d7f42544d502ab88f2f1b63c153c41fe17b6e5 (
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
128
129
130
131
132
133
134
135
136
137
|
#!/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:/hurd
export PATH
umask 022
# If we lose badly, try to exec each of these in turn.
fallback_shells='/bin/bash /bin/dash /bin/sh /bin/csh /bin/ash /bin/shd'
# Shell used for normal single-user startup.
SHELL=/bin/bash
# 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
echo "Starting the HURD..."
# 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
if [ -x "/SETUP" ]; then
echo "This is the first execution of the system."
echo "I'm going to setup everything and then reboot. Please wait..."
sleep 2
./SETUP
exit 0
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.
# TODO: we crash if we start it, investigate to understand what is happening.
# /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
|