1 #include <err.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <sysexits.h>
5 #include <netinet/in.h>
6 #include <sys/select.h>
7 #include <sys/socket.h>
8 #include <sys/types.h>
9 
10 int
11 main(int argc, char *argv[])
12 {
13     struct sockaddr_in sa_local, sa_remote;
14     socklen_t sin_size = sizeof(struct sockaddr_in);
15     fd_set exceptfds;
16     struct timeval timeout;
17     int fd_l, fd_c, fd_n, i;
18 
19     if ((fd_l = socket(PF_INET, SOCK_STREAM, 0)) == -1)
20         err(EX_OSERR, "socket(2) failure");
21 
22     if ((fd_c = socket(PF_INET, SOCK_STREAM, 0)) == -1)
23         err(EX_OSERR, "socket(2) failure");
24 
25     sa_local.sin_family = AF_INET;
26     sa_local.sin_port = 0;
27     sa_local.sin_addr.s_addr = htonl(INADDR_ANY);
28     memset(&(sa_local.sin_zero), 0, sizeof(sa_local.sin_zero));
29 
30     if (bind(fd_l, (struct sockaddr *)&sa_local, sizeof(struct sockaddr)) == -1)
31         err(EX_OSERR, "bind(2) failure");
32 
33     if (getsockname(fd_l, (struct sockaddr *)&sa_local, &sin_size) == -1)
34         err(EX_OSERR, "getsockname(2) failure");
35 
36     if (listen(fd_l, 1) == -1)
37         err(EX_OSERR, "listen(2) failure");
38 
39     if (connect(fd_c, (struct sockaddr *)&sa_local, sizeof(struct sockaddr)) == -1)
40         err(EX_OSERR, "connect(2) failure");
41 
42     fd_n = accept(fd_l, (struct sockaddr *)&sa_remote, &sin_size);
43 
44     FD_ZERO(&exceptfds);
45     FD_SET(fd_n, &exceptfds);
46 
47     if (send(fd_c, "x", 1, MSG_OOB) == -1)
48         err(EX_OSERR, "send(2) failure");
49 
50     memset(&timeout, 0, sizeof(timeout));
51     i = select(fd_n+1, NULL, NULL, &exceptfds, &timeout);
52 
53     if (i == 1)
54         printf("ok\n");
55 
56     return (0);
57 }
58