---
 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(+), 0 deletions(-)

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;
+               }
+       }
+}
-- 
1.7.5.3


Reply via email to