mirror of https://github.com/Hilbis/Hilbish
feat: attempt to implement fg builtin
parent
d65b574cb2
commit
e6b1e260d8
20
exec.go
20
exec.go
|
@ -17,6 +17,7 @@ import (
|
||||||
"hilbish/util"
|
"hilbish/util"
|
||||||
|
|
||||||
rt "github.com/arnodel/golua/runtime"
|
rt "github.com/arnodel/golua/runtime"
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
"mvdan.cc/sh/v3/shell"
|
"mvdan.cc/sh/v3/shell"
|
||||||
//"github.com/yuin/gopher-lua/parse"
|
//"github.com/yuin/gopher-lua/parse"
|
||||||
"mvdan.cc/sh/v3/interp"
|
"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
|
// If command is defined in Lua then run it
|
||||||
luacmdArgs := rt.NewTable()
|
luacmdArgs := rt.NewTable()
|
||||||
for i, str := range args[1:] {
|
for i, str := range args[1:] {
|
||||||
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
|
|
||||||
func handleSignals() {
|
func handleSignals() {
|
||||||
c := make(chan os.Signal)
|
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)
|
signal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGWINCH, syscall.SIGUSR1, syscall.SIGUSR2, syscall.SIGQUIT)
|
||||||
|
|
||||||
for s := range c {
|
for s := range c {
|
||||||
|
|
Loading…
Reference in New Issue