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}