From ce40e2b9d2f45daaadc8dc25a5d42c4273100991 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 31 Dec 2025 23:16:58 +0100 Subject: [PATCH] Rename tty services early from "init" -> "getty" Finit has support for "Please press Enter to activate this console." which means there's no getty yet running. However, when profiling systems with Finit, and embedded systems in general, a common metric is the time from power-on to getty has started. This commit makes sure to rename the process so that BusyBox pidof is capable of detecting that "getty" has started. This is mostly for the bootchart2 project's bootchartd, the native BusyBox bootchartd does not have this issue. Signed-off-by: Joachim Wiberg --- src/finit.c | 8 ++++++-- src/helpers.c | 24 ++++++++++++++++++++++++ src/helpers.h | 1 + src/service.c | 2 ++ 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/finit.c b/src/finit.c index 495cdc69..04b2c155 100644 --- a/src/finit.c +++ b/src/finit.c @@ -61,8 +61,9 @@ #include "util.h" #include "utmp-api.h" -uev_ctx_t *ctx = NULL; /* Main loop context */ -svc_t *wdog = NULL; /* No watchdog by default */ +uev_ctx_t *ctx; /* Main loop context */ +svc_t *wdog; /* No watchdog by default */ +char *arg0; /* Saved for setprocnm() */ /* @@ -609,6 +610,9 @@ int main(int argc, char *argv[]) { uev_ctx_t loop; + /* Save argv for setprocnm() in child processes */ + arg0 = argv[0]; + /* user calling telinit or init */ if (getpid() != 1) { if (geteuid() == 0) diff --git a/src/helpers.c b/src/helpers.c index 0aebde0c..73a1e069 100644 --- a/src/helpers.c +++ b/src/helpers.c @@ -32,6 +32,7 @@ #include #include #include +#include #ifdef _LIBITE_LITE # include #else @@ -527,6 +528,29 @@ int in_container(void) return 0; } +/** + * setprocnm - Set process name in argv[0] for ps/pidof + * @name: New process name to set + * + * Changes the process name by modifying argv[0]. This is particularly + * useful for compatibility with BusyBox's pidof which reads cmdline + * from /proc/pid/cmdline rather than /proc/pid/comm. + */ +void setprocnm(const char *name) +{ + extern char *arg0; + size_t len; + + if (!arg0 || !name) + return; + + prctl(PR_SET_NAME, name, 0, 0, 0); + + len = strlen(arg0); + memset(arg0, 0, len); + strlcpy(arg0, name, len + 1); +} + /** * Local Variables: * indent-tabs-mode: t diff --git a/src/helpers.h b/src/helpers.h index 0af260d4..2d380870 100644 --- a/src/helpers.h +++ b/src/helpers.h @@ -72,6 +72,7 @@ int print_result (int fail); void set_hostname (char **hostname); void networking (int updown); int in_container (void); +void setprocnm (const char *name); int complete (char *cmd, int pid); int run (char *cmd, char *log); diff --git a/src/service.c b/src/service.c index 4f1b2955..c94d5d80 100644 --- a/src/service.c +++ b/src/service.c @@ -569,6 +569,8 @@ static pid_t service_fork(svc_t *svc) return -1; } #endif + if (svc_is_tty(svc)) + setprocnm("getty"); sched_yield();