1*6777b538SAndroid Build Coastguard Worker /*
2*6777b538SAndroid Build Coastguard Worker * Compile with:
3*6777b538SAndroid Build Coastguard Worker * cc -I/usr/local/include -o event-test event-test.c -L/usr/local/lib -levent
4*6777b538SAndroid Build Coastguard Worker */
5*6777b538SAndroid Build Coastguard Worker
6*6777b538SAndroid Build Coastguard Worker #ifdef HAVE_CONFIG_H
7*6777b538SAndroid Build Coastguard Worker #include "config.h"
8*6777b538SAndroid Build Coastguard Worker #endif
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker #include <sys/types.h>
11*6777b538SAndroid Build Coastguard Worker #include <sys/stat.h>
12*6777b538SAndroid Build Coastguard Worker #ifndef WIN32
13*6777b538SAndroid Build Coastguard Worker #include <sys/queue.h>
14*6777b538SAndroid Build Coastguard Worker #include <unistd.h>
15*6777b538SAndroid Build Coastguard Worker #include <sys/time.h>
16*6777b538SAndroid Build Coastguard Worker #else
17*6777b538SAndroid Build Coastguard Worker #include <windows.h>
18*6777b538SAndroid Build Coastguard Worker #endif
19*6777b538SAndroid Build Coastguard Worker #include <fcntl.h>
20*6777b538SAndroid Build Coastguard Worker #include <stdlib.h>
21*6777b538SAndroid Build Coastguard Worker #include <stdio.h>
22*6777b538SAndroid Build Coastguard Worker #include <string.h>
23*6777b538SAndroid Build Coastguard Worker #include <errno.h>
24*6777b538SAndroid Build Coastguard Worker
25*6777b538SAndroid Build Coastguard Worker #include <event.h>
26*6777b538SAndroid Build Coastguard Worker
27*6777b538SAndroid Build Coastguard Worker static void
fifo_read(int fd,short event,void * arg)28*6777b538SAndroid Build Coastguard Worker fifo_read(int fd, short event, void *arg)
29*6777b538SAndroid Build Coastguard Worker {
30*6777b538SAndroid Build Coastguard Worker char buf[255];
31*6777b538SAndroid Build Coastguard Worker int len;
32*6777b538SAndroid Build Coastguard Worker struct event *ev = arg;
33*6777b538SAndroid Build Coastguard Worker #ifdef WIN32
34*6777b538SAndroid Build Coastguard Worker DWORD dwBytesRead;
35*6777b538SAndroid Build Coastguard Worker #endif
36*6777b538SAndroid Build Coastguard Worker
37*6777b538SAndroid Build Coastguard Worker /* Reschedule this event */
38*6777b538SAndroid Build Coastguard Worker event_add(ev, NULL);
39*6777b538SAndroid Build Coastguard Worker
40*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "fifo_read called with fd: %d, event: %d, arg: %p\n",
41*6777b538SAndroid Build Coastguard Worker fd, event, arg);
42*6777b538SAndroid Build Coastguard Worker #ifdef WIN32
43*6777b538SAndroid Build Coastguard Worker len = ReadFile((HANDLE)fd, buf, sizeof(buf) - 1, &dwBytesRead, NULL);
44*6777b538SAndroid Build Coastguard Worker
45*6777b538SAndroid Build Coastguard Worker // Check for end of file.
46*6777b538SAndroid Build Coastguard Worker if(len && dwBytesRead == 0) {
47*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "End Of File");
48*6777b538SAndroid Build Coastguard Worker event_del(ev);
49*6777b538SAndroid Build Coastguard Worker return;
50*6777b538SAndroid Build Coastguard Worker }
51*6777b538SAndroid Build Coastguard Worker
52*6777b538SAndroid Build Coastguard Worker buf[dwBytesRead] = '\0';
53*6777b538SAndroid Build Coastguard Worker #else
54*6777b538SAndroid Build Coastguard Worker len = read(fd, buf, sizeof(buf) - 1);
55*6777b538SAndroid Build Coastguard Worker
56*6777b538SAndroid Build Coastguard Worker if (len == -1) {
57*6777b538SAndroid Build Coastguard Worker perror("read");
58*6777b538SAndroid Build Coastguard Worker return;
59*6777b538SAndroid Build Coastguard Worker } else if (len == 0) {
60*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "Connection closed\n");
61*6777b538SAndroid Build Coastguard Worker return;
62*6777b538SAndroid Build Coastguard Worker }
63*6777b538SAndroid Build Coastguard Worker
64*6777b538SAndroid Build Coastguard Worker buf[len] = '\0';
65*6777b538SAndroid Build Coastguard Worker #endif
66*6777b538SAndroid Build Coastguard Worker fprintf(stdout, "Read: %s\n", buf);
67*6777b538SAndroid Build Coastguard Worker }
68*6777b538SAndroid Build Coastguard Worker
69*6777b538SAndroid Build Coastguard Worker int
main(int argc,char ** argv)70*6777b538SAndroid Build Coastguard Worker main (int argc, char **argv)
71*6777b538SAndroid Build Coastguard Worker {
72*6777b538SAndroid Build Coastguard Worker struct event evfifo;
73*6777b538SAndroid Build Coastguard Worker #ifdef WIN32
74*6777b538SAndroid Build Coastguard Worker HANDLE socket;
75*6777b538SAndroid Build Coastguard Worker // Open a file.
76*6777b538SAndroid Build Coastguard Worker socket = CreateFileA("test.txt", // open File
77*6777b538SAndroid Build Coastguard Worker GENERIC_READ, // open for reading
78*6777b538SAndroid Build Coastguard Worker 0, // do not share
79*6777b538SAndroid Build Coastguard Worker NULL, // no security
80*6777b538SAndroid Build Coastguard Worker OPEN_EXISTING, // existing file only
81*6777b538SAndroid Build Coastguard Worker FILE_ATTRIBUTE_NORMAL, // normal file
82*6777b538SAndroid Build Coastguard Worker NULL); // no attr. template
83*6777b538SAndroid Build Coastguard Worker
84*6777b538SAndroid Build Coastguard Worker if(socket == INVALID_HANDLE_VALUE)
85*6777b538SAndroid Build Coastguard Worker return 1;
86*6777b538SAndroid Build Coastguard Worker
87*6777b538SAndroid Build Coastguard Worker #else
88*6777b538SAndroid Build Coastguard Worker struct stat st;
89*6777b538SAndroid Build Coastguard Worker const char *fifo = "event.fifo";
90*6777b538SAndroid Build Coastguard Worker int socket;
91*6777b538SAndroid Build Coastguard Worker
92*6777b538SAndroid Build Coastguard Worker if (lstat (fifo, &st) == 0) {
93*6777b538SAndroid Build Coastguard Worker if ((st.st_mode & S_IFMT) == S_IFREG) {
94*6777b538SAndroid Build Coastguard Worker errno = EEXIST;
95*6777b538SAndroid Build Coastguard Worker perror("lstat");
96*6777b538SAndroid Build Coastguard Worker exit (1);
97*6777b538SAndroid Build Coastguard Worker }
98*6777b538SAndroid Build Coastguard Worker }
99*6777b538SAndroid Build Coastguard Worker
100*6777b538SAndroid Build Coastguard Worker unlink (fifo);
101*6777b538SAndroid Build Coastguard Worker if (mkfifo (fifo, 0600) == -1) {
102*6777b538SAndroid Build Coastguard Worker perror("mkfifo");
103*6777b538SAndroid Build Coastguard Worker exit (1);
104*6777b538SAndroid Build Coastguard Worker }
105*6777b538SAndroid Build Coastguard Worker
106*6777b538SAndroid Build Coastguard Worker /* Linux pipes are broken, we need O_RDWR instead of O_RDONLY */
107*6777b538SAndroid Build Coastguard Worker #ifdef __linux
108*6777b538SAndroid Build Coastguard Worker socket = open (fifo, O_RDWR | O_NONBLOCK, 0);
109*6777b538SAndroid Build Coastguard Worker #else
110*6777b538SAndroid Build Coastguard Worker socket = open (fifo, O_RDONLY | O_NONBLOCK, 0);
111*6777b538SAndroid Build Coastguard Worker #endif
112*6777b538SAndroid Build Coastguard Worker
113*6777b538SAndroid Build Coastguard Worker if (socket == -1) {
114*6777b538SAndroid Build Coastguard Worker perror("open");
115*6777b538SAndroid Build Coastguard Worker exit (1);
116*6777b538SAndroid Build Coastguard Worker }
117*6777b538SAndroid Build Coastguard Worker
118*6777b538SAndroid Build Coastguard Worker fprintf(stderr, "Write data to %s\n", fifo);
119*6777b538SAndroid Build Coastguard Worker #endif
120*6777b538SAndroid Build Coastguard Worker /* Initalize the event library */
121*6777b538SAndroid Build Coastguard Worker event_init();
122*6777b538SAndroid Build Coastguard Worker
123*6777b538SAndroid Build Coastguard Worker /* Initalize one event */
124*6777b538SAndroid Build Coastguard Worker #ifdef WIN32
125*6777b538SAndroid Build Coastguard Worker event_set(&evfifo, (int)socket, EV_READ, fifo_read, &evfifo);
126*6777b538SAndroid Build Coastguard Worker #else
127*6777b538SAndroid Build Coastguard Worker event_set(&evfifo, socket, EV_READ, fifo_read, &evfifo);
128*6777b538SAndroid Build Coastguard Worker #endif
129*6777b538SAndroid Build Coastguard Worker
130*6777b538SAndroid Build Coastguard Worker /* Add it to the active events, without a timeout */
131*6777b538SAndroid Build Coastguard Worker event_add(&evfifo, NULL);
132*6777b538SAndroid Build Coastguard Worker
133*6777b538SAndroid Build Coastguard Worker event_dispatch();
134*6777b538SAndroid Build Coastguard Worker #ifdef WIN32
135*6777b538SAndroid Build Coastguard Worker CloseHandle(socket);
136*6777b538SAndroid Build Coastguard Worker #endif
137*6777b538SAndroid Build Coastguard Worker return (0);
138*6777b538SAndroid Build Coastguard Worker }
139*6777b538SAndroid Build Coastguard Worker
140