| OLD | NEW |
| (Empty) |
| 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 = CreateFileA("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 | |
| OLD | NEW |