X-Git-Url: http://www.git.cypherpunks.ru/?p=goredo.git;a=blobdiff_plain;f=main.go;h=4de78be52fa786830cfbb92862c1c495cd59140a;hp=20072155f67c423ac294d82014af923f90f5280d;hb=314f58ec690c7321535d6718e8d3a0ecb4cac019;hpb=312d2fc4059d8ad03c7fa5b853cdbcb7091e8e71 diff --git a/main.go b/main.go index 2007215..4de78be 100644 --- a/main.go +++ b/main.go @@ -18,6 +18,8 @@ along with this program. If not, see . package main import ( + "bufio" + "bytes" "crypto/rand" "flag" "fmt" @@ -30,6 +32,7 @@ import ( "strconv" "go.cypherpunks.ru/recfile" + "golang.org/x/sys/unix" ) var ( @@ -159,6 +162,46 @@ func main() { } // Those are internal envs + FdOODTgts, err = ioutil.TempFile("", "ood-tgts") + if err != nil { + panic(err) + } + if err = os.Remove(FdOODTgts.Name()); err != nil { + panic(err) + } + FdOODTgtsLock, err = ioutil.TempFile("", "ood-tgts.lock") + if err != nil { + panic(err) + } + if err = os.Remove(FdOODTgtsLock.Name()); err != nil { + panic(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) + } + if _, err = fd.Seek(0, os.SEEK_SET); err != nil { + panic(err) + } + tgtsRaw, err := ioutil.ReadAll(bufio.NewReader(fd)) + if err != nil { + panic(err) + } + unix.Flock(int(fdLock.Fd()), unix.LOCK_UN) + OODTgts = make(map[string]struct{}) + for _, tgtRaw := range bytes.Split(tgtsRaw, []byte{0}) { + t := string(tgtRaw) + if t == "" { + continue + } + OODTgts[t] = struct{}{} + trace(CDebug, "ood: known to be: %s", t) + } + } + StderrPrefix = os.Getenv(EnvStderrPrefix) if v := os.Getenv(EnvLevel); v != "" { Level, err = strconv.Atoi(v) @@ -169,12 +212,14 @@ func main() { panic("negative " + EnvLevel) } } + var fdDep *os.File if v := os.Getenv(EnvDepFd); v != "" { fdDep = mustParseFd(v, EnvDepFd) } - BuildUUID = os.Getenv(EnvBuildUUID) + tgts := flag.Args() + BuildUUID = os.Getenv(EnvBuildUUID) if BuildUUID == "" { raw := new([16]byte) if _, err = io.ReadFull(rand.Reader, raw[:]); err != nil { @@ -189,6 +234,7 @@ func main() { tgts = []string{"all"} } } + statusInit() for i, tgt := range tgts { @@ -264,17 +310,19 @@ CmdSwitch: log.Fatalln("single target expected") } var fdTmp *os.File - fdTmp, err = ioutil.TempFile("", "") + fdTmp, err = ioutil.TempFile("", "whichdo") if err != nil { break } - os.Remove(fdTmp.Name()) + if err = os.Remove(fdTmp.Name()); err != nil { + break + } cwd, tgt := cwdAndTgt(tgts[0]) doFile, upLevels, err := findDo(fdTmp, cwd, tgt) if err != nil { break } - _, err = fdTmp.Seek(0, 0) + _, err = fdTmp.Seek(0, os.SEEK_SET) if err != nil { break }