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