xref: /dflybsd-src/test/testcases/io/select_4/select_4.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
186d7f5d3SJohn Marino #include <err.h>
286d7f5d3SJohn Marino #include <stdio.h>
386d7f5d3SJohn Marino #include <string.h>
486d7f5d3SJohn Marino #include <sysexits.h>
586d7f5d3SJohn Marino #include <netinet/in.h>
686d7f5d3SJohn Marino #include <sys/select.h>
786d7f5d3SJohn Marino #include <sys/socket.h>
886d7f5d3SJohn Marino #include <sys/types.h>
986d7f5d3SJohn Marino 
1086d7f5d3SJohn Marino int
main(int argc,char * argv[])1186d7f5d3SJohn Marino main(int argc, char *argv[])
1286d7f5d3SJohn Marino {
1386d7f5d3SJohn Marino     struct sockaddr_in sa_local, sa_remote;
1486d7f5d3SJohn Marino     socklen_t sin_size = sizeof(struct sockaddr_in);
1586d7f5d3SJohn Marino     fd_set exceptfds;
1686d7f5d3SJohn Marino     struct timeval timeout;
1786d7f5d3SJohn Marino     int fd_l, fd_c, fd_n, i;
1886d7f5d3SJohn Marino 
1986d7f5d3SJohn Marino     if ((fd_l = socket(PF_INET, SOCK_STREAM, 0)) == -1)
2086d7f5d3SJohn Marino         err(EX_OSERR, "socket(2) failure");
2186d7f5d3SJohn Marino 
2286d7f5d3SJohn Marino     if ((fd_c = socket(PF_INET, SOCK_STREAM, 0)) == -1)
2386d7f5d3SJohn Marino         err(EX_OSERR, "socket(2) failure");
2486d7f5d3SJohn Marino 
2586d7f5d3SJohn Marino     sa_local.sin_family = AF_INET;
2686d7f5d3SJohn Marino     sa_local.sin_port = 0;
2786d7f5d3SJohn Marino     sa_local.sin_addr.s_addr = htonl(INADDR_ANY);
2886d7f5d3SJohn Marino     memset(&(sa_local.sin_zero), 0, sizeof(sa_local.sin_zero));
2986d7f5d3SJohn Marino 
3086d7f5d3SJohn Marino     if (bind(fd_l, (struct sockaddr *)&sa_local, sizeof(struct sockaddr)) == -1)
3186d7f5d3SJohn Marino         err(EX_OSERR, "bind(2) failure");
3286d7f5d3SJohn Marino 
3386d7f5d3SJohn Marino     if (getsockname(fd_l, (struct sockaddr *)&sa_local, &sin_size) == -1)
3486d7f5d3SJohn Marino         err(EX_OSERR, "getsockname(2) failure");
3586d7f5d3SJohn Marino 
3686d7f5d3SJohn Marino     if (listen(fd_l, 1) == -1)
3786d7f5d3SJohn Marino         err(EX_OSERR, "listen(2) failure");
3886d7f5d3SJohn Marino 
3986d7f5d3SJohn Marino     if (connect(fd_c, (struct sockaddr *)&sa_local, sizeof(struct sockaddr)) == -1)
4086d7f5d3SJohn Marino         err(EX_OSERR, "connect(2) failure");
4186d7f5d3SJohn Marino 
4286d7f5d3SJohn Marino     fd_n = accept(fd_l, (struct sockaddr *)&sa_remote, &sin_size);
4386d7f5d3SJohn Marino 
4486d7f5d3SJohn Marino     FD_ZERO(&exceptfds);
4586d7f5d3SJohn Marino     FD_SET(fd_n, &exceptfds);
4686d7f5d3SJohn Marino 
4786d7f5d3SJohn Marino     if (send(fd_c, "x", 1, MSG_OOB) == -1)
4886d7f5d3SJohn Marino         err(EX_OSERR, "send(2) failure");
4986d7f5d3SJohn Marino 
5086d7f5d3SJohn Marino     memset(&timeout, 0, sizeof(timeout));
5186d7f5d3SJohn Marino     i = select(fd_n+1, NULL, NULL, &exceptfds, &timeout);
5286d7f5d3SJohn Marino 
5386d7f5d3SJohn Marino     if (i == 1)
5486d7f5d3SJohn Marino         printf("ok\n");
5586d7f5d3SJohn Marino 
5686d7f5d3SJohn Marino     return (0);
5786d7f5d3SJohn Marino }
58