github.com/phobos182/packer@v0.2.3-0.20130819023704-c84d2aeffc68/builder/amazon/chroot/lockfile_unix.go (about)

     1  // +build !windows
     2  
     3  package chroot
     4  
     5  import (
     6  	"errors"
     7  	"os"
     8  	"syscall"
     9  )
    10  
    11  // See: http://linux.die.net/include/sys/file.h
    12  const LOCK_EX = 2
    13  const LOCK_NB = 4
    14  const LOCK_UN = 8
    15  
    16  func lockFile(f *os.File) error {
    17  	err := syscall.Flock(int(f.Fd()), LOCK_EX|LOCK_NB)
    18  	if err != nil {
    19  		errno, ok := err.(syscall.Errno)
    20  		if ok && errno == syscall.EWOULDBLOCK {
    21  			return errors.New("file already locked")
    22  		}
    23  
    24  		return err
    25  	}
    26  
    27  	return nil
    28  }
    29  
    30  func unlockFile(f *os.File) error {
    31  	return syscall.Flock(int(f.Fd()), LOCK_UN)
    32  }