From 06ec805762c1a44c6297b8b98ae7e3cc899ee6e3 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Tue, 9 May 2023 17:47:26 +0200 Subject: [PATCH] add signal management --- server.c | 3 ++- server.h | 3 +++ signal.c | 21 +++++++++++++++++++++ signal.h | 7 +++++++ webserver.c | 26 ++++++++++++++++++-------- 5 files changed, 51 insertions(+), 9 deletions(-) create mode 100644 signal.c create mode 100644 signal.h diff --git a/server.c b/server.c index 9a4d83e..711f472 100644 --- a/server.c +++ b/server.c @@ -32,7 +32,6 @@ typedef SOCKET socket_t; typedef int socket_t; #define closesocket close #define ERRNO errno -#define INVALID_SOCKET -1 #define SOCKET_ERROR -1 #endif @@ -108,3 +107,5 @@ void close_listening_socket (socket_t sock) } /* vim: set ts=4 sw=4 et: */ + +/* vim: set ts=4 sw=4 et: */ diff --git a/server.h b/server.h index 962cb00..0738e5a 100644 --- a/server.h +++ b/server.h @@ -6,6 +6,7 @@ typedef SOCKET socket_t; #else /* Posix */ typedef int socket_t; +#define INVALID_SOCKET -1 #endif socket_t open_listening_socket (int port); @@ -14,3 +15,5 @@ void close_listening_socket (socket_t sock); #endif /* __SERVER_H__ */ /* vim: set ts=4 sw=4 et: */ + +/* vim: set ts=4 sw=4 et: */ diff --git a/signal.c b/signal.c new file mode 100644 index 0000000..bdeb7a9 --- /dev/null +++ b/signal.c @@ -0,0 +1,21 @@ +#include +#include + +#include "signal.h" + +void _signal_handler (int sig) { + printf ("signal: %d\n", sig); +} + +void (*sigh_hangup) (int) = &_signal_handler; +void (*sigh_terminate) (int) = &_signal_handler; + +void __attribute__((constructor)) init_signal (void) +{ +#ifdef _POSIX + signal (SIGHUP, sigh_hangup); +#endif /* _POSIX */ + signal (SIGTERM, sigh_terminate); +} + +/* vi:set tabstop=4 expandtab shiftwidth=4: this line set vi mode */ diff --git a/signal.h b/signal.h new file mode 100644 index 0000000..f4f3309 --- /dev/null +++ b/signal.h @@ -0,0 +1,7 @@ +#ifndef __SIGNAL_H__ +#define __SIGNAL_H__ + +extern void (*sigh_hangup) (int); +extern void (*sigh_terminate) (int); + +#endif /* __SIGNAL_H__ */ diff --git a/webserver.c b/webserver.c index 0673b9c..825b847 100644 --- a/webserver.c +++ b/webserver.c @@ -1,6 +1,6 @@ /* depend: */ /* cflags: */ -/* linker: color.o debug.o server.o */ +/* linker: color.o debug.o server.o signal.o */ #include #include @@ -8,6 +8,7 @@ #include "debug.h" #include "server.h" +#include "signal.h" /* types */ @@ -21,6 +22,7 @@ char *progname = NULL; int port = 8080; +socket_t sock = INVALID_SOCKET; /* help function */ @@ -35,12 +37,19 @@ int usage (int ret) return ret; } +void stop_server (__attribute__((unused)) int sig) +{ + if (sock != INVALID_SOCKET) { + close_listening_socket (sock); + exit (0); + } +} + /* main function */ int main (int argc, char *argv[]) { int i = 0; - int ret = 0; /* program name */ @@ -91,19 +100,19 @@ int main (int argc, char *argv[]) } VERBOSE (DEBUG, fprintf (stdout, "Initializing socket\n")); - socket_t sock = open_listening_socket (port); - if (sock == (socket_t)-1) { + sock = open_listening_socket (port); + if (sock == INVALID_SOCKET) { VERBOSE (ERROR, fprintf (stderr, "Can't open listening socket\n")); return 1; } VERBOSE (INFO, fprintf (stdout, "Listening socket on port %d\n", port)); - sleep (2); + sleep (20); VERBOSE (DEBUG, fprintf (stdout, "Closing socket\n")); close_listening_socket (sock); - return ret; + return 2; } // test: webserver.exe -h @@ -114,7 +123,8 @@ int main (int argc, char *argv[]) // test: webserver.exe -v 2>&1 | grep -q 'missing verbose level' // test: webserver.exe -p 2>&1 | grep -q 'missing port number' // test: webserver.exe -p -1 2>&1 | grep -q 'incorrect port number' -// test: webserver.exe | grep -q 'Listening socket on port 8080' -// test: webserver.exe -p 8000 | grep -q 'Listening socket on port 8000' +// test: ( webserver.exe & pid=$!; ( sleep 1; kill -TERM $pid ) ) | grep -q 'Listening socket on port 8080' +// test: ( webserver.exe -p 8008 & pid=$!; ( sleep 1; kill -TERM $pid ) ) | grep -q 'Listening socket on port 8008' +// test: webserver.exe & pid=$!; sleep 1; kill -INT $pid; ps aux | grep -q [w]ebserver.exe && kill -TERM $pid || rc=1; test x$rc = x1 /* vim: set ts=4 sw=4 et: */ -- 2.30.2