From: Nick Mathewson Date: Mon, 18 Feb 2008 20:04:01 +0000 (+0000) Subject: r18145@catbus: nickm | 2008-02-18 15:02:20 -0500 X-Git-Tag: release-2.0.1-alpha~421 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=11230f7e1620c663842e9993ac3cdaa29afec7c2;p=libevent r18145@catbus: nickm | 2008-02-18 15:02:20 -0500 Stop using deprecated autoconf code to set integer types; detect actual files to include more thoroughly. This should make us work on solaris 9 again. This should be a backport candidate, if it works. Also, make all libevent code use ev_uint32_t etc, rather than uint_32_t. svn:r649 --- diff --git a/ChangeLog b/ChangeLog index a1d28e57..33fde3f7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -43,8 +43,9 @@ Changes in current version: o Use a 64-bit field to hold HTTP content-lengths. Patch from Scott Lamb. o Allow regression code to build even without Python installed o remove NDEBUG ifdefs from evdns.c + o detect integer types properly on platforms without stdint.h - + Changes in 1.4.0: o allow \r or \n individually to separate HTTP headers instead of the standard "\r\n"; from Charles Kerr. o demote most http warnings to debug messages diff --git a/configure.in b/configure.in index 38fadde9..b392b79c 100644 --- a/configure.in +++ b/configure.in @@ -297,10 +297,22 @@ fi AC_TYPE_PID_T AC_TYPE_SIZE_T -AC_CHECK_TYPE(uint64_t, unsigned long long) -AC_CHECK_TYPE(uint32_t, unsigned int) -AC_CHECK_TYPE(uint16_t, unsigned short) -AC_CHECK_TYPE(uint8_t, unsigned char) + +AC_CHECK_TYPES([uint64_t, uint32_t, uint16_t, uint8_t], , , +[#ifdef HAVE_STDINT_H +#include +#elif defined(HAVE_INTTYPES_H) +#include +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif]) + +AC_CHECK_SIZEOF(long long) +AC_CHECK_SIZEOF(long) +AC_CHECK_SIZEOF(int) +AC_CHECK_SIZEOF(short) + AC_CHECK_TYPES([struct in6_addr], , , [#ifdef WIN32 #include diff --git a/evdns.c b/evdns.c index 002190f4..4ae78353 100644 --- a/evdns.c +++ b/evdns.c @@ -134,7 +134,7 @@ #ifdef __USE_ISOC99B /* libevent doesn't work without this */ -typedef uint8_t u_char; +typedef ev_uint8_t u_char; typedef unsigned int uint; #endif #include @@ -364,7 +364,7 @@ error_is_eagain(int err) static int inet_aton(const char *c, struct in_addr *addr) { - uint32_t r; + ev_uint32_t r; if (strcmp(c, "255.255.255.255") == 0) { addr->s_addr = 0xffffffffu; } else { @@ -1069,10 +1069,10 @@ default_transaction_id_fn(void) return trans_id; } -static uint16_t (*trans_id_function)(void) = default_transaction_id_fn; +static ev_uint16_t (*trans_id_function)(void) = default_transaction_id_fn; void -evdns_set_transaction_id_fn(uint16_t (*fn)(void)) +evdns_set_transaction_id_fn(ev_uint16_t (*fn)(void)) { if (fn) trans_id_function = fn; diff --git a/event_rpcgen.py b/event_rpcgen.py index bb6986d5..1317a40c 100755 --- a/event_rpcgen.py +++ b/event_rpcgen.py @@ -90,7 +90,7 @@ class Struct: self.PrintIndented(file, ' ', dcl) print >>file, '' for entry in self._entries: - print >>file, ' uint8_t %s_set;' % entry.Name() + print >>file, ' ev_uint8_t %s_set;' % entry.Name() print >>file, '};\n' print >>file, \ @@ -100,9 +100,9 @@ void %(name)s_clear(struct %(name)s *); void %(name)s_marshal(struct evbuffer *, const struct %(name)s *); int %(name)s_unmarshal(struct %(name)s *, struct evbuffer *); int %(name)s_complete(struct %(name)s *); -void evtag_marshal_%(name)s(struct evbuffer *, uint32_t, +void evtag_marshal_%(name)s(struct evbuffer *, ev_uint32_t, const struct %(name)s *); -int evtag_unmarshal_%(name)s(struct evbuffer *, uint32_t, +int evtag_unmarshal_%(name)s(struct evbuffer *, ev_uint32_t, struct %(name)s *);""" % { 'name' : self._name } @@ -214,7 +214,7 @@ int evtag_unmarshal_%(name)s(struct evbuffer *, uint32_t, '%(name)s_unmarshal(struct %(name)s *tmp, ' ' struct evbuffer *evbuf)\n' '{\n' - ' uint32_t tag;\n' + ' ev_uint32_t tag;\n' ' while (EVBUFFER_LENGTH(evbuf) > 0) {\n' ' if (evtag_peek(evbuf, &tag) == -1)\n' ' return (-1);\n' @@ -275,9 +275,9 @@ int evtag_unmarshal_%(name)s(struct evbuffer *, uint32_t, print >>file, ( 'int\n' 'evtag_unmarshal_%(name)s(struct evbuffer *evbuf, ' - 'uint32_t need_tag, struct %(name)s *msg)\n' + 'ev_uint32_t need_tag, struct %(name)s *msg)\n' '{\n' - ' uint32_t tag;\n' + ' ev_uint32_t tag;\n' ' int res = -1;\n' '\n' ' struct evbuffer *tmp = evbuffer_new();\n' @@ -299,7 +299,7 @@ int evtag_unmarshal_%(name)s(struct evbuffer *, uint32_t, # Complete message marshaling print >>file, ( 'void\n' - 'evtag_marshal_%(name)s(struct evbuffer *evbuf, uint32_t tag, ' + 'evtag_marshal_%(name)s(struct evbuffer *evbuf, ev_uint32_t tag, ' 'const struct %(name)s *msg)\n' '{\n' ' struct evbuffer *_buf = evbuffer_new();\n' @@ -476,7 +476,7 @@ class EntryBytes(Entry): Entry.__init__(self, type, name, tag) self._length = length - self._ctype = 'uint8_t' + self._ctype = 'ev_uint8_t' def GetInitializer(self): return "NULL" @@ -499,7 +499,7 @@ class EntryBytes(Entry): return code def Declaration(self): - dcl = ['uint8_t %s_data[%s];' % (self._name, self._length)] + dcl = ['ev_uint8_t %s_data[%s];' % (self._name, self._length)] return dcl @@ -576,7 +576,7 @@ class EntryInt(Entry): Entry.__init__(self, type, name, tag) self._can_be_array = 1 - self._ctype = 'uint32_t' + self._ctype = 'ev_uint32_t' def GetInitializer(self): return "0" @@ -610,7 +610,7 @@ class EntryInt(Entry): return code def Declaration(self): - dcl = ['uint32_t %s_data;' % self._name] + dcl = ['ev_uint32_t %s_data;' % self._name] return dcl @@ -904,7 +904,7 @@ class EntryVarBytes(Entry): # Init base class Entry.__init__(self, type, name, tag) - self._ctype = 'uint8_t *' + self._ctype = 'ev_uint8_t *' def GetInitializer(self): return "NULL" @@ -917,12 +917,12 @@ class EntryVarBytes(Entry): return [ '%(varname)s = NULL;' % { 'varname' : varname } ] def GetDeclaration(self, funcname): - code = [ 'int %s(struct %s *, %s *, uint32_t *);' % ( + code = [ 'int %s(struct %s *, %s *, ev_uint32_t *);' % ( funcname, self._struct.Name(), self._ctype ) ] return code def AssignDeclaration(self, funcname): - code = [ 'int %s(struct %s *, const %s, uint32_t);' % ( + code = [ 'int %s(struct %s *, const %s, ev_uint32_t);' % ( funcname, self._struct.Name(), self._ctype ) ] return code @@ -930,7 +930,7 @@ class EntryVarBytes(Entry): name = self._name code = [ 'int', '%s_%s_assign(struct %s *msg, ' - 'const %s value, uint32_t len)' % ( + 'const %s value, ev_uint32_t len)' % ( self._struct.Name(), name, self._struct.Name(), self._ctype), '{', @@ -949,7 +949,7 @@ class EntryVarBytes(Entry): def CodeGet(self): name = self._name code = [ 'int', - '%s_%s_get(struct %s *msg, %s *value, uint32_t *plen)' % ( + '%s_%s_get(struct %s *msg, %s *value, ev_uint32_t *plen)' % ( self._struct.Name(), name, self._struct.Name(), self._ctype), '{', @@ -1010,8 +1010,8 @@ class EntryVarBytes(Entry): return code def Declaration(self): - dcl = ['uint8_t *%s_data;' % self._name, - 'uint32_t %s_length;' % self._name] + dcl = ['ev_uint8_t *%s_data;' % self._name, + 'ev_uint32_t %s_length;' % self._name] return dcl diff --git a/event_tagging.c b/event_tagging.c index 4f4937c6..eec4bf8a 100644 --- a/event_tagging.c +++ b/event_tagging.c @@ -65,9 +65,9 @@ #include "log.h" #include "mm-internal.h" -int evtag_decode_int(uint32_t *pnumber, struct evbuffer *evbuf); -int evtag_encode_tag(struct evbuffer *evbuf, uint32_t tag); -int evtag_decode_tag(uint32_t *ptag, struct evbuffer *evbuf); +int evtag_decode_int(ev_uint32_t *pnumber, struct evbuffer *evbuf); +int evtag_encode_tag(struct evbuffer *evbuf, ev_uint32_t tag); +int evtag_decode_tag(ev_uint32_t *ptag, struct evbuffer *evbuf); static struct evbuffer *_buf; /* not thread safe */ @@ -88,10 +88,10 @@ evtag_init(void) */ void -encode_int(struct evbuffer *evbuf, uint32_t number) +encode_int(struct evbuffer *evbuf, ev_uint32_t number) { int off = 1, nibbles = 0; - uint8_t data[5]; + ev_uint8_t data[5]; memset(data, 0, sizeof(data)); while (number) { @@ -119,14 +119,14 @@ encode_int(struct evbuffer *evbuf, uint32_t number) */ int -evtag_encode_tag(struct evbuffer *evbuf, uint32_t tag) +evtag_encode_tag(struct evbuffer *evbuf, ev_uint32_t tag) { int bytes = 0; - uint8_t data[5]; + ev_uint8_t data[5]; memset(data, 0, sizeof(data)); do { - uint8_t lower = tag & 0x7f; + ev_uint8_t lower = tag & 0x7f; tag >>= 7; if (tag) @@ -142,15 +142,15 @@ evtag_encode_tag(struct evbuffer *evbuf, uint32_t tag) } static int -decode_tag_internal(uint32_t *ptag, struct evbuffer *evbuf, int dodrain) +decode_tag_internal(ev_uint32_t *ptag, struct evbuffer *evbuf, int dodrain) { - uint32_t number = 0; - uint8_t *data = EVBUFFER_DATA(evbuf); + ev_uint32_t number = 0; + ev_uint8_t *data = EVBUFFER_DATA(evbuf); int len = EVBUFFER_LENGTH(evbuf); int count = 0, shift = 0, done = 0; while (count++ < len) { - uint8_t lower = *data++; + ev_uint8_t lower = *data++; number |= (lower & 0x7f) << shift; shift += 7; @@ -173,7 +173,7 @@ decode_tag_internal(uint32_t *ptag, struct evbuffer *evbuf, int dodrain) } int -evtag_decode_tag(uint32_t *ptag, struct evbuffer *evbuf) +evtag_decode_tag(ev_uint32_t *ptag, struct evbuffer *evbuf) { return (decode_tag_internal(ptag, evbuf, 1 /* dodrain */)); } @@ -185,8 +185,8 @@ evtag_decode_tag(uint32_t *ptag, struct evbuffer *evbuf) */ void -evtag_marshal(struct evbuffer *evbuf, uint32_t tag, - const void *data, uint32_t len) +evtag_marshal(struct evbuffer *evbuf, ev_uint32_t tag, + const void *data, ev_uint32_t len) { evtag_encode_tag(evbuf, tag); encode_int(evbuf, len); @@ -195,7 +195,7 @@ evtag_marshal(struct evbuffer *evbuf, uint32_t tag, /* Marshaling for integers */ void -evtag_marshal_int(struct evbuffer *evbuf, uint32_t tag, uint32_t integer) +evtag_marshal_int(struct evbuffer *evbuf, ev_uint32_t tag, ev_uint32_t integer) { evbuffer_drain(_buf, EVBUFFER_LENGTH(_buf)); encode_int(_buf, integer); @@ -206,13 +206,13 @@ evtag_marshal_int(struct evbuffer *evbuf, uint32_t tag, uint32_t integer) } void -evtag_marshal_string(struct evbuffer *buf, uint32_t tag, const char *string) +evtag_marshal_string(struct evbuffer *buf, ev_uint32_t tag, const char *string) { evtag_marshal(buf, tag, string, strlen(string)); } void -evtag_marshal_timeval(struct evbuffer *evbuf, uint32_t tag, struct timeval *tv) +evtag_marshal_timeval(struct evbuffer *evbuf, ev_uint32_t tag, struct timeval *tv) { evbuffer_drain(_buf, EVBUFFER_LENGTH(_buf)); @@ -224,10 +224,10 @@ evtag_marshal_timeval(struct evbuffer *evbuf, uint32_t tag, struct timeval *tv) } static int -decode_int_internal(uint32_t *pnumber, struct evbuffer *evbuf, int dodrain) +decode_int_internal(ev_uint32_t *pnumber, struct evbuffer *evbuf, int dodrain) { - uint32_t number = 0; - uint8_t *data = EVBUFFER_DATA(evbuf); + ev_uint32_t number = 0; + ev_uint8_t *data = EVBUFFER_DATA(evbuf); int len = EVBUFFER_LENGTH(evbuf); int nibbles = 0; @@ -257,19 +257,19 @@ decode_int_internal(uint32_t *pnumber, struct evbuffer *evbuf, int dodrain) } int -evtag_decode_int(uint32_t *pnumber, struct evbuffer *evbuf) +evtag_decode_int(ev_uint32_t *pnumber, struct evbuffer *evbuf) { return (decode_int_internal(pnumber, evbuf, 1) == -1 ? -1 : 0); } int -evtag_peek(struct evbuffer *evbuf, uint32_t *ptag) +evtag_peek(struct evbuffer *evbuf, ev_uint32_t *ptag) { return (decode_tag_internal(ptag, evbuf, 0 /* dodrain */)); } int -evtag_peek_length(struct evbuffer *evbuf, uint32_t *plength) +evtag_peek_length(struct evbuffer *evbuf, ev_uint32_t *plength) { struct evbuffer tmp; int res, len; @@ -292,7 +292,7 @@ evtag_peek_length(struct evbuffer *evbuf, uint32_t *plength) } int -evtag_payload_length(struct evbuffer *evbuf, uint32_t *plength) +evtag_payload_length(struct evbuffer *evbuf, ev_uint32_t *plength) { struct evbuffer tmp; int res, len; @@ -315,7 +315,7 @@ evtag_payload_length(struct evbuffer *evbuf, uint32_t *plength) int evtag_consume(struct evbuffer *evbuf) { - uint32_t len; + ev_uint32_t len; if (decode_tag_internal(NULL, evbuf, 1 /* dodrain */) == -1) return (-1); if (evtag_decode_int(&len, evbuf) == -1) @@ -328,10 +328,10 @@ evtag_consume(struct evbuffer *evbuf) /* Reads the data type from an event buffer */ int -evtag_unmarshal(struct evbuffer *src, uint32_t *ptag, struct evbuffer *dst) +evtag_unmarshal(struct evbuffer *src, ev_uint32_t *ptag, struct evbuffer *dst) { - uint32_t len; - uint32_t integer; + ev_uint32_t len; + ev_uint32_t integer; if (decode_tag_internal(ptag, src, 1 /* dodrain */) == -1) return (-1); @@ -353,12 +353,12 @@ evtag_unmarshal(struct evbuffer *src, uint32_t *ptag, struct evbuffer *dst) /* Marshaling for integers */ int -evtag_unmarshal_int(struct evbuffer *evbuf, uint32_t need_tag, - uint32_t *pinteger) +evtag_unmarshal_int(struct evbuffer *evbuf, ev_uint32_t need_tag, + ev_uint32_t *pinteger) { - uint32_t tag; - uint32_t len; - uint32_t integer; + ev_uint32_t tag; + ev_uint32_t len; + ev_uint32_t integer; if (decode_tag_internal(&tag, evbuf, 1 /* dodrain */) == -1) return (-1); @@ -383,10 +383,10 @@ evtag_unmarshal_int(struct evbuffer *evbuf, uint32_t need_tag, /* Unmarshal a fixed length tag */ int -evtag_unmarshal_fixed(struct evbuffer *src, uint32_t need_tag, void *data, +evtag_unmarshal_fixed(struct evbuffer *src, ev_uint32_t need_tag, void *data, size_t len) { - uint32_t tag; + ev_uint32_t tag; /* Initialize this event buffer so that we can read into it */ evbuffer_drain(_buf, EVBUFFER_LENGTH(_buf)); @@ -403,10 +403,10 @@ evtag_unmarshal_fixed(struct evbuffer *src, uint32_t need_tag, void *data, } int -evtag_unmarshal_string(struct evbuffer *evbuf, uint32_t need_tag, +evtag_unmarshal_string(struct evbuffer *evbuf, ev_uint32_t need_tag, char **pstring) { - uint32_t tag; + ev_uint32_t tag; evbuffer_drain(_buf, EVBUFFER_LENGTH(_buf)); @@ -422,11 +422,11 @@ evtag_unmarshal_string(struct evbuffer *evbuf, uint32_t need_tag, } int -evtag_unmarshal_timeval(struct evbuffer *evbuf, uint32_t need_tag, +evtag_unmarshal_timeval(struct evbuffer *evbuf, ev_uint32_t need_tag, struct timeval *ptv) { - uint32_t tag; - uint32_t integer; + ev_uint32_t tag; + ev_uint32_t integer; evbuffer_drain(_buf, EVBUFFER_LENGTH(_buf)); if (evtag_unmarshal(evbuf, &tag, _buf) == -1 || tag != need_tag) diff --git a/evutil.h b/evutil.h index 788e4e92..32791ec2 100644 --- a/evutil.h +++ b/evutil.h @@ -42,28 +42,65 @@ extern "C" { #ifdef _EVENT_HAVE_SYS_TIME_H #include #endif - #ifdef _EVENT_HAVE_STDINT_H #include -#define ev_uint64_t uint64_t -#define ev_uint32_t uint32_t -#define ev_uint16_t uint16_t -#define ev_uint8_t uint8_t +#elif defined(_EVENT_HAVE_INTTYPES_H) +#include +#endif +#ifdef _EVENT_HAVE_SYS_TYPES_H +#include +#endif + +#ifdef _EVENT_HAVE_UINT64_T +#define ev_uint64_t uint64_t #define ev_int64_t int64_t #define ev_int32_t int32_t #define ev_int16_t int16_t #define ev_int8_t int8_t #elif defined(WIN32) -#define ev_uint64_t __uint64_t -#define ev_uint32_t unsigned int -#define ev_uint16_t unsigned short -#define ev_uint8_t unsigned char +#define ev_uint64_t __uint64_t +#elif _EVENT_SIZEOF_LONG_LONG == 8 +#define ev_uint64_t unsigned long long +#elif _EVENT_SIZEOF_LONG == 8 +#define ev_uint64_t unsigned long +#else +#error "No way to define ev_uint64_t" #define ev_int64_t __int64_t #define ev_int32_t signed int #define ev_int16_t signed short #define ev_int8_t signed char #endif +#ifdef _EVENT_HAVE_UINT32_T +#define ev_uint32_t uint32_t +#elif defined(WIN32) +#define ev_uint32_t unsigned int +#elif _EVENT_SIZEOF_LONG == 4 +#define ev_uint32_t unsigned long +#elif _EVENT_SIZEOF_INT == 4 +#define ev_uint32_t unsigned int +#else +#error "No way to define ev_uint32_t" +#endif + +#ifdef _EVENT_HAVE_UINT16_T +#define ev_uint16_t uint16_t +#elif defined(WIN32) +#define ev_uint16_t unsigned short +#elif _EVENT_SIZEOF_INT == 2 +#define ev_uint16_t unsigned int +#elif _EVENT_SIZEOF_SHORT == 2 +#define ev_uint16_t unsigned short +#else +#error "No way to define ev_uint16_t" +#endif + +#ifdef _EVENT_HAVE_UINT16_T +#define ev_uint8_t uint8_t +#else +#define ev_uint8_t unsigned char +#endif + #ifdef WIN32 /** Type to hold the output of "socket()" or "accept()". On Windows, this is * an intptr_t; elsewhere, it is an int. */ diff --git a/test/regress.c b/test/regress.c index f9fabd74..9af5c4c4 100644 --- a/test/regress.c +++ b/test/regress.c @@ -1234,9 +1234,9 @@ test_multiple_events_for_same_fd(void) cleanup_test(); } -int evtag_decode_int(uint32_t *pnumber, struct evbuffer *evbuf); -int evtag_encode_tag(struct evbuffer *evbuf, uint32_t number); -int evtag_decode_tag(uint32_t *pnumber, struct evbuffer *evbuf); +int evtag_decode_int(ev_uint32_t *pnumber, struct evbuffer *evbuf); +int evtag_encode_tag(struct evbuffer *evbuf, ev_uint32_t number); +int evtag_decode_tag(ev_uint32_t *pnumber, struct evbuffer *evbuf); static void read_once_cb(int fd, short event, void *arg) @@ -1287,10 +1287,10 @@ static void evtag_int_test(void) { struct evbuffer *tmp = evbuffer_new(); - uint32_t integers[TEST_MAX_INT] = { + ev_uint32_t integers[TEST_MAX_INT] = { 0xaf0, 0x1000, 0x1, 0xdeadbeef, 0x00, 0xbef000 }; - uint32_t integer; + ev_uint32_t integer; int i; for (i = 0; i < TEST_MAX_INT; i++) { @@ -1370,10 +1370,10 @@ static void evtag_tag_encoding(void) { struct evbuffer *tmp = evbuffer_new(); - uint32_t integers[TEST_MAX_INT] = { + ev_uint32_t integers[TEST_MAX_INT] = { 0xaf0, 0x1000, 0x1, 0xdeadbeef, 0x00, 0xbef000 }; - uint32_t integer; + ev_uint32_t integer; int i; for (i = 0; i < TEST_MAX_INT; i++) { @@ -1428,7 +1428,7 @@ rpc_test(void) struct run *run; struct evbuffer *tmp = evbuffer_new(); struct timeval tv_start, tv_end; - uint32_t tag; + ev_uint32_t tag; int i; fprintf(stdout, "Testing RPC: "); @@ -1460,7 +1460,7 @@ rpc_test(void) } EVTAG_ASSIGN(run, how, "very fast but with some data in it"); EVTAG_ASSIGN(run, fixed_bytes, - (uint8_t*)"012345678901234567890123"); + (ev_uint8_t*)"012345678901234567890123"); if (EVTAG_ADD(run, notes, "this is my note") == NULL) { fprintf(stderr, "Failed to add note.\n"); @@ -1550,7 +1550,7 @@ rpc_test(void) } for (i = 0; i < 3; ++i) { - uint32_t res; + ev_uint32_t res; if (EVTAG_GET(attack, how_often, i, &res) == -1) { fprintf(stderr, "Cannot get %dth how_often msg.\n", i); exit(1);