commit 53ef8b4a60a3bf92aa563a3fac8c203fd19ffc4b
parent 0b22350f52acb6ab5f3f0244195d156473703bd0
Author: Christian Grothoff <christian@grothoff.org>
Date: Sat, 10 Aug 2013 18:41:01 +0000
address #2984
Diffstat:
3 files changed, 36 insertions(+), 2 deletions(-)
diff --git a/ChangeLog b/ChangeLog
@@ -1,3 +1,7 @@
+Sat Aug 10 20:39:27 CEST 2013
+ Use 'errno' to indicate why 'MHD_add_connection' failed
+ (#2984). -CG
+
Sat Aug 10 17:31:31 CEST 2013
Disable use of 'shutdown' on W32 always as winsock
doesn't properly behave with half-closed connections
diff --git a/src/include/microhttpd.h b/src/include/microhttpd.h
@@ -1225,7 +1225,8 @@ MHD_stop_daemon (struct MHD_Daemon *daemon);
* @param addrlen number of bytes in addr
* @return MHD_YES on success, MHD_NO if this daemon could
* not handle the connection (i.e. malloc failed, etc).
- * The socket will be closed in any case.
+ * The socket will be closed in any case; 'errno' is
+ * set to indicate further details about the error.
*/
int
MHD_add_connection (struct MHD_Daemon *daemon,
diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c
@@ -983,7 +983,8 @@ create_thread (pthread_t *thread,
* @param addrlen number of bytes in addr
* @return MHD_YES on success, MHD_NO if this daemon could
* not handle the connection (i.e. malloc failed, etc).
- * The socket will be closed in any case.
+ * The socket will be closed in any case; 'errno' is
+ * set to indicate further details about the error.
*/
int
MHD_add_connection (struct MHD_Daemon *daemon,
@@ -994,6 +995,7 @@ MHD_add_connection (struct MHD_Daemon *daemon,
struct MHD_Connection *connection;
int res_thread_create;
unsigned int i;
+ int eno;
#if OSX
static int on = 1;
#endif
@@ -1011,6 +1013,9 @@ MHD_add_connection (struct MHD_Daemon *daemon,
/* all pools are at their connection limit, must refuse */
if (0 != CLOSE (client_socket))
MHD_PANIC ("close failed\n");
+#if ENFILE
+ errno = ENFILE;
+#endif
return MHD_NO;
}
@@ -1026,6 +1031,9 @@ MHD_add_connection (struct MHD_Daemon *daemon,
#endif
if (0 != CLOSE (client_socket))
MHD_PANIC ("close failed\n");
+#if EINVAL
+ errno = EINVAL;
+#endif
return MHD_NO;
}
#endif
@@ -1046,6 +1054,9 @@ MHD_add_connection (struct MHD_Daemon *daemon,
#endif
if (0 != CLOSE (client_socket))
MHD_PANIC ("close failed\n");
+#if ENFILE
+ errno = ENFILE;
+#endif
return MHD_NO;
}
@@ -1062,6 +1073,9 @@ MHD_add_connection (struct MHD_Daemon *daemon,
if (0 != CLOSE (client_socket))
MHD_PANIC ("close failed\n");
MHD_ip_limit_del (daemon, addr, addrlen);
+#if EACCESS
+ errno = EACCESS;
+#endif
return MHD_NO;
}
@@ -1077,6 +1091,7 @@ MHD_add_connection (struct MHD_Daemon *daemon,
if (NULL == (connection = malloc (sizeof (struct MHD_Connection))))
{
+ eno = errno;
#if HAVE_MESSAGES
MHD_DLOG (daemon,
"Error allocating memory: %s\n",
@@ -1085,6 +1100,7 @@ MHD_add_connection (struct MHD_Daemon *daemon,
if (0 != CLOSE (client_socket))
MHD_PANIC ("close failed\n");
MHD_ip_limit_del (daemon, addr, addrlen);
+ errno = eno;
return MHD_NO;
}
memset (connection, 0, sizeof (struct MHD_Connection));
@@ -1100,12 +1116,16 @@ MHD_add_connection (struct MHD_Daemon *daemon,
MHD_PANIC ("close failed\n");
MHD_ip_limit_del (daemon, addr, addrlen);
free (connection);
+#if ENOMEM
+ errno = ENOMEM;
+#endif
return MHD_NO;
}
connection->connection_timeout = daemon->connection_timeout;
if (NULL == (connection->addr = malloc (addrlen)))
{
+ eno = errno;
#if HAVE_MESSAGES
MHD_DLOG (daemon,
"Error allocating memory: %s\n",
@@ -1116,6 +1136,7 @@ MHD_add_connection (struct MHD_Daemon *daemon,
MHD_ip_limit_del (daemon, addr, addrlen);
MHD_pool_destroy (connection->pool);
free (connection);
+ errno = eno;
return MHD_NO;
}
memcpy (connection->addr, addr, addrlen);
@@ -1196,6 +1217,9 @@ MHD_add_connection (struct MHD_Daemon *daemon,
free (connection->addr);
free (connection);
MHD_PANIC ("Unknown credential type");
+#if EINVAL
+ errno = EINVAL;
+#endif
return MHD_NO;
}
gnutls_transport_set_ptr (connection->tls_session,
@@ -1231,6 +1255,7 @@ MHD_add_connection (struct MHD_Daemon *daemon,
&MHD_handle_connection, connection);
if (0 != res_thread_create)
{
+ eno = errno;
#if HAVE_MESSAGES
MHD_DLOG (daemon, "Failed to create a thread: %s\n",
STRERROR (res_thread_create));
@@ -1252,6 +1277,7 @@ MHD_add_connection (struct MHD_Daemon *daemon,
client_socket,
&event))
{
+ eno = errno;
#if HAVE_MESSAGES
if (0 != (daemon->options & MHD_USE_DEBUG))
MHD_DLOG (daemon,
@@ -1294,6 +1320,9 @@ MHD_add_connection (struct MHD_Daemon *daemon,
MHD_pool_destroy (connection->pool);
free (connection->addr);
free (connection);
+#if EINVAL
+ errno = eno;
+#endif
return MHD_NO;
#endif
}