Imported Upstream version 20081130
[ltp-debian.git] / testcases / audit-test / utils / bin / do_recvmsg.c
blob303f14ae337507c53ee2eb9ef8adb161929b2dd8
1 /* (c) Copyright Hewlett-Packard Development Company, L.P., 2007
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of version 2 the GNU General Public License as
5 * published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #include "includes.h"
17 #include <signal.h>
19 #define BUF_SIZE 2048
20 #define ALARM_TIMER 15
22 void sig_handler(int sig_num)
24 return;
27 int main(int argc, char **argv)
29 int rc, result;
30 struct sockaddr_storage sock_addr;
31 struct sockaddr_in *sock_addr4 = (struct sockaddr_in *)&sock_addr;
32 struct sockaddr_in6 *sock_addr6 = (struct sockaddr_in6 *)&sock_addr;
33 int sock;
34 int bool_true = 1;
35 struct msghdr msg;
36 struct iovec msg_buf;
37 char buf[BUF_SIZE];
39 if (argc != 3) {
40 fprintf(stderr, "Usage:\n%s ipv4|ipv6 <port>\n", argv[0]);
41 return TEST_ERROR;
44 signal(SIGALRM, sig_handler);
45 siginterrupt(SIGALRM, 1);
46 alarm(ALARM_TIMER);
48 memset(&msg, 0, sizeof(msg));
49 memset(&msg_buf, 0, sizeof(msg_buf));
50 msg_buf.iov_base = buf;
51 msg_buf.iov_len = BUF_SIZE;
52 msg.msg_iov = &msg_buf;
53 msg.msg_iovlen = 1;
55 memset(&sock_addr, 0, sizeof(sock_addr));
56 if (strcasecmp(argv[1], "ipv4") == 0) {
57 sock_addr.ss_family = AF_INET;
58 sock_addr4->sin_port = htons(atoi(argv[2]));
59 } else if (strcasecmp(argv[1], "ipv6") == 0) {
60 sock_addr.ss_family = AF_INET6;
61 sock_addr6->sin6_port = htons(atoi(argv[2]));
62 } else
63 return TEST_ERROR;
64 sock = socket(sock_addr.ss_family, SOCK_DGRAM, IPPROTO_UDP);
65 if (sock < 0)
66 return TEST_ERROR;
67 rc = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &bool_true, sizeof(int));
68 if (rc < 0)
69 return TEST_ERROR;
70 rc = bind(sock, (struct sockaddr *)&sock_addr, sizeof(sock_addr));
71 if (rc < 0)
72 return TEST_ERROR;
74 errno = 0;
75 rc = recvmsg(sock, &msg, 0);
76 result = (rc < 0 ? TEST_FAIL : TEST_SUCCESS);
78 printf("%d %d %d\n", result, result ? errno : rc, getpid());
79 return result;