projects
/
apps
/
pfixtools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Close the listeners on exit.
[apps/pfixtools.git]
/
server.c
diff --git
a/server.c
b/server.c
index
3becd75
..
73c2888
100644
(file)
--- a/
server.c
+++ b/
server.c
@@
-36,6
+36,10
@@
#include "server.h"
#include "epoll.h"
#include "server.h"
#include "epoll.h"
+static server_t *listeners[1024];
+static int listener_count = 0;
+
+
static server_t* server_new(void)
{
server_t* server = p_new(server_t, 1);
static server_t* server_new(void)
{
server_t* server = p_new(server_t, 1);
@@
-58,6
+62,15
@@
static void server_delete(server_t **server)
}
}
}
}
+static void server_shutdown(void)
+{
+ for (int i = 0 ; i < listener_count ; ++i) {
+ server_delete(&listeners[i]);
+ }
+}
+
+module_exit(server_shutdown);
+
int start_server(int port, start_listener_t starter, delete_client_t deleter)
{
struct sockaddr_in addr = {
int start_server(int port, start_listener_t starter, delete_client_t deleter)
{
struct sockaddr_in addr = {
@@
-88,6
+101,7
@@
int start_server(int port, start_listener_t starter, delete_client_t deleter)
tmp->data = data;
tmp->clear_data = deleter;
epoll_register(sock, EPOLLIN, tmp);
tmp->data = data;
tmp->clear_data = deleter;
epoll_register(sock, EPOLLIN, tmp);
+ listeners[listener_count++] = tmp;
return 0;
}
return 0;
}
@@
-105,7
+119,7
@@
static int start_client(server_t *server, start_client_t starter,
}
if (starter) {
}
if (starter) {
- data = starter();
+ data = starter(
server
);
if (data == NULL) {
close(sock);
return -1;
if (data == NULL) {
close(sock);
return -1;
@@
-130,7
+144,7
@@
int server_loop(start_client_t starter, delete_client_t deleter,
if (n < 0) {
if (errno != EAGAIN && errno != EINTR) {
UNIXERR("epoll_wait");
if (n < 0) {
if (errno != EAGAIN && errno != EINTR) {
UNIXERR("epoll_wait");
- return
-1
;
+ return
EXIT_FAILURE
;
}
continue;
}
}
continue;
}
@@
-161,5
+175,5
@@
int server_loop(start_client_t starter, delete_client_t deleter,
}
}
}
}
}
}
- return
0
;
+ return
EXIT_SUCCESS
;
}
}