mirror of
https://git.gnunet.org/libmicrohttpd.git
synced 2026-10-04 04:03:18 +03:00
partial fix to bad smell [long func] in MHD_start_daemon
This commit is contained in:
1 parent
abed5ccc4d
commit
44cac11c40
1 file changed
+87
-69
+87
-69
@@ -817,6 +817,83 @@ MHD_select_thread (void *cls)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Bind daemon to socket
|
||||
*
|
||||
* @param options passed to the daemon
|
||||
* @param port for the daemon to bind to
|
||||
* @param servaddr: optional user initialized servaddr to bind to
|
||||
* @param daemon
|
||||
* @return 0 upon sucess or -1 on error
|
||||
*/
|
||||
static int bind_to_socket(unsigned int options,
|
||||
unsigned short port,
|
||||
const struct sockaddr * servaddr, struct MHD_Daemon * daemon ){
|
||||
int socket_fd;
|
||||
const int on = 1;
|
||||
struct sockaddr_in servaddr4;
|
||||
struct sockaddr_in6 servaddr6;
|
||||
socklen_t addrlen;
|
||||
|
||||
if ((options & MHD_USE_IPv6) != 0)
|
||||
socket_fd = SOCKET (PF_INET6, SOCK_STREAM, 0);
|
||||
else
|
||||
socket_fd = SOCKET (PF_INET, SOCK_STREAM, 0);
|
||||
if (socket_fd < 0)
|
||||
{
|
||||
#if HAVE_MESSAGES
|
||||
if ((options & MHD_USE_DEBUG) != 0)
|
||||
FPRINTF (stderr, "Call to socket failed: %s\n", STRERROR (errno));
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
if ((SETSOCKOPT (socket_fd,
|
||||
SOL_SOCKET,
|
||||
SO_REUSEADDR,
|
||||
&on, sizeof (on)) < 0) && (options & MHD_USE_DEBUG) != 0)
|
||||
{
|
||||
#if HAVE_MESSAGES
|
||||
FPRINTF (stderr, "setsockopt failed: %s\n", STRERROR (errno));
|
||||
#endif
|
||||
}
|
||||
|
||||
/* check for user supplied sockaddr */
|
||||
if ((options & MHD_USE_IPv6) != 0)
|
||||
addrlen = sizeof (struct sockaddr_in6);
|
||||
else
|
||||
addrlen = sizeof (struct sockaddr_in);
|
||||
if (NULL == servaddr)
|
||||
{
|
||||
if ((options & MHD_USE_IPv6) != 0)
|
||||
{
|
||||
memset (&servaddr6, 0, sizeof (struct sockaddr_in6));
|
||||
servaddr6.sin6_family = AF_INET6;
|
||||
servaddr6.sin6_port = htons (port);
|
||||
servaddr = (struct sockaddr *) &servaddr6;
|
||||
}
|
||||
else
|
||||
{
|
||||
memset (&servaddr4, 0, sizeof (struct sockaddr_in));
|
||||
servaddr4.sin_family = AF_INET;
|
||||
servaddr4.sin_port = htons (port);
|
||||
servaddr = (struct sockaddr *) &servaddr4;
|
||||
}
|
||||
}
|
||||
|
||||
if (BIND (socket_fd, servaddr, addrlen) < 0)
|
||||
{
|
||||
#if HAVE_MESSAGES
|
||||
if ((options & MHD_USE_DEBUG) != 0)
|
||||
FPRINTF (stderr,
|
||||
"Failed to bind to port %u: %s\n", port, STRERROR (errno));
|
||||
#endif
|
||||
CLOSE (socket_fd);
|
||||
return -1;
|
||||
}
|
||||
daemon->socket_fd = socket_fd;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Start a webserver on the given port.
|
||||
*
|
||||
@@ -862,13 +939,8 @@ MHD_start_daemon_va (unsigned int options,
|
||||
void *apc_cls,
|
||||
MHD_AccessHandlerCallback dh, void *dh_cls, va_list ap)
|
||||
{
|
||||
const int on = 1;
|
||||
const struct sockaddr * servaddr = NULL;
|
||||
struct MHD_Daemon *retVal;
|
||||
int socket_fd;
|
||||
struct sockaddr_in servaddr4;
|
||||
struct sockaddr_in6 servaddr6;
|
||||
const struct sockaddr *servaddr = NULL;
|
||||
socklen_t addrlen;
|
||||
enum MHD_OPTION opt;
|
||||
|
||||
if ((port == 0) || (dh == NULL))
|
||||
@@ -976,73 +1048,19 @@ MHD_start_daemon_va (unsigned int options,
|
||||
}
|
||||
}
|
||||
|
||||
if ((options & MHD_USE_IPv6) != 0)
|
||||
socket_fd = SOCKET (PF_INET6, SOCK_STREAM, 0);
|
||||
else
|
||||
socket_fd = SOCKET (PF_INET, SOCK_STREAM, 0);
|
||||
if (socket_fd < 0)
|
||||
{
|
||||
#if HAVE_MESSAGES
|
||||
if ((options & MHD_USE_DEBUG) != 0)
|
||||
FPRINTF (stderr, "Call to socket failed: %s\n", STRERROR (errno));
|
||||
#endif
|
||||
free (retVal);
|
||||
return NULL;
|
||||
}
|
||||
if ((SETSOCKOPT (socket_fd,
|
||||
SOL_SOCKET,
|
||||
SO_REUSEADDR,
|
||||
&on, sizeof (on)) < 0) && (options & MHD_USE_DEBUG) != 0)
|
||||
{
|
||||
#if HAVE_MESSAGES
|
||||
FPRINTF (stderr, "setsockopt failed: %s\n", STRERROR (errno));
|
||||
#endif
|
||||
}
|
||||
if (bind_to_socket(options, port, servaddr, retVal)){;
|
||||
free (retVal);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* check for user supplied sockaddr */
|
||||
if ((options & MHD_USE_IPv6) != 0)
|
||||
addrlen = sizeof (struct sockaddr_in6);
|
||||
else
|
||||
addrlen = sizeof (struct sockaddr_in);
|
||||
if (NULL == servaddr)
|
||||
{
|
||||
if ((options & MHD_USE_IPv6) != 0)
|
||||
{
|
||||
memset (&servaddr6, 0, sizeof (struct sockaddr_in6));
|
||||
servaddr6.sin6_family = AF_INET6;
|
||||
servaddr6.sin6_port = htons (port);
|
||||
servaddr = (struct sockaddr *) &servaddr6;
|
||||
}
|
||||
else
|
||||
{
|
||||
memset (&servaddr4, 0, sizeof (struct sockaddr_in));
|
||||
servaddr4.sin_family = AF_INET;
|
||||
servaddr4.sin_port = htons (port);
|
||||
servaddr = (struct sockaddr *) &servaddr4;
|
||||
}
|
||||
}
|
||||
retVal->socket_fd = socket_fd;
|
||||
if (BIND (socket_fd, servaddr, addrlen) < 0)
|
||||
{
|
||||
#if HAVE_MESSAGES
|
||||
if ((options & MHD_USE_DEBUG) != 0)
|
||||
FPRINTF (stderr,
|
||||
"Failed to bind to port %u: %s\n", port, STRERROR (errno));
|
||||
#endif
|
||||
CLOSE (socket_fd);
|
||||
free (retVal);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
if (LISTEN (socket_fd, 20) < 0)
|
||||
if (LISTEN (retVal->socket_fd, 20) < 0)
|
||||
{
|
||||
#if HAVE_MESSAGES
|
||||
if ((options & MHD_USE_DEBUG) != 0)
|
||||
FPRINTF (stderr,
|
||||
"Failed to listen for connections: %s\n", STRERROR (errno));
|
||||
#endif
|
||||
CLOSE (socket_fd);
|
||||
CLOSE (retVal->socket_fd);
|
||||
free (retVal);
|
||||
return NULL;
|
||||
}
|
||||
@@ -1055,7 +1073,7 @@ MHD_start_daemon_va (unsigned int options,
|
||||
#if HAVE_MESSAGES
|
||||
MHD_DLOG (retVal, "Failed to initialize TLS support\n");
|
||||
#endif
|
||||
CLOSE (socket_fd);
|
||||
CLOSE (retVal->socket_fd);
|
||||
free (retVal);
|
||||
return NULL;
|
||||
}
|
||||
@@ -1070,7 +1088,7 @@ MHD_start_daemon_va (unsigned int options,
|
||||
"Failed to create listen thread: %s\n", STRERROR (errno));
|
||||
#endif
|
||||
free (retVal);
|
||||
CLOSE (socket_fd);
|
||||
CLOSE (retVal->socket_fd);
|
||||
return NULL;
|
||||
}
|
||||
return retVal;
|
||||
@@ -1096,7 +1114,7 @@ MHD_stop_daemon (struct MHD_Daemon *daemon)
|
||||
#endif
|
||||
#endif
|
||||
CLOSE (fd);
|
||||
if ((0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) ||
|
||||
if ((0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) ||
|
||||
(0 != (daemon->options & MHD_USE_SELECT_INTERNALLY)))
|
||||
{
|
||||
pthread_kill (daemon->pid, SIGALRM);
|
||||
|
||||
Reference in new issue
Block a user