From 9a244bb5e4a21835cac51ba7f35095b9c24547e6 Mon Sep 17 00:00:00 2001 From: Pierre Pfister Date: Thu, 27 Jul 2017 22:57:34 -0400 Subject: Add pidfile cmdline option Change-Id: Ibaa61b624eb6683b1be6901a7b29f5f73aad27b2 Signed-off-by: Pierre Pfister --- src/vlib/unix/main.c | 51 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 9 deletions(-) (limited to 'src/vlib/unix/main.c') diff --git a/src/vlib/unix/main.c b/src/vlib/unix/main.c index f52316e553b..c90e1331374 100644 --- a/src/vlib/unix/main.c +++ b/src/vlib/unix/main.c @@ -317,6 +317,7 @@ unix_config (vlib_main_t * vm, unformat_input_t * input) unix_main_t *um = &unix_main; clib_error_t *error = 0; gid_t gid; + int pidfd = -1; /* Defaults */ um->cli_pager_buffer_limit = UNIX_CLI_DEFAULT_PAGER_LIMIT; @@ -415,11 +416,38 @@ unix_config (vlib_main_t * vm, unformat_input_t * input) if (setegid (gid) == -1) return clib_error_return_unix (0, "setegid"); } + else if (unformat (input, "pidfile %s", &um->pidfile)) + ; else return clib_error_return (0, "unknown input `%U'", format_unformat_error, input); } + if (um->runtime_dir == 0) + { + uid_t uid = geteuid (); + if (uid == 00) + um->runtime_dir = format (0, "/run/%s%c", + vlib_default_runtime_dir, 0); + else + um->runtime_dir = format (0, "/run/user/%u/%s%c", uid, + vlib_default_runtime_dir, 0); + } + + if (um->pidfile) + { + if ((error = vlib_unix_validate_runtime_file (um, + (char *) um->pidfile, + &um->pidfile))) + return error; + + if (((pidfd = open ((char *) um->pidfile, + O_CREAT | O_WRONLY | O_TRUNC, 0644)) < 0)) + { + return clib_error_return_unix (0, "open"); + } + } + error = setup_signal_handlers (um); if (error) return error; @@ -434,19 +462,21 @@ unix_config (vlib_main_t * vm, unformat_input_t * input) 0) < 0) clib_error_return (0, "daemon () fails"); } - um->unix_config_complete = 1; - if (um->runtime_dir == 0) + if (pidfd >= 0) { - uid_t uid = geteuid (); - if (uid == 00) - um->runtime_dir = format (0, "/run/%s%c", - vlib_default_runtime_dir, 0); - else - um->runtime_dir = format (0, "/run/user/%u/%s%c", uid, - vlib_default_runtime_dir, 0); + u8 *lv = format (0, "%d", getpid ()); + if (write (pidfd, (char *) lv, vec_len (lv)) != vec_len (lv)) + { + vec_free (lv); + close (pidfd); + return clib_error_return_unix (0, "write"); + } + vec_free (lv); + close (pidfd); } + um->unix_config_complete = 1; return 0; } @@ -475,6 +505,9 @@ unix_config (vlib_main_t * vm, unformat_input_t * input) * Very useful in situations where folks don't remember or can't be bothered * to include CLI commands in bug reports. * + * @cfgcmd{pidfile, <filename>} + * Writes the pid of the main thread in @c filename. + * * @cfgcmd{full-coredump} * Ask the Linux kernel to dump all memory-mapped address regions, instead * of just text+data+bss. -- cgit 1.2.3-korg