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 <ben@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