github.com/EagleQL/Xray-core@v1.4.3/transport/internet/filelocker_other.go (about) 1 // +build !windows 2 3 package internet 4 5 import ( 6 "os" 7 8 "golang.org/x/sys/unix" 9 ) 10 11 // Acquire lock 12 func (fl *FileLocker) Acquire() error { 13 f, err := os.Create(fl.path) 14 if err != nil { 15 return err 16 } 17 if err := unix.Flock(int(f.Fd()), unix.LOCK_EX); err != nil { 18 f.Close() 19 return newError("failed to lock file: ", fl.path).Base(err) 20 } 21 fl.file = f 22 return nil 23 } 24 25 // Release lock 26 func (fl *FileLocker) Release() { 27 if err := unix.Flock(int(fl.file.Fd()), unix.LOCK_UN); err != nil { 28 newError("failed to unlock file: ", fl.path).Base(err).WriteToLog() 29 } 30 if err := fl.file.Close(); err != nil { 31 newError("failed to close file: ", fl.path).Base(err).WriteToLog() 32 } 33 if err := os.Remove(fl.path); err != nil { 34 newError("failed to remove file: ", fl.path).Base(err).WriteToLog() 35 } 36 }