signal_unix.go

 1//go:build unix
 2
 3package restic
 4
 5import (
 6	"os"
 7	"os/exec"
 8	"os/signal"
 9	"syscall"
10)
11
12func watchResticSignals(process *os.Process) func() {
13	signals := make(chan os.Signal, 1)
14	signal.Notify(signals, os.Interrupt, syscall.SIGTERM)
15	done := make(chan struct{})
16
17	go func() {
18		defer close(done)
19		for sig := range signals {
20			if sig == syscall.SIGTERM {
21				_ = process.Signal(sig)
22			}
23		}
24	}()
25
26	return func() {
27		signal.Stop(signals)
28		close(signals)
29		<-done
30	}
31}
32
33func resticExitCode(exitErr *exec.ExitError) int {
34	if status, ok := exitErr.Sys().(syscall.WaitStatus); ok {
35		if status.Signaled() {
36			return 128 + int(status.Signal())
37		}
38		if status.Exited() {
39			return status.ExitStatus()
40		}
41	}
42	return exitErr.ExitCode()
43}