Skip to content

Commit ffbba2c

Browse files
committed
Add solaris/illumos support
1 parent b6a68cf commit ffbba2c

File tree

3 files changed

+510
-1
lines changed

3 files changed

+510
-1
lines changed

ipc/uapi_solaris.go

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
/* SPDX-License-Identifier: MIT
2+
*
3+
* Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
4+
*/
5+
6+
package ipc
7+
8+
import (
9+
"net"
10+
"os"
11+
12+
"golang.org/x/sys/unix"
13+
)
14+
15+
type UAPIListener struct {
16+
listener net.Listener // unix socket listener
17+
connNew chan net.Conn
18+
connErr chan error
19+
evPort *unix.EventPort
20+
}
21+
22+
func (l *UAPIListener) Accept() (net.Conn, error) {
23+
for {
24+
select {
25+
case conn := <-l.connNew:
26+
return conn, nil
27+
28+
case err := <-l.connErr:
29+
return nil, err
30+
}
31+
}
32+
}
33+
34+
func (l *UAPIListener) Close() error {
35+
err1 := l.evPort.Close()
36+
err2 := l.listener.Close()
37+
if err1 != nil {
38+
return err1
39+
}
40+
return err2
41+
}
42+
43+
func (l *UAPIListener) Addr() net.Addr {
44+
return l.listener.Addr()
45+
}
46+
47+
func UAPIListen(name string, file *os.File) (net.Listener, error) {
48+
listener, err := net.FileListener(file)
49+
if err != nil {
50+
return nil, err
51+
}
52+
53+
uapi := &UAPIListener{
54+
listener: listener,
55+
connNew: make(chan net.Conn, 1),
56+
connErr: make(chan error, 1),
57+
}
58+
59+
if unixListener, ok := listener.(*net.UnixListener); ok {
60+
unixListener.SetUnlinkOnClose(true)
61+
}
62+
63+
socketPath := sockPath(name)
64+
65+
uapi.evPort, err = unix.NewEventPort()
66+
if err != nil {
67+
return nil, err
68+
}
69+
stat, err := os.Lstat(socketPath)
70+
if err != nil {
71+
return nil, err
72+
}
73+
err = uapi.evPort.AssociatePath(socketPath, stat, unix.FILE_MODIFIED|unix.FILE_ATTRIB|unix.FILE_NOFOLLOW, nil)
74+
if err != nil {
75+
return nil, err
76+
}
77+
78+
go func(l *UAPIListener) {
79+
for {
80+
// start with lstat to avoid race condition
81+
if _, err := os.Lstat(socketPath); os.IsNotExist(err) {
82+
l.connErr <- err
83+
return
84+
}
85+
_, perr := l.evPort.GetOne(nil)
86+
if perr == unix.EINTR {
87+
// If we were interrupted, resume watching.
88+
continue
89+
}
90+
if perr != nil {
91+
l.connErr <- perr
92+
return
93+
}
94+
}
95+
}(uapi)
96+
97+
// watch for new connections
98+
99+
go func(l *UAPIListener) {
100+
for {
101+
conn, err := l.listener.Accept()
102+
if err != nil {
103+
l.connErr <- err
104+
break
105+
}
106+
l.connNew <- conn
107+
}
108+
}(uapi)
109+
110+
return uapi, nil
111+
}

ipc/uapi_unix.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//go:build linux || darwin || freebsd || openbsd
1+
//go:build linux || darwin || freebsd || openbsd || solaris || illumos
22

33
/* SPDX-License-Identifier: MIT
44
*

0 commit comments

Comments
 (0)