diff options
author | Pierre Pfister <ppfister@cisco.com> | 2017-07-27 22:57:34 -0400 |
---|---|---|
committer | Pierre Pfister <ppfister@cisco.com> | 2017-09-05 18:10:40 +0200 |
commit | 9a244bb5e4a21835cac51ba7f35095b9c24547e6 (patch) | |
tree | ad8874c4ee37e1cebc85592982547ad4dd5858fc /src/vlib/unix/main.c | |
parent | 215961829c4ae5f738ffcd01a8d1afcab13bd0e2 (diff) |
Add pidfile cmdline option
Change-Id: Ibaa61b624eb6683b1be6901a7b29f5f73aad27b2
Signed-off-by: Pierre Pfister <ppfister@cisco.com>
Diffstat (limited to 'src/vlib/unix/main.c')
-rw-r--r-- | src/vlib/unix/main.c | 51 |
1 files changed, 42 insertions, 9 deletions
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. |