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
;
36 size_t buf_len
= BUF_SIZE
;
39 fprintf(stderr
, "Usage:\n%s ipv4|ipv6 <port>\n", argv
[0]);
43 signal(SIGALRM
, sig_handler
);
44 siginterrupt(SIGALRM
, 1);
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]));
56 sock
= socket(sock_addr
.ss_family
, SOCK_DGRAM
, IPPROTO_UDP
);
59 rc
= setsockopt(sock
, SOL_SOCKET
, SO_REUSEADDR
, &bool_true
, sizeof(int));
62 rc
= bind(sock
, (struct sockaddr
*)&sock_addr
, sizeof(sock_addr
));
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());