From d5840adf789d732bc8b00f37b26ca956a7cc8e79 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Thu, 14 Dec 2017 15:09:03 +0100 Subject: [PATCH] unix: add GetsockoptString for Darwin, *BSD and Solaris As suggested by Brad in CL 83275. From what I can tell getsockopt syscall on these OSes doesn't return ERANGE in any case, so these versions don't include the buffer growing. Change-Id: I667c3751021e26defec0a04761a689fa4b78c65d Reviewed-on: https://go-review.googlesource.com/84016 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- unix/syscall_bsd.go | 12 ++++++++++++ unix/syscall_solaris.go | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/unix/syscall_bsd.go b/unix/syscall_bsd.go index 47b05984..d3903ede 100644 --- a/unix/syscall_bsd.go +++ b/unix/syscall_bsd.go @@ -352,6 +352,18 @@ func GetsockoptICMPv6Filter(fd, level, opt int) (*ICMPv6Filter, 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 { + return "", err + } + return string(buf[:vallen-1]), nil +} + //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) diff --git a/unix/syscall_solaris.go b/unix/syscall_solaris.go index 58b4e6dd..81e23f9b 100644 --- a/unix/syscall_solaris.go +++ b/unix/syscall_solaris.go @@ -130,6 +130,18 @@ func Getsockname(fd int) (sa Sockaddr, err error) { return anyToSockaddr(&rsa) } +// 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 { + return "", err + } + return string(buf[:vallen-1]), nil +} + const ImplementsGetwd = true //sys Getcwd(buf []byte) (n int, err error)