linuxkit/pkg/getty/usr/bin/rungetty.sh
Petr Fedchenkov 893bee6b81
Fix return code of rungetty.sh (#3881)
* Fix return code of rungetty.sh

In case of INITGETTY defined we will return exit code 1 which is not
expected

Signed-off-by: Petr Fedchenkov <giggsoff@gmail.com>

* Update getty sha

Signed-off-by: Petr Fedchenkov <giggsoff@gmail.com>

* restore package cache in LinuxKit Build Tests

Signed-off-by: Petr Fedchenkov <giggsoff@gmail.com>

Signed-off-by: Petr Fedchenkov <giggsoff@gmail.com>
2022-12-15 12:12:19 +02:00

86 lines
2.0 KiB
Bash
Executable File

#!/bin/sh
infinite_loop() {
while true; do
$@
done
}
# run getty on all known consoles
start_getty() {
tty=${1%,*}
speed=${1#*,}
securetty="$2"
line=
term="linux"
[ "$speed" = "$1" ] && speed=115200
# did we already process this tty?
if $(echo "${PROCESSEDTTY}" | grep -q -w "$tty"); then
echo "getty: already processed tty for $tty, not starting twice" | tee /dev/console
return
fi
# now indicate that we are processing it
PROCESSEDTTY="${PROCESSEDTTY} ${tty}"
# does the device even exist?
if [ ! -c /dev/$tty ]; then
echo "getty: cmdline has console=$tty but /dev/$tty is not a character device; not starting getty for $tty" | tee /dev/console
return
fi
case "$tty" in
ttyS*|ttyAMA*|ttyUSB*|ttyMFD*)
line="-L"
term="vt100"
;;
tty?)
line=""
speed="38400"
term=""
;;
esac
# are we secure or insecure?
loginargs=
if [ "$INSECURE" == "true" ]; then
loginargs="-a root"
fi
if ! grep -q -w "$tty" "$securetty"; then
# we could not find the tty in securetty, so start a getty but warn that root login will not work
echo "getty: cmdline has console=$tty but does not exist in $securetty; will not be able to log in as root on this tty $tty." | tee /dev/$tty
fi
# respawn forever
echo "getty: starting getty for $tty" | tee /dev/$tty
infinite_loop setsid.getty -w /sbin/agetty $loginargs $line $speed $tty $term &
}
# check if we are namespaced, and, if so, indicate in the PS1
if [ -z "$INITGETTY" ]; then
cat >/etc/profile.d/namespace.sh <<"EOF"
export PS1="(ns: getty) $PS1"
EOF
fi
PROCESSEDTTY=
# check if we have /etc/getty.shadow
ROOTSHADOW=/hostroot/etc/getty.shadow
if [ -f $ROOTSHADOW ]; then
cp $ROOTSHADOW /etc/shadow
# just in case someone forgot a newline
echo >> /etc/shadow
fi
for opt in $(cat /proc/cmdline); do
case "$opt" in
console=*)
start_getty ${opt#console=} /etc/securetty
esac
done
# if we are in a container (not in root init) wait for all our child process to exit; tini will handle subreaping, if necessary
[ -n "$INITGETTY" ] || wait