// +build dragonfly freebsd linux netbsd openbsd plan9 solaris package daemon import ( "fmt" "syscall" ) func lockFile(fd uintptr) error { err := syscall.Flock(int(fd), syscall.LOCK_EX|syscall.LOCK_NB) if err == syscall.EWOULDBLOCK { err = ErrWouldBlock } return err } func unlockFile(fd uintptr) error { err := syscall.Flock(int(fd), syscall.LOCK_UN) if err == syscall.EWOULDBLOCK { err = ErrWouldBlock } return err } const pathMax = 0x1000 func getFdName(fd uintptr) (name string, err error) { path := fmt.Sprintf("/proc/self/fd/%d", int(fd)) // We use predefined pathMax const because /proc directory contains special files // so that unable to get correct size of pseudo-symlink through lstat. // please see notes and example for readlink syscall: // http://man7.org/linux/man-pages/man2/readlink.2.html#NOTES buf := make([]byte, pathMax) var n int if n, err = syscall.Readlink(path, buf); err == nil { name = string(buf[:n]) } return }