1*663afb9bSAndroid Build Coastguard Worker /*
2*663afb9bSAndroid Build Coastguard Worker * Copyright (c) 2012 Niels Provos and Nick Mathewson
3*663afb9bSAndroid Build Coastguard Worker *
4*663afb9bSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
5*663afb9bSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions
6*663afb9bSAndroid Build Coastguard Worker * are met:
7*663afb9bSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
8*663afb9bSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
9*663afb9bSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
10*663afb9bSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
11*663afb9bSAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
12*663afb9bSAndroid Build Coastguard Worker * 3. The name of the author may not be used to endorse or promote products
13*663afb9bSAndroid Build Coastguard Worker * derived from this software without specific prior written permission.
14*663afb9bSAndroid Build Coastguard Worker *
15*663afb9bSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16*663afb9bSAndroid Build Coastguard Worker * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17*663afb9bSAndroid Build Coastguard Worker * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18*663afb9bSAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19*663afb9bSAndroid Build Coastguard Worker * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20*663afb9bSAndroid Build Coastguard Worker * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21*663afb9bSAndroid Build Coastguard Worker * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22*663afb9bSAndroid Build Coastguard Worker * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23*663afb9bSAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24*663afb9bSAndroid Build Coastguard Worker * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25*663afb9bSAndroid Build Coastguard Worker */
26*663afb9bSAndroid Build Coastguard Worker #include "util-internal.h"
27*663afb9bSAndroid Build Coastguard Worker #include "event2/event-config.h"
28*663afb9bSAndroid Build Coastguard Worker
29*663afb9bSAndroid Build Coastguard Worker #ifdef _WIN32
30*663afb9bSAndroid Build Coastguard Worker #include <winsock2.h>
31*663afb9bSAndroid Build Coastguard Worker #include <windows.h>
32*663afb9bSAndroid Build Coastguard Worker #else
33*663afb9bSAndroid Build Coastguard Worker #include <unistd.h>
34*663afb9bSAndroid Build Coastguard Worker #endif
35*663afb9bSAndroid Build Coastguard Worker
36*663afb9bSAndroid Build Coastguard Worker #include <stdio.h>
37*663afb9bSAndroid Build Coastguard Worker #include <event2/event.h>
38*663afb9bSAndroid Build Coastguard Worker #include <signal.h>
39*663afb9bSAndroid Build Coastguard Worker
40*663afb9bSAndroid Build Coastguard Worker static void
sock_perror(const char * s)41*663afb9bSAndroid Build Coastguard Worker sock_perror(const char *s)
42*663afb9bSAndroid Build Coastguard Worker {
43*663afb9bSAndroid Build Coastguard Worker #ifdef _WIN32
44*663afb9bSAndroid Build Coastguard Worker const char *err = evutil_socket_error_to_string(EVUTIL_SOCKET_ERROR());
45*663afb9bSAndroid Build Coastguard Worker fprintf(stderr, "%s: %s\n", s, err);
46*663afb9bSAndroid Build Coastguard Worker #else
47*663afb9bSAndroid Build Coastguard Worker perror(s);
48*663afb9bSAndroid Build Coastguard Worker #endif
49*663afb9bSAndroid Build Coastguard Worker }
50*663afb9bSAndroid Build Coastguard Worker
51*663afb9bSAndroid Build Coastguard Worker static void
callback1(evutil_socket_t fd,short events,void * arg)52*663afb9bSAndroid Build Coastguard Worker callback1(evutil_socket_t fd, short events, void *arg)
53*663afb9bSAndroid Build Coastguard Worker {
54*663afb9bSAndroid Build Coastguard Worker }
55*663afb9bSAndroid Build Coastguard Worker static void
callback2(evutil_socket_t fd,short events,void * arg)56*663afb9bSAndroid Build Coastguard Worker callback2(evutil_socket_t fd, short events, void *arg)
57*663afb9bSAndroid Build Coastguard Worker {
58*663afb9bSAndroid Build Coastguard Worker }
59*663afb9bSAndroid Build Coastguard Worker
60*663afb9bSAndroid Build Coastguard Worker /* Testing code for event_base_dump_events().
61*663afb9bSAndroid Build Coastguard Worker
62*663afb9bSAndroid Build Coastguard Worker Notes that just because we have code to exercise this function,
63*663afb9bSAndroid Build Coastguard Worker doesn't mean that *ANYTHING* about the output format is guaranteed to
64*663afb9bSAndroid Build Coastguard Worker remain in the future.
65*663afb9bSAndroid Build Coastguard Worker */
66*663afb9bSAndroid Build Coastguard Worker int
main(int argc,char ** argv)67*663afb9bSAndroid Build Coastguard Worker main(int argc, char **argv)
68*663afb9bSAndroid Build Coastguard Worker {
69*663afb9bSAndroid Build Coastguard Worker #define N_EVENTS 13
70*663afb9bSAndroid Build Coastguard Worker int i;
71*663afb9bSAndroid Build Coastguard Worker struct event *ev[N_EVENTS];
72*663afb9bSAndroid Build Coastguard Worker evutil_socket_t pair1[2];
73*663afb9bSAndroid Build Coastguard Worker evutil_socket_t pair2[2];
74*663afb9bSAndroid Build Coastguard Worker struct timeval tv_onesec = {1,0};
75*663afb9bSAndroid Build Coastguard Worker struct timeval tv_two5sec = {2,500*1000};
76*663afb9bSAndroid Build Coastguard Worker const struct timeval *tv_onesec_common;
77*663afb9bSAndroid Build Coastguard Worker const struct timeval *tv_two5sec_common;
78*663afb9bSAndroid Build Coastguard Worker struct event_base *base;
79*663afb9bSAndroid Build Coastguard Worker struct timeval now;
80*663afb9bSAndroid Build Coastguard Worker
81*663afb9bSAndroid Build Coastguard Worker #ifdef _WIN32
82*663afb9bSAndroid Build Coastguard Worker WORD wVersionRequested;
83*663afb9bSAndroid Build Coastguard Worker WSADATA wsaData;
84*663afb9bSAndroid Build Coastguard Worker
85*663afb9bSAndroid Build Coastguard Worker wVersionRequested = MAKEWORD(2, 2);
86*663afb9bSAndroid Build Coastguard Worker
87*663afb9bSAndroid Build Coastguard Worker WSAStartup(wVersionRequested, &wsaData);
88*663afb9bSAndroid Build Coastguard Worker #endif
89*663afb9bSAndroid Build Coastguard Worker
90*663afb9bSAndroid Build Coastguard Worker #ifdef _WIN32
91*663afb9bSAndroid Build Coastguard Worker #define LOCAL_SOCKETPAIR_AF AF_INET
92*663afb9bSAndroid Build Coastguard Worker #else
93*663afb9bSAndroid Build Coastguard Worker #define LOCAL_SOCKETPAIR_AF AF_UNIX
94*663afb9bSAndroid Build Coastguard Worker #endif
95*663afb9bSAndroid Build Coastguard Worker
96*663afb9bSAndroid Build Coastguard Worker if (evutil_make_internal_pipe_(pair1) < 0 ||
97*663afb9bSAndroid Build Coastguard Worker evutil_make_internal_pipe_(pair2) < 0) {
98*663afb9bSAndroid Build Coastguard Worker sock_perror("evutil_make_internal_pipe_");
99*663afb9bSAndroid Build Coastguard Worker return 1;
100*663afb9bSAndroid Build Coastguard Worker }
101*663afb9bSAndroid Build Coastguard Worker
102*663afb9bSAndroid Build Coastguard Worker if (!(base = event_base_new())) {
103*663afb9bSAndroid Build Coastguard Worker fprintf(stderr,"Couldn't make event_base\n");
104*663afb9bSAndroid Build Coastguard Worker return 2;
105*663afb9bSAndroid Build Coastguard Worker }
106*663afb9bSAndroid Build Coastguard Worker
107*663afb9bSAndroid Build Coastguard Worker tv_onesec_common = event_base_init_common_timeout(base, &tv_onesec);
108*663afb9bSAndroid Build Coastguard Worker tv_two5sec_common = event_base_init_common_timeout(base, &tv_two5sec);
109*663afb9bSAndroid Build Coastguard Worker
110*663afb9bSAndroid Build Coastguard Worker ev[0] = event_new(base, pair1[0], EV_WRITE, callback1, NULL);
111*663afb9bSAndroid Build Coastguard Worker ev[1] = event_new(base, pair1[1], EV_READ|EV_PERSIST, callback1, NULL);
112*663afb9bSAndroid Build Coastguard Worker ev[2] = event_new(base, pair2[0], EV_WRITE|EV_PERSIST, callback2, NULL);
113*663afb9bSAndroid Build Coastguard Worker ev[3] = event_new(base, pair2[1], EV_READ, callback2, NULL);
114*663afb9bSAndroid Build Coastguard Worker
115*663afb9bSAndroid Build Coastguard Worker /* For timers */
116*663afb9bSAndroid Build Coastguard Worker ev[4] = evtimer_new(base, callback1, NULL);
117*663afb9bSAndroid Build Coastguard Worker ev[5] = evtimer_new(base, callback1, NULL);
118*663afb9bSAndroid Build Coastguard Worker ev[6] = evtimer_new(base, callback1, NULL);
119*663afb9bSAndroid Build Coastguard Worker ev[7] = event_new(base, -1, EV_PERSIST, callback2, NULL);
120*663afb9bSAndroid Build Coastguard Worker ev[8] = event_new(base, -1, EV_PERSIST, callback2, NULL);
121*663afb9bSAndroid Build Coastguard Worker ev[9] = event_new(base, -1, EV_PERSIST, callback2, NULL);
122*663afb9bSAndroid Build Coastguard Worker
123*663afb9bSAndroid Build Coastguard Worker /* To activate */
124*663afb9bSAndroid Build Coastguard Worker ev[10] = event_new(base, -1, 0, callback1, NULL);
125*663afb9bSAndroid Build Coastguard Worker ev[11] = event_new(base, -1, 0, callback2, NULL);
126*663afb9bSAndroid Build Coastguard Worker
127*663afb9bSAndroid Build Coastguard Worker /* Signals */
128*663afb9bSAndroid Build Coastguard Worker ev[12] = evsignal_new(base, SIGINT, callback2, NULL);
129*663afb9bSAndroid Build Coastguard Worker
130*663afb9bSAndroid Build Coastguard Worker event_add(ev[0], NULL);
131*663afb9bSAndroid Build Coastguard Worker event_add(ev[1], &tv_onesec);
132*663afb9bSAndroid Build Coastguard Worker event_add(ev[2], tv_onesec_common);
133*663afb9bSAndroid Build Coastguard Worker event_add(ev[3], tv_two5sec_common);
134*663afb9bSAndroid Build Coastguard Worker
135*663afb9bSAndroid Build Coastguard Worker event_add(ev[4], tv_onesec_common);
136*663afb9bSAndroid Build Coastguard Worker event_add(ev[5], tv_onesec_common);
137*663afb9bSAndroid Build Coastguard Worker event_add(ev[6], &tv_onesec);
138*663afb9bSAndroid Build Coastguard Worker event_add(ev[7], tv_two5sec_common);
139*663afb9bSAndroid Build Coastguard Worker event_add(ev[8], tv_onesec_common);
140*663afb9bSAndroid Build Coastguard Worker event_add(ev[9], &tv_two5sec);
141*663afb9bSAndroid Build Coastguard Worker
142*663afb9bSAndroid Build Coastguard Worker event_active(ev[10], EV_READ, 1);
143*663afb9bSAndroid Build Coastguard Worker event_active(ev[11], EV_READ|EV_WRITE|EV_TIMEOUT, 1);
144*663afb9bSAndroid Build Coastguard Worker event_active(ev[1], EV_READ, 1);
145*663afb9bSAndroid Build Coastguard Worker
146*663afb9bSAndroid Build Coastguard Worker event_add(ev[12], NULL);
147*663afb9bSAndroid Build Coastguard Worker
148*663afb9bSAndroid Build Coastguard Worker evutil_gettimeofday(&now,NULL);
149*663afb9bSAndroid Build Coastguard Worker puts("=====expected");
150*663afb9bSAndroid Build Coastguard Worker printf("Now= %ld.%06d\n",(long)now.tv_sec,(int)now.tv_usec);
151*663afb9bSAndroid Build Coastguard Worker puts("Inserted:");
152*663afb9bSAndroid Build Coastguard Worker printf(" %p [fd %ld] Write\n",ev[0],(long)pair1[0]);
153*663afb9bSAndroid Build Coastguard Worker printf(" %p [fd %ld] Read Persist Timeout=T+1\n",ev[1],(long)pair1[1]);
154*663afb9bSAndroid Build Coastguard Worker printf(" %p [fd %ld] Write Persist Timeout=T+1\n",ev[2],(long)pair2[0]);
155*663afb9bSAndroid Build Coastguard Worker printf(" %p [fd %ld] Read Timeout=T+2.5\n",ev[3],(long)pair2[1]);
156*663afb9bSAndroid Build Coastguard Worker printf(" %p [fd -1] Timeout=T+1\n",ev[4]);
157*663afb9bSAndroid Build Coastguard Worker printf(" %p [fd -1] Timeout=T+1\n",ev[5]);
158*663afb9bSAndroid Build Coastguard Worker printf(" %p [fd -1] Timeout=T+1\n",ev[6]);
159*663afb9bSAndroid Build Coastguard Worker printf(" %p [fd -1] Persist Timeout=T+2.5\n",ev[7]);
160*663afb9bSAndroid Build Coastguard Worker printf(" %p [fd -1] Persist Timeout=T+1\n",ev[8]);
161*663afb9bSAndroid Build Coastguard Worker printf(" %p [fd -1] Persist Timeout=T+2.5\n",ev[9]);
162*663afb9bSAndroid Build Coastguard Worker printf(" %p [sig %d] Signal Persist\n", ev[12], (int)SIGINT);
163*663afb9bSAndroid Build Coastguard Worker
164*663afb9bSAndroid Build Coastguard Worker puts("Active:");
165*663afb9bSAndroid Build Coastguard Worker printf(" %p [fd -1, priority=0] Read active\n", ev[10]);
166*663afb9bSAndroid Build Coastguard Worker printf(" %p [fd -1, priority=0] Read Write Timeout active\n", ev[11]);
167*663afb9bSAndroid Build Coastguard Worker printf(" %p [fd %ld, priority=0] Read active\n", ev[1], (long)pair1[1]);
168*663afb9bSAndroid Build Coastguard Worker
169*663afb9bSAndroid Build Coastguard Worker puts("======received");
170*663afb9bSAndroid Build Coastguard Worker event_base_dump_events(base, stdout);
171*663afb9bSAndroid Build Coastguard Worker
172*663afb9bSAndroid Build Coastguard Worker for (i = 0; i < N_EVENTS; ++i) {
173*663afb9bSAndroid Build Coastguard Worker event_free(ev[i]);
174*663afb9bSAndroid Build Coastguard Worker }
175*663afb9bSAndroid Build Coastguard Worker event_base_free(base);
176*663afb9bSAndroid Build Coastguard Worker
177*663afb9bSAndroid Build Coastguard Worker return 0;
178*663afb9bSAndroid Build Coastguard Worker }
179*663afb9bSAndroid Build Coastguard Worker
180