init: post initial process death exit timeout

Wait for 5 seconds before printing a message and exiting after picking up the initial process's wait status. This also kills any lingering processes.This behaviour is helpful for applications launched without a terminal attached.

Signed-off-by: Ophestra Umiker <cat@ophivana.moe>
This commit is contained in:
Ophestra Umiker 2024-10-17 02:38:24 +09:00
parent dd78728fb3
commit 5401882ed0
Signed by: cat
SSH Key Fingerprint: SHA256:gQ67O0enBZ7UdZypgtspB2FDM1g3GVw8nX0XSdcFw8Q
1 changed files with 15 additions and 0 deletions

View File

@ -11,10 +11,16 @@ import (
"path"
"strconv"
"syscall"
"time"
"git.ophivana.moe/cat/fortify/internal/verbose"
)
const (
// time to wait for linger processes after death initial process
residualProcessTimeout = 5 * time.Second
)
// everything beyond this point runs within pid namespace
// proceed with caution!
@ -121,6 +127,8 @@ func doInit(fd uintptr) {
close(done)
}()
timeout := make(chan struct{})
r := 2
for {
select {
@ -138,8 +146,15 @@ func doInit(fd uintptr) {
r = 255
}
}
go func() {
time.Sleep(residualProcessTimeout)
close(timeout)
}()
case <-done:
os.Exit(r)
case <-timeout:
fmt.Println("fortify-init: timeout exceeded waiting for lingering processes")
os.Exit(r)
}
}
}