From 2e7f7b96e5f1ca788e3f4589afaaa705b20051c0 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 31 Jan 2024 19:54:13 +0100 Subject: Cygwin: implement setproctitle Make sure to create commandline according to setting of setproctitle. Signed-off-by: Corinna Vinschen --- newlib/libc/include/sys/unistd.h | 8 ++++++++ winsup/cygwin/cygwin.din | 1 + winsup/cygwin/globals.cc | 2 ++ winsup/cygwin/include/cygwin/version.h | 3 ++- winsup/cygwin/libc/bsdlib.cc | 34 +++++++++++++++++++++++++++++++ winsup/cygwin/pinfo.cc | 37 +++++++++++++++++----------------- winsup/cygwin/release/3.6.0 | 2 ++ 7 files changed, 67 insertions(+), 20 deletions(-) diff --git a/newlib/libc/include/sys/unistd.h b/newlib/libc/include/sys/unistd.h index 0090154..13b0c16 100644 --- a/newlib/libc/include/sys/unistd.h +++ b/newlib/libc/include/sys/unistd.h @@ -209,6 +209,14 @@ int setpgid (pid_t __pid, pid_t __pgid); #if __SVID_VISIBLE || __XSI_VISIBLE >= 500 int setpgrp (void); #endif +#if defined(__CYGWIN__) && __BSD_VISIBLE +/* Stub for Linux libbsd compatibility. */ +#define initsetproctitle(c, a, e) setproctitle_init((c), (a), (e)) +static inline void setproctitle_init (int, char *[], char *[]) {} + +void setproctitle (const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 1, 2))); +#endif #if __BSD_VISIBLE || __XSI_VISIBLE >= 4 int setregid (gid_t __rgid, gid_t __egid); int setreuid (uid_t __ruid, uid_t __euid); diff --git a/winsup/cygwin/cygwin.din b/winsup/cygwin/cygwin.din index 6bac40c..be9efdc 100644 --- a/winsup/cygwin/cygwin.din +++ b/winsup/cygwin/cygwin.din @@ -1353,6 +1353,7 @@ setpassent NOSIGFE setpgid SIGFE setpgrp SIGFE setpriority SIGFE +setproctitle SIGFE setprogname NOSIGFE setprotoent = cygwin_setprotoent SIGFE setpwent NOSIGFE diff --git a/winsup/cygwin/globals.cc b/winsup/cygwin/globals.cc index 654b836..885ada8 100644 --- a/winsup/cygwin/globals.cc +++ b/winsup/cygwin/globals.cc @@ -83,6 +83,8 @@ int NO_COPY __isthreaded = 0; int __argc_safe; int __argc; char **__argv; +/* Set via setproctitle */ +char *__argv0_orig; _cygtls NO_COPY *_main_tls /* !globals.h */; diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h index 6679eed..d12ea9c 100644 --- a/winsup/cygwin/include/cygwin/version.h +++ b/winsup/cygwin/include/cygwin/version.h @@ -489,12 +489,13 @@ details. */ 352: Implement dirent.d_reclen. 353: Implement fdclosedir. 354: Implement posix_getdents. + 355: Implement setproctitle. Note that we forgot to bump the api for ualarm, strtoll, strtoull, sigaltstack, sethostname. */ #define CYGWIN_VERSION_API_MAJOR 0 -#define CYGWIN_VERSION_API_MINOR 354 +#define CYGWIN_VERSION_API_MINOR 355 /* There is also a compatibity version number associated with the shared memory regions. It is incremented when incompatible changes are made to the shared diff --git a/winsup/cygwin/libc/bsdlib.cc b/winsup/cygwin/libc/bsdlib.cc index 8e10827..14df033 100644 --- a/winsup/cygwin/libc/bsdlib.cc +++ b/winsup/cygwin/libc/bsdlib.cc @@ -258,6 +258,40 @@ setprogname (const char *newprogname) } extern "C" void +setproctitle (const char *fmt, ...) +{ + char buf[MAX_PATH]; /* Max len of a new proc title */ + va_list ap; + int len; + char *tmp; + + if (__argv0_orig) + { + tmp = __argv[0]; + __argv[0] = __argv0_orig; + __argv0_orig = NULL; + cfree (tmp); + } + if (fmt) + { + if (fmt[0] == '-') /* Skip program name prefix. */ + { + fmt++; + len = 0; + } + else /* Print program name heading for grep. */ + len = snprintf (buf, sizeof buf, "%s: ", getprogname ()); + va_start (ap, fmt); + vsnprintf (buf + len, sizeof buf - len, fmt, ap); + va_end (ap); + + tmp = (char *) cstrdup1 (buf); + __argv0_orig = __argv[0]; + __argv[0] = tmp; + } +} + +extern "C" void logwtmp (const char *line, const char *user, const char *host) { struct utmp ut; diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc index 5fd11f5..7f1f41d 100644 --- a/winsup/cygwin/pinfo.cc +++ b/winsup/cygwin/pinfo.cc @@ -642,27 +642,24 @@ commune_process (void *arg) { sigproc_printf ("processing PICOM_CMDLINE"); unsigned n = 0; - const char *argv[__argc_safe + 1]; + int argc = __argv0_orig ? 1 : __argc_safe; + const char *argv[argc + 1]; - for (int i = 0; i < __argc_safe; i++) + for (int i = 0; i < argc; i++) { argv[i] = __argv[i] ?: ""; n += strlen (argv[i]) + 1; } - argv[__argc_safe] = NULL; + argv[argc] = NULL; if (!WritePipeOverlapped (tothem, &n, sizeof n, &nr, 1000L)) - { - /*__seterrno ();*/ // this is run from the signal thread, so don't set errno - sigproc_printf ("WritePipeOverlapped sizeof argv failed, %E"); - } - else - for (const char **a = argv; *a; a++) - if (!WritePipeOverlapped (tothem, *a, strlen (*a) + 1, &nr, 1000L)) - { - sigproc_printf ("WritePipeOverlapped arg %d failed, %E", - a - argv); - break; - } + sigproc_printf ("WritePipeOverlapped sizeof argv failed, %E"); + else for (int i = 0; i < argc; i++) + if (!WritePipeOverlapped (tothem, __argv[i], + strlen (__argv[i]) + 1, &nr, 1000L)) + { + sigproc_printf ("WritePipeOverlapped arg %d failed, %E", i); + break; + } break; } case PICOM_CWD: @@ -1162,12 +1159,14 @@ _pinfo::cmdline (size_t& n) else { n = 0; - for (char **a = __argv; *a; a++) - n += strlen (*a) + 1; + int argc = __argv0_orig ? 1 : __argc_safe; + + for (int i = 0; i < argc; ++i) + n += strlen (__argv[i]) + 1; char *p; p = s = (char *) cmalloc_abort (HEAP_COMMUNE, n); - for (char **a = __argv; *a; a++) - p = stpcpy (p, *a) + 1; + for (int i = 0; i < argc; ++i) + p = stpcpy (p, __argv[i]) + 1; } return s; } diff --git a/winsup/cygwin/release/3.6.0 b/winsup/cygwin/release/3.6.0 index 5536d39..561637c 100644 --- a/winsup/cygwin/release/3.6.0 +++ b/winsup/cygwin/release/3.6.0 @@ -5,6 +5,8 @@ What's new: - New API calls: fdclosedir, posix_getdents. +- New API call: setproctitle. + What changed: ------------- -- cgit v1.1