Browse Source

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 <tobias.klauser@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Tobias Klauser 8 years ago
parent
commit
53aa286056
1 changed files with 18 additions and 0 deletions
  1. 18 0
      unix/syscall_linux.go

+ 18 - 0
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))
 }