diff options
-rw-r--r-- | src/miav_daemon.cc | 8 | ||||
-rw-r--r-- | src/miavd.cc | 23 | ||||
-rw-r--r-- | src/socket.cc | 28 |
3 files changed, 56 insertions, 3 deletions
diff --git a/src/miav_daemon.cc b/src/miav_daemon.cc index d86d448..97c26d7 100644 --- a/src/miav_daemon.cc +++ b/src/miav_daemon.cc @@ -37,6 +37,9 @@ #include "server.h" #include "socket.h" +// Declared in miavd.cc +extern bool server_is_running; + MiavDaemon::MiavDaemon(int port) { this->port = port; @@ -65,6 +68,8 @@ int MiavDaemon::daemon_main() while(1) { Socket *csocket = new Socket(socket->slisten()); + if(!server_is_running) break; + if(socket->hasError()) { ERR(miav, "Server socket has errors, quitting."); delete csocket; @@ -101,6 +106,9 @@ int MiavDaemon::daemon_main() } delete socket; + + INFO(miav, "MIaV server stopped"); + return 0; } diff --git a/src/miavd.cc b/src/miavd.cc index e9d7bc4..4ff3425 100644 --- a/src/miavd.cc +++ b/src/miavd.cc @@ -32,6 +32,9 @@ #include <config.h> +// For signal +#include <signal.h> + #include "miav_daemon.h" #include "miav_config.h" @@ -62,6 +65,23 @@ static const char usage_str[] = " -P, --pidfile file Write pid of the running daemon to file.\n" ; +bool server_is_running = true; +void ctrl_c(int) +{ + DEBUG(server, "Ctrl+c detected"); + server_is_running = false; +} + +void reload(int) +{ + printf("Reopening logfile...\n"); + if(hugin_reopen_log() != HUG_STATUS_OK) { + fprintf(stderr, "Could not reopen logfile!\n"); + return; + } + DEBUG(server, "Reopened log\n"); +} + int main(int argc, char *argv[]) { const char *hugin_filter = "+all"; @@ -168,5 +188,8 @@ int main(int argc, char *argv[]) if(user) cuser = user; if(group) cgroup = group; + signal(SIGHUP, reload); + signal(SIGINT, ctrl_c); + return daemon.run(cuser, cgroup, !foreground, pidfile); } diff --git a/src/socket.cc b/src/socket.cc index 1fffc87..349ec30 100644 --- a/src/socket.cc +++ b/src/socket.cc @@ -100,9 +100,31 @@ Socket Socket::slisten() // accept new connection and get its connection descriptor int csalen = sizeof(s.socketaddr); - s.ssocket = accept(ssocket, - (struct sockaddr*)&s.socketaddr, - (socklen_t*)&csalen); + { + fd_set rfds; + FD_ZERO(&rfds); + FD_SET(ssocket, &rfds); + int retval = select(ssocket + 1, &rfds, NULL, NULL, NULL); + + if (retval == -1) { + if(errno == EINTR) { + connected = true; + s.connected = true; + return s; + } + + ERR(socket, "select() failed! %s", strerror(errno)); + } else if(retval) { + if(FD_ISSET(ssocket, &rfds)) { + s.ssocket = accept(ssocket, + (struct sockaddr*)&s.socketaddr, + (socklen_t*)&csalen); + ERR(socket, "accept() failed! %s", strerror(errno)); + } + } else { + // We don't do timeout + } + } if (s.ssocket < 0) { s.connected = false; |