mirror of
https://github.com/netbirdio/netbird.git
synced 2026-05-31 21:19:55 +00:00
84 lines
1.7 KiB
Go
84 lines
1.7 KiB
Go
//go:build !ios && !android
|
|
|
|
package cmd
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"os"
|
|
"strings"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
type socketListener struct {
|
|
net.Listener
|
|
network string
|
|
address string
|
|
}
|
|
|
|
func listenOnAddress(addr string) (*socketListener, error) {
|
|
network, address, err := parseListenAddress(addr)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if network == "unix" {
|
|
removeStaleUnixSocket(address)
|
|
}
|
|
|
|
listener, err := net.Listen(network, address)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &socketListener{Listener: listener, network: network, address: address}, nil
|
|
}
|
|
|
|
func parseListenAddress(addr string) (string, string, error) {
|
|
network, address, ok := strings.Cut(addr, "://")
|
|
if !ok || network == "" || address == "" {
|
|
return "", "", fmt.Errorf("address must be in [unix|tcp]://[path|host:port] format: %q", addr)
|
|
}
|
|
|
|
switch network {
|
|
case "unix", "tcp":
|
|
return network, address, nil
|
|
default:
|
|
return "", "", fmt.Errorf("unsupported daemon address protocol: %v", network)
|
|
}
|
|
}
|
|
|
|
func removeStaleUnixSocket(path string) {
|
|
stat, err := os.Stat(path)
|
|
if err == nil && !stat.IsDir() {
|
|
if err := os.Remove(path); err != nil {
|
|
log.Debugf("remove socket file: %v", err)
|
|
}
|
|
return
|
|
}
|
|
|
|
if err != nil && !os.IsNotExist(err) {
|
|
log.Debugf("stat socket file: %v", err)
|
|
}
|
|
}
|
|
|
|
func removeStaleUnixSocketForAddress(addr string) {
|
|
network, address, err := parseListenAddress(addr)
|
|
if err != nil || network != "unix" {
|
|
return
|
|
}
|
|
removeStaleUnixSocket(address)
|
|
}
|
|
|
|
func (l *socketListener) chmodUnixSocket(description string) error {
|
|
if l == nil || l.network != "unix" {
|
|
return nil
|
|
}
|
|
|
|
if err := os.Chmod(l.address, 0666); err != nil {
|
|
return fmt.Errorf("failed setting %s permissions for %s: %w", description, l.address, err)
|
|
}
|
|
return nil
|
|
}
|