Annotation of embedaddon/libevent/sample/event-test.c, revision 1.1.1.1

1.1       misho       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: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>