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