github.com/eagleql/xray-core@v1.4.4/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  }