From e6b1e260d89ca87b8e310a73388b8b7bac56cd03 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Tue, 24 May 2022 17:24:08 -0400 Subject: [PATCH] feat: attempt to implement fg builtin --- exec.go | 20 ++++++++++++++++++++ signal_unix.go | 1 + 2 files changed, 21 insertions(+) diff --git a/exec.go b/exec.go index 2e0e0b1..36d3b16 100644 --- a/exec.go +++ b/exec.go @@ -17,6 +17,7 @@ import ( "hilbish/util" rt "github.com/arnodel/golua/runtime" + "golang.org/x/sys/unix" "mvdan.cc/sh/v3/shell" //"github.com/yuin/gopher-lua/parse" "mvdan.cc/sh/v3/interp" @@ -273,6 +274,25 @@ func execHandle(bg bool) interp.ExecHandlerFunc { } } + // sh interp has "fg" as unimplemented builtin, which panics + if args[0] == "fg" { + j := jobs.getLatest() + if j == nil || j.pid == 0 { + return interp.NewExitStatus(1) + } + + pgid, _ := syscall.Getpgid(j.pid) + hshPgid, _ := syscall.Getpgid(os.Getpid()) + + // tcsetpgrp + unix.IoctlSetPointerInt(0, unix.TIOCSPGRP, pgid) + proc, _ := os.FindProcess(j.pid) + proc.Wait() + unix.IoctlSetPointerInt(0, unix.TIOCSPGRP, hshPgid) + + return interp.NewExitStatus(0) + } + // If command is defined in Lua then run it luacmdArgs := rt.NewTable() for i, str := range args[1:] { diff --git a/signal_unix.go b/signal_unix.go index c186512..bd5984c 100644 --- a/signal_unix.go +++ b/signal_unix.go @@ -10,6 +10,7 @@ import ( func handleSignals() { c := make(chan os.Signal) + signal.Ignore(syscall.SIGTTOU, syscall.SIGTTIN, syscall.SIGTSTP) signal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGWINCH, syscall.SIGUSR1, syscall.SIGUSR2, syscall.SIGQUIT) for s := range c {