xref: /haiku/src/tests/system/network/select_test2.c (revision 5e54f6d4f9dd607ae2afcea4fe72f2f1763e4b5e)
1*5e54f6d4SAugustin Cavalier #include <stdio.h>
2*5e54f6d4SAugustin Cavalier #include <kernel/OS.h>
3*5e54f6d4SAugustin Cavalier #include <string.h>
4*5e54f6d4SAugustin Cavalier #include <sys/time.h>
5*5e54f6d4SAugustin Cavalier #include <errno.h>
6*5e54f6d4SAugustin Cavalier 
7*5e54f6d4SAugustin Cavalier #include "sys/socket.h"
8*5e54f6d4SAugustin Cavalier #include "netinet/in.h"
9*5e54f6d4SAugustin Cavalier #include "arpa/inet.h"
10*5e54f6d4SAugustin Cavalier #include "sys/select.h"
11*5e54f6d4SAugustin Cavalier 
12*5e54f6d4SAugustin Cavalier #include "ufunc.h"
13*5e54f6d4SAugustin Cavalier 
main(int argc,char ** argv)14*5e54f6d4SAugustin Cavalier int main(int argc, char **argv)
15*5e54f6d4SAugustin Cavalier {
16*5e54f6d4SAugustin Cavalier 	int s, f;
17*5e54f6d4SAugustin Cavalier 	int rv;
18*5e54f6d4SAugustin Cavalier 	struct fd_set fdr, fdw, fde;
19*5e54f6d4SAugustin Cavalier 	struct timeval tv;
20*5e54f6d4SAugustin Cavalier 	int32 rtc;
21*5e54f6d4SAugustin Cavalier 	char path[PATH_MAX];
22*5e54f6d4SAugustin Cavalier 
23*5e54f6d4SAugustin Cavalier 	test_banner("Select Test #2");
24*5e54f6d4SAugustin Cavalier 
25*5e54f6d4SAugustin Cavalier 	s = socket(AF_INET, SOCK_DGRAM, 0);
26*5e54f6d4SAugustin Cavalier 	if (s < 0)
27*5e54f6d4SAugustin Cavalier 		err(s, "Socket creation failed");
28*5e54f6d4SAugustin Cavalier 
29*5e54f6d4SAugustin Cavalier 	getcwd(path, PATH_MAX);
30*5e54f6d4SAugustin Cavalier 	sprintf(path, "%s/select_test2.c", path);
31*5e54f6d4SAugustin Cavalier 	f = open(path, O_RDWR);
32*5e54f6d4SAugustin Cavalier 
33*5e54f6d4SAugustin Cavalier 	if (f > 0 && s > 0)	{
34*5e54f6d4SAugustin Cavalier 		printf("\nsocket and fd created.\n");
35*5e54f6d4SAugustin Cavalier 	} else {
36*5e54f6d4SAugustin Cavalier 		err(-1, "Failed to create socket or fd\n");
37*5e54f6d4SAugustin Cavalier 	}
38*5e54f6d4SAugustin Cavalier 
39*5e54f6d4SAugustin Cavalier 	FD_ZERO(&fdr);
40*5e54f6d4SAugustin Cavalier 	FD_SET(s, &fdr);
41*5e54f6d4SAugustin Cavalier 	FD_ZERO(&fdw);
42*5e54f6d4SAugustin Cavalier 	FD_SET(s, &fdw);
43*5e54f6d4SAugustin Cavalier 	FD_ZERO(&fde);
44*5e54f6d4SAugustin Cavalier 	FD_SET(s, &fde);
45*5e54f6d4SAugustin Cavalier 
46*5e54f6d4SAugustin Cavalier 	tv.tv_sec = 5;
47*5e54f6d4SAugustin Cavalier 	tv.tv_usec = 0;
48*5e54f6d4SAugustin Cavalier 	printf("\nTest1\n=====\n\n");
49*5e54f6d4SAugustin Cavalier 	printf("Trying with timeval (5 secs)...\n");
50*5e54f6d4SAugustin Cavalier 	rtc = real_time_clock();
51*5e54f6d4SAugustin Cavalier 	rv = select(s + 1, &fdr, NULL, &fde, &tv);
52*5e54f6d4SAugustin Cavalier 	rtc = real_time_clock() - rtc;
53*5e54f6d4SAugustin Cavalier 	printf("select gave %d (expecting 0) in %ld seconds\n", rv, rtc);
54*5e54f6d4SAugustin Cavalier 
55*5e54f6d4SAugustin Cavalier 	FD_ZERO(&fdr);
56*5e54f6d4SAugustin Cavalier 	FD_SET(s, &fdr);
57*5e54f6d4SAugustin Cavalier 	FD_SET(f, &fdr);
58*5e54f6d4SAugustin Cavalier 	FD_ZERO(&fdw);
59*5e54f6d4SAugustin Cavalier 	FD_SET(s, &fdw);
60*5e54f6d4SAugustin Cavalier 	FD_ZERO(&fde);
61*5e54f6d4SAugustin Cavalier 	FD_SET(s, &fde);
62*5e54f6d4SAugustin Cavalier 
63*5e54f6d4SAugustin Cavalier 	printf("\nTest2\n=====\n\n");
64*5e54f6d4SAugustin Cavalier 	printf("Trying without timeval and both sockets and files...\n");
65*5e54f6d4SAugustin Cavalier 	rv = select(f +1, &fdr, NULL, NULL, NULL);
66*5e54f6d4SAugustin Cavalier 	printf("select gave %d (expecting 2)\n", rv);
67*5e54f6d4SAugustin Cavalier 
68*5e54f6d4SAugustin Cavalier 	if (rv > 0) {
69*5e54f6d4SAugustin Cavalier 		if (FD_ISSET(s, &fdr))
70*5e54f6d4SAugustin Cavalier 			printf("Data to read\n");
71*5e54f6d4SAugustin Cavalier 		if (FD_ISSET(s, &fdw))
72*5e54f6d4SAugustin Cavalier 			printf("OK to write\n");
73*5e54f6d4SAugustin Cavalier 		if (FD_ISSET(s, &fde))
74*5e54f6d4SAugustin Cavalier 			printf("Exception!\n");
75*5e54f6d4SAugustin Cavalier 		if (FD_ISSET(f, &fdr))
76*5e54f6d4SAugustin Cavalier 			printf("File is readable!\n");
77*5e54f6d4SAugustin Cavalier 	} else if (rv == 0) {
78*5e54f6d4SAugustin Cavalier 		printf("Timed out??? huh?!\n");
79*5e54f6d4SAugustin Cavalier 	} else {
80*5e54f6d4SAugustin Cavalier 		printf("errno = %d [%s]\n", errno, strerror(errno));
81*5e54f6d4SAugustin Cavalier 	}
82*5e54f6d4SAugustin Cavalier 
83*5e54f6d4SAugustin Cavalier 	closesocket(s);
84*5e54f6d4SAugustin Cavalier 	close(f);
85*5e54f6d4SAugustin Cavalier 
86*5e54f6d4SAugustin Cavalier 	printf("Test complete.\n");
87*5e54f6d4SAugustin Cavalier 
88*5e54f6d4SAugustin Cavalier 	return (0);
89*5e54f6d4SAugustin Cavalier }
90*5e54f6d4SAugustin Cavalier 
91