package main
import (
+ "bufio"
+ "bytes"
"crypto/rand"
"flag"
"fmt"
"strconv"
"go.cypherpunks.ru/recfile"
+ "golang.org/x/sys/unix"
)
var (
var err error
Cwd, err = os.Getwd()
if err != nil {
- panic(err)
+ log.Fatalln(err)
}
NoColor = os.Getenv(EnvNoColor) != ""
}
// 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)
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 {
- panic(err)
+ log.Fatalln(err)
}
raw[6] = (raw[6] & 0x0F) | uint8(4<<4) // version 4
BuildUUID = fmt.Sprintf(
tgts = []string{"all"}
}
}
+
statusInit()
for i, tgt := range tgts {
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
}