Files
Pulse/cmd/pulse-sensor-proxy/peer_creds_linux.go
2025-11-20 12:28:01 +00:00

45 lines
889 B
Go

//go:build linux
package main
import (
"fmt"
"net"
"syscall"
"github.com/rs/zerolog/log"
)
// extractPeerCredentials extracts peer credentials via SO_PEERCRED
func extractPeerCredentials(conn net.Conn) (*peerCredentials, error) {
unixConn, ok := conn.(*net.UnixConn)
if !ok {
return nil, fmt.Errorf("not a unix connection")
}
file, err := unixConn.File()
if err != nil {
return nil, fmt.Errorf("failed to get file descriptor: %w", err)
}
defer file.Close()
fd := int(file.Fd())
cred, err := syscall.GetsockoptUcred(fd, syscall.SOL_SOCKET, syscall.SO_PEERCRED)
if err != nil {
return nil, fmt.Errorf("failed to get peer credentials: %w", err)
}
log.Debug().
Int32("pid", cred.Pid).
Uint32("uid", cred.Uid).
Uint32("gid", cred.Gid).
Msg("Peer credentials")
return &peerCredentials{
uid: cred.Uid,
pid: uint32(cred.Pid),
gid: cred.Gid,
}, nil
}