From 53aa286056ef226755cd898109dbcdaba8ac0b81 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Fri, 8 Dec 2017 16:22:27 +0100 Subject: [PATCH] unix: add GetsockoptString on Linux Add a Getsockopt variant returning a string. This can e.g. be used to retrieve a peer's SELinux or AppArmor labels using SO_PEERSEC. Fixes golang/go#16374 Change-Id: Ia266bad1b0aef94ce19d378719ce1c1c976b4cc5 Reviewed-on: https://go-review.googlesource.com/83275 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- unix/syscall_linux.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/unix/syscall_linux.go b/unix/syscall_linux.go index 797cda7e..60b97a35 100644 --- a/unix/syscall_linux.go +++ b/unix/syscall_linux.go @@ -808,6 +808,24 @@ func GetsockoptTCPInfo(fd, level, opt int) (*TCPInfo, error) { return &value, err } +// GetsockoptString returns the string value of the socket option opt for the +// socket associated with fd at the given socket level. +func GetsockoptString(fd, level, opt int) (string, error) { + buf := make([]byte, 256) + vallen := _Socklen(len(buf)) + err := getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen) + if err != nil { + if err == ERANGE { + buf = make([]byte, vallen) + err = getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen) + } + if err != nil { + return "", err + } + } + return string(buf[:vallen-1]), nil +} + func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) { return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq)) }