From 85a8da77f262895c1e3f74930391a7584a0631d4 Mon Sep 17 00:00:00 2001 From: Marcelo Roberto Jimenez Date: Tue, 17 Apr 2007 04:06:11 +0000 Subject: [PATCH] Merge of trunk into branch-1.4.x. git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@156 119443c7-1b9e-41f8-b6fc-b9c35fce742c --- ChangeLog | 65 +++++++++++++++++++++++- THANKS | 2 + configure.ac | 2 +- threadutil/inc/ithread.h | 23 ++++++++- threadutil/src/ThreadPool.c | 5 ++ upnp/src/api/upnpapi.c | 5 ++ upnp/src/genlib/net/http/httpreadwrite.c | 28 +++++----- upnp/src/genlib/net/http/webserver.c | 15 +++--- upnp/src/genlib/net/uri/uri.c | 10 ++-- upnp/src/inc/http_client.h | 2 +- upnp/src/inc/membuffer.h | 21 +++----- upnp/src/inc/uri.h | 10 ++-- upnp/src/inc/util.h | 2 +- 13 files changed, 141 insertions(+), 49 deletions(-) diff --git a/ChangeLog b/ChangeLog index ae4652e..92722b4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,16 +1,77 @@ +************************************************************************* +Version 1.4.4 +************************************************************************* + +2007-04-06 Marcelo Jimenez + * SF Tracker [ 1695399 ] Typo in util.h + Submitted By: Luke Kim - nereusuj + Unix sleep is in seconds but WIN32 Sleep is in milliseconds. + +2007-04-17 Marcelo Jimenez + * SF Tracker [ 1652827 ] UpnpRegisterRootDevice returned -104 + Submitted By: Michael Andersen - miwer + + Issue was found to be related to sizeof (size_t) != sizeof (int) + on AMD64 systems. Emil Ljungdahl's AMD64 patch has been applied along + with some other fixes. Original user report follows: + + When I run upnpd I get the above mentioned error (UPNP_E_OUTOF_MEMORY). + I've tried with 1.4.1 and 1.4.2-RC3, it's the same. I don't understand why, + because I have plenty of RAM, and I even tried closing some applications, + but it didn't help. + + $ upnpd eth1 br0 + + The following is logged in the /var/log/messages: + Feb 6 01:33:47 server upnpd[6933]: Error registering the root device with + descDocUrl: http://192.168.0.1:49152/gatedesc.xml + Feb 6 01:33:47 server upnpd[6933]: UpnpRegisterRootDevice returned -104 + + + I tried enabling debugging and it looks like it cannot allocate memory + through the membuffer_append function. It's wierd because it's only a few + bytes. + + Please note, that I enabled some extra debugging lines that were commented, + in order to get more information. See attached files. ************************************************************************* Version 1.4.3 ************************************************************************* +2007-03-13 Marcelo Jimenez + * SF Tracker [ 1663004 ] Compile on Cygwin + Submitted By: Jon Foster - jongfoster + This patch gives basic support for building under Cygwin - it compiles, + links, and a simple UPnP device application can initialise. I'm not sure + if it actually works yet, but this is definitely a step in the right + direction. + + Patch is against the 1.4.1 release. Changes are: + + * threadutil/inc/ithread.h: Fix the ithread mutex support to use + documented, portable APIs (if present) rather than the Non-Portable (_NP) + ones it uses now. This is required because Cygwin implements only the + portable API. + + * threadutil/src/ThreadPool.c: Fake SetPolicyType() to do nothing on Cygwin + because otherwise it fails. Should probably investigate why it fails and + add a proper implementation later. + + * upnp/src/api/upnpapi.c: On Cygwin, zero out the GlobalHndMutex structure + before initialising it. Without this, the initialisation fails. This + appears to be a bug in Cygwin. + + * upnp/src/genlib/net/uri/uri.c: Use gethostbyname() on Cygwin. + 2007-03-05 Oxy * Code adapted and typedefs added to compile cleanly under Windows with Borland C++ Builder and MS Visual C++ 2007-03-03 Marcelo Jimenez - + * Fixed nasty segmentation fault bug on membuffer.c. - + ************************************************************************* Version 1.4.2 ************************************************************************* diff --git a/THANKS b/THANKS index 9ced75c..0f789a1 100644 --- a/THANKS +++ b/THANKS @@ -9,6 +9,7 @@ exempt of errors. - Arno Willig - Chaos - David Maass +- Emil Ljungdahl - Erik Johansson - Eric Tanguy - Erwan Velu @@ -18,6 +19,7 @@ exempt of errors. - Jonathan (no_dice) - Leuk_He - Loigu +- Luke Kim - Marcelo Roberto Jimenez - Markus Strobl - Nektarios K. Papadopoulos diff --git a/configure.ac b/configure.ac index 99d2119..fe8fe0b 100644 --- a/configure.ac +++ b/configure.ac @@ -10,7 +10,7 @@ AC_PREREQ(2.60) -AC_INIT([libupnp], [1.4.3], [mroberto@users.sourceforge.net]) +AC_INIT([libupnp], [1.4.4], [mroberto@users.sourceforge.net]) # *Independently* of the above libupnp package version, the libtool version # of the 3 libraries need to be updated whenever there is a change released : # "current:revision:age" (this is NOT the same as the package version), where: diff --git a/threadutil/inc/ithread.h b/threadutil/inc/ithread.h index 49dfb43..7b6f53a 100644 --- a/threadutil/inc/ithread.h +++ b/threadutil/inc/ithread.h @@ -47,11 +47,21 @@ extern "C" { #include #endif +#ifdef PTHREAD_MUTEX_RECURSIVE +/* This system has SuS2-compliant mutex attributes. + * E.g. on Cygwin, where we don't have the old nonportable (NP) symbols + */ +#define ITHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_NORMAL +#define ITHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE +#define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK +#else #define ITHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_FAST_NP #define ITHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE_NP #define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK_NP +#endif + #define ITHREAD_CANCELED PTHREAD_CANCELED - + /*************************************************************************** * Name: ithread_t @@ -181,8 +191,11 @@ extern "C" { * Returns EINVAL if the kind is not supported. * See man page for pthread_mutexattr_setkind_np *****************************************************************************/ +#ifdef PTHREAD_MUTEX_RECURSIVE +#define ithread_mutexattr_setkind_np pthread_mutexattr_settype +#else #define ithread_mutexattr_setkind_np pthread_mutexattr_setkind_np - +#endif /**************************************************************************** * Function: ithread_mutexattr_getkind_np @@ -203,7 +216,11 @@ extern "C" { * Always returns 0. * See man page for pthread_mutexattr_getkind_np *****************************************************************************/ +#ifdef PTHREAD_MUTEX_RECURSIVE +#define ithread_mutexattr_getkind_np pthread_mutexattr_gettype +#else #define ithread_mutexattr_getkind_np pthread_mutexattr_getkind_np +#endif /**************************************************************************** @@ -542,8 +559,10 @@ extern "C" { #endif +#ifndef PTHREAD_MUTEX_RECURSIVE //NK: Added for satisfying the gcc compiler EXPORT_SPEC int pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, int kind); +#endif #ifdef __cplusplus } diff --git a/threadutil/src/ThreadPool.c b/threadutil/src/ThreadPool.c index 4bbde2c..d8e737c 100644 --- a/threadutil/src/ThreadPool.c +++ b/threadutil/src/ThreadPool.c @@ -90,6 +90,10 @@ FreeThreadPoolJob( ThreadPool * tp, static int SetPolicyType( PolicyType in ) { + #ifdef __CYGWIN__ + /* TODO not currently working... */ + return 0; + #else #ifdef WIN32 return sched_setscheduler( 0, in); #else @@ -99,6 +103,7 @@ SetPolicyType( PolicyType in ) current.sched_priority = DEFAULT_SCHED_PARAM; return sched_setscheduler( 0, in, ¤t ); #endif + #endif } /**************************************************************************** diff --git a/upnp/src/api/upnpapi.c b/upnp/src/api/upnpapi.c index d447bed..6c20928 100644 --- a/upnp/src/api/upnpapi.c +++ b/upnp/src/api/upnpapi.c @@ -207,6 +207,11 @@ int UpnpInit( IN const char *HostIP, ( UPNP_INFO, API, __FILE__, __LINE__, "Inside UpnpInit \n" ); ) //initialize mutex +#ifdef __CYGWIN__ + /* On Cygwin, pthread_mutex_init() fails without this memset. */ + /* TODO: Fix Cygwin so we don't need this memset(). */ + memset(&GlobalHndMutex, 0, sizeof(GlobalHndMutex)); +#endif if( ithread_mutex_init( &GlobalHndMutex, NULL ) != 0 ) { return UPNP_E_INIT_FAILED; } diff --git a/upnp/src/genlib/net/http/httpreadwrite.c b/upnp/src/genlib/net/http/httpreadwrite.c index 1b81b5b..c5f82f2 100644 --- a/upnp/src/genlib/net/http/httpreadwrite.c +++ b/upnp/src/genlib/net/http/httpreadwrite.c @@ -41,12 +41,14 @@ #include #ifndef UPNP_USE_BCBPP #ifndef UPNP_USE_MSVCPP + #include #include #endif #endif #ifndef WIN32 #include + #include #include #include #include @@ -54,7 +56,6 @@ #include #include #include - #include #else #include #include @@ -801,27 +802,30 @@ MakePostMessage( const char *url_str, "HOSTNAME : %s Length : %d\n", hoststr, hostlen ); ) - if( contentLength >= 0 ) { + if( contentLength >= 0 ) { ret_code = http_MakeMessage( request, 1, 1, - "QsbcDCUTNc", + "Q" "s" "bcDCU" "T" "Nc", HTTPMETHOD_POST, url->pathquery.buff, url->pathquery.size, - "HOST: ", hoststr, hostlen, + "HOST: ", + hoststr, hostlen, contentType, (off_t)contentLength ); } else if( contentLength == UPNP_USING_CHUNKED ) { ret_code = http_MakeMessage( request, 1, 1, - "QsbcDCUTKc", + "Q" "s" "bcDCU" "TKc", HTTPMETHOD_POST, url->pathquery.buff, url->pathquery.size, - "HOST: ", hoststr, hostlen, + "HOST: ", + hoststr, hostlen, contentType ); } else if( contentLength == UPNP_UNTIL_CLOSE ) { ret_code = http_MakeMessage( request, 1, 1, - "QsbcDCUTc", + "Q" "s" "bcDCU" "Tc", HTTPMETHOD_POST, url->pathquery.buff, url->pathquery.size, - "HOST: ", hoststr, hostlen, + "HOST: ", + hoststr, hostlen, contentType ); } else { ret_code = UPNP_E_INVALID_PARAM; @@ -1815,7 +1819,7 @@ http_MakeMessage( INOUT membuffer * buf, { char c; char *s = NULL; - int num; + size_t num; off_t bignum; size_t length; time_t *loc_time; @@ -1898,7 +1902,7 @@ http_MakeMessage( INOUT membuffer * buf, { num = ( int )va_arg( argp, int ); - sprintf( tempbuf, "%d", num ); + sprintf( tempbuf, "%zu", num ); if( membuffer_append( buf, tempbuf, strlen( tempbuf ) ) != 0 ) { goto error_handler; } @@ -1908,7 +1912,7 @@ http_MakeMessage( INOUT membuffer * buf, { bignum = ( off_t )va_arg( argp, off_t ); - sprintf( tempbuf, "%lld", (int64_t)bignum ); + sprintf( tempbuf, "%"PRId64, (int64_t)bignum ); if( membuffer_append( buf, tempbuf, strlen( tempbuf ) ) != 0 ) { goto error_handler; } @@ -2046,7 +2050,7 @@ http_MakeMessage( INOUT membuffer * buf, method = ( http_method_t ) va_arg( argp, http_method_t ); method_str = method_to_str( method ); url_str = ( const char * )va_arg( argp, const char * ); - num = ( int )va_arg( argp, int ); // length of url_str + num = ( size_t )va_arg( argp, size_t ); // length of url_str if (http_MakeMessage( buf, http_major_version, http_minor_version, diff --git a/upnp/src/genlib/net/http/webserver.c b/upnp/src/genlib/net/http/webserver.c index 1e5f18b..b59ba03 100644 --- a/upnp/src/genlib/net/http/webserver.c +++ b/upnp/src/genlib/net/http/webserver.c @@ -39,7 +39,8 @@ #include #ifndef UPNP_USE_BCBPP #ifndef UPNP_USE_MSVCPP - #include + #include + #include #endif #endif #include "util.h" @@ -54,7 +55,7 @@ #include "ssdplib.h" #ifndef WIN32 - #include + #include #endif #include #include "ithread.h" @@ -990,7 +991,7 @@ CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier, Instr->RangeOffset = FirstByte; Instr->ReadSendSize = LastByte - FirstByte + 1; sprintf( Instr->RangeHeader, - "CONTENT-RANGE: bytes %lld-%lld/%lld\r\n", + "CONTENT-RANGE: bytes %"PRId64"-%"PRId64"/%"PRId64"\r\n", (int64_t)FirstByte, (int64_t)LastByte, (int64_t)FileLength ); //Data between two range. @@ -999,7 +1000,7 @@ CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier, Instr->RangeOffset = FirstByte; Instr->ReadSendSize = FileLength - FirstByte; sprintf( Instr->RangeHeader, - "CONTENT-RANGE: bytes %lld-%lld/%lld\r\n", + "CONTENT-RANGE: bytes %"PRId64"-%"PRId64"/%"PRId64"\r\n", (int64_t)FirstByte, (int64_t)(FileLength - 1), (int64_t)FileLength ); @@ -1008,14 +1009,14 @@ CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier, Instr->RangeOffset = 0; Instr->ReadSendSize = FileLength; sprintf( Instr->RangeHeader, - "CONTENT-RANGE: bytes 0-%lld/%lld\r\n", + "CONTENT-RANGE: bytes 0-%"PRId64"/%"PRId64"\r\n", (int64_t)(FileLength - 1), (int64_t)FileLength ); } else { Instr->RangeOffset = FileLength - LastByte; Instr->ReadSendSize = LastByte; sprintf( Instr->RangeHeader, - "CONTENT-RANGE: bytes %lld-%lld/%lld\r\n", + "CONTENT-RANGE: bytes %"PRId64"-%"PRId64"/%"PRId64"\r\n", (int64_t)(FileLength - LastByte + 1), (int64_t)FileLength, (int64_t)FileLength ); @@ -1206,7 +1207,7 @@ process_request( IN http_message_t * req, int resp_major, resp_minor; xboolean alias_grabbed; - int dummy; + size_t dummy; struct UpnpVirtualDirCallbacks *pVirtualDirCallback; print_http_headers( req ); diff --git a/upnp/src/genlib/net/uri/uri.c b/upnp/src/genlib/net/uri/uri.c index 0698194..fefc396 100644 --- a/upnp/src/genlib/net/uri/uri.c +++ b/upnp/src/genlib/net/uri/uri.c @@ -157,7 +157,7 @@ is_escaped( const char *in ) int replace_escaped( char *in, int index, - int *max ) + size_t *max ) { int tempInt = 0; char tempChar = 0; @@ -611,7 +611,9 @@ parse_hostport( const char *in, int errCode = 0; //call gethostbyname_r (reentrant form of gethostbyname) -#if defined(WIN32) + // TODO: Use autoconf to discover this rather than the + // platform-specific stuff below +#if defined(WIN32) || defined(__CYGWIN__) h=gethostbyname(temp_host_name); #elif defined(SPARC_SOLARIS) errCode = gethostbyname_r( temp_host_name, @@ -731,7 +733,7 @@ parse_scheme( const char *in, ************************************************************************/ int remove_escaped_chars( INOUT char *in, - INOUT int *size ) + INOUT size_t *size ) { int i = 0; @@ -1067,7 +1069,7 @@ parse_uri( const char *in, int parse_uri_and_unescape( char *in, int max, - uri_type * out ) + uri_type *out ) { int ret; diff --git a/upnp/src/inc/http_client.h b/upnp/src/inc/http_client.h index 11cad5c..16eb4aa 100644 --- a/upnp/src/inc/http_client.h +++ b/upnp/src/inc/http_client.h @@ -96,7 +96,7 @@ typedef struct SOCKET_BUFFER{ //holds a pointer into a larger array typedef struct TOKEN { char * buff; - int size; + size_t size; } token; diff --git a/upnp/src/inc/membuffer.h b/upnp/src/inc/membuffer.h index c9a61c9..ec9987b 100644 --- a/upnp/src/inc/membuffer.h +++ b/upnp/src/inc/membuffer.h @@ -51,8 +51,7 @@ typedef struct // memptr // note: Total length/capacity should not exceed MAX_INT typedef struct // membuffer { - char *buf; // mem buffer; must not write - // beyond buf[length-1] (read/write) + char *buf; // mem buffer; must not write beyond buf[length-1] (read/write) size_t length; // length of buffer (read-only) size_t capacity; // total allocated memory (read-only) size_t size_inc; // used to increase size; MUST be > 0; (read/write) @@ -148,8 +147,7 @@ int memptr_cmp_nocase( IN memptr* m, IN const char* s ); * * Note : ************************************************************************/ -int membuffer_set_size( INOUT membuffer* m, - IN size_t new_length ); +int membuffer_set_size( INOUT membuffer* m, IN size_t new_length ); /************************************************************************ * Function : membuffer_init @@ -200,8 +198,7 @@ void membuffer_destroy( INOUT membuffer* m ); * * Note : ************************************************************************/ -int membuffer_assign( INOUT membuffer* m, IN const void* buf, - IN size_t buf_len ); +int membuffer_assign( INOUT membuffer* m, IN const void* buf, IN size_t buf_len ); /************************************************************************ * Function : membuffer_assign_str @@ -237,8 +234,7 @@ int membuffer_assign_str( INOUT membuffer* m, IN const char* c_str ); * * Note : ************************************************************************/ -int membuffer_append( INOUT membuffer* m, IN const void* buf, - IN size_t buf_len ); +int membuffer_append( INOUT membuffer* m, IN const void* buf, IN size_t buf_len ); /************************************************************************ * Function : membuffer_append_str @@ -276,8 +272,7 @@ int membuffer_append_str( INOUT membuffer* m, IN const char* c_str ); * * Note : ************************************************************************/ -int membuffer_insert( INOUT membuffer* m, IN const void* buf, - IN size_t buf_len, int index ); +int membuffer_insert( INOUT membuffer* m, IN const void* buf, IN size_t buf_len, int index ); /************************************************************************ @@ -298,8 +293,7 @@ int membuffer_insert( INOUT membuffer* m, IN const void* buf, * * Note : ************************************************************************/ -void membuffer_delete( INOUT membuffer* m, IN int index, - IN size_t num_bytes ); +void membuffer_delete( INOUT membuffer* m, IN int index, IN size_t num_bytes ); /************************************************************************ @@ -336,8 +330,7 @@ char* membuffer_detach( INOUT membuffer* m ); * Note : 'new_buf' must be allocted using malloc or realloc so * that it can be freed using free() ************************************************************************/ -void membuffer_attach( INOUT membuffer* m, IN char* new_buf, - IN size_t buf_len ); +void membuffer_attach( INOUT membuffer* m, IN char* new_buf, IN size_t buf_len ); #ifdef __cplusplus } // extern "C" #endif // __cplusplus diff --git a/upnp/src/inc/uri.h b/upnp/src/inc/uri.h index 31f6a99..229d653 100644 --- a/upnp/src/inc/uri.h +++ b/upnp/src/inc/uri.h @@ -87,7 +87,7 @@ enum uriType { absolute, relative }; * holds a pointer into a larger array */ typedef struct TOKEN { const char *buff; - int size; + size_t size; } token; @@ -124,7 +124,7 @@ typedef struct URL_LIST { * Parameters : * char * in ; string of characters * int index ; index at which to start checking the characters -* int *max ; +* size_t *max ; * * Description : Replaces an escaped sequence with its unescaped version * as in http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs) @@ -137,7 +137,7 @@ typedef struct URL_LIST { * string are shifted over, and NULL characters are placed at the * end of the string. ************************************************************************/ -int replace_escaped(char * in, int index, int *max); +int replace_escaped(char * in, int index, size_t *max); /************************************************************************ * Function : copy_URL_list @@ -303,7 +303,7 @@ int parse_hostport(const char *in, int max, hostport_type *out ); * * Parameters : * INOUT char *in ; string of characters to be modified -* INOUT int *size ; size limit for the number of characters +* INOUT size_t *size ; size limit for the number of characters * * Description : removes http escaped characters such as: "%20" and * replaces them with their character representation. i.e. @@ -315,7 +315,7 @@ int parse_hostport(const char *in, int max, hostport_type *out ); * * Note : ************************************************************************/ -int remove_escaped_chars(char *in,int *size); +int remove_escaped_chars(char *in, size_t *size); /************************************************************************ * Function : remove_dots diff --git a/upnp/src/inc/util.h b/upnp/src/inc/util.h index 77948e3..74a2229 100644 --- a/upnp/src/inc/util.h +++ b/upnp/src/inc/util.h @@ -163,7 +163,7 @@ void linecopylen( OUT char dest[LINE_SIZE], IN const char* src, IN size_t srclen #define strcasecmp stricmp #define strncasecmp strnicmp - #define sleep Sleep + #define sleep(a) Sleep((a)*1000) #define usleep(a) Sleep((a)/1000) #endif