mirror of
https://github.com/roddhjav/apparmor.d.git
synced 2024-12-26 15:06:45 +01:00
build: update path helpers
This commit is contained in:
parent
4b5f7f2b52
commit
7757038a4f
2 changed files with 30 additions and 3 deletions
|
@ -55,7 +55,8 @@ func NewProcess(extraEnv []string, args ...string) (*Process, error) {
|
||||||
cmd: exec.Command(args[0], args[1:]...),
|
cmd: exec.Command(args[0], args[1:]...),
|
||||||
}
|
}
|
||||||
p.cmd.Env = append(os.Environ(), extraEnv...)
|
p.cmd.Env = append(os.Environ(), extraEnv...)
|
||||||
p.TellCommandNotToSpawnShell()
|
tellCommandNotToSpawnShell(p.cmd) // windows specific
|
||||||
|
tellCommandToStartOnNewProcessGroup(p.cmd) // linux specific
|
||||||
|
|
||||||
// This is required because some tools detects if the program is running
|
// This is required because some tools detects if the program is running
|
||||||
// from terminal by looking at the stdin/out bindings.
|
// from terminal by looking at the stdin/out bindings.
|
||||||
|
@ -146,7 +147,7 @@ func (p *Process) Signal(sig os.Signal) error {
|
||||||
// actually exited. This only kills the Process itself, not any other processes it may
|
// actually exited. This only kills the Process itself, not any other processes it may
|
||||||
// have started.
|
// have started.
|
||||||
func (p *Process) Kill() error {
|
func (p *Process) Kill() error {
|
||||||
return p.cmd.Process.Kill()
|
return kill(p.cmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetDir sets the working directory of the command. If Dir is the empty string, Run
|
// SetDir sets the working directory of the command. If Dir is the empty string, Run
|
||||||
|
|
|
@ -31,8 +31,34 @@
|
||||||
|
|
||||||
package paths
|
package paths
|
||||||
|
|
||||||
import "os/exec"
|
import (
|
||||||
|
"os/exec"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
func tellCommandNotToSpawnShell(_ *exec.Cmd) {
|
func tellCommandNotToSpawnShell(_ *exec.Cmd) {
|
||||||
// no op
|
// no op
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func tellCommandToStartOnNewProcessGroup(oscmd *exec.Cmd) {
|
||||||
|
// https://groups.google.com/g/golang-nuts/c/XoQ3RhFBJl8
|
||||||
|
|
||||||
|
// Start the process in a new process group.
|
||||||
|
// This is needed to kill the process and its children
|
||||||
|
// if we need to kill the process.
|
||||||
|
if oscmd.SysProcAttr == nil {
|
||||||
|
oscmd.SysProcAttr = &syscall.SysProcAttr{}
|
||||||
|
}
|
||||||
|
oscmd.SysProcAttr.Setpgid = true
|
||||||
|
}
|
||||||
|
|
||||||
|
func kill(oscmd *exec.Cmd) error {
|
||||||
|
// https://groups.google.com/g/golang-nuts/c/XoQ3RhFBJl8
|
||||||
|
|
||||||
|
// Kill the process group
|
||||||
|
pgid, err := syscall.Getpgid(oscmd.Process.Pid)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return syscall.Kill(-pgid, syscall.SIGKILL)
|
||||||
|
}
|
Loading…
Reference in a new issue