]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: memorize what fds were open at startup
authorDavid Lamparter <equinox@diac24.net>
Thu, 4 Feb 2021 21:25:49 +0000 (22:25 +0100)
committerDavid Lamparter <equinox@diac24.net>
Fri, 12 Feb 2021 18:28:22 +0000 (19:28 +0100)
... in case the user does something like `zebra 3>logfile`.  Also useful
for some module purposes, maybe even feeding config at some point in the
future.

Signed-off-by: David Lamparter <equinox@diac24.net>
lib/libfrr.c
lib/libfrr.h

index b83883779cd05b050162800fa37ca587bb1cb5d3..51b97369c92232c315d90d73f2f8a2c1e9788f8b 100644 (file)
@@ -71,6 +71,7 @@ static char vtypath_default[512];
 
 bool debug_memstats_at_exit = false;
 static bool nodetach_term, nodetach_daemon;
+static uint64_t startup_fds;
 
 static char comb_optstr[256];
 static struct option comb_lo[64];
@@ -341,6 +342,28 @@ void frr_preinit(struct frr_daemon_info *daemon, int argc, char **argv)
        strlcpy(frr_protonameinst, di->logname, sizeof(frr_protonameinst));
 
        di->cli_mode = FRR_CLI_CLASSIC;
+
+       /* we may be starting with extra FDs open for whatever purpose,
+        * e.g. logging, some module, etc.  Recording them here allows later
+        * checking whether an fd is valid for such extension purposes,
+        * without this we could end up e.g. logging to a BGP session fd.
+        */
+       startup_fds = 0;
+       for (int i = 0; i < 64; i++) {
+               struct stat st;
+
+               if (fstat(i, &st))
+                       continue;
+               if (S_ISDIR(st.st_mode) || S_ISBLK(st.st_mode))
+                       continue;
+
+               startup_fds |= UINT64_C(0x1) << (uint64_t)i;
+       }
+}
+
+bool frr_is_startup_fd(int fd)
+{
+       return !!(startup_fds & (UINT64_C(0x1) << (uint64_t)fd));
 }
 
 void frr_opt_add(const char *optstr, const struct option *longopts,
index c4469314689da31e78bbd175a0b12575a4b960b8..825f502bdf6dcd6a975ac96aea0dbb12c4100deb 100644 (file)
@@ -138,7 +138,8 @@ extern __attribute__((__noreturn__)) void frr_help_exit(int status);
 extern struct thread_master *frr_init(void);
 extern const char *frr_get_progname(void);
 extern enum frr_cli_mode frr_get_cli_mode(void);
-uint32_t frr_get_fd_limit(void);
+extern uint32_t frr_get_fd_limit(void);
+extern bool frr_is_startup_fd(int fd);
 
 DECLARE_HOOK(frr_late_init, (struct thread_master * tm), (tm))
 DECLARE_HOOK(frr_very_late_init, (struct thread_master * tm), (tm))