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.
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/>.
20 #define ALARM_TIMER 15
22 void sig_handler(int sig_num
)
27 int main(int argc
, char **argv
)
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
;
40 fprintf(stderr
, "Usage:\n%s ipv4|ipv6 <port>\n", argv
[0]);
44 signal(SIGALRM
, sig_handler
);
45 siginterrupt(SIGALRM
, 1);
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
;
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]));
64 sock
= socket(sock_addr
.ss_family
, SOCK_DGRAM
, IPPROTO_UDP
);
67 rc
= setsockopt(sock
, SOL_SOCKET
, SO_REUSEADDR
, &bool_true
, sizeof(int));
70 rc
= bind(sock
, (struct sockaddr
*)&sock_addr
, sizeof(sock_addr
));
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());