mirror of
https://github.com/netbirdio/netbird.git
synced 2026-07-18 20:49:56 +00:00
36 lines
799 B
Go
36 lines
799 B
Go
//go:build linux
|
|
|
|
package cmd
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
// peerUID returns the uid of the process on the other end of a unix socket
|
|
// connection, read from the kernel via SO_PEERCRED.
|
|
func peerUID(c net.Conn) (int, error) {
|
|
uc, ok := c.(*net.UnixConn)
|
|
if !ok {
|
|
return 0, fmt.Errorf("connection is not a unix socket: %T", c)
|
|
}
|
|
raw, err := uc.SyscallConn()
|
|
if err != nil {
|
|
return 0, fmt.Errorf("raw conn: %w", err)
|
|
}
|
|
|
|
var cred *unix.Ucred
|
|
var credErr error
|
|
if err := raw.Control(func(fd uintptr) {
|
|
cred, credErr = unix.GetsockoptUcred(int(fd), unix.SOL_SOCKET, unix.SO_PEERCRED)
|
|
}); err != nil {
|
|
return 0, fmt.Errorf("getsockopt control: %w", err)
|
|
}
|
|
if credErr != nil {
|
|
return 0, fmt.Errorf("SO_PEERCRED: %w", credErr)
|
|
}
|
|
return int(cred.Uid), nil
|
|
}
|