net: print SO_GET_FILTER in getsockopt

SO_ATTACH_FILTER and SO_GET_FILTER have the same value; the former
constant is intended for use in setsockopt, and the latter is for
getsockopt.  Handle that the same way as similar SOL_IP/SOL_IPV6 socket
options are handled.

* xlat/getsock_options.in: New file.
* xlat/setsock_options.in: Likewise.
* xlat/sockoptions.in (SO_ATTACH_FILTER): Move to
xlat/setsock_options.in.
* net.c: Include "xlat/setsock_options.h" and "xlat/getsock_options.h".
(print_sockopt_fd_level_name) <case SOL_SOCKET>: Use
getsock_options or setsock_options as auxiliary xlats based on the value
of is_getsockopt flag.
* tests/sock_filter-v.c: Update expected output.

Co-Authored-by: Dmitry V. Levin <ldv@altlinux.org>
This commit is contained in:
Eugene Syromyatnikov 2018-05-09 12:44:28 +00:00 committed by Dmitry V. Levin
parent b537ddc752
commit a228405a08
5 changed files with 28 additions and 15 deletions

6
net.c
View File

@ -426,6 +426,8 @@ SYS_FUNC(socketpair)
}
#include "xlat/sock_options.h"
#include "xlat/getsock_options.h"
#include "xlat/setsock_options.h"
#include "xlat/sock_ip_options.h"
#include "xlat/getsock_ip_options.h"
#include "xlat/setsock_ip_options.h"
@ -466,7 +468,9 @@ print_sockopt_fd_level_name(struct tcb *tcp, int fd, unsigned int level,
switch (level) {
case SOL_SOCKET:
printxval(sock_options, name, "SO_???");
printxvals(name, "SO_???", sock_options,
is_getsockopt ? getsock_options :
setsock_options, NULL);
break;
case SOL_IP:
printxvals(name, "IP_???", sock_ip_options,

View File

@ -35,6 +35,11 @@
#include <sys/socket.h>
#include <linux/filter.h>
/* SO_GET_FILTER was introduced by Linux commit v3.8-rc1~139^2~518 */
#ifndef SO_GET_FILTER
# define SO_GET_FILTER SO_ATTACH_FILTER
#endif
#define HEX_FMT "%#x"
#if XLAT_RAW
@ -116,7 +121,7 @@ static const char *errstr;
static int
get_filter(int fd, void *val, socklen_t *len)
{
int rc = getsockopt(fd, SOL_SOCKET, SO_ATTACH_FILTER, val, len);
int rc = getsockopt(fd, SOL_SOCKET, SO_GET_FILTER, val, len);
errstr = sprintrc(rc);
return rc;
}
@ -150,17 +155,17 @@ main(void)
*len = BPF_MAXINSNS;
rc = get_filter(fd, NULL, len);
if (rc)
perror_msg_and_skip("getsockopt SOL_SOCKET SO_ATTACH_FILTER");
perror_msg_and_skip("getsockopt SOL_SOCKET SO_GET_FILTER");
printf("getsockopt(%d, " XLAT_FMT ", " XLAT_FMT ", NULL, [%u->0]) "
"= 0\n",
fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_ATTACH_FILTER),
fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_GET_FILTER),
BPF_MAXINSNS);
/* getsockopt NULL optlen - EFAULT */
rc = get_filter(fd, NULL, NULL);
printf("getsockopt(%d, " XLAT_FMT ", " XLAT_FMT ", NULL, NULL) "
"= %s\n",
fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_ATTACH_FILTER), errstr);
fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_GET_FILTER), errstr);
/* attach a filter */
rc = set_filter(fd, prog, sizeof(*prog));
@ -194,28 +199,28 @@ main(void)
rc = get_filter(fd, efault, len);
printf("getsockopt(%d, " XLAT_FMT ", " XLAT_FMT ", %p, [0->%u]) "
"= %s\n",
fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_ATTACH_FILTER), efault,
fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_GET_FILTER), efault,
(unsigned int) ARRAY_SIZE(bpf_filter), errstr);
/* getsockopt optlen is too small - EINVAL */
*len = ARRAY_SIZE(bpf_filter) - 1;
rc = get_filter(fd, efault, len);
printf("getsockopt(%d, " XLAT_FMT ", " XLAT_FMT ", %p, [%u]) = %s\n",
fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_ATTACH_FILTER), efault,
fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_GET_FILTER), efault,
(unsigned int) ARRAY_SIZE(bpf_filter) - 1, errstr);
/* getsockopt optval EFAULT */
*len = ARRAY_SIZE(bpf_filter);
rc = get_filter(fd, filter + 1, len);
printf("getsockopt(%d, " XLAT_FMT ", " XLAT_FMT ", %p, [%u]) = %s\n",
fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_ATTACH_FILTER),
fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_GET_FILTER),
filter + 1, (unsigned int) ARRAY_SIZE(bpf_filter), errstr);
/* getsockopt optlen is too large - truncated */
*len = ARRAY_SIZE(bpf_filter) + 1;
rc = get_filter(fd, filter, len);
printf("getsockopt(%d, " XLAT_FMT ", " XLAT_FMT ", ",
fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_ATTACH_FILTER));
fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_GET_FILTER));
print_filter();
printf(", [%u->%d]) = %s\n",
(unsigned int) ARRAY_SIZE(bpf_filter) + 1, *len, errstr);

5
xlat/getsock_options.in Normal file
View File

@ -0,0 +1,5 @@
#if defined __hppa__
SO_GET_FILTER 16410
#else
SO_GET_FILTER 26
#endif

5
xlat/setsock_options.in Normal file
View File

@ -0,0 +1,5 @@
#if defined __hppa__
SO_ATTACH_FILTER 16410
#else
SO_ATTACH_FILTER 26
#endif

View File

@ -196,12 +196,6 @@ SO_BINDTODEVICE 16409
SO_BINDTODEVICE 25
#endif
#if defined __hppa__
SO_ATTACH_FILTER 16410
#else
SO_ATTACH_FILTER 26
#endif
#if defined __hppa__
SO_DETACH_FILTER 16411
#else