summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sd_daemon/notify_linux.go9
-rw-r--r--sd_daemon/notify_nonlinux.go7
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