Move the periodic watcher (un)initialization and handler code into
auditd-listen.c to allow for easy disabling at build time. The
(un)initialization is now handled by auditd_tcp_listen_init() and
auditd_tcp_listen_uninit().
---
 src/auditd-config.h |    2 --
 src/auditd-listen.c |   40 +++++++++++++++++++++++++++++++++++++---
 src/auditd-listen.h |    4 ++--
 src/auditd.c        |   32 +-------------------------------
 4 files changed, 40 insertions(+), 38 deletions(-)

diff --git a/src/auditd-config.h b/src/auditd-config.h
index 9bf6698..f58a521 100644
--- a/src/auditd-config.h
+++ b/src/auditd-config.h
@@ -96,7 +96,5 @@ int start_config_manager(struct auditd_reply_list *rep);
 void shutdown_config(void);
 void free_config(struct daemon_conf *config);
 
-void periodic_reconfigure(void);
-
 #endif
 
diff --git a/src/auditd-listen.c b/src/auditd-listen.c
index 0caf324..01c14a0 100644
--- a/src/auditd-listen.c
+++ b/src/auditd-listen.c
@@ -75,6 +75,7 @@ typedef struct ev_tcp {
 
 static int listen_socket;
 static struct ev_io tcp_listen_watcher;
+static struct ev_periodic periodic_watcher;
 static int min_port, max_port, max_per_addr;
 static int use_libwrap = 1;
 #ifdef USE_GSSAPI
@@ -87,6 +88,8 @@ static char msgbuf[MAX_AUDIT_MESSAGE_LENGTH + 1];
 
 static struct ev_tcp *client_chain = NULL;
 
+static void auditd_tcp_listen_check_idle (struct ev_loop *loop );
+
 static char *sockaddr_to_ipv4(struct sockaddr_in *addr)
 {
        unsigned char *uaddr = (unsigned char *)&(addr->sin_addr);
@@ -873,11 +876,26 @@ static void auditd_set_ports(int minp, int maxp, int 
max_p_addr)
        max_per_addr = max_p_addr;
 }
 
+static void periodic_handler(struct ev_loop *loop, struct ev_periodic *per,
+                       int revents )
+{
+       struct daemon_conf *config = (struct daemon_conf *) per->data;
+
+       if (config->tcp_client_max_idle)
+               auditd_tcp_listen_check_idle (loop);
+}
+
 int auditd_tcp_listen_init ( struct ev_loop *loop, struct daemon_conf *config )
 {
        struct sockaddr_in address;
        int one = 1;
 
+       ev_periodic_init (&periodic_watcher, periodic_handler,
+                         0, config->tcp_client_max_idle, NULL);
+       periodic_watcher.data = config;
+       if (config->tcp_client_max_idle)
+               ev_periodic_start (loop, &periodic_watcher);
+
        /* If the port is not set, that means we aren't going to
          listen for connections.  */
        if (config->tcp_listen_port == 0)
@@ -963,7 +981,8 @@ int auditd_tcp_listen_init ( struct ev_loop *loop, struct 
daemon_conf *config )
        return 0;
 }
 
-void auditd_tcp_listen_uninit ( struct ev_loop *loop )
+void auditd_tcp_listen_uninit ( struct ev_loop *loop,
+                               struct daemon_conf *config )
 {
 #ifdef USE_GSSAPI
        OM_uint32 status;
@@ -987,9 +1006,12 @@ void auditd_tcp_listen_uninit ( struct ev_loop *loop )
                ev_io_stop (loop, &client_chain->io);
                close_client (client_chain);
        }
+
+       if (config->tcp_client_max_idle)
+               ev_periodic_stop (loop, &periodic_watcher);
 }
 
-void auditd_tcp_listen_check_idle (struct ev_loop *loop )
+static void auditd_tcp_listen_check_idle (struct ev_loop *loop )
 {
        struct ev_tcp *ev, *next = NULL;
        int active;
@@ -1010,6 +1032,18 @@ void auditd_tcp_listen_check_idle (struct ev_loop *loop )
        }
 }
 
