diff options
-rw-r--r-- | sd_daemon/notify_linux.go | 9 | ||||
-rw-r--r-- | sd_daemon/notify_nonlinux.go | 7 |
2 files changed, 13 insertions, 3 deletions
diff --git a/sd_daemon/notify_linux.go b/sd_daemon/notify_linux.go index 903f1ad..085b25c 100644 --- a/sd_daemon/notify_linux.go +++ b/sd_daemon/notify_linux.go @@ -99,7 +99,16 @@ func (msg Notification) send(unsetEnv bool) error { // the high-level interface of "net", and messing around with FileConn // and UnixConn. Maybe we just drop to using unix.Socket and // unix.SendmsgN directly. +// +// See: net/sock_cloexec.go:sysSocket() func socketUnixgram(name string) (*net.UnixConn, error) { + // Don't bother with SOCK_NONBLOCK, net.FileConn() will call + // syscall.SetNonblock(). + // + // BUG(lukeshu): On Linux, Notification.Send() depends on + // SOCK_CLOEXEC in Linux 2.6.27 (2008-10-09), which is + // slightly newer than Go itself depends on, 2.6.23 + // (2007-10-09). fd, err := unix.Socket(unix.AF_UNIX, unix.SOCK_DGRAM|unix.SOCK_CLOEXEC, 0) if err != nil { return nil, os.NewSyscallError("socket", err) diff --git a/sd_daemon/notify_nonlinux.go b/sd_daemon/notify_nonlinux.go index d09cef0..dc268d3 100644 --- a/sd_daemon/notify_nonlinux.go +++ b/sd_daemon/notify_nonlinux.go @@ -99,6 +99,8 @@ func (msg Notification) send(unsetEnv bool) error { // the high-level interface of "net", and messing around with FileConn // and UnixConn. Maybe we just drop to using unix.Socket and // unix.SendmsgN directly. +// +// See: net/sys_cloexec.go:sysSocket() func socketUnixgram(name string) (*net.UnixConn, error) { syscall.ForkLock.RLock() fd, err := unix.Socket(unix.AF_UNIX, unix.SOCK_DGRAM, 0) @@ -110,9 +112,8 @@ func socketUnixgram(name string) (*net.UnixConn, error) { return nil, os.NewSyscallError("socket", err) } defer unix.Close(fd) - if err = unix.SetNonblock(fd, true); err != nil { - return nil, os.NewSyscallError("setnonblock", err) - } + // Don't bother calling unix.SetNonblock(), net.FileConn() + // will call syscall.SetNonblock(). conn, err := net.FileConn(os.NewFile(uintptr(fd), name)) if err != nil { return nil, err |