1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/*
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Copyright (c) 2007 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#ifndef _EVUTIL_H_
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define _EVUTIL_H_
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/** @file evutil.h
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Common convenience functions for cross-platform portability and
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  related socket manipulations.
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef __cplusplus
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottextern "C" {
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "event-config.h"
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef _EVENT_HAVE_SYS_TIME_H
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/time.h>
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef _EVENT_HAVE_STDINT_H
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <stdint.h>
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(_EVENT_HAVE_INTTYPES_H)
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <inttypes.h>
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef _EVENT_HAVE_SYS_TYPES_H
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/types.h>
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <stdarg.h>
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef _EVENT_HAVE_UINT64_T
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define ev_uint64_t uint64_t
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define ev_int64_t int64_t
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(WIN32)
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define ev_uint64_t unsigned __int64
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define ev_int64_t signed __int64
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif _EVENT_SIZEOF_LONG_LONG == 8
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define ev_uint64_t unsigned long long
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define ev_int64_t long long
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif _EVENT_SIZEOF_LONG == 8
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define ev_uint64_t unsigned long
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define ev_int64_t long
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#error "No way to define ev_uint64_t"
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef _EVENT_HAVE_UINT32_T
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define ev_uint32_t uint32_t
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(WIN32)
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define ev_uint32_t unsigned int
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif _EVENT_SIZEOF_LONG == 4
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define ev_uint32_t unsigned long
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif _EVENT_SIZEOF_INT == 4
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define ev_uint32_t unsigned int
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#error "No way to define ev_uint32_t"
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef _EVENT_HAVE_UINT16_T
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define ev_uint16_t uint16_t
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(WIN32)
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define ev_uint16_t unsigned short
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif _EVENT_SIZEOF_INT == 2
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define ev_uint16_t unsigned int
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif _EVENT_SIZEOF_SHORT == 2
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define ev_uint16_t unsigned short
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#error "No way to define ev_uint16_t"
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef _EVENT_HAVE_UINT8_T
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define ev_uint8_t uint8_t
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define ev_uint8_t unsigned char
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evutil_socketpair(int d, int type, int protocol, int sv[2]);
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evutil_make_socket_nonblocking(int sock);
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef WIN32
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVUTIL_CLOSESOCKET(s) closesocket(s)
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVUTIL_CLOSESOCKET(s) close(s)
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef WIN32
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVUTIL_SOCKET_ERROR() WSAGetLastError()
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVUTIL_SET_SOCKET_ERROR(errcode)		\
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	do { WSASetLastError(errcode); } while (0)
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVUTIL_SOCKET_ERROR() (errno)
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVUTIL_SET_SOCKET_ERROR(errcode)		\
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott		do { errno = (errcode); } while (0)
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/*
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Manipulation functions for struct timeval
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef _EVENT_HAVE_TIMERADD
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define evutil_timeradd(tvp, uvp, vvp) timeradd((tvp), (uvp), (vvp))
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define evutil_timersub(tvp, uvp, vvp) timersub((tvp), (uvp), (vvp))
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define evutil_timeradd(tvp, uvp, vvp)							\
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	do {														\
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott		(vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec;			\
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott		(vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec;       \
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott		if ((vvp)->tv_usec >= 1000000) {						\
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott			(vvp)->tv_sec++;									\
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott			(vvp)->tv_usec -= 1000000;							\
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott		}														\
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	} while (0)
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define	evutil_timersub(tvp, uvp, vvp)						\
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	do {													\
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott		(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec;		\
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott		(vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec;	\
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott		if ((vvp)->tv_usec < 0) {							\
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott			(vvp)->tv_sec--;								\
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott			(vvp)->tv_usec += 1000000;						\
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott		}													\
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	} while (0)
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /* !_EVENT_HAVE_HAVE_TIMERADD */
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef _EVENT_HAVE_TIMERCLEAR
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define evutil_timerclear(tvp) timerclear(tvp)
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define	evutil_timerclear(tvp)	(tvp)->tv_sec = (tvp)->tv_usec = 0
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define	evutil_timercmp(tvp, uvp, cmp)							\
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	(((tvp)->tv_sec == (uvp)->tv_sec) ?							\
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	 ((tvp)->tv_usec cmp (uvp)->tv_usec) :						\
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	 ((tvp)->tv_sec cmp (uvp)->tv_sec))
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef _EVENT_HAVE_TIMERISSET
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define evutil_timerisset(tvp) timerisset(tvp)
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define	evutil_timerisset(tvp)	((tvp)->tv_sec || (tvp)->tv_usec)
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* big-int related functions */
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottev_int64_t evutil_strtoll(const char *s, char **endptr, int base);
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef _EVENT_HAVE_GETTIMEOFDAY
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define evutil_gettimeofday(tv, tz) gettimeofday((tv), (tz))
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct timezone;
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evutil_gettimeofday(struct timeval *tv, struct timezone *tz);
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evutil_snprintf(char *buf, size_t buflen, const char *format, ...)
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef __GNUC__
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	__attribute__((format(printf, 3, 4)))
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	;
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evutil_vsnprintf(char *buf, size_t buflen, const char *format, va_list ap);
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef __cplusplus
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /* _EVUTIL_H_ */
187