1*6777b538SAndroid Build Coastguard Worker /* 2*6777b538SAndroid Build Coastguard Worker * Copyright (c) 2007 Niels Provos <[email protected]> 3*6777b538SAndroid Build Coastguard Worker * All rights reserved. 4*6777b538SAndroid Build Coastguard Worker * 5*6777b538SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 6*6777b538SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions 7*6777b538SAndroid Build Coastguard Worker * are met: 8*6777b538SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright 9*6777b538SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 10*6777b538SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright 11*6777b538SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the 12*6777b538SAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution. 13*6777b538SAndroid Build Coastguard Worker * 3. The name of the author may not be used to endorse or promote products 14*6777b538SAndroid Build Coastguard Worker * derived from this software without specific prior written permission. 15*6777b538SAndroid Build Coastguard Worker * 16*6777b538SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17*6777b538SAndroid Build Coastguard Worker * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18*6777b538SAndroid Build Coastguard Worker * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19*6777b538SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20*6777b538SAndroid Build Coastguard Worker * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21*6777b538SAndroid Build Coastguard Worker * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22*6777b538SAndroid Build Coastguard Worker * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23*6777b538SAndroid Build Coastguard Worker * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24*6777b538SAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25*6777b538SAndroid Build Coastguard Worker * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26*6777b538SAndroid Build Coastguard Worker */ 27*6777b538SAndroid Build Coastguard Worker #ifndef _EVUTIL_H_ 28*6777b538SAndroid Build Coastguard Worker #define _EVUTIL_H_ 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Worker /** @file evutil.h 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker Common convenience functions for cross-platform portability and 33*6777b538SAndroid Build Coastguard Worker related socket manipulations. 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker */ 36*6777b538SAndroid Build Coastguard Worker 37*6777b538SAndroid Build Coastguard Worker #ifdef __cplusplus 38*6777b538SAndroid Build Coastguard Worker extern "C" { 39*6777b538SAndroid Build Coastguard Worker #endif 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker #include "event-config.h" 42*6777b538SAndroid Build Coastguard Worker #ifdef _EVENT_HAVE_SYS_TIME_H 43*6777b538SAndroid Build Coastguard Worker #include <sys/time.h> 44*6777b538SAndroid Build Coastguard Worker #endif 45*6777b538SAndroid Build Coastguard Worker #ifdef _EVENT_HAVE_STDINT_H 46*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 47*6777b538SAndroid Build Coastguard Worker #elif defined(_EVENT_HAVE_INTTYPES_H) 48*6777b538SAndroid Build Coastguard Worker #include <inttypes.h> 49*6777b538SAndroid Build Coastguard Worker #endif 50*6777b538SAndroid Build Coastguard Worker #ifdef _EVENT_HAVE_SYS_TYPES_H 51*6777b538SAndroid Build Coastguard Worker #include <sys/types.h> 52*6777b538SAndroid Build Coastguard Worker #endif 53*6777b538SAndroid Build Coastguard Worker #include <stdarg.h> 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker #ifdef _EVENT_HAVE_UINT64_T 56*6777b538SAndroid Build Coastguard Worker #define ev_uint64_t uint64_t 57*6777b538SAndroid Build Coastguard Worker #define ev_int64_t int64_t 58*6777b538SAndroid Build Coastguard Worker #elif defined(WIN32) 59*6777b538SAndroid Build Coastguard Worker #define ev_uint64_t unsigned __int64 60*6777b538SAndroid Build Coastguard Worker #define ev_int64_t signed __int64 61*6777b538SAndroid Build Coastguard Worker #elif _EVENT_SIZEOF_LONG_LONG == 8 62*6777b538SAndroid Build Coastguard Worker #define ev_uint64_t unsigned long long 63*6777b538SAndroid Build Coastguard Worker #define ev_int64_t long long 64*6777b538SAndroid Build Coastguard Worker #elif _EVENT_SIZEOF_LONG == 8 65*6777b538SAndroid Build Coastguard Worker #define ev_uint64_t unsigned long 66*6777b538SAndroid Build Coastguard Worker #define ev_int64_t long 67*6777b538SAndroid Build Coastguard Worker #else 68*6777b538SAndroid Build Coastguard Worker #error "No way to define ev_uint64_t" 69*6777b538SAndroid Build Coastguard Worker #endif 70*6777b538SAndroid Build Coastguard Worker 71*6777b538SAndroid Build Coastguard Worker #ifdef _EVENT_HAVE_UINT32_T 72*6777b538SAndroid Build Coastguard Worker #define ev_uint32_t uint32_t 73*6777b538SAndroid Build Coastguard Worker #elif defined(WIN32) 74*6777b538SAndroid Build Coastguard Worker #define ev_uint32_t unsigned int 75*6777b538SAndroid Build Coastguard Worker #elif _EVENT_SIZEOF_LONG == 4 76*6777b538SAndroid Build Coastguard Worker #define ev_uint32_t unsigned long 77*6777b538SAndroid Build Coastguard Worker #elif _EVENT_SIZEOF_INT == 4 78*6777b538SAndroid Build Coastguard Worker #define ev_uint32_t unsigned int 79*6777b538SAndroid Build Coastguard Worker #else 80*6777b538SAndroid Build Coastguard Worker #error "No way to define ev_uint32_t" 81*6777b538SAndroid Build Coastguard Worker #endif 82*6777b538SAndroid Build Coastguard Worker 83*6777b538SAndroid Build Coastguard Worker #ifdef _EVENT_HAVE_UINT16_T 84*6777b538SAndroid Build Coastguard Worker #define ev_uint16_t uint16_t 85*6777b538SAndroid Build Coastguard Worker #elif defined(WIN32) 86*6777b538SAndroid Build Coastguard Worker #define ev_uint16_t unsigned short 87*6777b538SAndroid Build Coastguard Worker #elif _EVENT_SIZEOF_INT == 2 88*6777b538SAndroid Build Coastguard Worker #define ev_uint16_t unsigned int 89*6777b538SAndroid Build Coastguard Worker #elif _EVENT_SIZEOF_SHORT == 2 90*6777b538SAndroid Build Coastguard Worker #define ev_uint16_t unsigned short 91*6777b538SAndroid Build Coastguard Worker #else 92*6777b538SAndroid Build Coastguard Worker #error "No way to define ev_uint16_t" 93*6777b538SAndroid Build Coastguard Worker #endif 94*6777b538SAndroid Build Coastguard Worker 95*6777b538SAndroid Build Coastguard Worker #ifdef _EVENT_HAVE_UINT8_T 96*6777b538SAndroid Build Coastguard Worker #define ev_uint8_t uint8_t 97*6777b538SAndroid Build Coastguard Worker #else 98*6777b538SAndroid Build Coastguard Worker #define ev_uint8_t unsigned char 99*6777b538SAndroid Build Coastguard Worker #endif 100*6777b538SAndroid Build Coastguard Worker 101*6777b538SAndroid Build Coastguard Worker int evutil_socketpair(int d, int type, int protocol, int sv[2]); 102*6777b538SAndroid Build Coastguard Worker int evutil_make_socket_nonblocking(int sock); 103*6777b538SAndroid Build Coastguard Worker #ifdef WIN32 104*6777b538SAndroid Build Coastguard Worker #define EVUTIL_CLOSESOCKET(s) closesocket(s) 105*6777b538SAndroid Build Coastguard Worker #else 106*6777b538SAndroid Build Coastguard Worker #define EVUTIL_CLOSESOCKET(s) close(s) 107*6777b538SAndroid Build Coastguard Worker #endif 108*6777b538SAndroid Build Coastguard Worker 109*6777b538SAndroid Build Coastguard Worker #ifdef WIN32 110*6777b538SAndroid Build Coastguard Worker #define EVUTIL_SOCKET_ERROR() WSAGetLastError() 111*6777b538SAndroid Build Coastguard Worker #define EVUTIL_SET_SOCKET_ERROR(errcode) \ 112*6777b538SAndroid Build Coastguard Worker do { WSASetLastError(errcode); } while (0) 113*6777b538SAndroid Build Coastguard Worker #else 114*6777b538SAndroid Build Coastguard Worker #define EVUTIL_SOCKET_ERROR() (errno) 115*6777b538SAndroid Build Coastguard Worker #define EVUTIL_SET_SOCKET_ERROR(errcode) \ 116*6777b538SAndroid Build Coastguard Worker do { errno = (errcode); } while (0) 117*6777b538SAndroid Build Coastguard Worker #endif 118*6777b538SAndroid Build Coastguard Worker 119*6777b538SAndroid Build Coastguard Worker /* 120*6777b538SAndroid Build Coastguard Worker * Manipulation functions for struct timeval 121*6777b538SAndroid Build Coastguard Worker */ 122*6777b538SAndroid Build Coastguard Worker #ifdef _EVENT_HAVE_TIMERADD 123*6777b538SAndroid Build Coastguard Worker #define evutil_timeradd(tvp, uvp, vvp) timeradd((tvp), (uvp), (vvp)) 124*6777b538SAndroid Build Coastguard Worker #define evutil_timersub(tvp, uvp, vvp) timersub((tvp), (uvp), (vvp)) 125*6777b538SAndroid Build Coastguard Worker #else 126*6777b538SAndroid Build Coastguard Worker #define evutil_timeradd(tvp, uvp, vvp) \ 127*6777b538SAndroid Build Coastguard Worker do { \ 128*6777b538SAndroid Build Coastguard Worker (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \ 129*6777b538SAndroid Build Coastguard Worker (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \ 130*6777b538SAndroid Build Coastguard Worker if ((vvp)->tv_usec >= 1000000) { \ 131*6777b538SAndroid Build Coastguard Worker (vvp)->tv_sec++; \ 132*6777b538SAndroid Build Coastguard Worker (vvp)->tv_usec -= 1000000; \ 133*6777b538SAndroid Build Coastguard Worker } \ 134*6777b538SAndroid Build Coastguard Worker } while (0) 135*6777b538SAndroid Build Coastguard Worker #define evutil_timersub(tvp, uvp, vvp) \ 136*6777b538SAndroid Build Coastguard Worker do { \ 137*6777b538SAndroid Build Coastguard Worker (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ 138*6777b538SAndroid Build Coastguard Worker (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ 139*6777b538SAndroid Build Coastguard Worker if ((vvp)->tv_usec < 0) { \ 140*6777b538SAndroid Build Coastguard Worker (vvp)->tv_sec--; \ 141*6777b538SAndroid Build Coastguard Worker (vvp)->tv_usec += 1000000; \ 142*6777b538SAndroid Build Coastguard Worker } \ 143*6777b538SAndroid Build Coastguard Worker } while (0) 144*6777b538SAndroid Build Coastguard Worker #endif /* !_EVENT_HAVE_HAVE_TIMERADD */ 145*6777b538SAndroid Build Coastguard Worker 146*6777b538SAndroid Build Coastguard Worker #ifdef _EVENT_HAVE_TIMERCLEAR 147*6777b538SAndroid Build Coastguard Worker #define evutil_timerclear(tvp) timerclear(tvp) 148*6777b538SAndroid Build Coastguard Worker #else 149*6777b538SAndroid Build Coastguard Worker #define evutil_timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0 150*6777b538SAndroid Build Coastguard Worker #endif 151*6777b538SAndroid Build Coastguard Worker 152*6777b538SAndroid Build Coastguard Worker #define evutil_timercmp(tvp, uvp, cmp) \ 153*6777b538SAndroid Build Coastguard Worker (((tvp)->tv_sec == (uvp)->tv_sec) ? \ 154*6777b538SAndroid Build Coastguard Worker ((tvp)->tv_usec cmp (uvp)->tv_usec) : \ 155*6777b538SAndroid Build Coastguard Worker ((tvp)->tv_sec cmp (uvp)->tv_sec)) 156*6777b538SAndroid Build Coastguard Worker 157*6777b538SAndroid Build Coastguard Worker #ifdef _EVENT_HAVE_TIMERISSET 158*6777b538SAndroid Build Coastguard Worker #define evutil_timerisset(tvp) timerisset(tvp) 159*6777b538SAndroid Build Coastguard Worker #else 160*6777b538SAndroid Build Coastguard Worker #define evutil_timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec) 161*6777b538SAndroid Build Coastguard Worker #endif 162*6777b538SAndroid Build Coastguard Worker 163*6777b538SAndroid Build Coastguard Worker 164*6777b538SAndroid Build Coastguard Worker /* big-int related functions */ 165*6777b538SAndroid Build Coastguard Worker ev_int64_t evutil_strtoll(const char *s, char **endptr, int base); 166*6777b538SAndroid Build Coastguard Worker 167*6777b538SAndroid Build Coastguard Worker 168*6777b538SAndroid Build Coastguard Worker #ifdef _EVENT_HAVE_GETTIMEOFDAY 169*6777b538SAndroid Build Coastguard Worker #define evutil_gettimeofday(tv, tz) gettimeofday((tv), (tz)) 170*6777b538SAndroid Build Coastguard Worker #else 171*6777b538SAndroid Build Coastguard Worker struct timezone; 172*6777b538SAndroid Build Coastguard Worker int evutil_gettimeofday(struct timeval *tv, struct timezone *tz); 173*6777b538SAndroid Build Coastguard Worker #endif 174*6777b538SAndroid Build Coastguard Worker 175*6777b538SAndroid Build Coastguard Worker int evutil_snprintf(char *buf, size_t buflen, const char *format, ...) 176*6777b538SAndroid Build Coastguard Worker #ifdef __GNUC__ 177*6777b538SAndroid Build Coastguard Worker __attribute__((format(printf, 3, 4))) 178*6777b538SAndroid Build Coastguard Worker #endif 179*6777b538SAndroid Build Coastguard Worker ; 180*6777b538SAndroid Build Coastguard Worker int evutil_vsnprintf(char *buf, size_t buflen, const char *format, va_list ap); 181*6777b538SAndroid Build Coastguard Worker 182*6777b538SAndroid Build Coastguard Worker #ifdef __cplusplus 183*6777b538SAndroid Build Coastguard Worker } 184*6777b538SAndroid Build Coastguard Worker #endif 185*6777b538SAndroid Build Coastguard Worker 186*6777b538SAndroid Build Coastguard Worker #endif /* _EVUTIL_H_ */ 187