15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 2002, 2003 Niels Provos <provos@citi.umich.edu> 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All rights reserved. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * modification, are permitted provided that the following conditions 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are met: 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * documentation and/or other materials provided with the distribution. 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3. The name of the author may not be used to endorse or promote products 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * derived from this software without specific prior written permission. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_CONFIG_H 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "config.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WIN32 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <winsock2.h> 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_VASPRINTF 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* If we have vasprintf, we need to define this before we include stdio.h. */ 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _GNU_SOURCE 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/types.h> 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_TIME_H 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/time.h> 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_IOCTL_H 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/ioctl.h> 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <assert.h> 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <errno.h> 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h> 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STDARG_H 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdarg.h> 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_UNISTD_H 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <unistd.h> 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "event.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "config.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "evutil.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct evbuffer * 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)evbuffer_new(void) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evbuffer *buffer; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer = calloc(1, sizeof(struct evbuffer)); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (buffer); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)evbuffer_free(struct evbuffer *buffer) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buffer->orig_buffer != NULL) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) free(buffer->orig_buffer); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) free(buffer); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This is a destructive add. The data from one buffer moves into 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the other buffer. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SWAP(x,y) do { \ 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (x)->buffer = (y)->buffer; \ 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (x)->orig_buffer = (y)->orig_buffer; \ 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (x)->misalign = (y)->misalign; \ 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (x)->totallen = (y)->totallen; \ 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (x)->off = (y)->off; \ 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} while (0) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)evbuffer_add_buffer(struct evbuffer *outbuf, struct evbuffer *inbuf) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int res; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Short cut for better performance */ 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (outbuf->off == 0) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct evbuffer tmp; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t oldoff = inbuf->off; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Swap them directly */ 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SWAP(&tmp, outbuf); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SWAP(outbuf, inbuf); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SWAP(inbuf, &tmp); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Optimization comes with a price; we need to notify the 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * buffer if necessary of the changes. oldoff is the amount 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of data that we transfered from inbuf to outbuf 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (inbuf->off != oldoff && inbuf->cb != NULL) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*inbuf->cb)(inbuf, oldoff, inbuf->off, inbuf->cbarg); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (oldoff && outbuf->cb != NULL) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*outbuf->cb)(outbuf, 0, oldoff, outbuf->cbarg); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = evbuffer_add(outbuf, inbuf->buffer, inbuf->off); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res == 0) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* We drain the input buffer on success */ 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evbuffer_drain(inbuf, inbuf->off); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (res); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)evbuffer_add_vprintf(struct evbuffer *buf, const char *fmt, va_list ap) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *buffer; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t space; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t oldoff = buf->off; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sz; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_list aq; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* make sure that at least some space is available */ 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evbuffer_expand(buf, 64); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (;;) { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t used = buf->misalign + buf->off; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer = (char *)buf->buffer + buf->off; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(buf->totallen >= used); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) space = buf->totallen - used; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef va_copy 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define va_copy(dst, src) memcpy(&(dst), &(src), sizeof(va_list)) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_copy(aq, ap); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sz = evutil_vsnprintf(buffer, space, fmt, aq); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_end(aq); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sz < 0) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((size_t)sz < space) { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf->off += sz; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buf->cb != NULL) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*buf->cb)(buf, oldoff, buf->off, buf->cbarg); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (sz); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (evbuffer_expand(buf, sz + 1) == -1) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* NOTREACHED */ 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)evbuffer_add_printf(struct evbuffer *buf, const char *fmt, ...) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int res = -1; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_list ap; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_start(ap, fmt); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = evbuffer_add_vprintf(buf, fmt, ap); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_end(ap); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (res); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Reads data from an event buffer and drains the bytes read */ 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)evbuffer_remove(struct evbuffer *buf, void *data, size_t datlen) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t nread = datlen; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nread >= buf->off) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nread = buf->off; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(data, buf->buffer, nread); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evbuffer_drain(buf, nread); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (nread); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reads a line terminated by either '\r\n', '\n\r' or '\r' or '\n'. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The returned buffer needs to be freed by the called. 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char * 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)evbuffer_readline(struct evbuffer *buffer) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u_char *data = EVBUFFER_DATA(buffer); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t len = EVBUFFER_LENGTH(buffer); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *line; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int i; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < len; i++) { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (data[i] == '\r' || data[i] == '\n') 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i == len) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((line = malloc(i + 1)) == NULL) { 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "%s: out of memory\n", __func__); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(line, data, i); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) line[i] = '\0'; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Some protocols terminate a line with '\r\n', so check for 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * that, too. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ( i < len - 1 ) { 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char fch = data[i], sch = data[i+1]; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Drain one more character if needed */ 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ( (sch == '\r' || sch == '\n') && sch != fch ) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i += 1; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evbuffer_drain(buffer, i + 1); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (line); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Adds data to an event buffer */ 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)evbuffer_align(struct evbuffer *buf) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memmove(buf->orig_buffer, buf->buffer, buf->off); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf->buffer = buf->orig_buffer; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf->misalign = 0; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Expands the available space in the event buffer to at least datlen */ 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)evbuffer_expand(struct evbuffer *buf, size_t datlen) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t need = buf->misalign + buf->off + datlen; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If we can fit all the data, then we don't have to do anything */ 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buf->totallen >= need) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If the misalignment fulfills our data needs, we just force an 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * alignment to happen. Afterwards, we have enough space. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buf->misalign >= datlen) { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evbuffer_align(buf); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *newbuf; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t length = buf->totallen; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (length < 256) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) length = 256; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (length < need) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) length <<= 1; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buf->orig_buffer != buf->buffer) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evbuffer_align(buf); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((newbuf = realloc(buf->buffer, length)) == NULL) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf->orig_buffer = buf->buffer = newbuf; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf->totallen = length; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)evbuffer_add(struct evbuffer *buf, const void *data, size_t datlen) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t need = buf->misalign + buf->off + datlen; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t oldoff = buf->off; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buf->totallen < need) { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (evbuffer_expand(buf, datlen) == -1) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(buf->buffer + buf->off, data, datlen); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf->off += datlen; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (datlen && buf->cb != NULL) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*buf->cb)(buf, oldoff, buf->off, buf->cbarg); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)evbuffer_drain(struct evbuffer *buf, size_t len) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t oldoff = buf->off; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (len >= buf->off) { 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf->off = 0; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf->buffer = buf->orig_buffer; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf->misalign = 0; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto done; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf->buffer += len; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf->misalign += len; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf->off -= len; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done: 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Tell someone about changes in this buffer */ 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buf->off != oldoff && buf->cb != NULL) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*buf->cb)(buf, oldoff, buf->off, buf->cbarg); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reads data from a file descriptor into a buffer. 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define EVBUFFER_MAX_READ 4096 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)evbuffer_read(struct evbuffer *buf, int fd, int howmuch) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u_char *p; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t oldoff = buf->off; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n = EVBUFFER_MAX_READ; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(FIONREAD) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WIN32 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long lng = n; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ioctlsocket(fd, FIONREAD, &lng) == -1 || (n=lng) <= 0) { 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ioctl(fd, FIONREAD, &n) == -1 || n <= 0) { 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n = EVBUFFER_MAX_READ; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (n > EVBUFFER_MAX_READ && n > howmuch) { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * It's possible that a lot of data is available for 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * reading. We do not want to exhaust resources 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * before the reader has a chance to do something 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * about it. If the reader does not tell us how much 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * data we should read, we artifically limit it. 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((size_t)n > buf->totallen << 2) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n = buf->totallen << 2; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (n < EVBUFFER_MAX_READ) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n = EVBUFFER_MAX_READ; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (howmuch < 0 || howmuch > n) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) howmuch = n; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If we don't have FIONREAD, we might waste some space here */ 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (evbuffer_expand(buf, howmuch) == -1) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* We can append new data at this point */ 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p = buf->buffer + buf->off; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef WIN32 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n = read(fd, p, howmuch); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n = recv(fd, p, howmuch, 0); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (n == -1) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (n == 0) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf->off += n; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Tell someone about changes in this buffer */ 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buf->off != oldoff && buf->cb != NULL) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*buf->cb)(buf, oldoff, buf->off, buf->cbarg); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (n); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)evbuffer_write(struct evbuffer *buffer, int fd) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef WIN32 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n = write(fd, buffer->buffer, buffer->off); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n = send(fd, buffer->buffer, buffer->off, 0); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (n == -1) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (n == 0) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evbuffer_drain(buffer, n); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (n); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)u_char * 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)evbuffer_find(struct evbuffer *buffer, const u_char *what, size_t len) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u_char *search = buffer->buffer, *end = search + buffer->off; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u_char *p; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (search < end && 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (p = memchr(search, *what, end - search)) != NULL) { 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (p + len > end) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (memcmp(p, what, len) == 0) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (p); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search = p + 1; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void evbuffer_setcb(struct evbuffer *buffer, 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void (*cb)(struct evbuffer *, size_t, size_t, void *), 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *cbarg) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer->cb = cb; 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer->cbarg = cbarg; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 451