added IOHandler
[TransparentIRC.git] / src / ServerSocket.c
1 /* ServerSocket.c - TransparentIRC 0.1
2  * Copyright (C) 2011-2012  Philipp Kreil (pk910)
3  * 
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  * 
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  * 
14  * You should have received a copy of the GNU General Public License 
15  * along with this program. If not, see <http://www.gnu.org/licenses/>. 
16  */
17 #include "ServerSocket.h"
18 #include "IOHandler.h"
19 #include "UserClient.h"
20
21 static struct ServerSocket *serversockets = NULL;
22
23 static void serversocket_callback(struct IOEvent *event);
24
25 static struct ServerSocket *serversocket_create(struct IODescriptor *iofd) {
26     struct ServerSocket *sock = malloc(sizeof(*sock));
27     sock->iofd = iofd;
28     sock->clientcount = 0;
29     
30     //add ServerSocket to the list
31     sock->prev = NULL;
32     sock->next = serversockets;
33     serversockets->prev = sock;
34     serversockets = sock;
35 }
36
37 static void serversocket_delete(struct ServerSocket *server) {
38     if(server->prev)
39         server->prev->next = server->next;
40     else
41         serversockets = server->next;
42     if(server->next)
43         server->next->prev = server->prev;
44     free(server);
45 }
46
47 struct ServerSocket *serversocket_listen(char *hostname, int port) {
48     struct IODescriptor *iofd = iohandler_listen(hostname, port, serversocket_callback);
49     if(iofd) {
50         struct ServerSocket *server = serversocket_create(iofd);
51         return server;
52     }
53     return NULL;
54 }
55
56 void serversocket_close(struct ServerSocket *server, int keep_clients) {
57     userclient_close_server(server, keep_clients);
58     iohandler_close(server->iofd);
59     serversocket_delete(server);
60 }
61
62 static void serversocket_callback(struct IOEvent *event) {
63     switch(event->type) {
64         case IOEVENT_ACCEPT:
65             struct ServerSocket *server = NULL;
66             for(server = serversockets; server; server = server->next) {
67                 if(server->iofd == event->iofd)
68                     break;
69             }
70             if(server)
71                 userclient_accepted(server, event->accept_fd)
72             break;
73     }
74 }
75