]> Cypherpunks.ru repositories - goredo.git/blobdiff - main.go
Replace flock() with fcntl() locks
[goredo.git] / main.go
diff --git a/main.go b/main.go
index 9f1158182194446d20e8a2c0a103d9b4fa3d86f5..5bb158b9f3438a137047ae16202241b30e2bdf2f 100644 (file)
--- a/main.go
+++ b/main.go
@@ -1,6 +1,6 @@
 /*
 goredo -- djb's redo implementation on pure Go
-Copyright (C) 2020-2021 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2020-2022 Sergey Matveev <stargrave@stargrave.org>
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -138,10 +138,6 @@ func main() {
                log.Fatalln(err)
        }
 
-       NoColor = os.Getenv(EnvNoColor) != ""
-       NoSync = os.Getenv(EnvNoSync) == "1"
-       InodeTrust = os.Getenv(EnvInodeNoTrust) == ""
-
        TopDir = os.Getenv(EnvTopDir)
        if TopDir == "" {
                TopDir = "/"
@@ -198,6 +194,19 @@ func main() {
        } else if flagTrace != nil {
                traced = *flagTrace
        }
+       NoColor = os.Getenv(EnvNoColor) != ""
+       NoSync = os.Getenv(EnvNoSync) == "1"
+       switch s := os.Getenv(EnvInodeTrust); s {
+       case "none":
+               InodeTrust = InodeTrustNone
+       case "", "ctime":
+               InodeTrust = InodeTrustCtime
+       case "mtime":
+               InodeTrust = InodeTrustMtime
+       default:
+               log.Fatalln("unknown", EnvInodeTrust, "value")
+       }
+       tracef(CDebug, "inode-trust: %s", InodeTrust)
 
        // Those are internal envs
        FdOODTgts, err = ioutil.TempFile("", "ood-tgts")
@@ -218,7 +227,11 @@ func main() {
        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 {
+               flock := unix.Flock_t{
+                       Type:   unix.F_WRLCK,
+                       Whence: io.SeekStart,
+               }
+               if err = unix.FcntlFlock(fdLock.Fd(), unix.F_SETLKW, &flock); err != nil {
                        log.Fatalln(err)
                }
                if _, err = fd.Seek(0, io.SeekStart); err != nil {
@@ -228,7 +241,8 @@ func main() {
                if err != nil {
                        log.Fatalln(err)
                }
-               if err = unix.Flock(int(fdLock.Fd()), unix.LOCK_UN); err != nil {
+               flock.Type = unix.F_UNLCK
+               if err = unix.FcntlFlock(fdLock.Fd(), unix.F_SETLK, &flock); err != nil {
                        log.Fatalln(err)
                }
                OODTgts = map[string]struct{}{}
@@ -320,7 +334,7 @@ CmdSwitch:
        case CmdNameRedoIfchange:
                ok, err = ifchange(tgts, false, traced)
                if err == nil {
-                       err = writeDeps(fdDep, tgts)
+                       err = depsWrite(fdDep, tgts)
                }
        case CmdNameRedoIfcreate:
                if fdDep == nil {