xref: /freebsd/contrib/ntp/sntp/libevent/test/test-eof.c (revision 2b15cb3d0922bd70ea592f0da9b4a5b167f4d53f)
1*2b15cb3dSCy Schubert /*
2*2b15cb3dSCy Schubert  * Copyright (c) 2002-2007 Niels Provos <provos@citi.umich.edu>
3*2b15cb3dSCy Schubert  * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
4*2b15cb3dSCy Schubert  *
5*2b15cb3dSCy Schubert  * Redistribution and use in source and binary forms, with or without
6*2b15cb3dSCy Schubert  * modification, are permitted provided that the following conditions
7*2b15cb3dSCy Schubert  * are met:
8*2b15cb3dSCy Schubert  * 1. Redistributions of source code must retain the above copyright
9*2b15cb3dSCy Schubert  *    notice, this list of conditions and the following disclaimer.
10*2b15cb3dSCy Schubert  * 2. Redistributions in binary form must reproduce the above copyright
11*2b15cb3dSCy Schubert  *    notice, this list of conditions and the following disclaimer in the
12*2b15cb3dSCy Schubert  *    documentation and/or other materials provided with the distribution.
13*2b15cb3dSCy Schubert  * 3. The name of the author may not be used to endorse or promote products
14*2b15cb3dSCy Schubert  *    derived from this software without specific prior written permission.
15*2b15cb3dSCy Schubert  *
16*2b15cb3dSCy Schubert  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17*2b15cb3dSCy Schubert  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18*2b15cb3dSCy Schubert  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19*2b15cb3dSCy Schubert  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20*2b15cb3dSCy Schubert  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21*2b15cb3dSCy Schubert  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22*2b15cb3dSCy Schubert  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23*2b15cb3dSCy Schubert  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24*2b15cb3dSCy Schubert  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25*2b15cb3dSCy Schubert  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*2b15cb3dSCy Schubert  */
27*2b15cb3dSCy Schubert #include "event2/event-config.h"
28*2b15cb3dSCy Schubert 
29*2b15cb3dSCy Schubert #ifdef _WIN32
30*2b15cb3dSCy Schubert #include <winsock2.h>
31*2b15cb3dSCy Schubert #else
32*2b15cb3dSCy Schubert #include <unistd.h>
33*2b15cb3dSCy Schubert #endif
34*2b15cb3dSCy Schubert #include <sys/types.h>
35*2b15cb3dSCy Schubert #include <sys/stat.h>
36*2b15cb3dSCy Schubert #ifdef EVENT__HAVE_SYS_TIME_H
37*2b15cb3dSCy Schubert #include <sys/time.h>
38*2b15cb3dSCy Schubert #endif
39*2b15cb3dSCy Schubert #ifdef EVENT__HAVE_SYS_SOCKET_H
40*2b15cb3dSCy Schubert #include <sys/socket.h>
41*2b15cb3dSCy Schubert #endif
42*2b15cb3dSCy Schubert #include <fcntl.h>
43*2b15cb3dSCy Schubert #include <stdlib.h>
44*2b15cb3dSCy Schubert #include <stdio.h>
45*2b15cb3dSCy Schubert #include <string.h>
46*2b15cb3dSCy Schubert #include <errno.h>
47*2b15cb3dSCy Schubert 
48*2b15cb3dSCy Schubert #include <event.h>
49*2b15cb3dSCy Schubert #include <evutil.h>
50*2b15cb3dSCy Schubert 
51*2b15cb3dSCy Schubert #ifdef EVENT____func__
52*2b15cb3dSCy Schubert #define __func__ EVENT____func__
53*2b15cb3dSCy Schubert #endif
54*2b15cb3dSCy Schubert 
55*2b15cb3dSCy Schubert int test_okay = 1;
56*2b15cb3dSCy Schubert int called = 0;
57*2b15cb3dSCy Schubert struct timeval timeout = {60, 0};
58*2b15cb3dSCy Schubert 
59*2b15cb3dSCy Schubert static void
60*2b15cb3dSCy Schubert read_cb(evutil_socket_t fd, short event, void *arg)
61*2b15cb3dSCy Schubert {
62*2b15cb3dSCy Schubert 	char buf[256];
63*2b15cb3dSCy Schubert 	int len;
64*2b15cb3dSCy Schubert 
65*2b15cb3dSCy Schubert 	if (EV_TIMEOUT & event) {
66*2b15cb3dSCy Schubert 		printf("%s: Timeout!\n", __func__);
67*2b15cb3dSCy Schubert 		exit(1);
68*2b15cb3dSCy Schubert 	}
69*2b15cb3dSCy Schubert 
70*2b15cb3dSCy Schubert 	len = recv(fd, buf, sizeof(buf), 0);
71*2b15cb3dSCy Schubert 
72*2b15cb3dSCy Schubert 	printf("%s: read %d%s\n", __func__,
73*2b15cb3dSCy Schubert 	    len, len ? "" : " - means EOF");
74*2b15cb3dSCy Schubert 
75*2b15cb3dSCy Schubert 	if (len) {
76*2b15cb3dSCy Schubert 		if (!called)
77*2b15cb3dSCy Schubert 			event_add(arg, &timeout);
78*2b15cb3dSCy Schubert 	} else if (called == 1)
79*2b15cb3dSCy Schubert 		test_okay = 0;
80*2b15cb3dSCy Schubert 
81*2b15cb3dSCy Schubert 	called++;
82*2b15cb3dSCy Schubert }
83*2b15cb3dSCy Schubert 
84*2b15cb3dSCy Schubert #ifndef SHUT_WR
85*2b15cb3dSCy Schubert #define SHUT_WR 1
86*2b15cb3dSCy Schubert #endif
87*2b15cb3dSCy Schubert 
88*2b15cb3dSCy Schubert int
89*2b15cb3dSCy Schubert main(int argc, char **argv)
90*2b15cb3dSCy Schubert {
91*2b15cb3dSCy Schubert 	struct event ev;
92*2b15cb3dSCy Schubert 	const char *test = "test string";
93*2b15cb3dSCy Schubert 	evutil_socket_t pair[2];
94*2b15cb3dSCy Schubert 
95*2b15cb3dSCy Schubert #ifdef _WIN32
96*2b15cb3dSCy Schubert 	WORD wVersionRequested;
97*2b15cb3dSCy Schubert 	WSADATA wsaData;
98*2b15cb3dSCy Schubert 
99*2b15cb3dSCy Schubert 	wVersionRequested = MAKEWORD(2, 2);
100*2b15cb3dSCy Schubert 
101*2b15cb3dSCy Schubert 	(void) WSAStartup(wVersionRequested, &wsaData);
102*2b15cb3dSCy Schubert #endif
103*2b15cb3dSCy Schubert 
104*2b15cb3dSCy Schubert 	if (evutil_socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == -1)
105*2b15cb3dSCy Schubert 		return (1);
106*2b15cb3dSCy Schubert 
107*2b15cb3dSCy Schubert 
108*2b15cb3dSCy Schubert 	if (send(pair[0], test, (int)strlen(test)+1, 0) < 0)
109*2b15cb3dSCy Schubert 		return (1);
110*2b15cb3dSCy Schubert 	shutdown(pair[0], SHUT_WR);
111*2b15cb3dSCy Schubert 
112*2b15cb3dSCy Schubert 	/* Initalize the event library */
113*2b15cb3dSCy Schubert 	event_init();
114*2b15cb3dSCy Schubert 
115*2b15cb3dSCy Schubert 	/* Initalize one event */
116*2b15cb3dSCy Schubert 	event_set(&ev, pair[1], EV_READ | EV_TIMEOUT, read_cb, &ev);
117*2b15cb3dSCy Schubert 
118*2b15cb3dSCy Schubert 	event_add(&ev, &timeout);
119*2b15cb3dSCy Schubert 
120*2b15cb3dSCy Schubert 	event_dispatch();
121*2b15cb3dSCy Schubert 
122*2b15cb3dSCy Schubert 	return (test_okay);
123*2b15cb3dSCy Schubert }
124*2b15cb3dSCy Schubert 
125