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 27static void 28fifo_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 69int 70main (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 140