include upstream ip1000a driver version 2.09f
[linux-2.4.git] / net / khttpd / sockets.c
1 /*
2
3 kHTTPd -- the next generation
4
5 Basic socket functions
6
7 */
8 /****************************************************************
9  *      This program is free software; you can redistribute it and/or modify
10  *      it under the terms of the GNU General Public License as published by
11  *      the Free Software Foundation; either version 2, or (at your option)
12  *      any later version.
13  *
14  *      This program is distributed in the hope that it will be useful,
15  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  *      GNU General Public License for more details.
18  *
19  *      You should have received a copy of the GNU General Public License
20  *      along with this program; if not, write to the Free Software
21  *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22  *
23  ****************************************************************/
24
25 #include "prototypes.h"
26 #include <linux/kernel.h>
27 #include <linux/net.h>
28 #include <linux/version.h>
29 #include <linux/smp_lock.h>
30 #include <net/sock.h>
31
32
33 /*
34
35 MainSocket is shared by all threads, therefore it has to be
36 a global variable.
37
38 */
39 struct socket *MainSocket=NULL;
40
41
42 int StartListening(const int Port)
43 {
44         struct socket *sock;
45         struct sockaddr_in sin;
46         int error;
47         
48         EnterFunction("StartListening");
49         
50         /* First create a socket */
51         
52         error = sock_create(PF_INET,SOCK_STREAM,IPPROTO_TCP,&sock);
53         if (error<0) 
54              (void)printk(KERN_ERR "Error during creation of socket; terminating\n");
55
56
57
58         /* Now bind the socket */
59         
60         sin.sin_family       = AF_INET;
61         sin.sin_addr.s_addr  = INADDR_ANY;
62         sin.sin_port         = htons((unsigned short)Port);
63         
64         error = sock->ops->bind(sock,(struct sockaddr*)&sin,sizeof(sin));
65         if (error<0)
66         {
67                 (void)printk(KERN_ERR "kHTTPd: Error binding socket. This means that some other \n");
68                 (void)printk(KERN_ERR "        daemon is (or was a short time ago) using port %i.\n",Port);
69                 return 0;       
70         }
71
72         /* Grrr... setsockopt() does this. */
73         sock->sk->reuse   = 1;
74
75         /* Now, start listening on the socket */
76         
77         /* I have no idea what a sane backlog-value is. 48 works so far. */
78         
79         error=sock->ops->listen(sock,48);       
80         if (error!=0)
81                 (void)printk(KERN_ERR "kHTTPd: Error listening on socket \n");
82         
83         MainSocket = sock;
84         
85         LeaveFunction("StartListening");
86         return 1; 
87 }       
88
89 void StopListening(void)
90 {
91         struct socket *sock;
92         
93         EnterFunction("StopListening");
94         if (MainSocket==NULL) return;
95         
96         sock=MainSocket;
97         MainSocket = NULL;
98         sock_release(sock);
99
100         LeaveFunction("StopListening");
101 }