diff --git a/go.mod b/go.mod index 0fa0221..debf1c0 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,4 @@ module github.com/tailscale/peercred go 1.18 -require golang.org/x/sys v0.0.0-20210301091718-77cc2087c03b +require golang.org/x/sys v0.29.1-0.20250107080300-1c14dcadc3ab diff --git a/go.sum b/go.sum index df556d9..2bfc1a9 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,2 @@ -golang.org/x/sys v0.0.0-20210301091718-77cc2087c03b h1:kHlr0tATeLRMEiZJu5CknOw/E8V6h69sXXQFGoPtjcc= -golang.org/x/sys v0.0.0-20210301091718-77cc2087c03b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.29.1-0.20250107080300-1c14dcadc3ab h1:BMkEEWYOjkvOX7+YKOGbp6jCyQ5pR2j0Ah47p1Vdsx4= +golang.org/x/sys v0.29.1-0.20250107080300-1c14dcadc3ab/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= diff --git a/peercred_solaris.go b/peercred_solaris.go new file mode 100644 index 0000000..aa84dda --- /dev/null +++ b/peercred_solaris.go @@ -0,0 +1,53 @@ +// Copyright (c) 2021 AUTHORS All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package peercred + +import ( + "fmt" + "net" + "strconv" + + "golang.org/x/sys/unix" +) + +func init() { + osGet = getSolaris +} + +func getSolaris(c net.Conn) (*Creds, error) { + switch c := c.(type) { + case *net.UnixConn: + return getUnix(c) + case *net.TCPConn: + // TODO: Need ideas + } + return nil, ErrUnsupportedConnType +} + +func getUnix(c *net.UnixConn) (*Creds, error) { + raw, err := c.SyscallConn() + if err != nil { + return nil, fmt.Errorf("SyscallConn: %w", err) + } + + var creds *unix.Ucred + cerr := raw.Control(func(fd uintptr) { + creds, err = unix.GetPeerUcred(fd) + if err != nil { + err = fmt.Errorf("unix.GetPeerUcred: %w", err) + return + } + }) + if cerr != nil { + return nil, fmt.Errorf("raw.Control: %w", cerr) + } + if err != nil { + return nil, err + } + return &Creds{ + pid: creds.Getpid(), + uid: strconv.FormatUint(uint64(creds.Geteuid()), 10), + }, nil +} diff --git a/peercred_unix_test.go b/peercred_unix_test.go index 9cd4dbb..c183c11 100644 --- a/peercred_unix_test.go +++ b/peercred_unix_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build go1.15 && (linux || darwin || freebsd) +//go:build go1.15 && (linux || darwin || freebsd || illumos || solaris) package peercred