| // +build !windows |
| |
| package utils |
| |
| import ( |
| "io/ioutil" |
| "os" |
| "strconv" |
| "syscall" |
| ) |
| |
| func CloseExecFrom(minFd int) error { |
| fdList, err := ioutil.ReadDir("/proc/self/fd") |
| if err != nil { |
| return err |
| } |
| for _, fi := range fdList { |
| fd, err := strconv.Atoi(fi.Name()) |
| if err != nil { |
| // ignore non-numeric file names |
| continue |
| } |
| |
| if fd < minFd { |
| // ignore descriptors lower than our specified minimum |
| continue |
| } |
| |
| // intentionally ignore errors from syscall.CloseOnExec |
| syscall.CloseOnExec(fd) |
| // the cases where this might fail are basically file descriptors that have already been closed (including and especially the one that was created when ioutil.ReadDir did the "opendir" syscall) |
| } |
| return nil |
| } |
| |
| // NewSockPair returns a new unix socket pair |
| func NewSockPair(name string) (parent *os.File, child *os.File, err error) { |
| fds, err := syscall.Socketpair(syscall.AF_LOCAL, syscall.SOCK_STREAM|syscall.SOCK_CLOEXEC, 0) |
| if err != nil { |
| return nil, nil, err |
| } |
| return os.NewFile(uintptr(fds[1]), name+"-p"), os.NewFile(uintptr(fds[0]), name+"-c"), nil |
| } |