2015-06-27 11:13:17 +08:00
// +build !windows
package utils
import (
"io/ioutil"
2017-03-03 04:53:06 +08:00
"os"
2015-06-27 11:13:17 +08:00
"strconv"
2017-05-10 05:38:27 +08:00
"golang.org/x/sys/unix"
2015-06-27 11:13:17 +08:00
)
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
}
2017-05-10 05:38:27 +08:00
// intentionally ignore errors from unix.CloseOnExec
unix . CloseOnExec ( fd )
2015-06-27 11:13:17 +08:00
// 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
}
2017-03-03 04:53:06 +08:00
// NewSockPair returns a new unix socket pair
func NewSockPair ( name string ) ( parent * os . File , child * os . File , err error ) {
2017-05-10 05:38:27 +08:00
fds , err := unix . Socketpair ( unix . AF_LOCAL , unix . SOCK_STREAM | unix . SOCK_CLOEXEC , 0 )
2017-03-03 04:53:06 +08:00
if err != nil {
return nil , nil , err
}
return os . NewFile ( uintptr ( fds [ 1 ] ) , name + "-p" ) , os . NewFile ( uintptr ( fds [ 0 ] ) , name + "-c" ) , nil
}