From 156ee8235805864e6db9c272de0addf4cd68e737 Mon Sep 17 00:00:00 2001 From: Marcelo Roberto Jimenez Date: Wed, 6 Feb 2008 18:32:09 +0000 Subject: [PATCH] Slightly improved error report by showing the sys_errlist string corresponding to errno. Also, got rid of two useless constants: UPNP_SOCKETERROR and UPNP_INVALID_SOCKET. They both mean the same, that a network API function has failed. -1 is the value to check, not an invented constant. git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@319 119443c7-1b9e-41f8-b6fc-b9c35fce742c --- upnp/inc/upnp.h | 2 - upnp/src/genlib/miniserver/miniserver.c | 130 +++++++++++++----------- upnp/src/ssdp/ssdp_ctrlpt.c | 42 +++----- upnp/src/ssdp/ssdp_device.c | 20 ++-- upnp/src/ssdp/ssdp_server.c | 75 +++++++++----- 5 files changed, 144 insertions(+), 125 deletions(-) diff --git a/upnp/inc/upnp.h b/upnp/inc/upnp.h index db6d9f7..14d31a0 100644 --- a/upnp/inc/upnp.h +++ b/upnp/inc/upnp.h @@ -102,8 +102,6 @@ #define UpnpCloseSocket closesocket #define fseeko fseek #endif -#define UPNP_SOCKETERROR -1 -#define UPNP_INVALID_SOCKET -1 #ifndef WIN32 #define SOCKET int #endif diff --git a/upnp/src/genlib/miniserver/miniserver.c b/upnp/src/genlib/miniserver/miniserver.c index be8e979..3d61405 100644 --- a/upnp/src/genlib/miniserver/miniserver.c +++ b/upnp/src/genlib/miniserver/miniserver.c @@ -393,6 +393,7 @@ RunMiniServer( MiniServerSockArray * miniSock ) unsigned int maxMiniSock; int byteReceived; char requestBuf[256]; + int ret = 0; maxMiniSock = max( miniServSock, miniServStopSock) ; maxMiniSock = max( maxMiniSock, (SOCKET)(ssdpSock) ); @@ -414,10 +415,11 @@ RunMiniServer( MiniServerSockArray * miniSock ) FD_SET( ssdpReqSock, &rdSet ); #endif - if( select( maxMiniSock, &rdSet, NULL, &expSet, NULL ) == - UPNP_SOCKETERROR ) { + ret = select( maxMiniSock, &rdSet, NULL, &expSet, NULL ); + if ( ret == -1 ) { UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, - "Error in select call!\n" ); + "Error in select(): %s\n", + sys_errlist[errno] ); /* Avoid 100% CPU in case of repeated error in select() */ isleep( 1 ); continue; @@ -426,9 +428,10 @@ RunMiniServer( MiniServerSockArray * miniSock ) clientLen = sizeof( struct sockaddr_in ); connectHnd = accept( miniServSock, ( struct sockaddr * )&clientAddr, &clientLen ); - if( connectHnd == UPNP_INVALID_SOCKET ) { + if( connectHnd == -1 ) { UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, - "miniserver: Error in accepting connection\n" ); + "miniserver: Error in accept(): %s\n", + sys_errlist[errno] ); continue; } schedule_request_job( connectHnd, &clientAddr ); @@ -444,8 +447,7 @@ RunMiniServer( MiniServerSockArray * miniSock ) } if( FD_ISSET( miniServStopSock, &rdSet ) ) { clientLen = sizeof( struct sockaddr_in ); - memset( ( char * )&clientAddr, 0, - sizeof( struct sockaddr_in ) ); + memset( (char *)&clientAddr, 0, sizeof (struct sockaddr_in) ); byteReceived = recvfrom( miniServStopSock, requestBuf, 25, 0, ( struct sockaddr * )&clientAddr, @@ -453,7 +455,7 @@ RunMiniServer( MiniServerSockArray * miniSock ) if( byteReceived > 0 ) { requestBuf[byteReceived] = '\0'; UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, - "Received response !!! %s From host %s \n", + "Received response: %s From host %s \n", requestBuf, inet_ntoa( clientAddr.sin_addr ) ); UpnpPrintf( UPNP_PACKET, MSERV, __FILE__, __LINE__, "Received multicast packet: \n %s\n", @@ -552,9 +554,10 @@ get_miniserver_sockets( MiniServerSockArray * out, int sockError = UPNP_E_SUCCESS; int errCode = 0; int miniServerStopSock; + int ret = 0; listenfd = socket( AF_INET, SOCK_STREAM, 0 ); - if( listenfd < 0 ) { + if ( listenfd == -1 ) { return UPNP_E_OUTOF_SOCKET; // error creating socket } // As per the IANA specifications for the use of ports by applications @@ -571,51 +574,51 @@ get_miniserver_sockets( MiniServerSockArray * out, // Keeping the re-use address code as an optional behaviour that can be // turned on if necessary. // TURN ON the reuseaddr_on option to use the option. - if( reuseaddr_on ) { - //THIS IS ALLOWS US TO BIND AGAIN IMMEDIATELY - //AFTER OUR SERVER HAS BEEN CLOSED - //THIS MAY CAUSE TCP TO BECOME LESS RELIABLE - //HOWEVER IT HAS BEEN SUGESTED FOR TCP SERVERS - + if ( reuseaddr_on ) { + // THIS IS ALLOWS US TO BIND AGAIN IMMEDIATELY + // AFTER OUR SERVER HAS BEEN CLOSED + // THIS MAY CAUSE TCP TO BECOME LESS RELIABLE + // HOWEVER IT HAS BEEN SUGESTED FOR TCP SERVERS UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, "mserv start: resuseaddr set\n" ); sockError = setsockopt( listenfd, SOL_SOCKET, SO_REUSEADDR, - ( const char * )&reuseaddr_on, sizeof( int )); - if( sockError == UPNP_SOCKETERROR ) { + (const char *)&reuseaddr_on, sizeof (int) ); + if ( sockError == -1 ) { shutdown( listenfd, SD_BOTH ); UpnpCloseSocket( listenfd ); + return UPNP_E_SOCKET_BIND; } - sockError = bind( listenfd, - ( struct sockaddr * )&serverAddr, - sizeof( struct sockaddr_in ) - ); + sockError = bind( listenfd, (struct sockaddr *)&serverAddr, + sizeof (struct sockaddr_in) ); } else { do { serverAddr.sin_port = htons( listen_port++ ); - sockError = bind( listenfd, - ( struct sockaddr * )&serverAddr, - sizeof( struct sockaddr_in ) - ); - if( sockError == UPNP_SOCKETERROR ) { + sockError = bind( listenfd, (struct sockaddr *)&serverAddr, + sizeof (struct sockaddr_in) ); + if ( sockError == -1 ) { #ifdef WIN32 errCode = WSAGetLastError(); #else errCode = errno; #endif - if( errno == EADDRINUSE ) + if( errno == EADDRINUSE ) { errCode = 1; + } } else errCode = 0; - } while( errCode != 0 ); + } while ( errCode != 0 ); } - if( sockError == UPNP_SOCKETERROR ) { - perror( "mserv start: bind failed" ); + if ( sockError == -1 ) { + UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, + "mserv start: Error in bind(): %s\n", + sys_errlist[errno] ); shutdown( listenfd, SD_BOTH ); UpnpCloseSocket( listenfd ); + return UPNP_E_SOCKET_BIND; // bind failed } @@ -623,28 +626,35 @@ get_miniserver_sockets( MiniServerSockArray * out, "mserv start: bind success\n" ); success = listen( listenfd, SOMAXCONN ); - if( success == UPNP_SOCKETERROR ) { + if ( success == -1 ) { + UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, + "mserv start: Error in listen(): %s\n", + sys_errlist[errno] ); shutdown( listenfd, SD_BOTH ); UpnpCloseSocket( listenfd ); - return UPNP_E_LISTEN; // listen failed + + return UPNP_E_LISTEN; } actual_port = get_port( listenfd ); if( actual_port <= 0 ) { shutdown( listenfd, SD_BOTH ); UpnpCloseSocket( listenfd ); + return UPNP_E_INTERNAL_ERROR; } out->miniServerPort = actual_port; - if( ( miniServerStopSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == - UPNP_INVALID_SOCKET ) { + miniServerStopSock = socket( AF_INET, SOCK_DGRAM, 0 ); + if ( miniServerStopSock == -1 ) { UpnpPrintf( UPNP_CRITICAL, MSERV, __FILE__, __LINE__, - "Error in socket operation !!!\n" ); + "Error in socket(): %s\n", + sys_errlist[errno] ); shutdown( listenfd, SD_BOTH ); UpnpCloseSocket( listenfd ); + return UPNP_E_OUTOF_SOCKET; } @@ -652,10 +662,9 @@ get_miniserver_sockets( MiniServerSockArray * out, memset( ( char * )&serverAddr, 0, sizeof( struct sockaddr_in ) ); serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = inet_addr( "127.0.0.1" ); - - if( bind( miniServerStopSock, ( struct sockaddr * )&serverAddr, - sizeof( serverAddr ) ) == UPNP_SOCKETERROR ) { - + ret = bind( miniServerStopSock, (struct sockaddr *)&serverAddr, + sizeof (serverAddr) ); + if ( ret == -1 ) { UpnpPrintf( UPNP_CRITICAL, MSERV, __FILE__, __LINE__, "Error in binding localhost!!!\n" ); @@ -663,20 +672,21 @@ get_miniserver_sockets( MiniServerSockArray * out, UpnpCloseSocket( listenfd ); shutdown( miniServerStopSock, SD_BOTH ); UpnpCloseSocket( miniServerStopSock ); + return UPNP_E_SOCKET_BIND; } miniStopSockPort = get_port( miniServerStopSock ); - if( miniStopSockPort <= 0 ) { + if ( miniStopSockPort <= 0 ) { shutdown( miniServerStopSock, SD_BOTH ); UpnpCloseSocket( miniServerStopSock ); shutdown( listenfd, SD_BOTH ); UpnpCloseSocket( listenfd ); + return UPNP_E_INTERNAL_ERROR; } out->stopPort = miniStopSockPort; - out->miniServerSock = listenfd; out->miniServerStopSock = miniServerStopSock; @@ -718,18 +728,19 @@ StartMiniServer( unsigned short listen_port ) return UPNP_E_INTERNAL_ERROR; // miniserver running } - miniSocket = - ( MiniServerSockArray * ) malloc( sizeof( MiniServerSockArray ) ); - if( miniSocket == NULL ) + miniSocket = (MiniServerSockArray *) malloc( sizeof (MiniServerSockArray) ); + if( miniSocket == NULL ) { return UPNP_E_OUTOF_MEMORY; + } - if( ( success = get_miniserver_sockets( miniSocket, listen_port ) ) - != UPNP_E_SUCCESS ) { + success = get_miniserver_sockets( miniSocket, listen_port ); + if( success != UPNP_E_SUCCESS ) { free( miniSocket ); return success; } - if( ( success = get_ssdp_sockets( miniSocket ) ) != UPNP_E_SUCCESS ) { + success = get_ssdp_sockets( miniSocket ); + if( success != UPNP_E_SUCCESS ) { shutdown( miniSocket->miniServerSock, SD_BOTH ); UpnpCloseSocket( miniSocket->miniServerSock ); shutdown( miniSocket->miniServerStopSock, SD_BOTH ); @@ -739,15 +750,12 @@ StartMiniServer( unsigned short listen_port ) return success; } - TPJobInit( &job, ( start_routine ) RunMiniServer, - ( void * )miniSocket ); + TPJobInit( &job, (start_routine)RunMiniServer, (void *)miniSocket ); TPJobSetPriority( &job, MED_PRIORITY ); - TPJobSetFreeFunction( &job, ( free_routine ) free ); success = ThreadPoolAddPersistent( &gMiniServerThreadPool, &job, NULL ); - - if( success < 0 ) { + if ( success < 0 ) { shutdown( miniSocket->miniServerSock, SD_BOTH ); UpnpCloseSocket( miniSocket->miniServerSock ); shutdown( miniSocket->miniServerStopSock, SD_BOTH ); @@ -763,13 +771,13 @@ StartMiniServer( unsigned short listen_port ) } // wait for miniserver to start count = 0; - while( gMServState != MSERV_RUNNING && count < max_count ) { + while ( gMServState != MSERV_RUNNING && count < max_count ) { usleep( 50 * 1000 ); // 0.05s count++; } // taking too long to start that thread - if( count >= max_count ) { + if ( count >= max_count ) { shutdown( miniSocket->miniServerSock, SD_BOTH ); UpnpCloseSocket( miniSocket->miniServerSock ); shutdown( miniSocket->miniServerStopSock, SD_BOTH ); @@ -801,7 +809,7 @@ StartMiniServer( unsigned short listen_port ) * Always returns 0 ************************************************************************/ int -StopMiniServer( void ) +StopMiniServer() { int socklen = sizeof( struct sockaddr_in ); @@ -817,9 +825,10 @@ StopMiniServer( void ) } sock = socket( AF_INET, SOCK_DGRAM, 0 ); - if( sock == UPNP_INVALID_SOCKET ) { + if ( sock == -1 ) { UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, - "SSDP_SERVER:StopSSDPServer: Error in socket operation !!!\n" ); + "SSDP_SERVER: StopSSDPServer: Error in socket() %s\n", + sys_errlist[errno] ); return 0; } @@ -827,15 +836,16 @@ StopMiniServer( void ) ssdpAddr.sin_family = AF_INET; ssdpAddr.sin_addr.s_addr = inet_addr( "127.0.0.1" ); ssdpAddr.sin_port = htons( miniStopSockPort ); - sendto( sock, buf, bufLen, 0, ( struct sockaddr * )&ssdpAddr, - socklen ); + sendto( sock, buf, bufLen, 0, (struct sockaddr *)&ssdpAddr, socklen ); usleep( 1000 ); - if( gMServState == MSERV_IDLE ) + if( gMServState == MSERV_IDLE ) { break; + } isleep( 1 ); } shutdown( sock, SD_BOTH ); UpnpCloseSocket( sock ); + return 0; } diff --git a/upnp/src/ssdp/ssdp_ctrlpt.c b/upnp/src/ssdp/ssdp_ctrlpt.c index 331b73e..9bdf54b 100644 --- a/upnp/src/ssdp/ssdp_ctrlpt.c +++ b/upnp/src/ssdp/ssdp_ctrlpt.c @@ -516,6 +516,7 @@ SearchByTarget( IN int Mx, { int socklen = sizeof( struct sockaddr_in ); int *id = NULL; + int ret = 0; char *ReqBuf; struct sockaddr_in destAddr; fd_set wrSet; @@ -534,9 +535,10 @@ SearchByTarget( IN int Mx, return UPNP_E_INVALID_PARAM; } - ReqBuf = ( char * )malloc( BUFSIZE ); - if( ReqBuf == NULL ) + ReqBuf = (char *)malloc( BUFSIZE ); + if( ReqBuf == NULL ) { return UPNP_E_OUTOF_MEMORY; + } UpnpPrintf(UPNP_INFO, SSDP, __FILE__, __LINE__, ">>> SSDP SEND >>>\n"); @@ -558,7 +560,7 @@ SearchByTarget( IN int Mx, FD_ZERO( &wrSet ); FD_SET( gSsdpReqSocket, &wrSet ); - //add search criteria to list + // add search criteria to list HandleLock(); if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) { HandleUnlock(); @@ -576,7 +578,7 @@ SearchByTarget( IN int Mx, TPJobSetPriority( &job, MED_PRIORITY ); TPJobSetFreeFunction( &job, ( free_routine ) free ); - //Schdule a timeout event to remove search Arg + // Schedule a timeout event to remove search Arg TimerThreadSchedule( &gTimerThread, timeTillRead, REL_SEC, &job, SHORT_TERM, id ); newArg->timeoutEventId = ( *id ); @@ -584,37 +586,24 @@ SearchByTarget( IN int Mx, ListAddTail( &ctrlpt_info->SsdpSearchList, newArg ); HandleUnlock(); - setsockopt( gSsdpReqSocket, IPPROTO_IP, IP_MULTICAST_IF, - ( char * )&addr, sizeof( addr ) ); + ret = setsockopt( gSsdpReqSocket, IPPROTO_IP, IP_MULTICAST_IF, + (char *)&addr, sizeof (addr) ); - if( select( gSsdpReqSocket + 1, NULL, &wrSet, NULL, NULL ) - == UPNP_SOCKETERROR ) { - if( errno == EBADF ) { - UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, - "SSDP_LIB :RequestHandler:An invalid file descriptor" - " was givenin one of the sets. \n" ); - } else if( errno == EINTR ) { - UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, - "SSDP_LIB :RequestHandler: A non blocked " - "signal was caught. \n" ); - } else if( errno == EINVAL ) { - UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, - "SSDP_LIB :RequestHandler: n is negative. \n" ); - } else if( errno == ENOMEM ) { - UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, - "SSDP_LIB : RequestHandler:select was unable to " - "allocate memory for internal tables.\n" ); - } + ret = select( gSsdpReqSocket + 1, NULL, &wrSet, NULL, NULL ); + if( ret == -1 ) { + UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, + "SSDP_LIB: Error in select(): %s\n", + sys_errlist[errno] ); shutdown( gSsdpReqSocket, SD_BOTH ); UpnpCloseSocket( gSsdpReqSocket ); free( ReqBuf ); + return UPNP_E_INTERNAL_ERROR; } else if( FD_ISSET( gSsdpReqSocket, &wrSet ) ) { int NumCopy = 0; - while( NumCopy < NUM_SSDP_COPY ) { sendto( gSsdpReqSocket, ReqBuf, strlen( ReqBuf ), 0, - ( struct sockaddr * )&destAddr, socklen ); + (struct sockaddr *)&destAddr, socklen ); NumCopy++; imillisleep( SSDP_PAUSE ); } @@ -626,3 +615,4 @@ SearchByTarget( IN int Mx, #endif // EXCLUDE_SSDP #endif // INCLUDE_CLIENT_APIS + diff --git a/upnp/src/ssdp/ssdp_device.c b/upnp/src/ssdp/ssdp_device.c index 363efe7..7e9d314 100644 --- a/upnp/src/ssdp/ssdp_device.c +++ b/upnp/src/ssdp/ssdp_device.c @@ -213,26 +213,27 @@ NewRequestHandler( IN struct sockaddr_in *DestAddr, IN int NumPacket, IN char **RqPacket ) { - int ReplySock, - socklen = sizeof( struct sockaddr_in ); - int NumCopy, - Index; + int ReplySock; + int socklen = sizeof( struct sockaddr_in ); + int NumCopy; + int Index; unsigned long replyAddr = inet_addr( LOCAL_HOST ); - int ttl = 4; //a/c to UPNP Spec + int ttl = 4; // a/c to UPNP Spec ReplySock = socket( AF_INET, SOCK_DGRAM, 0 ); - if( ReplySock == UPNP_INVALID_SOCKET ) { + if ( ReplySock == -1 ) { UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, "SSDP_LIB: New Request Handler:" - "Error in socket operation !!!\n" ); + "Error in socket(): %s\n", + sys_errlist[errno] ); return UPNP_E_OUTOF_SOCKET; } setsockopt( ReplySock, IPPROTO_IP, IP_MULTICAST_IF, - ( char * )&replyAddr, sizeof( replyAddr ) ); + (char *)&replyAddr, sizeof (replyAddr) ); setsockopt( ReplySock, IPPROTO_IP, IP_MULTICAST_TTL, - ( char * )&ttl, sizeof( int ) ); + (char *)&ttl, sizeof (int) ); for( Index = 0; Index < NumPacket; Index++ ) { int rc; @@ -262,6 +263,7 @@ NewRequestHandler( IN struct sockaddr_in *DestAddr, shutdown( ReplySock, SD_BOTH ); UpnpCloseSocket( ReplySock ); + return UPNP_E_SUCCESS; } diff --git a/upnp/src/ssdp/ssdp_server.c b/upnp/src/ssdp/ssdp_server.c index 6cc79d7..44d6011 100644 --- a/upnp/src/ssdp/ssdp_server.c +++ b/upnp/src/ssdp/ssdp_server.c @@ -861,28 +861,34 @@ get_ssdp_sockets( MiniServerSockArray * out ) struct ip_mreq ssdpMcastAddr; struct sockaddr_in ssdpAddr; int option = 1; + int ret = 0; struct in_addr addr; SOCKET ssdpSock; #if INCLUDE_CLIENT_APIS SOCKET ssdpReqSock; - if( ( ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == UPNP_INVALID_SOCKET ) { + ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ); + if ( ssdpReqSock == -1 ) { UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, - "Error in socket operation !!!\n" ); + "Error in socket(): %s\n", + sys_errlist[errno] ); return UPNP_E_OUTOF_SOCKET; } - setsockopt( ssdpReqSock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof( ttl ) ); + ret = setsockopt( ssdpReqSock, IPPROTO_IP, IP_MULTICAST_TTL, + &ttl, sizeof (ttl) ); // just do it, regardless if fails or not. Make_Socket_NoBlocking( ssdpReqSock ); gSsdpReqSocket = ssdpReqSock; #endif /* INCLUDE_CLIENT_APIS */ - if( ( ssdpSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == UPNP_INVALID_SOCKET ) { + ssdpSock = socket( AF_INET, SOCK_DGRAM, 0 ); + if ( ssdpSock == -1 ) { UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, - "Error in socket operation !!!\n" ); + "Error in socket(): %s\n", + sys_errlist[errno] ); CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); ) CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); ) @@ -890,11 +896,13 @@ get_ssdp_sockets( MiniServerSockArray * out ) } onOff = 1; - if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEADDR, - ( char * )&onOff, sizeof( onOff ) ) != 0 ) { + ret = setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEADDR, + (char *)&onOff, sizeof(onOff) ); + if ( ret == -1) { UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, - "Error in set reuse addr !!!\n" ); + "Error in setsockopt() SO_REUSEADDR: %s\n", + sys_errlist[errno] ); CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); ) CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); ) shutdown( ssdpSock, SD_BOTH ); @@ -904,11 +912,13 @@ get_ssdp_sockets( MiniServerSockArray * out ) } #if defined(__FreeBSD__) || defined(__OSX__) || defined(__APPLE__) - if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEPORT, - ( char * )&onOff, sizeof( onOff ) ) != 0 ) { + ret = setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEPORT, + (char *)&onOff, sizeof (onOff) ); + if ( ret == -1 ) { UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, - "Error in set reuse port !!!\n" ); + "Error in setsockopt() SO_REUSEPORT: %s\n", + sys_errlist[errno] ); CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); ) CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); ) shutdown( ssdpSock, SD_BOTH ); @@ -918,16 +928,18 @@ get_ssdp_sockets( MiniServerSockArray * out ) } #endif /* __FreeBSD__ */ - memset( ( void * )&ssdpAddr, 0, sizeof( struct sockaddr_in ) ); + memset( (void *)&ssdpAddr, 0, sizeof( struct sockaddr_in ) ); ssdpAddr.sin_family = AF_INET; // ssdpAddr.sin_addr.s_addr = inet_addr(LOCAL_HOST); ssdpAddr.sin_addr.s_addr = htonl( INADDR_ANY ); ssdpAddr.sin_port = htons( SSDP_PORT ); - if( bind( ssdpSock, ( struct sockaddr * )&ssdpAddr, - sizeof( ssdpAddr ) ) != 0 ) { + ret = bind( ssdpSock, (struct sockaddr *)&ssdpAddr, sizeof (ssdpAddr) ); + if ( ret == -1 ) { UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, - "Error in binding !!!\n" ); + "Error in bind(), addr=0x%08X, port=%d: %s\n", + INADDR_ANY, SSDP_PORT, + sys_errlist[errno] ); shutdown( ssdpSock, SD_BOTH ); UpnpCloseSocket( ssdpSock ); CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); ) @@ -936,14 +948,16 @@ get_ssdp_sockets( MiniServerSockArray * out ) return UPNP_E_SOCKET_BIND; } - memset( ( void * )&ssdpMcastAddr, 0, sizeof( struct ip_mreq ) ); + memset( (void *)&ssdpMcastAddr, 0, sizeof (struct ip_mreq) ); ssdpMcastAddr.imr_interface.s_addr = inet_addr( LOCAL_HOST ); ssdpMcastAddr.imr_multiaddr.s_addr = inet_addr( SSDP_IP ); - if( setsockopt( ssdpSock, IPPROTO_IP, IP_ADD_MEMBERSHIP, - ( char * )&ssdpMcastAddr, sizeof( struct ip_mreq ) ) != 0 ) { + ret = setsockopt( ssdpSock, IPPROTO_IP, IP_ADD_MEMBERSHIP, + (char *)&ssdpMcastAddr, sizeof (struct ip_mreq) ); + if ( ret == -1 ) { UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, - "Error in joining multicast group !!!\n" ); + "Error in setsockopt() IP_ADD_MEMBERSHIP (join multicast group): %s\n", + sys_errlist[errno] ); shutdown( ssdpSock, SD_BOTH ); CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); ) UpnpCloseSocket( ssdpSock ); @@ -953,23 +967,28 @@ get_ssdp_sockets( MiniServerSockArray * out ) } /* Set multicast interface. */ - memset( ( void * )&addr, 0, sizeof( struct in_addr )); + memset( (void *)&addr, 0, sizeof (struct in_addr) ); addr.s_addr = inet_addr(LOCAL_HOST); - if ( setsockopt(ssdpSock, IPPROTO_IP, IP_MULTICAST_IF, - (char *)&addr, sizeof addr) != 0) { + ret = setsockopt(ssdpSock, IPPROTO_IP, IP_MULTICAST_IF, + (char *)&addr, sizeof addr); + if ( ret == -1 ) { UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, - "Couldn't set multicast interface.\n" ); + "Error in setsockopt() IP_MULTICAST_IF (set multicast interface): %s\n", + sys_errlist[errno] ); /* This is probably not a critical error, so let's continue. */ } /* result is not checked becuase it will fail in WinMe and Win9x. */ - setsockopt( ssdpSock, IPPROTO_IP, - IP_MULTICAST_TTL, &ttl, sizeof( ttl ) ); - if( setsockopt( ssdpSock, SOL_SOCKET, SO_BROADCAST, - (char *)&option, sizeof(option) ) != 0) { + ret = setsockopt( ssdpSock, IPPROTO_IP, + IP_MULTICAST_TTL, &ttl, sizeof (ttl) ); + + ret = setsockopt( ssdpSock, SOL_SOCKET, SO_BROADCAST, + (char *)&option, sizeof (option) ); + if( ret == -1) { UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, - "Error in setting broadcast !!!\n" ); + "Error in setsockopt() SO_BROADCAST (set broadcast): %s\n", + sys_errlist[errno] ); shutdown( ssdpSock, SD_BOTH ); CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); ) UpnpCloseSocket( ssdpSock );