25 lines
453 B
Go
25 lines
453 B
Go
|
|
package main
|
||
|
|
|
||
|
|
import (
|
||
|
|
"net"
|
||
|
|
"syscall"
|
||
|
|
)
|
||
|
|
|
||
|
|
func uidPair(conn *net.UnixConn) (int, error) {
|
||
|
|
brut, err := conn.SyscallConn()
|
||
|
|
if err != nil {
|
||
|
|
return -1, err
|
||
|
|
}
|
||
|
|
var cred *syscall.Ucred
|
||
|
|
var errCred error
|
||
|
|
if err := brut.Control(func(fd uintptr) {
|
||
|
|
cred, errCred = syscall.GetsockoptUcred(int(fd), syscall.SOL_SOCKET, syscall.SO_PEERCRED)
|
||
|
|
}); err != nil {
|
||
|
|
return -1, err
|
||
|
|
}
|
||
|
|
if errCred != nil {
|
||
|
|
return -1, errCred
|
||
|
|
}
|
||
|
|
return int(cred.Uid), nil
|
||
|
|
}
|