diff options
Diffstat (limited to 'net/khttpd/sockets.c')
-rw-r--r-- | net/khttpd/sockets.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/net/khttpd/sockets.c b/net/khttpd/sockets.c new file mode 100644 index 000000000..8f8b5d250 --- /dev/null +++ b/net/khttpd/sockets.c @@ -0,0 +1,103 @@ +/* + +kHTTPd -- the next generation + +Basic socket functions + +*/ +/**************************************************************** + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + ****************************************************************/ + +#include "prototypes.h" +#include <linux/kernel.h> +#include <linux/net.h> +#include <linux/version.h> +#include <linux/smp_lock.h> +#include <net/sock.h> + + +/* + +MainSocket is shared by all threads, therefore it has to be +a global variable. + +*/ +struct socket *MainSocket=NULL; + + +int StartListening(const int Port) +{ + struct socket *sock; + struct sockaddr_in sin; + int error; + + EnterFunction("StartListening"); + + /* First create a socket */ + + error = sock_create(PF_INET,SOCK_STREAM,IPPROTO_TCP,&sock); + if (error<0) + (void)printk(KERN_ERR "Error during creation of socket; terminating\n"); + + + + /* Now bind the socket */ + + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = INADDR_ANY; + sin.sin_port = htons((unsigned short)Port); + + error = sock->ops->bind(sock,(struct sockaddr*)&sin,sizeof(sin)); + if (error<0) + { + (void)printk(KERN_ERR "kHTTPd: Error binding socket. This means that some other \n"); + (void)printk(KERN_ERR " daemon is (or was a short time ago) using port %i.\n",Port); + return 0; + } + + sock->sk->reuse = 1; + sock->sk->nonagle = 0; + sock->sk->linger = 1; + + /* Now, start listening on the socket */ + + /* I have no idea what a sane backlog-value is. 48 works so far. */ + + error=sock->ops->listen(sock,48); + if (error!=0) + (void)printk(KERN_ERR "kHTTPd: Error listening on socket \n"); + sock->flags |= SO_ACCEPTCON; + + MainSocket = sock; + + EnterFunction("StartListening"); + return 1; +} + +void StopListening(void) +{ + struct socket *sock; + + EnterFunction("StopListening"); + if (MainSocket==NULL) return; + + sock=MainSocket; + MainSocket = NULL; + sock_release(sock); + + LeaveFunction("StopListening"); +} |