diff --git a/bin/shell-wrapper/main.go b/bin/shell-wrapper/main.go index e373abf..a316cde 100644 --- a/bin/shell-wrapper/main.go +++ b/bin/shell-wrapper/main.go @@ -10,6 +10,7 @@ import ( "os/exec" "path/filepath" "sort" + "syscall" "strings" "time" ) @@ -170,7 +171,7 @@ func Shell() string { return shell } -func RunLocally(req *termite.WorkRequest, rule *termite.LocalRule) *os.Waitmsg { +func RunLocally(req *termite.WorkRequest, rule *termite.LocalRule) syscall.WaitStatus { env := os.Environ() if !rule.Recurse { env = cleanEnv(env) @@ -183,11 +184,11 @@ func RunLocally(req *termite.WorkRequest, rule *termite.LocalRule) *os.Waitmsg { if err != nil { log.Fatalf("os.StartProcess() for %v: %v", req, err) } - msg, err := proc.Wait(0) + msg, err := proc.Wait() if err != nil { log.Fatalf("proc.Wait() for %v: %v", req, err) } - return msg + return msg.Sys().(syscall.WaitStatus) } func main() { @@ -241,7 +242,7 @@ func main() { } else { req, rule = PrepareRun(*command, *directory, topDir) } - var waitMsg *os.Waitmsg + var waitMsg syscall.WaitStatus rep := termite.WorkResponse{} if rule != nil && rule.Local { waitMsg = RunLocally(req, rule) @@ -260,14 +261,14 @@ func main() { os.Stdout.Write([]byte(rep.Stdout)) os.Stderr.Write([]byte(rep.Stderr)) - waitMsg = &rep.Exit + waitMsg = rep.Exit } - if waitMsg.ExitStatus() != 0 { + if waitMsg != 0 { log.Printf("Failed %s: '%q'", rep.WorkerId, *command) } // TODO - is this necessary? Rpc().Close() - os.Exit(waitMsg.ExitStatus()) + os.Exit(int(waitMsg)) } diff --git a/bin/worker/main.go b/bin/worker/main.go index 8925164..eb8f81f 100644 --- a/bin/worker/main.go +++ b/bin/worker/main.go @@ -12,23 +12,21 @@ import ( "os/user" "runtime" "runtime/pprof" + "strconv" "syscall" ) var _ = log.Printf func handleStop(daemon *termite.Worker) { - for { - sig := <-signal.Incoming - switch sig.(os.UnixSignal) { - case syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGINT: - log.Println("got signal: ", sig) - req := termite.ShutdownRequest{Kill: true} - rep := termite.ShutdownResponse{} - daemon.Shutdown(&req, &rep) - case syscall.SIGHUP: - daemon.Report() - } + ch := make(chan os.Signal, 1) + + signal.Notify(ch, os.Interrupt, os.Kill) + for sig := range ch { + log.Println("got signal: ", sig) + req := termite.ShutdownRequest{Kill: true} + rep := termite.ShutdownResponse{} + daemon.Shutdown(&req, &rep) } } @@ -109,7 +107,7 @@ func main() { if err != nil { log.Fatalf("close stderr: %v", err) } - _, err = syscall.Dup(f.Fd()) + _, err = syscall.Dup(int(f.Fd())) if err != nil { log.Fatalf("dup: %v", err) } @@ -137,7 +135,12 @@ func main() { if err != nil { log.Fatalf("can't lookup %q: %v", *userFlag, err) } - opts.User = nobody + uid, err := strconv.ParseInt(nobody.Uid, 10, 64) + gid, err := strconv.ParseInt(nobody.Gid, 10, 64) + opts.User = &termite.User{ + Uid: int(uid), + Gid: int(gid), + } } daemon := termite.NewWorker(&opts) diff --git a/termite/coordinator.go b/termite/coordinator.go index 70413e9..3098367 100644 --- a/termite/coordinator.go +++ b/termite/coordinator.go @@ -10,6 +10,7 @@ import ( "net/rpc" "os" "sort" + "syscall" "sync" "time" ) @@ -506,11 +507,11 @@ func (me *Coordinator) ServeHTTP(port int) { Handler: me.Mux, } err = httpServer.Serve(me.listener) - if e, ok := err.(*net.OpError); ok && e.Err == os.EINVAL { + if e, ok := err.(*net.OpError); ok && e.Err == syscall.EINVAL { return } - if err != nil && err != os.EINVAL { + if err != nil && err != syscall.EINVAL { log.Println("httpServer.Serve:", err) } } diff --git a/termite/localmaster.go b/termite/localmaster.go index 36dd5a1..c0f592a 100644 --- a/termite/localmaster.go +++ b/termite/localmaster.go @@ -6,6 +6,7 @@ import ( "net" "net/rpc" "os" + "syscall" ) // Expose functionality for the local tool to use. @@ -68,7 +69,7 @@ func (me *LocalMaster) start(sock string) { log.Println("accepting connections on", sock) for { conn, err := me.listener.Accept() - if err == os.EINVAL { + if err == syscall.EINVAL { break } if err != nil { diff --git a/termite/masterrun.go b/termite/masterrun.go index 244033a..c285ebd 100644 --- a/termite/masterrun.go +++ b/termite/masterrun.go @@ -5,7 +5,6 @@ import ( "github.com/hanwen/go-fuse/fuse" "github.com/hanwen/termite/attr" "log" - "os" "path/filepath" "strings" "syscall" @@ -114,7 +113,7 @@ func rmMaybeMasterRun(master *Master, req *WorkRequest, rep *WorkResponse) bool master.replay(fs) rep.Stderr = strings.Join(msgs, "\n") - rep.Exit.WaitStatus = syscall.WaitStatus(status << 8) + rep.Exit = syscall.WaitStatus(status << 8) return true } @@ -183,7 +182,7 @@ func mkdirParentMasterRun(master *Master, arg string, rep *WorkResponse) { if len(msgs) > 0 { rep.Stderr = strings.Join(msgs, "\n") - rep.Exit.WaitStatus = 1 << 8 + rep.Exit = 1 << 8 } } @@ -207,26 +206,20 @@ func mkdirNormalMasterRun(master *Master, arg string, rep *WorkResponse) { dirAttr := master.fileServer.attributes.Get(dir) if dirAttr.Deletion() { rep.Stderr = fmt.Sprintf("File not found: /%s", dir) - rep.Exit = os.Waitmsg{ - WaitStatus: (1 << 8), - } + rep.Exit = syscall.WaitStatus(1 << 8) return } if !dirAttr.IsDir() { rep.Stderr = fmt.Sprintf("Is not a directory: /%s", dir) - rep.Exit = os.Waitmsg{ - WaitStatus: (1 << 8), - } + rep.Exit = syscall.WaitStatus(1 << 8) return } chAttr := master.fileServer.attributes.Get(rootless) if !chAttr.Deletion() { rep.Stderr = fmt.Sprintf("File exists: /%s", rootless) - rep.Exit = os.Waitmsg{ - WaitStatus: (1 << 8), - } + rep.Exit = syscall.WaitStatus(1 << 8) return } chAttr = mkdirEntry(rootless) diff --git a/termite/rpc.go b/termite/rpc.go index c44d545..f8d6f6f 100644 --- a/termite/rpc.go +++ b/termite/rpc.go @@ -2,9 +2,10 @@ package termite import ( "fmt" + "syscall" + "github.com/hanwen/termite/attr" "github.com/hanwen/termite/stats" - "os" ) type AttrRequest struct { @@ -70,7 +71,7 @@ type Timing struct { } type WorkResponse struct { - Exit os.Waitmsg + Exit syscall.WaitStatus Stderr string Stdout string diff --git a/termite/task.go b/termite/task.go index 65f3d69..ca8f36b 100644 --- a/termite/task.go +++ b/termite/task.go @@ -112,9 +112,9 @@ func (me *WorkerTask) runInFuse(fuseFs *workerFuseFs) error { printCmd, cmd.Dir, fuseFs.id) err := cmd.Wait() - waitMsg, ok := err.(*exec.ExitError) + exitErr, ok := err.(*exec.ExitError) if ok { - me.rep.Exit = *waitMsg.Waitmsg + me.rep.Exit = exitErr.Sys().(syscall.WaitStatus) err = nil } diff --git a/termite/worker.go b/termite/worker.go index 4b24760..a2bc2c0 100644 --- a/termite/worker.go +++ b/termite/worker.go @@ -14,6 +14,7 @@ import ( "os" "os/exec" "strings" + "syscall" "time" ) @@ -186,11 +187,11 @@ func (me *Worker) RunWorkerServer() { for { conn, err := me.listener.Accept() - if err == os.EINVAL { + if err == syscall.EINVAL { break } if err != nil { - if e, ok := err.(*net.OpError); ok && e.Err == os.EINVAL { + if e, ok := err.(*net.OpError); ok && e.Err == syscall.EINVAL { break } log.Println("me.listener", err)