Control: tag -1 patch pending

I worked out how to do this without setsid -c.

Ben.
---
Currently the panic shell's controlling tty is /dev/console which is
not fully functional - the shell can't provide job control and more
can't work out the screen size for paging.

Fix this by reading /proc/consoles to find out the underlying tty
device and then connecting the shell to it directly with the aid of
setsid.

Closes: #512679
Signed-off-by: Ben Hutchings <b...@decadent.org.uk>
---
 scripts/functions | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/scripts/functions b/scripts/functions
index 531d1bd..67ce319 100644
--- a/scripts/functions
+++ b/scripts/functions
@@ -33,6 +33,8 @@ log_end_msg()
 
 panic()
 {
+       local console rest
+
        if command -v chvt >/dev/null 2>&1; then
                chvt 1
        fi
@@ -48,7 +50,20 @@ panic()
 
        run_scripts /scripts/panic
 
-       REASON="$@" PS1='(initramfs) ' /bin/sh -i </dev/console >/dev/console 
2>&1
+       # Try to use setsid, which will enable job control in the shell
+       # and paging in more
+       if command -v setsid >/dev/null 2>&1; then
+               read console rest </proc/consoles
+               if [ "${console}" = "tty0" ]; then
+                       # Need to choose a specific VT
+                       console="tty1"
+               fi
+               # We don't have 'setsid -c' so we need to setsid, open
+               # the tty, and finally exec an interactive shell
+               REASON="$@" PS1='(initramfs) ' setsid sh -c "exec sh -i 
<>/dev/${console} 1>&0 2>&1"
+       else
+               REASON="$@" PS1='(initramfs) ' sh -i </dev/console 
>/dev/console 2>&1
+       fi
 }
 
 maybe_break()

Attachment: signature.asc
Description: Digital signature

Reply via email to