forked from Mirror/frr
lib: memorize what fds were open at startup
... 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>
This commit is contained in:
parent
35da69f154
commit
6e3253b979
23
lib/libfrr.c
23
lib/libfrr.c
|
@ -71,6 +71,7 @@ static char vtypath_default[512];
|
||||||
|
|
||||||
bool debug_memstats_at_exit = false;
|
bool debug_memstats_at_exit = false;
|
||||||
static bool nodetach_term, nodetach_daemon;
|
static bool nodetach_term, nodetach_daemon;
|
||||||
|
static uint64_t startup_fds;
|
||||||
|
|
||||||
static char comb_optstr[256];
|
static char comb_optstr[256];
|
||||||
static struct option comb_lo[64];
|
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));
|
strlcpy(frr_protonameinst, di->logname, sizeof(frr_protonameinst));
|
||||||
|
|
||||||
di->cli_mode = FRR_CLI_CLASSIC;
|
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,
|
void frr_opt_add(const char *optstr, const struct option *longopts,
|
||||||
|
|
|
@ -138,7 +138,8 @@ extern __attribute__((__noreturn__)) void frr_help_exit(int status);
|
||||||
extern struct thread_master *frr_init(void);
|
extern struct thread_master *frr_init(void);
|
||||||
extern const char *frr_get_progname(void);
|
extern const char *frr_get_progname(void);
|
||||||
extern enum frr_cli_mode frr_get_cli_mode(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_late_init, (struct thread_master * tm), (tm))
|
||||||
DECLARE_HOOK(frr_very_late_init, (struct thread_master * tm), (tm))
|
DECLARE_HOOK(frr_very_late_init, (struct thread_master * tm), (tm))
|
||||||
|
|
Loading…
Reference in a new issue