From c7401c6c23169771822a9f5b98cfea304f1670cf Mon Sep 17 00:00:00 2001 From: Daniel Willmann Date: Sun, 17 Jul 2011 17:48:18 +0200 Subject: server: Register signal handler to reopen logfiles on SIGHUP --- include/osmo-pcap/osmo_pcap_server.h | 2 ++ src/osmo_server_main.c | 4 ++++ src/osmo_server_network.c | 20 ++++++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/include/osmo-pcap/osmo_pcap_server.h b/include/osmo-pcap/osmo_pcap_server.h index b408c47..1f2f6fc 100644 --- a/include/osmo-pcap/osmo_pcap_server.h +++ b/include/osmo-pcap/osmo_pcap_server.h @@ -63,6 +63,7 @@ struct osmo_pcap_conn { /* read buffering */ int state; int pend; + int reopen; char buf[4096]; struct osmo_pcap_data *data; }; @@ -80,6 +81,7 @@ struct osmo_pcap_server { extern struct osmo_pcap_server *pcap_server; +void osmo_pcap_server_reopen(struct osmo_pcap_server *server); int osmo_pcap_server_listen(struct osmo_pcap_server *server); struct osmo_pcap_conn *osmo_pcap_server_find(struct osmo_pcap_server *ser, const char *name); diff --git a/src/osmo_server_main.c b/src/osmo_server_main.c index 5c1ad58..4e67163 100644 --- a/src/osmo_server_main.c +++ b/src/osmo_server_main.c @@ -140,6 +140,9 @@ static void signal_handler(int signal) talloc_report(tall_vty_ctx, stderr); talloc_report_full(tall_bsc_ctx, stderr); break; + case SIGHUP: + osmo_pcap_server_reopen(pcap_server); + break; default: break; } @@ -175,6 +178,7 @@ int main(int argc, char **argv) signal(SIGABRT, &signal_handler); signal(SIGUSR1, &signal_handler); osmo_init_ignore_signals(); + signal(SIGHUP, &signal_handler); telnet_init(tall_bsc_ctx, NULL, 4241); diff --git a/src/osmo_server_network.c b/src/osmo_server_network.c index be61d03..513ca1f 100644 --- a/src/osmo_server_network.c +++ b/src/osmo_server_network.c @@ -253,6 +253,11 @@ static int read_cb(struct osmo_fd *fd, unsigned int what) conn = fd->data; if (conn->state == STATE_INITIAL) { + if (conn->reopen) { + LOGP(DSERVER, LOGL_INFO, "Reopening log for %s now.\n", conn->name); + restart_pcap(conn); + conn->reopen = 0; + } return read_cb_initial(fd, conn); } else if (conn->state == STATE_DATA) { return read_cb_data(fd, conn); @@ -336,3 +341,18 @@ int osmo_pcap_server_listen(struct osmo_pcap_server *server) return 0; } + +void osmo_pcap_server_reopen(struct osmo_pcap_server *server) +{ + struct osmo_pcap_conn *conn; + LOGP(DSERVER, LOGL_INFO, "Reopening all logfiles.\n"); + llist_for_each_entry(conn, &server->conn, entry) { + /* Write the complete packet out first */ + if (conn->state == STATE_INITIAL) { + restart_pcap(conn); + } else { + LOGP(DSERVER, LOGL_INFO, "Delaying %s until current packet is complete.\n", conn->name); + conn->reopen = 1; + } + } +} -- cgit v1.2.3