Imported Upstream version 20081130
[ltp-debian.git] / testcases / audit-test / utils / bin / do_recvfrom.c
blob1e006b98a14814e1886592d5943da537b12a2093
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 char buf[BUF_SIZE];
36 size_t buf_len = BUF_SIZE;
38 if (argc != 3) {
39 fprintf(stderr, "Usage:\n%s ipv4|ipv6 <port>\n", argv[0]);
40 return TEST_ERROR;
43 signal(SIGALRM, sig_handler);
44 siginterrupt(SIGALRM, 1);
45 alarm(ALARM_TIMER);
47 memset(&sock_addr, 0, sizeof(sock_addr));
48 if (strcasecmp(argv[1], "ipv4") == 0) {
49 sock_addr.ss_family = AF_INET;
50 sock_addr4->sin_port = htons(atoi(argv[2]));
51 } else if (strcasecmp(argv[1], "ipv6") == 0) {
52 sock_addr.ss_family = AF_INET6;
53 sock_addr6->sin6_port = htons(atoi(argv[2]));
54 } else
55 return TEST_ERROR;
56 sock = socket(sock_addr.ss_family, SOCK_DGRAM, IPPROTO_UDP);
57 if (sock < 0)
58 return TEST_ERROR;
59 rc = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &bool_true, sizeof(int));
60 if (rc < 0)
61 return TEST_ERROR;
62 rc = bind(sock, (struct sockaddr *)&sock_addr, sizeof(sock_addr));
63 if (rc < 0)
64 return TEST_ERROR;
66 errno = 0;
67 rc = recvfrom(sock, buf, buf_len, 0, NULL, NULL);
68 result = (rc < 0 ? TEST_FAIL : TEST_SUCCESS);
70 printf("%d %d %d\n", result, result ? errno : rc, getpid());
71 return result;