diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-09-17 19:44:53 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-09-17 19:44:53 +0000 |
commit | 14f445102e0b861845ccd53a5d6777a25bc75c7e (patch) | |
tree | dd687f869f194e1a85777221a8c8f0cd6b836205 /apps/netutils/webserver/httpd.c | |
parent | 040391cfab5aa7d508055ca12f551f5e5a3f924c (diff) | |
download | nuttx-14f445102e0b861845ccd53a5d6777a25bc75c7e.tar.gz nuttx-14f445102e0b861845ccd53a5d6777a25bc75c7e.tar.bz2 nuttx-14f445102e0b861845ccd53a5d6777a25bc75c7e.zip |
Add option for single connection web server. From Kate.
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5157 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'apps/netutils/webserver/httpd.c')
-rw-r--r-- | apps/netutils/webserver/httpd.c | 65 |
1 files changed, 63 insertions, 2 deletions
diff --git a/apps/netutils/webserver/httpd.c b/apps/netutils/webserver/httpd.c index b482b1e03..bb70e34a1 100644 --- a/apps/netutils/webserver/httpd.c +++ b/apps/netutils/webserver/httpd.c @@ -54,10 +54,13 @@ #include <stdlib.h> #include <unistd.h> #include <string.h> -#include <pthread.h> #include <errno.h> #include <debug.h> +#ifndef CONFIG_NETUTILS_HTTPD_SINGLETHREAD +# include <pthread.h> +#endif + #include <nuttx/net/uip/uip.h> #include <apps/netutils/uiplib.h> #include <apps/netutils/httpd.h> @@ -595,6 +598,60 @@ static void *httpd_handler(void *arg) return NULL; } +#ifdef CONFIG_NETUTILS_HTTPD_SINGLETHREAD +static void single_server(uint16_t portno, pthread_startroutine_t handler, int stacksize) +{ + struct sockaddr_in myaddr; + socklen_t addrlen; + int listensd; + int acceptsd; +#ifdef CONFIG_NET_HAVE_SOLINGER + struct linger ling; +#endif + + listensd = uip_listenon(portno); + if (listensd < 0) + { + return ERROR; + } + + /* Begin serving connections */ + + for (;;) + { + addrlen = sizeof(struct sockaddr_in); + acceptsd = accept(listensd, (struct sockaddr*)&myaddr, &addrlen); + + if (acceptsd < 0) + { + ndbg("accept failure: %d\n", errno); + break;; + } + + nvdbg("Connection accepted -- serving sd=%d\n", acceptsd); + + /* Configure to "linger" until all data is sent when the socket is closed */ + +#ifdef CONFIG_NET_HAVE_SOLINGER + ling.l_onoff = 1; + ling.l_linger = 30; /* timeout is seconds */ + if (setsockopt(acceptsd, SOL_SOCKET, SO_LINGER, &ling, sizeof(struct linger)) < 0) + { + close(acceptsd); + ndbg("setsockopt SO_LINGER failure: %d\n", errno); + break;; + } +#endif + + /* Handle the request. This blocks until complete. */ + + (void) httpd_handler((void*)acceptsd); + } + + return ERROR; +} +#endif + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -611,9 +668,13 @@ int httpd_listen(void) { /* Execute httpd_handler on each connection to port 80 */ +#ifdef CONFIG_NETUTILS_HTTPD_SINGLETHREAD + single_server(HTONS(80), httpd_handler, CONFIG_NETUTILS_HTTPDSTACKSIZE); +#else uip_server(HTONS(80), httpd_handler, CONFIG_NETUTILS_HTTPDSTACKSIZE); +#endif - /* uip_server only returns on errors */ + /* the server accept loop only returns on errors */ return ERROR; } |