(root)/
strace-6.5/
tests-m32/
nfnetlink_ctnetlink_exp.c
       1  /*
       2   * Copyright (c) 2017 JingPiao Chen <chenjingpiao@gmail.com>
       3   * Copyright (c) 2017-2021 The strace developers.
       4   * All rights reserved.
       5   *
       6   * SPDX-License-Identifier: GPL-2.0-or-later
       7   */
       8  
       9  #include "tests.h"
      10  #include <stdio.h>
      11  #include <sys/socket.h>
      12  #include "netlink.h"
      13  #include <linux/netfilter/nfnetlink.h>
      14  #include <linux/netfilter/nfnetlink_conntrack.h>
      15  
      16  static void
      17  test_nlmsg_type(const int fd)
      18  {
      19  	long rc;
      20  	struct nlmsghdr nlh = {
      21  		.nlmsg_len = sizeof(nlh),
      22  		.nlmsg_flags = NLM_F_REQUEST,
      23  	};
      24  
      25  	nlh.nlmsg_type = NFNL_SUBSYS_CTNETLINK_EXP << 8 | IPCTNL_MSG_EXP_NEW;
      26  	rc = sendto(fd, &nlh, nlh.nlmsg_len, MSG_DONTWAIT, NULL, 0);
      27  	printf("sendto(%d, {nlmsg_len=%u"
      28  	       ", nlmsg_type=NFNL_SUBSYS_CTNETLINK_EXP<<8|IPCTNL_MSG_EXP_NEW"
      29  	       ", nlmsg_flags=NLM_F_REQUEST, nlmsg_seq=0, nlmsg_pid=0}"
      30  	       ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",
      31  	       fd, nlh.nlmsg_len, nlh.nlmsg_len, sprintrc(rc));
      32  
      33  	nlh.nlmsg_type = NFNL_SUBSYS_CTNETLINK_EXP << 8 | 0xff;
      34  	rc = sendto(fd, &nlh, nlh.nlmsg_len, MSG_DONTWAIT, NULL, 0);
      35  	printf("sendto(%d, {nlmsg_len=%u"
      36  	       ", nlmsg_type=NFNL_SUBSYS_CTNETLINK_EXP<<8|0xff"
      37  	       " /* IPCTNL_MSG_EXP_??? */"
      38  	       ", nlmsg_flags=NLM_F_REQUEST, nlmsg_seq=0, nlmsg_pid=0}"
      39  	       ", %u, MSG_DONTWAIT, NULL, 0) = %s\n",
      40  	       fd, nlh.nlmsg_len, nlh.nlmsg_len, sprintrc(rc));
      41  }
      42  
      43  static void
      44  test_nlmsg_flags(const int fd)
      45  {
      46  	long rc;
      47  	struct nlmsghdr nlh = {
      48  		.nlmsg_len = sizeof(nlh),
      49  	};
      50  
      51  	nlh.nlmsg_type = NFNL_SUBSYS_CTNETLINK_EXP << 8 | IPCTNL_MSG_EXP_NEW;
      52  	nlh.nlmsg_flags = NLM_F_REQUEST | NLM_F_EXCL;
      53  	rc = sendto(fd, &nlh, nlh.nlmsg_len, MSG_DONTWAIT, NULL, 0);
      54  	printf("sendto(%d, {nlmsg_len=%u"
      55  	       ", nlmsg_type=NFNL_SUBSYS_CTNETLINK_EXP<<8|IPCTNL_MSG_EXP_NEW"
      56  	       ", nlmsg_flags=NLM_F_REQUEST|NLM_F_EXCL, nlmsg_seq=0"
      57  	       ", nlmsg_pid=0}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",
      58  	       fd, nlh.nlmsg_len, nlh.nlmsg_len, sprintrc(rc));
      59  
      60  	nlh.nlmsg_type = NFNL_SUBSYS_CTNETLINK_EXP << 8 | IPCTNL_MSG_EXP_GET;
      61  	nlh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ROOT;
      62  	rc = sendto(fd, &nlh, nlh.nlmsg_len, MSG_DONTWAIT, NULL, 0);
      63  	printf("sendto(%d, {nlmsg_len=%u"
      64  	       ", nlmsg_type=NFNL_SUBSYS_CTNETLINK_EXP<<8|IPCTNL_MSG_EXP_GET"
      65  	       ", nlmsg_flags=NLM_F_REQUEST|NLM_F_ROOT, nlmsg_seq=0"
      66  	       ", nlmsg_pid=0}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",
      67  	       fd, nlh.nlmsg_len, nlh.nlmsg_len, sprintrc(rc));
      68  
      69  	nlh.nlmsg_type = NFNL_SUBSYS_CTNETLINK_EXP << 8 | IPCTNL_MSG_EXP_DELETE;
      70  	nlh.nlmsg_flags = NLM_F_REQUEST | NLM_F_NONREC;
      71  	rc = sendto(fd, &nlh, nlh.nlmsg_len, MSG_DONTWAIT, NULL, 0);
      72  	printf("sendto(%d, {nlmsg_len=%u"
      73  	       ", nlmsg_type=NFNL_SUBSYS_CTNETLINK_EXP<<8|IPCTNL_MSG_EXP_DELETE"
      74  	       ", nlmsg_flags=NLM_F_REQUEST|NLM_F_NONREC, nlmsg_seq=0"
      75  	       ", nlmsg_pid=0}, %u, MSG_DONTWAIT, NULL, 0) = %s\n",
      76  	       fd, nlh.nlmsg_len, nlh.nlmsg_len, sprintrc(rc));
      77  }
      78  
      79  int
      80  main(void)
      81  {
      82  	skip_if_unavailable("/proc/self/fd/");
      83  
      84  	int fd = create_nl_socket(NETLINK_NETFILTER);
      85  
      86  	test_nlmsg_type(fd);
      87  	test_nlmsg_flags(fd);
      88  
      89  	puts("+++ exited with 0 +++");
      90  
      91  	return 0;
      92  }