commit | 9109b7679e13aa34a54834cfb4949cac4b96e576 | [log] [tgz] |
---|---|---|
author | Kir Kolyshkin <kolyshkin@gmail.com> | Sun Sep 01 17:21:42 2019 -0700 |
committer | Tobias Klauser <tobias.klauser@gmail.com> | Mon Sep 02 13:37:55 2019 +0000 |
tree | 65e4f56bd141f04b9dc13c61a20bc6ef01ed1de5 | |
parent | 1e83adbbebd0f5dc971915fd7e5db032c3d2b731 [diff] |
unix: add IoctlRetInt for Linux Add IoctlRetInt() for ioctls that use syscall's return value as an output parameter. Add a unit test for Linux, and the NS_GET_ defines that it requires (see ioctl_ns(2)). Motivation: Currently, x/sys/unix provides a few functions to deal with ioctls. In particular, IoctlGetInt(), which "performs an ioctl operation which gets an integer value". It does that by passing a pointer to an integer to a syscall and returning that integer. The value returned from syscall is treated as success/failure flag (0 means success, -1 means failure, and in such case errno is used to figure out the underlying error). It appears that there are a few ioctls in Linux and at least one in Solaris, which do not use the above way to return an int, instead they use the syscall's return value (in case it's not negative). As Linux ioctl(2) man page says, > RETURN VALUE > Usually, on success zero is returned. A few ioctl() requests > use the return value as an output parameter and return > a nonnegative value on success. On error, -1 is returned, > and errno is set appropriately. Currently I am aware of at least 6 Linux ioctls that do that (return the value directly): * LOOP_CTL_* ioctls on /dev/loop-control (all 3 of them). Source: loop(4) * NS_* ioctls (3 out of 4) on /proc/PID/ns/*. Source: ioctl_ns(2) And one in Solaris: * I_FIND ioctl, source: streamio(7i). There might be some more ioctls like the ones above, but since ioctls are scarcely documented, it is hard to say how many more. Obviously, using IoctlGetInt() for such ioctls would be a big mistake, as 0 will always be returned. For example, there was a bug in Docker's pkg/loopback (moby/moby#39801). [v6: make it linux-specific for now] Fixes golang/go#33966 Change-Id: Ie64f72fd84101b955ba14519a357e06a66d685d0 Reviewed-on: https://go-review.googlesource.com/c/sys/+/192780 Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Tobias Klauser <tobias.klauser@gmail.com>
This repository holds supplemental Go packages for low-level interactions with the operating system.
The easiest way to install is to run go get -u golang.org/x/sys
. You can also manually git clone the repository to $GOPATH/src/golang.org/x/sys
.
This repository uses Gerrit for code changes. To learn how to submit changes to this repository, see https://golang.org/doc/contribute.html.
The main issue tracker for the sys repository is located at https://github.com/golang/go/issues. Prefix your issue with “x/sys:” in the subject line, so it is easy to find.