| /* |
| * Compile with: |
| * cc -I/usr/local/include -o event-test event-test.c -L/usr/local/lib -levent |
| */ |
| |
| #ifdef HAVE_CONFIG_H |
| #include "config.h" |
| #endif |
| |
| #include <sys/types.h> |
| #include <sys/stat.h> |
| #ifndef WIN32 |
| #include <sys/queue.h> |
| #include <unistd.h> |
| #include <sys/time.h> |
| #else |
| #include <windows.h> |
| #endif |
| #include <fcntl.h> |
| #include <stdlib.h> |
| #include <stdio.h> |
| #include <string.h> |
| #include <errno.h> |
| |
| #include <event.h> |
| |
| static void |
| fifo_read(int fd, short event, void *arg) |
| { |
| char buf[255]; |
| int len; |
| struct event *ev = arg; |
| #ifdef WIN32 |
| DWORD dwBytesRead; |
| #endif |
| |
| /* Reschedule this event */ |
| event_add(ev, NULL); |
| |
| fprintf(stderr, "fifo_read called with fd: %d, event: %d, arg: %p\n", |
| fd, event, arg); |
| #ifdef WIN32 |
| len = ReadFile((HANDLE)fd, buf, sizeof(buf) - 1, &dwBytesRead, NULL); |
| |
| // Check for end of file. |
| if(len && dwBytesRead == 0) { |
| fprintf(stderr, "End Of File"); |
| event_del(ev); |
| return; |
| } |
| |
| buf[dwBytesRead] = '\0'; |
| #else |
| len = read(fd, buf, sizeof(buf) - 1); |
| |
| if (len == -1) { |
| perror("read"); |
| return; |
| } else if (len == 0) { |
| fprintf(stderr, "Connection closed\n"); |
| return; |
| } |
| |
| buf[len] = '\0'; |
| #endif |
| fprintf(stdout, "Read: %s\n", buf); |
| } |
| |
| int |
| main (int argc, char **argv) |
| { |
| struct event evfifo; |
| #ifdef WIN32 |
| HANDLE socket; |
| // Open a file. |
| socket = CreateFile("test.txt", // open File |
| GENERIC_READ, // open for reading |
| 0, // do not share |
| NULL, // no security |
| OPEN_EXISTING, // existing file only |
| FILE_ATTRIBUTE_NORMAL, // normal file |
| NULL); // no attr. template |
| |
| if(socket == INVALID_HANDLE_VALUE) |
| return 1; |
| |
| #else |
| struct stat st; |
| const char *fifo = "event.fifo"; |
| int socket; |
| |
| if (lstat (fifo, &st) == 0) { |
| if ((st.st_mode & S_IFMT) == S_IFREG) { |
| errno = EEXIST; |
| perror("lstat"); |
| exit (1); |
| } |
| } |
| |
| unlink (fifo); |
| if (mkfifo (fifo, 0600) == -1) { |
| perror("mkfifo"); |
| exit (1); |
| } |
| |
| /* Linux pipes are broken, we need O_RDWR instead of O_RDONLY */ |
| #ifdef __linux |
| socket = open (fifo, O_RDWR | O_NONBLOCK, 0); |
| #else |
| socket = open (fifo, O_RDONLY | O_NONBLOCK, 0); |
| #endif |
| |
| if (socket == -1) { |
| perror("open"); |
| exit (1); |
| } |
| |
| fprintf(stderr, "Write data to %s\n", fifo); |
| #endif |
| /* Initalize the event library */ |
| event_init(); |
| |
| /* Initalize one event */ |
| #ifdef WIN32 |
| event_set(&evfifo, (int)socket, EV_READ, fifo_read, &evfifo); |
| #else |
| event_set(&evfifo, socket, EV_READ, fifo_read, &evfifo); |
| #endif |
| |
| /* Add it to the active events, without a timeout */ |
| event_add(&evfifo, NULL); |
| |
| event_dispatch(); |
| #ifdef WIN32 |
| CloseHandle(socket); |
| #endif |
| return (0); |
| } |
| |