summaryrefslogtreecommitdiffstats
path: root/src/vlib/unix/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vlib/unix/main.c')
-rw-r--r--src/vlib/unix/main.c51
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, &lt;filename&gt;}
+ * 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.