1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Copyright (c) 2003, 2004 Niels Provos <provos@citi.umich.edu> 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * All rights reserved. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Redistribution and use in source and binary forms, with or without 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * modification, are permitted provided that the following conditions 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * are met: 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 1. Redistributions of source code must retain the above copyright 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * notice, this list of conditions and the following disclaimer. 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 2. Redistributions in binary form must reproduce the above copyright 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * notice, this list of conditions and the following disclaimer in the 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * documentation and/or other materials provided with the distribution. 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 3. The name of the author may not be used to endorse or promote products 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * derived from this software without specific prior written permission. 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef WIN32 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <winsock2.h> 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <windows.h> 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef HAVE_CONFIG_H 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "config.h" 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/types.h> 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/stat.h> 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef HAVE_SYS_TIME_H 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/time.h> 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/queue.h> 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef WIN32 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/socket.h> 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/wait.h> 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <signal.h> 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <unistd.h> 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <netdb.h> 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <assert.h> 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <fcntl.h> 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <signal.h> 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <stdlib.h> 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <stdio.h> 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string.h> 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <errno.h> 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "event.h" 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "evutil.h" 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "event-internal.h" 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "log.h" 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "regress.h" 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef WIN32 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "regress.gen.h" 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint pair[2]; 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint test_ok; 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic int called; 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic char wbuf[4096]; 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic char rbuf[4096]; 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic int woff; 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic int roff; 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic int usepersist; 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic struct timeval tset; 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic struct timeval tcalled; 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic struct event_base *global_base; 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define TEST1 "this is a test" 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define SECONDS 1 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef SHUT_WR 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define SHUT_WR 1 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef WIN32 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define write(fd,buf,len) send((fd),(buf),(len),0) 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define read(fd,buf,len) recv((fd),(buf),(len),0) 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottsimple_read_cb(int fd, short event, void *arg) 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char buf[256]; 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int len; 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (arg == NULL) 99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott len = read(fd, buf, sizeof(buf)); 102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (len) { 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!called) { 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event_add(arg, NULL) == -1) 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else if (called == 1) 109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 1; 110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott called++; 112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottsimple_write_cb(int fd, short event, void *arg) 116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int len; 118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (arg == NULL) 120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott len = write(fd, TEST1, strlen(TEST1) + 1); 123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (len == -1) 124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 1; 127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottmultiple_write_cb(int fd, short event, void *arg) 131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event *ev = arg; 133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int len; 134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott len = 128; 136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (woff + len >= sizeof(wbuf)) 137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott len = sizeof(wbuf) - woff; 138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott len = write(fd, wbuf + woff, len); 140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (len == -1) { 141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "%s: write\n", __func__); 142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (usepersist) 143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_del(ev); 144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott woff += len; 148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (woff >= sizeof(wbuf)) { 150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott shutdown(fd, SHUT_WR); 151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (usepersist) 152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_del(ev); 153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!usepersist) { 157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event_add(ev, NULL) == -1) 158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottmultiple_read_cb(int fd, short event, void *arg) 164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event *ev = arg; 166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int len; 167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott len = read(fd, rbuf + roff, sizeof(rbuf) - roff); 169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (len == -1) 170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "%s: read\n", __func__); 171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (len <= 0) { 172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (usepersist) 173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_del(ev); 174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott roff += len; 178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!usepersist) { 179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event_add(ev, NULL) == -1) 180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttimeout_cb(int fd, short event, void *arg) 186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct timeval tv; 188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int diff; 189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evutil_gettimeofday(&tcalled, NULL); 191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (evutil_timercmp(&tcalled, &tset, >)) 192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evutil_timersub(&tcalled, &tset, &tv); 193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evutil_timersub(&tset, &tcalled, &tv); 195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott diff = tv.tv_sec*1000 + tv.tv_usec/1000 - SECONDS * 1000; 197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (diff < 0) 198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott diff = -diff; 199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (diff < 100) 201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 1; 202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef WIN32 205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottsignal_cb_sa(int sig) 207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 2; 209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottsignal_cb(int fd, short event, void *arg) 213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event *ev = arg; 215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_del(ev); 217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 1; 218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct both { 222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event ev; 223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int nread; 224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottcombined_read_cb(int fd, short event, void *arg) 228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct both *both = arg; 230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char buf[128]; 231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int len; 232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott len = read(fd, buf, sizeof(buf)); 234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (len == -1) 235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "%s: read\n", __func__); 236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (len <= 0) 237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott both->nread += len; 240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event_add(&both->ev, NULL) == -1) 241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottcombined_write_cb(int fd, short event, void *arg) 246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct both *both = arg; 248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char buf[128]; 249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int len; 250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott len = sizeof(buf); 252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (len > both->nread) 253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott len = both->nread; 254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott len = write(fd, buf, len); 256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (len == -1) 257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "%s: write\n", __func__); 258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (len <= 0) { 259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott shutdown(fd, SHUT_WR); 260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott both->nread -= len; 264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event_add(&both->ev, NULL) == -1) 265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* Test infrastructure */ 269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic int 271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottsetup_test(const char *name) 272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stdout, "%s", name); 275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (evutil_socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == -1) { 277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "%s: socketpair\n", __func__); 278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef HAVE_FCNTL 282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (fcntl(pair[0], F_SETFL, O_NONBLOCK) == -1) 283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "fcntl(O_NONBLOCK)"); 284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (fcntl(pair[1], F_SETFL, O_NONBLOCK) == -1) 286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "fcntl(O_NONBLOCK)"); 287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott called = 0; 291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return (0); 292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic int 295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottcleanup_test(void) 296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef WIN32 298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott close(pair[0]); 299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott close(pair[1]); 300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CloseHandle((HANDLE)pair[0]); 302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CloseHandle((HANDLE)pair[1]); 303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (test_ok) 305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stdout, "OK\n"); 306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else { 307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stdout, "FAILED\n"); 308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return (0); 312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_registerfds(void) 316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int i, j; 318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int pair[2]; 319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event read_evs[512]; 320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event write_evs[512]; 321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event_base *base = event_base_new(); 323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stdout, "Testing register fds: "); 325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (i = 0; i < 512; ++i) { 327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (evutil_socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == -1) { 328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* run up to the limit of file descriptors */ 329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_set(&read_evs[i], pair[0], 332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EV_READ|EV_PERSIST, simple_read_cb, NULL); 333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_set(base, &read_evs[i]); 334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_add(&read_evs[i], NULL); 335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_set(&write_evs[i], pair[1], 336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EV_WRITE|EV_PERSIST, simple_write_cb, NULL); 337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_set(base, &write_evs[i]); 338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_add(&write_evs[i], NULL); 339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* just loop once */ 341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_loop(base, EVLOOP_ONCE); 342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* now delete everything */ 345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (j = 0; j < i; ++j) { 346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_del(&read_evs[j]); 347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_del(&write_evs[j]); 348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef WIN32 349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott close(read_evs[j].ev_fd); 350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott close(write_evs[j].ev_fd); 351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CloseHandle((HANDLE)read_evs[j].ev_fd); 353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CloseHandle((HANDLE)write_evs[j].ev_fd); 354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* just loop once */ 357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_loop(base, EVLOOP_ONCE); 358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_free(base); 361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stdout, "OK\n"); 363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_simpleread(void) 367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event ev; 369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Very simple read test */ 371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott setup_test("Simple read: "); 372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott write(pair[0], TEST1, strlen(TEST1)+1); 374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott shutdown(pair[0], SHUT_WR); 375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_set(&ev, pair[1], EV_READ, simple_read_cb, &ev); 377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event_add(&ev, NULL) == -1) 378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_dispatch(); 380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_simplewrite(void) 386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event ev; 388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Very simple write test */ 390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott setup_test("Simple write: "); 391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_set(&ev, pair[0], EV_WRITE, simple_write_cb, &ev); 393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event_add(&ev, NULL) == -1) 394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_dispatch(); 396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_multiple(void) 402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event ev, ev2; 404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int i; 405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Multiple read and write test */ 407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott setup_test("Multiple read/write: "); 408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(rbuf, 0, sizeof(rbuf)); 409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (i = 0; i < sizeof(wbuf); i++) 410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott wbuf[i] = i; 411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott roff = woff = 0; 413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott usepersist = 0; 414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_set(&ev, pair[0], EV_WRITE, multiple_write_cb, &ev); 416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event_add(&ev, NULL) == -1) 417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_set(&ev2, pair[1], EV_READ, multiple_read_cb, &ev2); 419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event_add(&ev2, NULL) == -1) 420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_dispatch(); 422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (roff == woff) 424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = memcmp(rbuf, wbuf, sizeof(wbuf)) == 0; 425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_persistent(void) 431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event ev, ev2; 433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int i; 434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Multiple read and write test with persist */ 436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott setup_test("Persist read/write: "); 437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(rbuf, 0, sizeof(rbuf)); 438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (i = 0; i < sizeof(wbuf); i++) 439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott wbuf[i] = i; 440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott roff = woff = 0; 442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott usepersist = 1; 443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_set(&ev, pair[0], EV_WRITE|EV_PERSIST, multiple_write_cb, &ev); 445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event_add(&ev, NULL) == -1) 446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_set(&ev2, pair[1], EV_READ|EV_PERSIST, multiple_read_cb, &ev2); 448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event_add(&ev2, NULL) == -1) 449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_dispatch(); 451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (roff == woff) 453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = memcmp(rbuf, wbuf, sizeof(wbuf)) == 0; 454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_combined(void) 460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct both r1, r2, w1, w2; 462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott setup_test("Combined read/write: "); 464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(&r1, 0, sizeof(r1)); 465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(&r2, 0, sizeof(r2)); 466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(&w1, 0, sizeof(w1)); 467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(&w2, 0, sizeof(w2)); 468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott w1.nread = 4096; 470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott w2.nread = 8192; 471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 472c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_set(&r1.ev, pair[0], EV_READ, combined_read_cb, &r1); 473c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_set(&w1.ev, pair[0], EV_WRITE, combined_write_cb, &w1); 474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_set(&r2.ev, pair[1], EV_READ, combined_read_cb, &r2); 475c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_set(&w2.ev, pair[1], EV_WRITE, combined_write_cb, &w2); 476c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event_add(&r1.ev, NULL) == -1) 477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event_add(&w1.ev, NULL)) 479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event_add(&r2.ev, NULL)) 481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event_add(&w2.ev, NULL)) 483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_dispatch(); 486c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (r1.nread == 8192 && r2.nread == 4096) 488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 1; 489c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 490c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 491c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 492c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 493c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 494c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_simpletimeout(void) 495c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 496c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct timeval tv; 497c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event ev; 498c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott setup_test("Simple timeout: "); 500c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tv.tv_usec = 0; 502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tv.tv_sec = SECONDS; 503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evtimer_set(&ev, timeout_cb, NULL); 504c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evtimer_add(&ev, &tv); 505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 506c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evutil_gettimeofday(&tset, NULL); 507c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_dispatch(); 508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 512c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef WIN32 513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottextern struct event_base *current_base; 514c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 515c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 516c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottchild_signal_cb(int fd, short event, void *arg) 517c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 518c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct timeval tv; 519c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int *pint = arg; 520c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 521c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *pint = 1; 522c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 523c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tv.tv_usec = 500000; 524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tv.tv_sec = 0; 525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_loopexit(&tv); 526c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 527c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_fork(void) 530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int status, got_sigchld = 0; 532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event ev, sig_ev; 533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott pid_t pid; 534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 535c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott setup_test("After fork: "); 536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 537c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott write(pair[0], TEST1, strlen(TEST1)+1); 538c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_set(&ev, pair[1], EV_READ, simple_read_cb, &ev); 540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event_add(&ev, NULL) == -1) 541c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 542c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_set(&sig_ev, SIGCHLD, child_signal_cb, &got_sigchld); 544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_add(&sig_ev, NULL); 545c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((pid = fork()) == 0) { 547c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* in the child */ 548c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event_reinit(current_base) == -1) { 549c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "FAILED (reinit)\n"); 550c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 551c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 552c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 553c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_del(&sig_ev); 554c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 555c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott called = 0; 556c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 557c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_dispatch(); 558c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 559c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* we do not send an EOF; simple_read_cb requires an EOF 560c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * to set test_ok. we just verify that the callback was 561c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * called. */ 562c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(test_ok != 0 || called != 2 ? -2 : 76); 563c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 564c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 565c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* wait for the child to read the data */ 566c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott sleep(1); 567c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 568c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott write(pair[0], TEST1, strlen(TEST1)+1); 569c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 570c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (waitpid(pid, &status, 0) == -1) { 571c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "FAILED (fork)\n"); 572c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 573c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 574c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 575c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (WEXITSTATUS(status) != 76) { 576c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "FAILED (exit): %d\n", WEXITSTATUS(status)); 577c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 578c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 579c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 580c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* test that the current event loop still works */ 581c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott write(pair[0], TEST1, strlen(TEST1)+1); 582c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott shutdown(pair[0], SHUT_WR); 583c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 584c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_dispatch(); 585c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 586c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!got_sigchld) { 587c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stdout, "FAILED (sigchld)\n"); 588c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 589c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 590c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 591c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_del(&sig_ev); 592c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 593c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 594c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 595c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 596c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 597c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_simplesignal(void) 598c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 599c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event ev; 600c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct itimerval itv; 601c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 602c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott setup_test("Simple signal: "); 603c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_set(&ev, SIGALRM, signal_cb, &ev); 604c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_add(&ev, NULL); 605c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* find bugs in which operations are re-ordered */ 606c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_del(&ev); 607c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_add(&ev, NULL); 608c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 609c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(&itv, 0, sizeof(itv)); 610c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott itv.it_value.tv_sec = 1; 611c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (setitimer(ITIMER_REAL, &itv, NULL) == -1) 612c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto skip_simplesignal; 613c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 614c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_dispatch(); 615c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott skip_simplesignal: 616c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (signal_del(&ev) == -1) 617c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 618c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 619c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 620c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 621c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 622c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 623c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_multiplesignal(void) 624c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 625c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event ev_one, ev_two; 626c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct itimerval itv; 627c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 628c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott setup_test("Multiple signal: "); 629c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 630c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_set(&ev_one, SIGALRM, signal_cb, &ev_one); 631c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_add(&ev_one, NULL); 632c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 633c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_set(&ev_two, SIGALRM, signal_cb, &ev_two); 634c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_add(&ev_two, NULL); 635c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 636c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(&itv, 0, sizeof(itv)); 637c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott itv.it_value.tv_sec = 1; 638c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (setitimer(ITIMER_REAL, &itv, NULL) == -1) 639c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto skip_simplesignal; 640c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 641c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_dispatch(); 642c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 643c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott skip_simplesignal: 644c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (signal_del(&ev_one) == -1) 645c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 646c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (signal_del(&ev_two) == -1) 647c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 648c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 649c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 650c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 651c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 652c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 653c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_immediatesignal(void) 654c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 655c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event ev; 656c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 657c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 658c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("Immediate signal: "); 659c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_set(&ev, SIGUSR1, signal_cb, &ev); 660c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_add(&ev, NULL); 661c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott raise(SIGUSR1); 662c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_loop(EVLOOP_NONBLOCK); 663c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_del(&ev); 664c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 665c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 666c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 667c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 668c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_signal_dealloc(void) 669c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 670c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* make sure that signal_event is event_del'ed and pipe closed */ 671c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event ev; 672c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event_base *base = event_init(); 673c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("Signal dealloc: "); 674c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_set(&ev, SIGUSR1, signal_cb, &ev); 675c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_add(&ev, NULL); 676c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_del(&ev); 677c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_free(base); 678c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* If we got here without asserting, we're fine. */ 679c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 1; 680c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 681c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 682c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 683c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 684c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_signal_pipeloss(void) 685c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 686c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* make sure that the base1 pipe is closed correctly. */ 687c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event_base *base1, *base2; 688c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int pipe1; 689c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 690c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("Signal pipeloss: "); 691c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base1 = event_init(); 692c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott pipe1 = base1->sig.ev_signal_pair[0]; 693c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base2 = event_init(); 694c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_free(base2); 695c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_free(base1); 696c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (close(pipe1) != -1 || errno!=EBADF) { 697c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* fd must be closed, so second close gives -1, EBADF */ 698c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("signal pipe not closed. "); 699c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 700c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 701c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 1; 702c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 703c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 704c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 705c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 706c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* 707c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * make two bases to catch signals, use both of them. this only works 708c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * for event mechanisms that use our signal pipe trick. kqueue handles 709c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * signals internally, and all interested kqueues get all the signals. 710c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 711c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 712c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_signal_switchbase(void) 713c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 714c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event ev1, ev2; 715c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event_base *base1, *base2; 716c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int is_kqueue; 717c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 718c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("Signal switchbase: "); 719c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base1 = event_init(); 720c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base2 = event_init(); 721c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott is_kqueue = !strcmp(event_get_method(),"kqueue"); 722c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_set(&ev1, SIGUSR1, signal_cb, &ev1); 723c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_set(&ev2, SIGUSR1, signal_cb, &ev2); 724c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event_base_set(base1, &ev1) || 725c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_set(base2, &ev2) || 726c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_add(&ev1, NULL) || 727c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_add(&ev2, NULL)) { 728c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "%s: cannot set base, add\n", __func__); 729c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 730c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 731c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 732c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 733c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* can handle signal before loop is called */ 734c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott raise(SIGUSR1); 735c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_loop(base2, EVLOOP_NONBLOCK); 736c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (is_kqueue) { 737c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!test_ok) 738c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto done; 739c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 740c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 741c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_loop(base1, EVLOOP_NONBLOCK); 742c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (test_ok && !is_kqueue) { 743c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 744c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 745c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* set base1 to handle signals */ 746c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_loop(base1, EVLOOP_NONBLOCK); 747c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott raise(SIGUSR1); 748c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_loop(base1, EVLOOP_NONBLOCK); 749c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_loop(base2, EVLOOP_NONBLOCK); 750c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 751c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott done: 752c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_free(base1); 753c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_free(base2); 754c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 755c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 756c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 757c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* 758c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * assert that a signal event removed from the event queue really is 759c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * removed - with no possibility of it's parent handler being fired. 760c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 761c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 762c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_signal_assert(void) 763c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 764c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event ev; 765c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event_base *base = event_init(); 766c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 767c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("Signal handler assert: "); 768c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* use SIGCONT so we don't kill ourselves when we signal to nowhere */ 769c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_set(&ev, SIGCONT, signal_cb, &ev); 770c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_add(&ev, NULL); 771c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* 772c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * if signal_del() fails to reset the handler, it's current handler 773c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * will still point to evsignal_handler(). 774c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 775c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_del(&ev); 776c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 777c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott raise(SIGCONT); 778c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* only way to verify we were in evsignal_handler() */ 779c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (base->sig.evsignal_caught) 780c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 781c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 782c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 1; 783c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 784c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_free(base); 785c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 786c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 787c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 788c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 789c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* 790c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * assert that we restore our previous signal handler properly. 791c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 792c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 793c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_signal_restore(void) 794c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 795c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event ev; 796c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event_base *base = event_init(); 797c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef HAVE_SIGACTION 798c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct sigaction sa; 799c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 800c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 801c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 802c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("Signal handler restore: "); 803c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef HAVE_SIGACTION 804c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott sa.sa_handler = signal_cb_sa; 805c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott sa.sa_flags = 0x0; 806c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott sigemptyset(&sa.sa_mask); 807c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (sigaction(SIGUSR1, &sa, NULL) == -1) 808c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto out; 809c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 810c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (signal(SIGUSR1, signal_cb_sa) == SIG_ERR) 811c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto out; 812c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 813c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_set(&ev, SIGUSR1, signal_cb, &ev); 814c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_add(&ev, NULL); 815c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_del(&ev); 816c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 817c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott raise(SIGUSR1); 818c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* 1 == signal_cb, 2 == signal_cb_sa, we want our previous handler */ 819c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (test_ok != 2) 820c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 821c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottout: 822c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_free(base); 823c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 824c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 825c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 826c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 827c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 828c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottsignal_cb_swp(int sig, short event, void *arg) 829c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 830c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott called++; 831c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (called < 5) 832c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott raise(sig); 833c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 834c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_loopexit(NULL); 835c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 836c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 837c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttimeout_cb_swp(int fd, short event, void *arg) 838c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 839c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (called == -1) { 840c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct timeval tv = {5, 0}; 841c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 842c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott called = 0; 843c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evtimer_add((struct event *)arg, &tv); 844c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott raise(SIGUSR1); 845c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 846c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 847c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 848c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_loopexit(NULL); 849c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 850c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 851c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 852c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_signal_while_processing(void) 853c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 854c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event_base *base = event_init(); 855c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event ev, ev_timer; 856c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct timeval tv = {0, 0}; 857c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 858c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott setup_test("Receiving a signal while processing other signal: "); 859c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 860c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott called = -1; 861c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 1; 862c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_set(&ev, SIGUSR1, signal_cb_swp, NULL); 863c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signal_add(&ev, NULL); 864c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evtimer_set(&ev_timer, timeout_cb_swp, &ev_timer); 865c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evtimer_add(&ev_timer, &tv); 866c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_dispatch(); 867c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 868c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_free(base); 869c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 870c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 871c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 872c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 873c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 874c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 875c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_free_active_base(void) 876c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 877c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event_base *base1; 878c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event ev1; 879c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott setup_test("Free active base: "); 880c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base1 = event_init(); 881c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_set(&ev1, pair[1], EV_READ, simple_read_cb, &ev1); 882c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_set(base1, &ev1); 883c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_add(&ev1, NULL); 884c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* event_del(&ev1); */ 885c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_free(base1); 886c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 1; 887c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 888c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 889c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 890c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 891c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_event_base_new(void) 892c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 893c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event_base *base; 894c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event ev1; 895c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott setup_test("Event base new: "); 896c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 897c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott write(pair[0], TEST1, strlen(TEST1)+1); 898c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott shutdown(pair[0], SHUT_WR); 899c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 900c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base = event_base_new(); 901c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_set(&ev1, pair[1], EV_READ, simple_read_cb, &ev1); 902c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_set(base, &ev1); 903c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_add(&ev1, NULL); 904c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 905c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_dispatch(base); 906c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 907c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_free(base); 908c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 1; 909c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 910c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 911c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 912c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 913c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_loopexit(void) 914c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 915c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct timeval tv, tv_start, tv_end; 916c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event ev; 917c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 918c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott setup_test("Loop exit: "); 919c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 920c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tv.tv_usec = 0; 921c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tv.tv_sec = 60*60*24; 922c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evtimer_set(&ev, timeout_cb, NULL); 923c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evtimer_add(&ev, &tv); 924c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 925c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tv.tv_usec = 0; 926c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tv.tv_sec = 1; 927c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_loopexit(&tv); 928c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 929c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evutil_gettimeofday(&tv_start, NULL); 930c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_dispatch(); 931c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evutil_gettimeofday(&tv_end, NULL); 932c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evutil_timersub(&tv_end, &tv_start, &tv_end); 933c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 934c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evtimer_del(&ev); 935c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 936c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (tv.tv_sec < 2) 937c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 1; 938c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 939c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 940c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 941c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 942c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 943c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_loopexit_multiple(void) 944c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 945c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct timeval tv; 946c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event_base *base; 947c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 948c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott setup_test("Loop Multiple exit: "); 949c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 950c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base = event_base_new(); 951c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 952c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tv.tv_usec = 0; 953c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tv.tv_sec = 1; 954c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_loopexit(base, &tv); 955c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 956c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tv.tv_usec = 0; 957c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tv.tv_sec = 2; 958c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_loopexit(base, &tv); 959c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 960c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_dispatch(base); 961c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 962c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_free(base); 963c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 964c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 1; 965c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 966c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 967c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 968c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 969c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 970c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbreak_cb(int fd, short events, void *arg) 971c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 972c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 1; 973c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_loopbreak(); 974c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 975c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 976c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 977c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottfail_cb(int fd, short events, void *arg) 978c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 979c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 980c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 981c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 982c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 983c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_loopbreak(void) 984c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 985c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event ev1, ev2; 986c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct timeval tv; 987c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 988c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott setup_test("Loop break: "); 989c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 990c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tv.tv_sec = 0; 991c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tv.tv_usec = 0; 992c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evtimer_set(&ev1, break_cb, NULL); 993c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evtimer_add(&ev1, &tv); 994c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evtimer_set(&ev2, fail_cb, NULL); 995c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evtimer_add(&ev2, &tv); 996c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 997c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_dispatch(); 998c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 999c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evtimer_del(&ev1); 1000c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evtimer_del(&ev2); 1001c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1002c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 1003c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1004c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1005c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 1006c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_evbuffer(void) { 1007c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1008c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct evbuffer *evb = evbuffer_new(); 1009c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott setup_test("Testing Evbuffer: "); 1010c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1011c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evbuffer_add_printf(evb, "%s/%d", "hello", 1); 1012c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1013c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (EVBUFFER_LENGTH(evb) == 7 && 1014c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott strcmp((char*)EVBUFFER_DATA(evb), "hello/1") == 0) 1015c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 1; 1016c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1017c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evbuffer_free(evb); 1018c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1019c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 1020c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1021c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1022c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 1023c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_evbuffer_find(void) 1024c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1025c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott u_char* p; 1026c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* test1 = "1234567890\r\n"; 1027c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* test2 = "1234567890\r"; 1028c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVBUFFER_INITIAL_LENGTH 256 1029c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char test3[EVBUFFER_INITIAL_LENGTH]; 1030c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott unsigned int i; 1031c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct evbuffer * buf = evbuffer_new(); 1032c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1033c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* make sure evbuffer_find doesn't match past the end of the buffer */ 1034c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stdout, "Testing evbuffer_find 1: "); 1035c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evbuffer_add(buf, (u_char*)test1, strlen(test1)); 1036c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evbuffer_drain(buf, strlen(test1)); 1037c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evbuffer_add(buf, (u_char*)test2, strlen(test2)); 1038c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott p = evbuffer_find(buf, (u_char*)"\r\n", 2); 1039c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (p == NULL) { 1040c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stdout, "OK\n"); 1041c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 1042c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stdout, "FAILED\n"); 1043c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 1044c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1045c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1046c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* 1047c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * drain the buffer and do another find; in r309 this would 1048c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * read past the allocated buffer causing a valgrind error. 1049c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 1050c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stdout, "Testing evbuffer_find 2: "); 1051c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evbuffer_drain(buf, strlen(test2)); 1052c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (i = 0; i < EVBUFFER_INITIAL_LENGTH; ++i) 1053c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test3[i] = 'a'; 1054c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test3[EVBUFFER_INITIAL_LENGTH - 1] = 'x'; 1055c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evbuffer_add(buf, (u_char *)test3, EVBUFFER_INITIAL_LENGTH); 1056c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott p = evbuffer_find(buf, (u_char *)"xy", 2); 1057c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (p == NULL) { 1058c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("OK\n"); 1059c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 1060c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stdout, "FAILED\n"); 1061c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 1062c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1063c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1064c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* simple test for match at end of allocated buffer */ 1065c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stdout, "Testing evbuffer_find 3: "); 1066c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott p = evbuffer_find(buf, (u_char *)"ax", 2); 1067c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (p != NULL && strncmp((char*)p, "ax", 2) == 0) { 1068c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printf("OK\n"); 1069c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 1070c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stdout, "FAILED\n"); 1071c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 1072c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1073c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1074c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evbuffer_free(buf); 1075c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1076c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1077c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* 1078c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * simple bufferevent test 1079c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 1080c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1081c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 1082c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottreadcb(struct bufferevent *bev, void *arg) 1083c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1084c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (EVBUFFER_LENGTH(bev->input) == 8333) { 1085c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bufferevent_disable(bev, EV_READ); 1086c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok++; 1087c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1088c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1089c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1090c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 1091c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottwritecb(struct bufferevent *bev, void *arg) 1092c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1093c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (EVBUFFER_LENGTH(bev->output) == 0) 1094c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok++; 1095c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1096c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1097c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 1098c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotterrorcb(struct bufferevent *bev, short what, void *arg) 1099c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = -2; 1101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 1104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_bufferevent(void) 1105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct bufferevent *bev1, *bev2; 1107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char buffer[8333]; 1108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int i; 1109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott setup_test("Bufferevent: "); 1111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bev1 = bufferevent_new(pair[0], readcb, writecb, errorcb, NULL); 1113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bev2 = bufferevent_new(pair[1], readcb, writecb, errorcb, NULL); 1114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bufferevent_disable(bev1, EV_READ); 1116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bufferevent_enable(bev2, EV_READ); 1117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (i = 0; i < sizeof(buffer); i++) 1119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott buffer[i] = i; 1120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bufferevent_write(bev1, buffer, sizeof(buffer)); 1122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_dispatch(); 1124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bufferevent_free(bev1); 1126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bufferevent_free(bev2); 1127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (test_ok != 2) 1129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 1130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 1132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* 1135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * test watermarks and bufferevent 1136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 1137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 1139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottwm_readcb(struct bufferevent *bev, void *arg) 1140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int len = EVBUFFER_LENGTH(bev->input); 1142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static int nread; 1143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott assert(len >= 10 && len <= 20); 1145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evbuffer_drain(bev->input, len); 1147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott nread += len; 1149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (nread == 65000) { 1150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bufferevent_disable(bev, EV_READ); 1151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok++; 1152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 1156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottwm_writecb(struct bufferevent *bev, void *arg) 1157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (EVBUFFER_LENGTH(bev->output) == 0) 1159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok++; 1160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 1163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottwm_errorcb(struct bufferevent *bev, short what, void *arg) 1164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = -2; 1166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 1169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_bufferevent_watermarks(void) 1170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct bufferevent *bev1, *bev2; 1172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char buffer[65000]; 1173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int i; 1174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott setup_test("Bufferevent Watermarks: "); 1176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bev1 = bufferevent_new(pair[0], NULL, wm_writecb, wm_errorcb, NULL); 1178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bev2 = bufferevent_new(pair[1], wm_readcb, NULL, wm_errorcb, NULL); 1179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bufferevent_disable(bev1, EV_READ); 1181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bufferevent_enable(bev2, EV_READ); 1182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (i = 0; i < sizeof(buffer); i++) 1184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott buffer[i] = i; 1185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bufferevent_write(bev1, buffer, sizeof(buffer)); 1187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* limit the reading on the receiving bufferevent */ 1189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bufferevent_setwatermark(bev2, EV_READ, 10, 20); 1190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_dispatch(); 1192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bufferevent_free(bev1); 1194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bufferevent_free(bev2); 1195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (test_ok != 2) 1197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 1198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 1200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct test_pri_event { 1203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event ev; 1204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int count; 1205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 1206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 1208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_priorities_cb(int fd, short what, void *arg) 1209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct test_pri_event *pri = arg; 1211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct timeval tv; 1212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (pri->count == 3) { 1214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_loopexit(NULL); 1215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 1216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott pri->count++; 1219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evutil_timerclear(&tv); 1221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_add(&pri->ev, &tv); 1222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 1225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_priorities(int npriorities) 1226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char buf[32]; 1228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct test_pri_event one, two; 1229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct timeval tv; 1230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evutil_snprintf(buf, sizeof(buf), "Testing Priorities %d: ", npriorities); 1232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott setup_test(buf); 1233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_base_priority_init(global_base, npriorities); 1235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(&one, 0, sizeof(one)); 1237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(&two, 0, sizeof(two)); 1238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott timeout_set(&one.ev, test_priorities_cb, &one); 1240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event_priority_set(&one.ev, 0) == -1) { 1241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "%s: failed to set priority", __func__); 1242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 1243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott timeout_set(&two.ev, test_priorities_cb, &two); 1246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event_priority_set(&two.ev, npriorities - 1) == -1) { 1247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "%s: failed to set priority", __func__); 1248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 1249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evutil_timerclear(&tv); 1252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event_add(&one.ev, &tv) == -1) 1254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 1255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event_add(&two.ev, &tv) == -1) 1256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 1257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_dispatch(); 1259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_del(&one.ev); 1261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_del(&two.ev); 1262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (npriorities == 1) { 1264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (one.count == 3 && two.count == 3) 1265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 1; 1266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else if (npriorities == 2) { 1267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Two is called once because event_loopexit is priority 1 */ 1268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (one.count == 3 && two.count == 1) 1269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 1; 1270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 1271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (one.count == 3 && two.count == 0) 1272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 1; 1273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 1276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 1279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_multiple_cb(int fd, short event, void *arg) 1280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event & EV_READ) 1282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok |= 1; 1283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if (event & EV_WRITE) 1284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok |= 2; 1285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 1288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_multiple_events_for_same_fd(void) 1289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event e1, e2; 1291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott setup_test("Multiple events for same fd: "); 1293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_set(&e1, pair[0], EV_READ, test_multiple_cb, NULL); 1295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_add(&e1, NULL); 1296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_set(&e2, pair[0], EV_WRITE, test_multiple_cb, NULL); 1297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_add(&e2, NULL); 1298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_loop(EVLOOP_ONCE); 1299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_del(&e2); 1300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott write(pair[1], TEST1, strlen(TEST1)+1); 1301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_loop(EVLOOP_ONCE); 1302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_del(&e1); 1303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (test_ok != 3) 1305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 1306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 1308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evtag_decode_int(uint32_t *pnumber, struct evbuffer *evbuf); 1311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evtag_encode_tag(struct evbuffer *evbuf, uint32_t number); 1312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evtag_decode_tag(uint32_t *pnumber, struct evbuffer *evbuf); 1313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 1315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottread_once_cb(int fd, short event, void *arg) 1316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char buf[256]; 1318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int len; 1319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott len = read(fd, buf, sizeof(buf)); 1321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (called) { 1323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 1324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else if (len) { 1325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Assumes global pair[0] can be used for writing */ 1326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott write(pair[0], TEST1, strlen(TEST1)+1); 1327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 1; 1328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott called++; 1331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 1334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_want_only_once(void) 1335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct event ev; 1337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct timeval tv; 1338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Very simple read test */ 1340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott setup_test("Want read only once: "); 1341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott write(pair[0], TEST1, strlen(TEST1)+1); 1343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Setup the loop termination */ 1345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evutil_timerclear(&tv); 1346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tv.tv_sec = 1; 1347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_loopexit(&tv); 1348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_set(&ev, pair[1], EV_READ, read_once_cb, &ev); 1350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (event_add(&ev, NULL) == -1) 1351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 1352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_dispatch(); 1353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 1355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define TEST_MAX_INT 6 1358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 1360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottevtag_int_test(void) 1361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct evbuffer *tmp = evbuffer_new(); 1363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott uint32_t integers[TEST_MAX_INT] = { 1364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xaf0, 0x1000, 0x1, 0xdeadbeef, 0x00, 0xbef000 1365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 1366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott uint32_t integer; 1367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int i; 1368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (i = 0; i < TEST_MAX_INT; i++) { 1370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int oldlen, newlen; 1371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott oldlen = EVBUFFER_LENGTH(tmp); 1372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott encode_int(tmp, integers[i]); 1373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott newlen = EVBUFFER_LENGTH(tmp); 1374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stdout, "\t\tencoded 0x%08x with %d bytes\n", 1375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott integers[i], newlen - oldlen); 1376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (i = 0; i < TEST_MAX_INT; i++) { 1379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (evtag_decode_int(&integer, tmp) == -1) { 1380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "decode %d failed", i); 1381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 1382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (integer != integers[i]) { 1384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "got %x, wanted %x", 1385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott integer, integers[i]); 1386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 1387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (EVBUFFER_LENGTH(tmp) != 0) { 1391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "trailing data"); 1392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 1393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evbuffer_free(tmp); 1395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stdout, "\t%s: OK\n", __func__); 1397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 1400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottevtag_fuzz(void) 1401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott u_char buffer[4096]; 1403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct evbuffer *tmp = evbuffer_new(); 1404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct timeval tv; 1405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int i, j; 1406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int not_failed = 0; 1408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (j = 0; j < 100; j++) { 1409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (i = 0; i < sizeof(buffer); i++) 1410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott buffer[i] = rand(); 1411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evbuffer_drain(tmp, -1); 1412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evbuffer_add(tmp, buffer, sizeof(buffer)); 1413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (evtag_unmarshal_timeval(tmp, 0, &tv) != -1) 1415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott not_failed++; 1416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* The majority of decodes should fail */ 1419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (not_failed >= 10) { 1420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "evtag_unmarshal should have failed"); 1421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 1422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Now insert some corruption into the tag length field */ 1425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evbuffer_drain(tmp, -1); 1426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evutil_timerclear(&tv); 1427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tv.tv_sec = 1; 1428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evtag_marshal_timeval(tmp, 0, &tv); 1429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evbuffer_add(tmp, buffer, sizeof(buffer)); 1430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EVBUFFER_DATA(tmp)[1] = 0xff; 1432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (evtag_unmarshal_timeval(tmp, 0, &tv) != -1) { 1433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "evtag_unmarshal_timeval should have failed"); 1434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 1435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evbuffer_free(tmp); 1438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stdout, "\t%s: OK\n", __func__); 1440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 1443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottevtag_tag_encoding(void) 1444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct evbuffer *tmp = evbuffer_new(); 1446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott uint32_t integers[TEST_MAX_INT] = { 1447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xaf0, 0x1000, 0x1, 0xdeadbeef, 0x00, 0xbef000 1448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 1449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott uint32_t integer; 1450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int i; 1451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (i = 0; i < TEST_MAX_INT; i++) { 1453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int oldlen, newlen; 1454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott oldlen = EVBUFFER_LENGTH(tmp); 1455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evtag_encode_tag(tmp, integers[i]); 1456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott newlen = EVBUFFER_LENGTH(tmp); 1457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stdout, "\t\tencoded 0x%08x with %d bytes\n", 1458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott integers[i], newlen - oldlen); 1459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (i = 0; i < TEST_MAX_INT; i++) { 1462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (evtag_decode_tag(&integer, tmp) == -1) { 1463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "decode %d failed", i); 1464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 1465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (integer != integers[i]) { 1467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "got %x, wanted %x", 1468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott integer, integers[i]); 1469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 1470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1472c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1473c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (EVBUFFER_LENGTH(tmp) != 0) { 1474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "trailing data"); 1475c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 1476c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evbuffer_free(tmp); 1478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stdout, "\t%s: OK\n", __func__); 1480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 1483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottevtag_test(void) 1484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stdout, "Testing Tagging:\n"); 1486c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evtag_init(); 1488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evtag_int_test(); 1489c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evtag_fuzz(); 1490c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1491c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evtag_tag_encoding(); 1492c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1493c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stdout, "OK\n"); 1494c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1495c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1496c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef WIN32 1497c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 1498c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottrpc_test(void) 1499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1500c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct msg *msg, *msg2; 1501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct kill *attack; 1502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct run *run; 1503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct evbuffer *tmp = evbuffer_new(); 1504c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct timeval tv_start, tv_end; 1505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott uint32_t tag; 1506c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int i; 1507c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stdout, "Testing RPC: "); 1509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg = msg_new(); 1511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EVTAG_ASSIGN(msg, from_name, "niels"); 1512c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EVTAG_ASSIGN(msg, to_name, "phoenix"); 1513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1514c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (EVTAG_GET(msg, attack, &attack) == -1) { 1515c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "Failed to set kill message.\n"); 1516c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 1517c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1518c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1519c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EVTAG_ASSIGN(attack, weapon, "feather"); 1520c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EVTAG_ASSIGN(attack, action, "tickle"); 1521c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1522c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evutil_gettimeofday(&tv_start, NULL); 1523c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (i = 0; i < 1000; ++i) { 1524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott run = EVTAG_ADD(msg, run); 1525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (run == NULL) { 1526c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "Failed to add run message.\n"); 1527c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 1528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EVTAG_ASSIGN(run, how, "very fast but with some data in it"); 1530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EVTAG_ASSIGN(run, fixed_bytes, 1531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (unsigned char*)"012345678901234567890123"); 1532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (msg_complete(msg) == -1) { 1535c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "Failed to make complete message.\n"); 1536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 1537c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1538c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evtag_marshal_msg(tmp, 0xdeaf, msg); 1540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1541c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (evtag_peek(tmp, &tag) == -1) { 1542c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "Failed to peak tag.\n"); 1543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit (1); 1544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1545c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (tag != 0xdeaf) { 1547c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "Got incorrect tag: %0x.\n", tag); 1548c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit (1); 1549c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1550c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1551c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg2 = msg_new(); 1552c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (evtag_unmarshal_msg(tmp, 0xdeaf, msg2) == -1) { 1553c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "Failed to unmarshal message.\n"); 1554c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 1555c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1556c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1557c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evutil_gettimeofday(&tv_end, NULL); 1558c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evutil_timersub(&tv_end, &tv_start, &tv_end); 1559c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "(%.1f us/add) ", 1560c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (float)tv_end.tv_sec/(float)i * 1000000.0 + 1561c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tv_end.tv_usec / (float)i); 1562c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1563c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!EVTAG_HAS(msg2, from_name) || 1564c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott !EVTAG_HAS(msg2, to_name) || 1565c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott !EVTAG_HAS(msg2, attack)) { 1566c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "Missing data structures.\n"); 1567c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 1568c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1569c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1570c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (EVTAG_LEN(msg2, run) != i) { 1571c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, "Wrong number of run messages.\n"); 1572c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott exit(1); 1573c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1574c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1575c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg_free(msg); 1576c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott msg_free(msg2); 1577c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1578c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evbuffer_free(tmp); 1579c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1580c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stdout, "OK\n"); 1581c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1582c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1583c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1584c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void 1585c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttest_evutil_strtoll(void) 1586c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1587c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char *s; 1588c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char *endptr; 1589c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott setup_test("evutil_stroll: "); 1590c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 0; 1591c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1592c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (evutil_strtoll("5000000000", NULL, 10) != ((ev_int64_t)5000000)*1000) 1593c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto err; 1594c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (evutil_strtoll("-5000000000", NULL, 10) != ((ev_int64_t)5000000)*-1000) 1595c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto err; 1596c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s = " 99999stuff"; 1597c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (evutil_strtoll(s, &endptr, 10) != (ev_int64_t)99999) 1598c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto err; 1599c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (endptr != s+6) 1600c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto err; 1601c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (evutil_strtoll("foo", NULL, 10) != 0) 1602c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott goto err; 1603c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1604c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_ok = 1; 1605c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott err: 1606c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cleanup_test(); 1607c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1608c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1609c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1610c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint 1611c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottmain (int argc, char **argv) 1612c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{ 1613c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef WIN32 1614c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott WORD wVersionRequested; 1615c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott WSADATA wsaData; 1616c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int err; 1617c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1618c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott wVersionRequested = MAKEWORD( 2, 2 ); 1619c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1620c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott err = WSAStartup( wVersionRequested, &wsaData ); 1621c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1622c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1623c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef WIN32 1624c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) 1625c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return (1); 1626c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1627c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott setvbuf(stdout, NULL, _IONBF, 0); 1628c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1629c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Initalize the event library */ 1630c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott global_base = event_init(); 1631c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1632c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_registerfds(); 1633c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1634c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_evutil_strtoll(); 1635c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1636c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* use the global event base and need to be called first */ 1637c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_priorities(1); 1638c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_priorities(2); 1639c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_priorities(3); 1640c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1641c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_evbuffer(); 1642c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_evbuffer_find(); 1643c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1644c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_bufferevent(); 1645c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_bufferevent_watermarks(); 1646c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1647c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_free_active_base(); 1648c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1649c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_event_base_new(); 1650c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1651c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott http_suite(); 1652c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1653c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef WIN32 1654c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rpc_suite(); 1655c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1656c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1657c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott dns_suite(); 1658c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1659c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef WIN32 1660c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_fork(); 1661c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1662c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1663c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_simpleread(); 1664c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1665c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_simplewrite(); 1666c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1667c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_multiple(); 1668c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1669c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_persistent(); 1670c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1671c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_combined(); 1672c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1673c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_simpletimeout(); 1674c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef WIN32 1675c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_simplesignal(); 1676c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_multiplesignal(); 1677c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_immediatesignal(); 1678c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1679c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_loopexit(); 1680c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_loopbreak(); 1681c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1682c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_loopexit_multiple(); 1683c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1684c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_multiple_events_for_same_fd(); 1685c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1686c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_want_only_once(); 1687c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1688c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott evtag_test(); 1689c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1690c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef WIN32 1691c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rpc_test(); 1692c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1693c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_signal_dealloc(); 1694c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_signal_pipeloss(); 1695c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_signal_switchbase(); 1696c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_signal_restore(); 1697c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_signal_assert(); 1698c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_signal_while_processing(); 1699c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 1700c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1701c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return (0); 1702c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 1703c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1704