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:
parent
b537ddc752
commit
a228405a08
6
net.c
6
net.c
@ -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,
|
||||
|
@ -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
5
xlat/getsock_options.in
Normal 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
5
xlat/setsock_options.in
Normal file
@ -0,0 +1,5 @@
|
||||
#if defined __hppa__
|
||||
SO_ATTACH_FILTER 16410
|
||||
#else
|
||||
SO_ATTACH_FILTER 26
|
||||
#endif
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user