mirror of
https://git.zx2c4.com/wireguard-go
synced 2024-11-15 09:15:14 +01:00
b21c82e32d
The implementation now terminates when the unix socket is deleted. Currently we are unable to use fsnotify (on linux), since it does not notify on the deletion of open files. The implementation can now daemonize (on linux) or be kept in the foreground by providing the necessary flag.
84 lines
1.3 KiB
Go
84 lines
1.3 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"os"
|
|
"time"
|
|
)
|
|
|
|
/* TODO:
|
|
* This code can be improved by using fsnotify once:
|
|
* https://github.com/fsnotify/fsnotify/pull/205
|
|
* Is merged
|
|
*/
|
|
|
|
type UAPIListener struct {
|
|
listener net.Listener // unix socket listener
|
|
connNew chan net.Conn
|
|
connErr chan error
|
|
}
|
|
|
|
func (l *UAPIListener) Accept() (net.Conn, error) {
|
|
for {
|
|
select {
|
|
case conn := <-l.connNew:
|
|
return conn, nil
|
|
|
|
case err := <-l.connErr:
|
|
return nil, err
|
|
}
|
|
}
|
|
}
|
|
|
|
func (l *UAPIListener) Close() error {
|
|
return l.listener.Close()
|
|
}
|
|
|
|
func (l *UAPIListener) Addr() net.Addr {
|
|
return nil
|
|
}
|
|
|
|
func NewUAPIListener(name string) (net.Listener, error) {
|
|
|
|
// open UNIX socket
|
|
|
|
socketPath := fmt.Sprintf("/var/run/wireguard/%s.sock", name)
|
|
listener, err := net.Listen("unix", socketPath)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
uapi := &UAPIListener{
|
|
listener: listener,
|
|
connNew: make(chan net.Conn, 1),
|
|
connErr: make(chan error, 1),
|
|
}
|
|
|
|
// watch for deletion of socket
|
|
|
|
go func(l *UAPIListener) {
|
|
for ; ; time.Sleep(time.Second) {
|
|
if _, err := os.Stat(socketPath); os.IsNotExist(err) {
|
|
l.connErr <- err
|
|
return
|
|
}
|
|
}
|
|
}(uapi)
|
|
|
|
// watch for new connections
|
|
|
|
go func(l *UAPIListener) {
|
|
for {
|
|
conn, err := l.listener.Accept()
|
|
if err != nil {
|
|
l.connErr <- err
|
|
break
|
|
}
|
|
l.connNew <- conn
|
|
}
|
|
}(uapi)
|
|
|
|
return uapi, nil
|
|
}
|