+static void periodic_reconfigure(struct daemon_conf *config)
+{
+       struct ev_loop *loop = ev_default_loop (EVFLAG_AUTO);
+       if (config->tcp_client_max_idle) {
+               ev_periodic_set (&periodic_watcher, ev_now (loop),
+                                config->tcp_client_max_idle, NULL);
+               ev_periodic_start (loop, &periodic_watcher);
+       } else {
+               ev_periodic_stop (loop, &periodic_watcher);
+       }
+}
+
 void auditd_tcp_listen_reconfigure ( struct daemon_conf *nconf,
                                     struct daemon_conf *oconf )
 {
@@ -1026,7 +1060,7 @@ void auditd_tcp_listen_reconfigure ( struct daemon_conf 
*nconf,
        }
        if (oconf->tcp_client_max_idle != nconf->tcp_client_max_idle) {
                oconf->tcp_client_max_idle = nconf->tcp_client_max_idle;
-               periodic_reconfigure();
+               periodic_reconfigure(oconf);
        }
        if (oconf->tcp_listen_port != nconf->tcp_listen_port ||
                        oconf->tcp_listen_queue != nconf->tcp_listen_queue) {
diff --git a/src/auditd-listen.h b/src/auditd-listen.h
index 440b6ab..024fd6f 100644
--- a/src/auditd-listen.h
+++ b/src/auditd-listen.h
@@ -26,8 +26,8 @@
 
 #include "ev.h"
 int auditd_tcp_listen_init ( struct ev_loop *loop, struct daemon_conf *config 
);
-void auditd_tcp_listen_uninit ( struct ev_loop *loop );
-void auditd_tcp_listen_check_idle ( struct ev_loop *loop );
+void auditd_tcp_listen_uninit ( struct ev_loop *loop,
+                               struct daemon_conf *config );
 void auditd_tcp_listen_reconfigure ( struct daemon_conf *nconf,
                                     struct daemon_conf *oconf );
 
diff --git a/src/auditd.c b/src/auditd.c
index e0ee702..a369434 100644
--- a/src/auditd.c
+++ b/src/auditd.c
@@ -68,7 +68,6 @@ static int do_fork = 1;
 static struct auditd_reply_list *rep = NULL;
 static int hup_info_requested = 0, usr1_info_requested = 0;
 static char subj[SUBJ_LEN];
-static struct ev_periodic periodic_watcher;
 
 /* Local function prototypes */
 int send_audit_event(int type, const char *str);
@@ -442,27 +441,6 @@ static void netlink_handler(struct ev_loop *loop, struct 
ev_io *io,
        }
 }
 
-static void periodic_handler(struct ev_loop *loop, struct ev_periodic *per,
-                       int revents )
-{
-       struct daemon_conf *config = (struct daemon_conf *) per->data;
-
-       if (config->tcp_client_max_idle)
-               auditd_tcp_listen_check_idle (loop);
-}
-
-void periodic_reconfigure(void)
-{
-       struct ev_loop *loop = ev_default_loop (EVFLAG_AUTO);
-       if (config.tcp_client_max_idle) {
-               ev_periodic_set (&periodic_watcher, ev_now (loop),
-                                config.tcp_client_max_idle, NULL);
-               ev_periodic_start (loop, &periodic_watcher);
-       } else {
-               ev_periodic_stop (loop, &periodic_watcher);
-       }
-}
-
 int main(int argc, char *argv[])
 {
        struct sigaction sa;
@@ -719,12 +697,6 @@ int main(int argc, char *argv[])
        ev_signal_init (&sigchld_watcher, child_handler, SIGCHLD);
        ev_signal_start (loop, &sigchld_watcher);
 
-       ev_periodic_init (&periodic_watcher, periodic_handler,
-                         0, config.tcp_client_max_idle, NULL);
-       periodic_watcher.data = &config;
-       if (config.tcp_client_max_idle)
-               ev_periodic_start (loop, &periodic_watcher);
-
        if (auditd_tcp_listen_init (loop, &config)) {
                char emsg[DEFAULT_BUF_SZ];
                if (*subj)
@@ -755,15 +727,13 @@ int main(int argc, char *argv[])
        if (!stop)
                ev_loop (loop, 0);
 
-       auditd_tcp_listen_uninit (loop);
+       auditd_tcp_listen_uninit (loop, &config);
 
        // Tear down IO watchers Part 1
        ev_signal_stop (loop, &sighup_watcher);
        ev_signal_stop (loop, &sigusr1_watcher);
        ev_signal_stop (loop, &sigusr2_watcher);
        ev_signal_stop (loop, &sigterm_watcher);
-       if (config.tcp_client_max_idle)
-               ev_periodic_stop (loop, &periodic_watcher);
 
        /* Write message to log that we are going down */
        rc = audit_request_signal_info(fd);
-- 
1.7.9.5

--
Linux-audit mailing list
Linux-audit@redhat.com
https://www.redhat.com/mailman/listinfo/linux-audit

Reply via email to