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 140