summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2018-05-03 00:47:37 +0200
committerSimon Rettberg2018-05-03 00:47:37 +0200
commit2f8a2683501d666517a5c0cc34dce90338d9137e (patch)
tree73550ec90b89080e1c0cdcf4ef1a915ed5d9abbe
parent[SERVER] Don't spam log in vmdkLegacyMode for unknown images (diff)
downloaddnbd3-2f8a2683501d666517a5c0cc34dce90338d9137e.tar.gz
dnbd3-2f8a2683501d666517a5c0cc34dce90338d9137e.tar.xz
dnbd3-2f8a2683501d666517a5c0cc34dce90338d9137e.zip
[SERVER] Print info about signal sender
-rw-r--r--src/server/server.c51
1 files changed, 46 insertions, 5 deletions
diff --git a/src/server/server.c b/src/server/server.c
index 71b791a..b209451 100644
--- a/src/server/server.c
+++ b/src/server/server.c
@@ -53,12 +53,22 @@ static poll_list_t *listeners = NULL;
static ticks startupTime;
static bool sigReload = false, sigLogCycle = false;
+/**
+ * Copied to in signal handler so we can print info
+ * later on
+ */
+static siginfo_t lastSignal;
+
+void printSignal();
+
static poll_list_t* setupNetwork(char *bindAddress);
static dnbd3_client_t* dnbd3_prepareClient(struct sockaddr_storage *client, int fd);
static void dnbd3_handleSignal(int signum);
+static void dnbd3_handleSignal2(int signum, siginfo_t *info, void *data);
+
static void* server_asyncImageListLoad(void *data);
/**
@@ -298,11 +308,16 @@ int main(int argc, char *argv[])
#endif
// setup signal handler
- signal( SIGTERM, dnbd3_handleSignal );
- signal( SIGINT, dnbd3_handleSignal );
- signal( SIGUSR1, dnbd3_handleSignal );
- signal( SIGHUP, dnbd3_handleSignal );
- signal( SIGUSR2, dnbd3_handleSignal );
+ struct sigaction sa;
+ memset( &sa, 0, sizeof(sa) );
+ sa.sa_sigaction = dnbd3_handleSignal2;
+ sa.sa_flags = SA_SIGINFO;
+ //sa.sa_mask = ;
+ sigaction( SIGTERM, &sa, NULL );
+ sigaction( SIGINT, &sa, NULL );
+ sigaction( SIGUSR1, &sa, NULL );
+ sigaction( SIGHUP, &sa, NULL );
+ sigaction( SIGUSR2, &sa, NULL );
signal( SIGPIPE, SIG_IGN );
logadd( LOG_INFO, "Loading images...." );
@@ -338,6 +353,7 @@ int main(int argc, char *argv[])
int fd;
while ( !_shutdown ) {
// Handle signals
+ printSignal();
if ( sigReload ) {
sigReload = false;
logadd( LOG_INFO, "SIGHUP received, re-scanning image directory" );
@@ -374,11 +390,30 @@ int main(int argc, char *argv[])
continue;
}
}
+ printSignal();
free( bindAddress );
dnbd3_cleanup();
return 0;
}
+void printSignal()
+{
+ if ( lastSignal.si_signo != 0 ) {
+ logadd( LOG_INFO, "Signal %d (via %d) by pid %u, uid %u",
+ lastSignal.si_signo, lastSignal.si_code,
+ (unsigned int)lastSignal.si_pid, (unsigned int)lastSignal.si_uid );
+ if ( lastSignal.si_pid != 0 ) {
+ char buffer[500], path[100];
+ snprintf( path, sizeof(path), "/proc/%u/exe", (unsigned int)lastSignal.si_pid );
+ ssize_t len = readlink( path, buffer, sizeof(buffer) );
+ if ( len > 0 ) {
+ logadd( LOG_INFO, "%u is %.*s", (unsigned int)lastSignal.si_pid, (int)len, buffer );
+ }
+ }
+ lastSignal.si_signo = 0;
+ }
+}
+
static poll_list_t* setupNetwork(char *bindAddress)
{
listeners = sock_newPollList();
@@ -437,6 +472,12 @@ static void dnbd3_handleSignal(int signum)
}
}
+static void dnbd3_handleSignal2(int signum, siginfo_t *info, void *data UNUSED)
+{
+ memcpy( &lastSignal, info, sizeof(siginfo_t) );
+ dnbd3_handleSignal( signum );
+}
+
uint32_t dnbd3_serverUptime()
{
ticks now;