#!/bin/sh # In order to give proper access to the tty, we need to locate the device # corresponding to the console we are actually using. NL=" " console= if ! [ -f /var/run/console-device ]; then # If the kernel emitted a "handover" message, then it's the one case $(uname -r) in 2.6.2*|2.6.3[01]*) console="$(dmesg -s 262143 | sed -n -r -e 's/(.*\])? *console handover: boot \[.*\] -> real \[(.*)\]$/\2/p')" ;; 2.6.3[234567]*) console="$(dmesg -s 262143 | sed -n -r -e 's/(.*\])? *console \[(.*)\] enabled, bootconsole disabled$/\2/p')" ;; *) # >= 2.6.38 console_major_minor="$(get-real-console-linux)" console_raw="$(readlink "/sys/dev/char/${console_major_minor}")" console="${console_raw##*/}" ;; esac # Except if it is the wrong type... if [ "$console" ] && [ "$(console-type)" = serial ] && \ expr "$console" : "tty[0-9]" >/dev/null; then console= fi consoles= if [ -z "$console" ]; then # Retrieve all enabled consoles from boot log; ignore those # for which no device file exists for cons in $(dmesg -s 262143 | sed -n -r -e 's/(.*\])? *console \[(.*)\] enabled/\2/p') do if [ -e "/dev/$cons" ]; then consoles="${consoles:+$consoles$NL}$cons" fi done # Only one console? Then we are good. if [ $(echo "$consoles" | wc -l) -eq 1 ]; then console="$consoles" fi fi if [ -z "$console" ]; then # Locate the last enabled console present on the command line for arg in $(cat /proc/cmdline); do case $arg in console=*) arg=${arg#console=} cons=${arg%%,*} if echo "$consoles" | grep -q "^$cons$"; then console=$cons fi ;; esac done fi if [ -z "$console" ]; then # Still nothing? Default to /dev/console. console=console fi echo /dev/$console > /var/run/console-device fi # Some other session may have it as ctty. Steal it from them exec /sbin/steal-ctty $(cat /var/run/console-device) "$@"