]> Cypherpunks.ru repositories - goredo.git/blobdiff - main.go
default.do-s must not depend on themselves
[goredo.git] / main.go
diff --git a/main.go b/main.go
index 300157139d22896b696bf696987ba9a94428d68f..c3b1be78677b731291db45ca8af4cfab7b74a5d3 100644 (file)
--- a/main.go
+++ b/main.go
@@ -27,11 +27,13 @@ import (
        "io/ioutil"
        "log"
        "os"
+       "os/signal"
        "path"
        "path/filepath"
        "runtime"
        "sort"
        "strconv"
+       "syscall"
 
        "go.cypherpunks.ru/recfile"
        "golang.org/x/sys/unix"
@@ -127,7 +129,7 @@ func main() {
                }
                os.Exit(rc)
        }
-       log.SetFlags(0)
+       log.SetFlags(log.Lshortfile)
 
        var err error
        Cwd, err = os.Getwd()
@@ -199,31 +201,31 @@ func main() {
        // Those are internal envs
        FdOODTgts, err = ioutil.TempFile("", "ood-tgts")
        if err != nil {
-               panic(err)
+               log.Fatalln(err)
        }
        if err = os.Remove(FdOODTgts.Name()); err != nil {
-               panic(err)
+               log.Fatalln(err)
        }
        FdOODTgtsLock, err = ioutil.TempFile("", "ood-tgts.lock")
        if err != nil {
-               panic(err)
+               log.Fatalln(err)
        }
        if err = os.Remove(FdOODTgtsLock.Name()); err != nil {
-               panic(err)
+               log.Fatalln(err)
        }
 
        if v := os.Getenv(EnvOODTgtsFd); v != "" {
                fd := mustParseFd(v, EnvOODTgtsFd)
                fdLock := mustParseFd(v, EnvOODTgtsLockFd)
                if err = unix.Flock(int(fdLock.Fd()), unix.LOCK_EX); err != nil {
-                       panic(err)
+                       log.Fatalln(err)
                }
                if _, err = fd.Seek(0, io.SeekStart); err != nil {
-                       panic(err)
+                       log.Fatalln(err)
                }
                tgtsRaw, err := ioutil.ReadAll(bufio.NewReader(fd))
                if err != nil {
-                       panic(err)
+                       log.Fatalln(err)
                }
                unix.Flock(int(fdLock.Fd()), unix.LOCK_UN)
                OODTgts = map[string]struct{}{}
@@ -282,6 +284,20 @@ func main() {
                }
        }
 
+       killed := make(chan os.Signal, 0)
+       signal.Notify(killed, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM)
+       go func() {
+               <-killed
+               trace(CDebug, "[%s] killed", BuildUUID)
+               jsReleaseAll()
+               RunningProcsM.Lock()
+               for pid, proc := range RunningProcs {
+                       trace(CDebug, "[%s] killing child %d", BuildUUID, pid)
+                       proc.Signal(syscall.SIGTERM)
+               }
+               os.Exit(1)
+       }()
+
        ok := true
        err = nil
        trace(
@@ -308,7 +324,14 @@ CmdSwitch:
                        log.Fatalln("no", EnvDepFd)
                }
                for _, tgt := range tgts {
-                       err = ifcreate(fdDep, tgt)
+                       tgtRel, err := filepath.Rel(
+                               filepath.Join(Cwd, DirPrefix),
+                               filepath.Join(Cwd, tgt),
+                       )
+                       if err != nil {
+                               break
+                       }
+                       err = ifcreate(fdDep, tgtRel)
                        if err != nil {
                                break
                        }