This works for me, but it's a gross hack so I'm not going to apply
this version.

Ben.
---
If only one console device is enabled, we can open a shell on that
rather than /dev/console and it will have full control over the tty.
For example, this allows pagers to work.

Unfortunately this depends on 'setsid -c' which is not provided by
busybox or klibc-utils.

Closes: #512679
Signed-off-by: Ben Hutchings <b...@decadent.org.uk>
---
 mkinitramfs       |  4 ++++
 scripts/functions | 21 ++++++++++++++++++++-
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/mkinitramfs b/mkinitramfs
index b64c7fb..b818751 100755
--- a/mkinitramfs
+++ b/mkinitramfs
@@ -315,6 +315,10 @@ if [ ! -e "${DESTDIR}/bin/sh" ]; then
        copy_exec /bin/sh "${DESTDIR}/bin/"
 fi
 
+# HACK replace busybox setsid with util-linux version
+rm -f "${DESTDIR}/bin/setsid"
+copy_exec /usr/bin/setsid /bin/
+
 # Remove any looping or broken symbolic links, since they break cpio.
 [ "${verbose}" = y ] && xargs_verbose="-t"
 (cd "${DESTDIR}" && find . -type l -printf '%p %Y\n' | sed -n 's/ [LN]$//p' \
diff --git a/scripts/functions b/scripts/functions
index aa53010..7bf346e 100644
--- a/scripts/functions
+++ b/scripts/functions
@@ -33,6 +33,8 @@ log_end_msg()
 
 panic()
 {
+       local console tty_dev rest setsid
+
        if command -v chvt >/dev/null 2>&1; then
                chvt 1
        fi
@@ -56,7 +58,24 @@ panic()
 
        run_scripts /scripts/panic
 
-       REASON="$@" PS1='(initramfs) ' /bin/sh -i </dev/console >/dev/console 
2>&1
+       # Do not use built-in setsid
+       if [ -x /bin/setsid ]; then
+               setsid='/bin/setsid -c'
+               while read console rest; do
+                       if [ -z "$tty_dev" ]; then
+                               # Single console, so use it directly to enable
+                               # full tty control
+                               tty_dev="/dev/$console"
+                       else
+                               # Multiple consoles, so write to them all
+                               tty_dev=/dev/console
+                       fi
+               done < /proc/consoles
+       else
+               setsid=
+               tty_dev=/dev/console
+       fi
+       REASON="$@" PS1='(initramfs) ' $setsid /bin/sh -i <"$tty_dev" 
>"$tty_dev" 2>&1
 }
 
 maybe_break()
-- 
Ben Hutchings
I'm always amazed by the number of people who take up solipsism because
they heard someone else explain it. - E*Borg on alt.fan.pratchett

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to