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();