added SSL backend for IOMultiplexer
[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     iofd->data = sock;
29     sock->clientcount = 0;
30     
31     //add ServerSocket to the list
32     sock->prev = NULL;
33     sock->next = serversockets;
34     if(serversockets)
35         serversockets->prev = sock;
36     serversockets = sock;
37     return sock;
38 }
39
40 static void serversocket_delete(struct ServerSocket *server) {
41     if(server->prev)
42         server->prev->next = server->next;
43     else
44         serversockets = server->next;
45     if(server->next)
46         server->next->prev = server->prev;
47     free(server);
48 }
49
50 struct ServerSocket *serversocket_listen(char *hostname, int port, int ssl) {
51     struct IODescriptor *iofd = iohandler_listen(hostname, port, serversocket_callback);
52     if(!iofd) return NULL;
53     struct ServerSocket *server = serversocket_create(iofd);
54     return server;
55 }
56
57 void serversocket_close(struct ServerSocket *server, int keep_clients) {
58     userclient_close_server(server, keep_clients);
59     iohandler_close(server->iofd);
60     serversocket_delete(server);
61 }
62
63 static void serversocket_callback(struct IOEvent *event) {
64     struct ServerSocket *server = event->iofd->data;
65     switch(event->type) {
66         case IOEVENT_ACCEPT:
67             userclient_accepted(server, event->data.accept_fd);
68             break;
69         default:
70             break;
71     }
72 }
73