Doxygen and indentation for miniserver.
(cherry picked from commit 6128296e5f)
			
			
This commit is contained in:
		| @@ -36,7 +36,7 @@ | |||||||
| /*! | /*! | ||||||
|  * \file |  * \file | ||||||
|  * |  * | ||||||
|  * \brief This file implements the functionality and utility functions |  * \brief Implements the functionality and utility functions | ||||||
|  * used by the Miniserver module. |  * used by the Miniserver module. | ||||||
|  * |  * | ||||||
|  * The miniserver is a central point for processing all network requests. |  * The miniserver is a central point for processing all network requests. | ||||||
| @@ -68,28 +68,36 @@ | |||||||
| #include <sys/types.h> | #include <sys/types.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /*! . */ | ||||||
| #define APPLICATION_LISTENING_PORT 49152 | #define APPLICATION_LISTENING_PORT 49152 | ||||||
|  |  | ||||||
|  |  | ||||||
| struct mserv_request_t { | struct mserv_request_t { | ||||||
| 	/*! Connection handle. */ | 	/*! Connection handle. */ | ||||||
| 	int connfd; | 	int connfd; | ||||||
|  | 	/*! . */ | ||||||
| 	struct sockaddr_storage foreign_sockaddr; | 	struct sockaddr_storage foreign_sockaddr; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /*! . */ | ||||||
| typedef enum { | typedef enum { | ||||||
|  | 	/*! . */ | ||||||
| 	MSERV_IDLE, | 	MSERV_IDLE, | ||||||
|  | 	/*! . */ | ||||||
| 	MSERV_RUNNING, | 	MSERV_RUNNING, | ||||||
|  | 	/*! . */ | ||||||
| 	MSERV_STOPPING | 	MSERV_STOPPING | ||||||
| } MiniServerState; | } MiniServerState; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /*! . */ | ||||||
| unsigned short miniStopSockPort; | unsigned short miniStopSockPort; | ||||||
|  |  | ||||||
|  |  | ||||||
| //////////////////////////////////////////////////////////////////////////// | /*! | ||||||
| // module vars |  * module vars | ||||||
|  |  */ | ||||||
| static MiniServerCallback gGetCallback = NULL; | static MiniServerCallback gGetCallback = NULL; | ||||||
| static MiniServerCallback gSoapCallback = NULL; | static MiniServerCallback gSoapCallback = NULL; | ||||||
| static MiniServerCallback gGenaCallback = NULL; | static MiniServerCallback gGenaCallback = NULL; | ||||||
| @@ -135,7 +143,6 @@ static int dispatch_request( | |||||||
| 	case HTTPMETHOD_MPOST: | 	case HTTPMETHOD_MPOST: | ||||||
| 		callback = gSoapCallback; | 		callback = gSoapCallback; | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	/* Gena Call */ | 	/* Gena Call */ | ||||||
| 	case HTTPMETHOD_NOTIFY: | 	case HTTPMETHOD_NOTIFY: | ||||||
| 	case HTTPMETHOD_SUBSCRIBE: | 	case HTTPMETHOD_SUBSCRIBE: | ||||||
| @@ -144,7 +151,6 @@ static int dispatch_request( | |||||||
| 			"miniserver %d: got GENA msg\n", info->socket); | 			"miniserver %d: got GENA msg\n", info->socket); | ||||||
| 			callback = gGenaCallback; | 			callback = gGenaCallback; | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	/* HTTP server call */ | 	/* HTTP server call */ | ||||||
| 	case HTTPMETHOD_GET: | 	case HTTPMETHOD_GET: | ||||||
| 	case HTTPMETHOD_POST: | 	case HTTPMETHOD_POST: | ||||||
| @@ -152,15 +158,12 @@ static int dispatch_request( | |||||||
| 	case HTTPMETHOD_SIMPLEGET: | 	case HTTPMETHOD_SIMPLEGET: | ||||||
| 		callback = gGetCallback; | 		callback = gGetCallback; | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	default: | 	default: | ||||||
| 		callback = NULL; | 		callback = NULL; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (callback == NULL) { | 	if (callback == NULL) { | ||||||
| 		return HTTP_INTERNAL_SERVER_ERROR; | 		return HTTP_INTERNAL_SERVER_ERROR; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	callback(hparser, &hparser->msg, info); | 	callback(hparser, &hparser->msg, info); | ||||||
|  |  | ||||||
| 	return 0; | 	return 0; | ||||||
| @@ -219,9 +222,8 @@ static void handle_request( | |||||||
|  |  | ||||||
| 	UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, | 	UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, | ||||||
| 		"miniserver %d: READING\n", connfd ); | 		"miniserver %d: READING\n", connfd ); | ||||||
| 	//parser_request_init( &parser ); ////LEAK_FIX_MK | 	/* parser_request_init( &parser ); */ /* LEAK_FIX_MK */ | ||||||
| 	hmsg = &parser.msg; | 	hmsg = &parser.msg; | ||||||
|  |  | ||||||
| 	ret_code = sock_init_with_ip( | 	ret_code = sock_init_with_ip( | ||||||
| 		&info, connfd, (struct sockaddr *)&request->foreign_sockaddr); | 		&info, connfd, (struct sockaddr *)&request->foreign_sockaddr); | ||||||
| 	if (ret_code != UPNP_E_SUCCESS) { | 	if (ret_code != UPNP_E_SUCCESS) { | ||||||
| @@ -229,23 +231,19 @@ static void handle_request( | |||||||
| 		httpmsg_destroy(hmsg); | 		httpmsg_destroy(hmsg); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
|  | 	/* read */ | ||||||
| 	// read |  | ||||||
| 	ret_code = http_RecvMessage( | 	ret_code = http_RecvMessage( | ||||||
| 		&info, &parser, HTTPMETHOD_UNKNOWN, &timeout, &http_error_code); | 		&info, &parser, HTTPMETHOD_UNKNOWN, &timeout, &http_error_code); | ||||||
| 	if (ret_code != 0) { | 	if (ret_code != 0) { | ||||||
| 		goto error_handler; | 		goto error_handler; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__, | 	UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__, | ||||||
| 		"miniserver %d: PROCESSING...\n", connfd); | 		"miniserver %d: PROCESSING...\n", connfd); | ||||||
|  | 	/* dispatch */ | ||||||
| 	// dispatch |  | ||||||
| 	http_error_code = dispatch_request(&info, &parser); | 	http_error_code = dispatch_request(&info, &parser); | ||||||
| 	if (http_error_code != 0) { | 	if (http_error_code != 0) { | ||||||
| 		goto error_handler; | 		goto error_handler; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	http_error_code = 0; | 	http_error_code = 0; | ||||||
|  |  | ||||||
| error_handler: | error_handler: | ||||||
| @@ -278,7 +276,8 @@ static UPNP_INLINE void schedule_request_job( | |||||||
| 	struct mserv_request_t *request; | 	struct mserv_request_t *request; | ||||||
| 	ThreadPoolJob job; | 	ThreadPoolJob job; | ||||||
|  |  | ||||||
| 	request = (struct mserv_request_t *)malloc(sizeof (struct mserv_request_t)); | 	request = (struct mserv_request_t *)malloc( | ||||||
|  | 		sizeof (struct mserv_request_t)); | ||||||
| 	if (request == NULL) { | 	if (request == NULL) { | ||||||
| 		UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, | 		UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, | ||||||
| 			"mserv %d: out of memory\n", connfd); | 			"mserv %d: out of memory\n", connfd); | ||||||
| @@ -289,11 +288,9 @@ static UPNP_INLINE void schedule_request_job( | |||||||
| 	request->connfd = connfd; | 	request->connfd = connfd; | ||||||
| 	memcpy(&request->foreign_sockaddr, clientAddr, | 	memcpy(&request->foreign_sockaddr, clientAddr, | ||||||
| 		sizeof(request->foreign_sockaddr)); | 		sizeof(request->foreign_sockaddr)); | ||||||
|  |  | ||||||
| 	TPJobInit(&job, (start_routine)handle_request, (void *)request); | 	TPJobInit(&job, (start_routine)handle_request, (void *)request); | ||||||
| 	TPJobSetFreeFunction(&job, free_handle_request_arg); | 	TPJobSetFreeFunction(&job, free_handle_request_arg); | ||||||
| 	TPJobSetPriority(&job, MED_PRIORITY); | 	TPJobSetPriority(&job, MED_PRIORITY); | ||||||
|  |  | ||||||
| 	if (ThreadPoolAdd(&gMiniServerThreadPool, &job, NULL) != 0) { | 	if (ThreadPoolAdd(&gMiniServerThreadPool, &job, NULL) != 0) { | ||||||
| 		UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__, | 		UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__, | ||||||
| 			"mserv %d: cannot schedule request\n", connfd); | 			"mserv %d: cannot schedule request\n", connfd); | ||||||
| @@ -479,7 +476,6 @@ static int get_port( | |||||||
| 	if (code == -1) { | 	if (code == -1) { | ||||||
| 		return -1; | 		return -1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (sockinfo.ss_family == AF_INET) { | 	if (sockinfo.ss_family == AF_INET) { | ||||||
| 		port = ntohs(((struct sockaddr_in*)&sockinfo)->sin_port); | 		port = ntohs(((struct sockaddr_in*)&sockinfo)->sin_port); | ||||||
| 	} else if(sockinfo.ss_family == AF_INET6) { | 	} else if(sockinfo.ss_family == AF_INET6) { | ||||||
| @@ -511,9 +507,11 @@ static int get_port( | |||||||
| static int get_miniserver_sockets( | static int get_miniserver_sockets( | ||||||
| 	/*! [in] Socket Array. */ | 	/*! [in] Socket Array. */ | ||||||
| 	MiniServerSockArray *out, | 	MiniServerSockArray *out, | ||||||
| 	/*! [in] port on which the server is listening for incoming IPv4 connections. */ | 	/*! [in] port on which the server is listening for incoming IPv4 | ||||||
|  | 	 * connections. */ | ||||||
| 	unsigned short listen_port4, | 	unsigned short listen_port4, | ||||||
| 	/*! [in] port on which the server is listening for incoming IPv6 connections. */ | 	/*! [in] port on which the server is listening for incoming IPv6 | ||||||
|  | 	 * connections. */ | ||||||
| 	unsigned short listen_port6) | 	unsigned short listen_port6) | ||||||
| { | { | ||||||
| 	char errorBuffer[ERROR_BUFFER_LEN]; | 	char errorBuffer[ERROR_BUFFER_LEN]; | ||||||
| @@ -532,22 +530,20 @@ static int get_miniserver_sockets( | |||||||
| 	int sockError = UPNP_E_SUCCESS; | 	int sockError = UPNP_E_SUCCESS; | ||||||
| 	int errCode = 0; | 	int errCode = 0; | ||||||
|  |  | ||||||
| 	// Create listen socket for IPv4/IPv6. An error here may indicate | 	/* Create listen socket for IPv4/IPv6. An error here may indicate | ||||||
| 	// that we don't have an IPv4/IPv6 stack. | 	 * that we don't have an IPv4/IPv6 stack. */ | ||||||
| 	listenfd4 = socket(AF_INET, SOCK_STREAM, 0); | 	listenfd4 = socket(AF_INET, SOCK_STREAM, 0); | ||||||
| 	if (listenfd4 == -1) { | 	if (listenfd4 == -1) { | ||||||
| 		return UPNP_E_OUTOF_SOCKET; | 		return UPNP_E_OUTOF_SOCKET; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| #ifdef UPNP_ENABLE_IPV6 | #ifdef UPNP_ENABLE_IPV6 | ||||||
| 	listenfd6 = socket(AF_INET6, SOCK_STREAM, 0); | 	listenfd6 = socket(AF_INET6, SOCK_STREAM, 0); | ||||||
| 	if (listenfd6 == -1) { | 	if (listenfd6 == -1) { | ||||||
| 		return UPNP_E_OUTOF_SOCKET; | 		return UPNP_E_OUTOF_SOCKET; | ||||||
| 	} | 	} | ||||||
| #endif | #endif | ||||||
|  | 	/* As per the IANA specifications for the use of ports by applications | ||||||
| 	// As per the IANA specifications for the use of ports by applications | 	 * override the listen port passed in with the first available. */ | ||||||
| 	// override the listen port passed in with the first available  |  | ||||||
| 	if (listen_port4 < APPLICATION_LISTENING_PORT) { | 	if (listen_port4 < APPLICATION_LISTENING_PORT) { | ||||||
| 		listen_port4 = APPLICATION_LISTENING_PORT; | 		listen_port4 = APPLICATION_LISTENING_PORT; | ||||||
| 	} | 	} | ||||||
| @@ -559,27 +555,26 @@ static int get_miniserver_sockets( | |||||||
| 	memset(&__ss_v4, 0, sizeof (__ss_v4)); | 	memset(&__ss_v4, 0, sizeof (__ss_v4)); | ||||||
| 	serverAddr4->sin_family = AF_INET; | 	serverAddr4->sin_family = AF_INET; | ||||||
| 	serverAddr4->sin_addr.s_addr = htonl(INADDR_ANY); | 	serverAddr4->sin_addr.s_addr = htonl(INADDR_ANY); | ||||||
|  |  | ||||||
| #ifdef UPNP_ENABLE_IPV6 | #ifdef UPNP_ENABLE_IPV6 | ||||||
| 	memset(&__ss_v6, 0, sizeof (__ss_v6)); | 	memset(&__ss_v6, 0, sizeof (__ss_v6)); | ||||||
| 	serverAddr6->sin6_family = AF_INET6; | 	serverAddr6->sin6_family = AF_INET6; | ||||||
| 	serverAddr6->sin6_addr = in6addr_any; | 	serverAddr6->sin6_addr = in6addr_any; | ||||||
| #endif | #endif | ||||||
| 	// Getting away with implementation of re-using address:port and instead  | 	/* Getting away with implementation of re-using address:port and | ||||||
| 	// choosing to increment port numbers. | 	 * instead choosing to increment port numbers. | ||||||
| 	// Keeping the re-use address code as an optional behaviour that can be  | 	 * Keeping the re-use address code as an optional behaviour that | ||||||
| 	// turned on if necessary.  | 	 * can be turned on if necessary. | ||||||
| 	// TURN ON the reuseaddr_on option to use the option. | 	 * TURN ON the reuseaddr_on option to use the option. */ | ||||||
| 	if (reuseaddr_on) { | 	if (reuseaddr_on) { | ||||||
| 		// THIS IS ALLOWS US TO BIND AGAIN IMMEDIATELY | 		/* THIS IS ALLOWS US TO BIND AGAIN IMMEDIATELY | ||||||
| 		// AFTER OUR SERVER HAS BEEN CLOSED | 		 * AFTER OUR SERVER HAS BEEN CLOSED | ||||||
| 		// THIS MAY CAUSE TCP TO BECOME LESS RELIABLE | 		 * THIS MAY CAUSE TCP TO BECOME LESS RELIABLE | ||||||
| 		// HOWEVER IT HAS BEEN SUGESTED FOR TCP SERVERS | 		 * HOWEVER IT HAS BEEN SUGESTED FOR TCP SERVERS. */ | ||||||
| 		UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__, | 		UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__, | ||||||
| 			"get_miniserver_sockets: resuseaddr set\n"); | 			"get_miniserver_sockets: resuseaddr is set.\n"); | ||||||
|  |  | ||||||
| 		if (listenfd4 != -1) { | 		if (listenfd4 != -1) { | ||||||
| 			sockError = setsockopt(listenfd4, SOL_SOCKET, SO_REUSEADDR, | 			sockError = setsockopt(listenfd4, SOL_SOCKET, | ||||||
|  | 				SO_REUSEADDR, | ||||||
| 				(const char *)&reuseaddr_on, sizeof (int)); | 				(const char *)&reuseaddr_on, sizeof (int)); | ||||||
| 			if (sockError == -1) { | 			if (sockError == -1) { | ||||||
| 				sock_close(listenfd4); | 				sock_close(listenfd4); | ||||||
| @@ -588,14 +583,17 @@ static int get_miniserver_sockets( | |||||||
| #endif | #endif | ||||||
| 				return UPNP_E_SOCKET_BIND; | 				return UPNP_E_SOCKET_BIND; | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			serverAddr4->sin_port = htons(listen_port4); | 			serverAddr4->sin_port = htons(listen_port4); | ||||||
| 			sockError = bind(listenfd4, (struct sockaddr *)&__ss_v4, | 			sockError = bind(listenfd4, | ||||||
|  | 				(struct sockaddr *)&__ss_v4, | ||||||
| 				sizeof (__ss_v4)); | 				sizeof (__ss_v4)); | ||||||
| 			if (sockError == -1) { | 			if (sockError == -1) { | ||||||
| 				strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); | 				strerror_r(errno, errorBuffer, | ||||||
| 				UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, | 					ERROR_BUFFER_LEN); | ||||||
| 					"get_miniserver_sockets: Error in IPv4 bind(): %s\n",  | 				UpnpPrintf(UPNP_INFO, MSERV, | ||||||
|  | 					__FILE__, __LINE__, | ||||||
|  | 					"get_miniserver_sockets: " | ||||||
|  | 					"Error in IPv4 bind(): %s\n",  | ||||||
| 					errorBuffer); | 					errorBuffer); | ||||||
| 				sock_close(listenfd4); | 				sock_close(listenfd4); | ||||||
| #ifdef UPNP_ENABLE_IPV6 | #ifdef UPNP_ENABLE_IPV6 | ||||||
| @@ -605,24 +603,27 @@ static int get_miniserver_sockets( | |||||||
| 				return UPNP_E_SOCKET_BIND; | 				return UPNP_E_SOCKET_BIND; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| #ifdef UPNP_ENABLE_IPV6 | #ifdef UPNP_ENABLE_IPV6 | ||||||
| 		if (listenfd6 != -1) { | 		if (listenfd6 != -1) { | ||||||
| 			sockError = setsockopt(listenfd6, SOL_SOCKET, SO_REUSEADDR, | 			sockError = setsockopt(listenfd6, SOL_SOCKET, | ||||||
|  | 				SO_REUSEADDR, | ||||||
| 			(const char *)&reuseaddr_on, sizeof (int)); | 			(const char *)&reuseaddr_on, sizeof (int)); | ||||||
| 			if (sockError == -1) { | 			if (sockError == -1) { | ||||||
| 				sock_close(listenfd4); | 				sock_close(listenfd4); | ||||||
| 				sock_close(listenfd6); | 				sock_close(listenfd6); | ||||||
| 				return UPNP_E_SOCKET_BIND; | 				return UPNP_E_SOCKET_BIND; | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			serverAddr6->sin6_port = htons(listen_port6); | 			serverAddr6->sin6_port = htons(listen_port6); | ||||||
| 			sockError = bind(listenfd6, (struct sockaddr *)&__ss_v6, | 			sockError = bind(listenfd6, | ||||||
|  | 				(struct sockaddr *)&__ss_v6, | ||||||
| 				sizeof (__ss_v6)); | 				sizeof (__ss_v6)); | ||||||
| 			if (sockError == -1) { | 			if (sockError == -1) { | ||||||
| 				strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); | 				strerror_r(errno, errorBuffer, | ||||||
| 				UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__, | 					ERROR_BUFFER_LEN); | ||||||
| 					"get_miniserver_sockets: Error in IPv6 bind(): %s\n",  | 				UpnpPrintf(UPNP_INFO, MSERV, | ||||||
|  | 					__FILE__, __LINE__, | ||||||
|  | 					"get_miniserver_sockets: " | ||||||
|  | 					"Error in IPv6 bind(): %s\n",  | ||||||
| 					errorBuffer); | 					errorBuffer); | ||||||
| 				sock_close(listenfd4); | 				sock_close(listenfd4); | ||||||
| 				sock_close(listenfd6); | 				sock_close(listenfd6); | ||||||
| @@ -630,13 +631,15 @@ static int get_miniserver_sockets( | |||||||
| 				return UPNP_E_SOCKET_BIND; | 				return UPNP_E_SOCKET_BIND; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| #endif  //IPv6 | #endif  /* IPv6 */ | ||||||
| 	} else { | 	} else { | ||||||
| 		if (listenfd4 != -1) { | 		if (listenfd4 != -1) { | ||||||
| 			unsigned short orig_listen_port4 = listen_port4; | 			unsigned short orig_listen_port4 = listen_port4; | ||||||
| 			do { | 			do { | ||||||
| 				serverAddr4->sin_port = htons(listen_port4++); | 				serverAddr4->sin_port = htons(listen_port4++); | ||||||
| 				sockError = bind(listenfd4, (struct sockaddr *)serverAddr4, sizeof(*serverAddr4)); | 				sockError = bind(listenfd4, | ||||||
|  | 					(struct sockaddr *)serverAddr4, | ||||||
|  | 					sizeof(*serverAddr4)); | ||||||
| 				if (sockError == -1) { | 				if (sockError == -1) { | ||||||
| #ifdef WIN32 | #ifdef WIN32 | ||||||
| 					errCode = WSAGetLastError(); | 					errCode = WSAGetLastError(); | ||||||
| @@ -649,27 +652,31 @@ static int get_miniserver_sockets( | |||||||
| 				} else { | 				} else { | ||||||
| 					errCode = 0; | 					errCode = 0; | ||||||
| 				} | 				} | ||||||
| 			} while ( errCode != 0 && (listen_port4 >= orig_listen_port4) ); | 			} while (errCode != 0 && | ||||||
|  | 				 listen_port4 >= orig_listen_port4); | ||||||
| 			if (sockError == -1) { | 			if (sockError == -1) { | ||||||
| 				strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); | 				strerror_r(errno, errorBuffer, | ||||||
| 				UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__, | 					ERROR_BUFFER_LEN); | ||||||
| 					"get_miniserver_sockets: Error in IPv4 bind(): %s\n", | 				UpnpPrintf(UPNP_INFO, MSERV, | ||||||
|  | 					__FILE__, __LINE__, | ||||||
|  | 					"get_miniserver_sockets: " | ||||||
|  | 					"Error in IPv4 bind(): %s\n", | ||||||
| 					errorBuffer); | 					errorBuffer); | ||||||
| 				sock_close(listenfd4); | 				sock_close(listenfd4); | ||||||
| #ifdef UPNP_ENABLE_IPV6 | #ifdef UPNP_ENABLE_IPV6 | ||||||
| 				sock_close(listenfd6); | 				sock_close(listenfd6); | ||||||
| #endif | #endif | ||||||
| 				return UPNP_E_SOCKET_BIND;  // bind failed | 				/* Bind failied. */ | ||||||
|  | 				return UPNP_E_SOCKET_BIND; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| #ifdef UPNP_ENABLE_IPV6 | #ifdef UPNP_ENABLE_IPV6 | ||||||
| 		if (listenfd6 != -1) { | 		if (listenfd6 != -1) { | ||||||
| 			unsigned short orig_listen_port6 = listen_port6; | 			unsigned short orig_listen_port6 = listen_port6; | ||||||
| 			do { | 			do { | ||||||
| 				serverAddr6->sin6_port = htons(listen_port6++); | 				serverAddr6->sin6_port = htons(listen_port6++); | ||||||
| 				sockError = bind(listenfd6, (struct sockaddr *)serverAddr6, | 				sockError = bind(listenfd6, | ||||||
|  | 					(struct sockaddr *)serverAddr6, | ||||||
| 					sizeof(*serverAddr6)); | 					sizeof(*serverAddr6)); | ||||||
| 				if (sockError == -1) { | 				if (sockError == -1) { | ||||||
| #ifdef WIN32 | #ifdef WIN32 | ||||||
| @@ -683,25 +690,26 @@ static int get_miniserver_sockets( | |||||||
| 				} else { | 				} else { | ||||||
| 					errCode = 0; | 					errCode = 0; | ||||||
| 				} | 				} | ||||||
| 			} while (errCode != 0 && (listen_port6 >= orig_listen_port6)); | 			} while (errCode != 0 && | ||||||
|  | 				 listen_port6 >= orig_listen_port6); | ||||||
| 			if (sockError == -1) { | 			if (sockError == -1) { | ||||||
| 				strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); | 				strerror_r(errno, errorBuffer, | ||||||
| 				UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__, | 					ERROR_BUFFER_LEN); | ||||||
| 					"get_miniserver_sockets: Error in IPv6 bind(): %s\n", | 				UpnpPrintf(UPNP_INFO, MSERV, | ||||||
|  | 					__FILE__, __LINE__, | ||||||
|  | 					"get_miniserver_sockets: " | ||||||
|  | 					"Error in IPv6 bind(): %s\n", | ||||||
| 					errorBuffer); | 					errorBuffer); | ||||||
| 				sock_close(listenfd4); | 				sock_close(listenfd4); | ||||||
| 				sock_close(listenfd6); | 				sock_close(listenfd6); | ||||||
| 				/* Bind failied */ | 				/* Bind failied. */ | ||||||
| 				return UPNP_E_SOCKET_BIND; | 				return UPNP_E_SOCKET_BIND; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| #endif | #endif | ||||||
| 	} | 	} | ||||||
|  | 	UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__, | ||||||
| 	UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, | 		"get_miniserver_sockets: bind successful\n"); | ||||||
| 		"get_miniserver_sockets: bind successful\n" ); |  | ||||||
|  |  | ||||||
| 	if (listenfd4 != -1) { | 	if (listenfd4 != -1) { | ||||||
| 		ret_code = listen(listenfd4, SOMAXCONN); | 		ret_code = listen(listenfd4, SOMAXCONN); | ||||||
| 		if (ret_code == -1) { | 		if (ret_code == -1) { | ||||||
| @@ -760,10 +768,10 @@ static int get_miniserver_sockets( | |||||||
|  *  listened on to know when it is time to stop the Miniserver. |  *  listened on to know when it is time to stop the Miniserver. | ||||||
|  * |  * | ||||||
|  * \return  |  * \return  | ||||||
|  *	\li UPNP_E_OUTOF_SOCKET: Failed to create a socket. |  * \li \c UPNP_E_OUTOF_SOCKET: Failed to create a socket. | ||||||
|  *	\li UPNP_E_SOCKET_BIND: Bind() failed. |  * \li \c UPNP_E_SOCKET_BIND: Bind() failed. | ||||||
|  *	\li UPNP_E_INTERNAL_ERROR: Port returned by the socket layer is < 0. |  * \li \c UPNP_E_INTERNAL_ERROR: Port returned by the socket layer is < 0. | ||||||
|  *	\li UPNP_E_SUCCESS: Success. |  * \li \c UPNP_E_SUCCESS: Success. | ||||||
|  */ |  */ | ||||||
| static int get_miniserver_stopsock( | static int get_miniserver_stopsock( | ||||||
| 	/*! [in] Miniserver Socket Array. */ | 	/*! [in] Miniserver Socket Array. */ | ||||||
| @@ -781,8 +789,7 @@ static int get_miniserver_stopsock( | |||||||
| 			"Error in socket(): %s\n", errorBuffer); | 			"Error in socket(): %s\n", errorBuffer); | ||||||
| 		return UPNP_E_OUTOF_SOCKET; | 		return UPNP_E_OUTOF_SOCKET; | ||||||
| 	} | 	} | ||||||
|  | 	/* Bind to local socket. */ | ||||||
| 	// bind to local socket |  | ||||||
| 	memset(&stop_sockaddr, 0, sizeof (stop_sockaddr)); | 	memset(&stop_sockaddr, 0, sizeof (stop_sockaddr)); | ||||||
| 	stop_sockaddr.sin_family = AF_INET; | 	stop_sockaddr.sin_family = AF_INET; | ||||||
| 	stop_sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); | 	stop_sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); | ||||||
| @@ -795,13 +802,11 @@ static int get_miniserver_stopsock( | |||||||
| 		sock_close(miniServerStopSock); | 		sock_close(miniServerStopSock); | ||||||
| 		return UPNP_E_SOCKET_BIND; | 		return UPNP_E_SOCKET_BIND; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	miniStopSockPort = get_port( miniServerStopSock ); | 	miniStopSockPort = get_port( miniServerStopSock ); | ||||||
| 	if (miniStopSockPort <= 0) { | 	if (miniStopSockPort <= 0) { | ||||||
| 		sock_close(miniServerStopSock); | 		sock_close(miniServerStopSock); | ||||||
| 		return UPNP_E_INTERNAL_ERROR; | 		return UPNP_E_INTERNAL_ERROR; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	out->miniServerStopSock = miniServerStopSock; | 	out->miniServerStopSock = miniServerStopSock; | ||||||
| 	out->stopPort = miniStopSockPort; | 	out->stopPort = miniStopSockPort; | ||||||
|  |  | ||||||
| @@ -824,15 +829,16 @@ static inline void InitMiniServerSockArray(MiniServerSockArray *miniSocket) | |||||||
| } | } | ||||||
|  |  | ||||||
| int StartMiniServer( | int StartMiniServer( | ||||||
| 	/*! [in,out] Port on which the server listens for incoming IPv4 connections. */ | 	/*! [in,out] Port on which the server listens for incoming IPv4 | ||||||
|  | 	 * connections. */ | ||||||
| 	unsigned short *listen_port4,  | 	unsigned short *listen_port4,  | ||||||
| 	/*! [in,out] Port on which the server listens for incoming IPv6 connections. */ | 	/*! [in,out] Port on which the server listens for incoming IPv6 | ||||||
|  | 	 * connections. */ | ||||||
| 	unsigned short *listen_port6) | 	unsigned short *listen_port6) | ||||||
| { | { | ||||||
| 	int ret_code; | 	int ret_code; | ||||||
| 	int count; | 	int count; | ||||||
| 	int max_count = 10000; | 	int max_count = 10000; | ||||||
|  |  | ||||||
| 	MiniServerSockArray *miniSocket; | 	MiniServerSockArray *miniSocket; | ||||||
| 	ThreadPoolJob job; | 	ThreadPoolJob job; | ||||||
|  |  | ||||||
| @@ -840,22 +846,21 @@ int StartMiniServer( | |||||||
| 		/* miniserver running. */ | 		/* miniserver running. */ | ||||||
| 		return UPNP_E_INTERNAL_ERROR; | 		return UPNP_E_INTERNAL_ERROR; | ||||||
| 	} | 	} | ||||||
|  | 	miniSocket = (MiniServerSockArray *)malloc( | ||||||
| 	miniSocket = (MiniServerSockArray *)malloc(sizeof (MiniServerSockArray)); | 		sizeof (MiniServerSockArray)); | ||||||
| 	if (!miniSocket) { | 	if (!miniSocket) { | ||||||
| 		return UPNP_E_OUTOF_MEMORY; | 		return UPNP_E_OUTOF_MEMORY; | ||||||
| 	} | 	} | ||||||
| 	InitMiniServerSockArray(miniSocket); | 	InitMiniServerSockArray(miniSocket); | ||||||
|  |  | ||||||
| #ifdef INTERNAL_WEB_SERVER | #ifdef INTERNAL_WEB_SERVER | ||||||
| 	/* V4 and V6 http listeners. */ | 	/* V4 and V6 http listeners. */ | ||||||
| 	ret_code = get_miniserver_sockets(miniSocket, *listen_port4, *listen_port6); | 	ret_code = get_miniserver_sockets( | ||||||
|  | 		miniSocket, *listen_port4, *listen_port6); | ||||||
| 	if (ret_code != UPNP_E_SUCCESS) { | 	if (ret_code != UPNP_E_SUCCESS) { | ||||||
| 		free(miniSocket); | 		free(miniSocket); | ||||||
| 		return ret_code; | 		return ret_code; | ||||||
| 	} | 	} | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| 	/* Stop socket (To end miniserver processing). */ | 	/* Stop socket (To end miniserver processing). */ | ||||||
| 	ret_code = get_miniserver_stopsock(miniSocket); | 	ret_code = get_miniserver_stopsock(miniSocket); | ||||||
| 	if (ret_code != UPNP_E_SUCCESS) { | 	if (ret_code != UPNP_E_SUCCESS) { | ||||||
| @@ -864,7 +869,6 @@ int StartMiniServer( | |||||||
| 		free(miniSocket); | 		free(miniSocket); | ||||||
| 		return ret_code; | 		return ret_code; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* SSDP socket for discovery/advertising. */ | 	/* SSDP socket for discovery/advertising. */ | ||||||
| 	ret_code = get_ssdp_sockets(miniSocket); | 	ret_code = get_ssdp_sockets(miniSocket); | ||||||
| 	if (ret_code != UPNP_E_SUCCESS) { | 	if (ret_code != UPNP_E_SUCCESS) { | ||||||
| @@ -874,7 +878,6 @@ int StartMiniServer( | |||||||
| 		free(miniSocket); | 		free(miniSocket); | ||||||
| 		return ret_code; | 		return ret_code; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	TPJobInit(&job, (start_routine)RunMiniServer, (void *)miniSocket); | 	TPJobInit(&job, (start_routine)RunMiniServer, (void *)miniSocket); | ||||||
| 	TPJobSetPriority(&job, MED_PRIORITY); | 	TPJobSetPriority(&job, MED_PRIORITY); | ||||||
| 	TPJobSetFreeFunction(&job, (free_routine)free); | 	TPJobSetFreeFunction(&job, (free_routine)free); | ||||||
| @@ -890,15 +893,15 @@ int StartMiniServer( | |||||||
| 		sock_close(miniSocket->ssdpReqSock6); | 		sock_close(miniSocket->ssdpReqSock6); | ||||||
| 		return UPNP_E_OUTOF_MEMORY; | 		return UPNP_E_OUTOF_MEMORY; | ||||||
| 	} | 	} | ||||||
| 	// wait for miniserver to start | 	/* Wait for miniserver to start. */ | ||||||
| 	count = 0; | 	count = 0; | ||||||
| 	while (gMServState != MSERV_RUNNING && count < max_count) { | 	while (gMServState != MSERV_RUNNING && count < max_count) { | ||||||
| 		usleep(50 * 1000);    // 0.05s | 		/* 0.05s */ | ||||||
|  | 		usleep(50 * 1000); | ||||||
| 		count++; | 		count++; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// taking too long to start that thread |  | ||||||
| 	if (count >= max_count) { | 	if (count >= max_count) { | ||||||
|  | 		/* Took it too long to start that thread. */ | ||||||
| 		sock_close(miniSocket->miniServerSock4); | 		sock_close(miniSocket->miniServerSock4); | ||||||
| 		sock_close(miniSocket->miniServerSock6); | 		sock_close(miniSocket->miniServerSock6); | ||||||
| 		sock_close(miniSocket->miniServerStopSock); | 		sock_close(miniSocket->miniServerStopSock); | ||||||
| @@ -932,7 +935,6 @@ int StopMiniServer() | |||||||
| 	} else { | 	} else { | ||||||
| 		return 0; | 		return 0; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	sock = socket(AF_INET, SOCK_DGRAM, 0); | 	sock = socket(AF_INET, SOCK_DGRAM, 0); | ||||||
| 	if (sock == -1) { | 	if (sock == -1) { | ||||||
| 		strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); | 		strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); | ||||||
| @@ -941,7 +943,6 @@ int StopMiniServer() | |||||||
| 			errorBuffer); | 			errorBuffer); | ||||||
| 		return 0; | 		return 0; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	while(gMServState != MSERV_IDLE) { | 	while(gMServState != MSERV_IDLE) { | ||||||
| 		ssdpAddr.sin_family = AF_INET; | 		ssdpAddr.sin_family = AF_INET; | ||||||
| 		ssdpAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); | 		ssdpAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /************************************************************************ | /************************************************************************** | ||||||
|  * |  * | ||||||
|  * Copyright (c) 2000-2003 Intel Corporation |  * Copyright (c) 2000-2003 Intel Corporation | ||||||
|  * All rights reserved. |  * All rights reserved. | ||||||
| @@ -6,12 +6,12 @@ | |||||||
|  * Redistribution and use in source and binary forms, with or without |  * Redistribution and use in source and binary forms, with or without | ||||||
|  * modification, are permitted provided that the following conditions are met: |  * modification, are permitted provided that the following conditions are met: | ||||||
|  * |  * | ||||||
|  * * Redistributions of source code must retain the above copyright notice,  |  * - Redistributions of source code must retain the above copyright notice, | ||||||
|  * this list of conditions and the following disclaimer. |  * this list of conditions and the following disclaimer. | ||||||
|  * * Redistributions in binary form must reproduce the above copyright notice,  |  * - Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  * this list of conditions and the following disclaimer in the documentation |  * this list of conditions and the following disclaimer in the documentation | ||||||
|  * and/or other materials provided with the distribution. |  * and/or other materials provided with the distribution. | ||||||
|  * Neither name of Intel Corporation nor the names of its contributors  |  * - Neither name of Intel Corporation nor the names of its contributors | ||||||
|  * may be used to endorse or promote products derived from this software |  * may be used to endorse or promote products derived from this software | ||||||
|  * without specific prior written permission. |  * without specific prior written permission. | ||||||
|  * |  * | ||||||
| @@ -27,12 +27,17 @@ | |||||||
|  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||||
|  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  * |  * | ||||||
|  ************************************************************************/ |  **************************************************************************/ | ||||||
|  |  | ||||||
| #ifndef MINISERVER_H | #ifndef MINISERVER_H | ||||||
| #define MINISERVER_H | #define MINISERVER_H | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /*! | ||||||
|  |  * \file | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  |  | ||||||
| #include "sock.h" | #include "sock.h" | ||||||
| #include "httpparser.h" | #include "httpparser.h" | ||||||
|  |  | ||||||
| @@ -41,32 +46,43 @@ extern SOCKET gMiniServerStopSock; | |||||||
|  |  | ||||||
|  |  | ||||||
| typedef struct MServerSockArray { | typedef struct MServerSockArray { | ||||||
| 	/* socket for listening for miniserver requests */ | 	/*! IPv4 socket for listening for miniserver requests. */ | ||||||
| 	SOCKET miniServerSock4; | 	SOCKET miniServerSock4; | ||||||
|  | 	/*! IPv6 Socket for listening for miniserver requests. */ | ||||||
| 	SOCKET miniServerSock6; | 	SOCKET miniServerSock6; | ||||||
| 	/* socket for stopping miniserver */ | 	/*! Socket for stopping miniserver */ | ||||||
| 	SOCKET miniServerStopSock; | 	SOCKET miniServerStopSock; | ||||||
| 	/* socket for incoming advertisments and search requests */ | 	/*! IPv4 SSDP Socket for incoming advertisments and search requests. */ | ||||||
| 	SOCKET ssdpSock4; | 	SOCKET ssdpSock4; | ||||||
|  | 	/*! IPv6 SSDP Socket for incoming advertisments and search requests. */ | ||||||
| 	SOCKET ssdpSock6; | 	SOCKET ssdpSock6; | ||||||
|  | 	/*! IPv6 SSDP Socket for incoming advertisments and search requests. */ | ||||||
| 	SOCKET ssdpSock6UlaGua; | 	SOCKET ssdpSock6UlaGua; | ||||||
|  | 	/* ! . */ | ||||||
| 	SOCKET stopPort; | 	SOCKET stopPort; | ||||||
|  | 	/* ! . */ | ||||||
| 	SOCKET miniServerPort4; | 	SOCKET miniServerPort4; | ||||||
|  | 	/* ! . */ | ||||||
| 	SOCKET miniServerPort6; | 	SOCKET miniServerPort6; | ||||||
|  |  | ||||||
| #ifdef INCLUDE_CLIENT_APIS | #ifdef INCLUDE_CLIENT_APIS | ||||||
| 	/* socket for sending search requests and receiving search replies */ | 	/*! IPv4 SSDP socket for sending search requests and receiving search | ||||||
|  | 	 * replies */ | ||||||
| 	SOCKET ssdpReqSock4; | 	SOCKET ssdpReqSock4; | ||||||
|  | 	/*! IPv6 SSDP socket for sending search requests and receiving search | ||||||
|  | 	 * replies */ | ||||||
| 	SOCKET ssdpReqSock6; | 	SOCKET ssdpReqSock6; | ||||||
| #endif /* INCLUDE_CLIENT_APIS */ | #endif /* INCLUDE_CLIENT_APIS */ | ||||||
| } MiniServerSockArray; | } MiniServerSockArray; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /*! . */ | ||||||
| typedef void (*MiniServerCallback)( | typedef void (*MiniServerCallback)( | ||||||
|  | 	/* ! . */ | ||||||
| 	IN http_parser_t *parser, | 	IN http_parser_t *parser, | ||||||
|  | 	/* ! . */ | ||||||
| 	IN http_message_t* request,  | 	IN http_message_t* request,  | ||||||
| 	IN SOCKINFO *info ); | 	/* ! . */ | ||||||
|  | 	IN SOCKINFO *info); | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| @@ -118,9 +134,11 @@ void SetGenaCallback( | |||||||
|  *	\li On error: UPNP_E_XXX. |  *	\li On error: UPNP_E_XXX. | ||||||
|  */ |  */ | ||||||
| int StartMiniServer( | int StartMiniServer( | ||||||
| 	/*! [in,out] Port on which the server listens for incoming IPv4 connections. */ | 	/*! [in,out] Port on which the server listens for incoming IPv4 | ||||||
|  | 	 * connections. */ | ||||||
| 	unsigned short *listen_port4,  | 	unsigned short *listen_port4,  | ||||||
| 	/*! [in,out] Port on which the server listens for incoming IPv6 connections. */ | 	/*! [in,out] Port on which the server listens for incoming IPv6 | ||||||
|  | 	 * connections. */ | ||||||
| 	unsigned short *listen_port6); | 	unsigned short *listen_port6); | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Marcelo Roberto Jimenez
					Marcelo Roberto Jimenez