aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2024-01-31 19:54:13 +0100
committerCorinna Vinschen <corinna@vinschen.de>2024-01-31 20:11:58 +0100
commit2e7f7b96e5f1ca788e3f4589afaaa705b20051c0 (patch)
tree586253be5c7b1cdf8e687c62419388e1d0359bc6
parent61fd8702969da82a8f086e9b9aaa26fc068926c0 (diff)
downloadnewlib-topic/3.6.zip
newlib-topic/3.6.tar.gz
newlib-topic/3.6.tar.bz2
Cygwin: implement setproctitlegithub/topic/3.6topic/3.6
Make sure to create commandline according to setting of setproctitle. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r--newlib/libc/include/sys/unistd.h8
-rw-r--r--winsup/cygwin/cygwin.din1
-rw-r--r--winsup/cygwin/globals.cc2
-rw-r--r--winsup/cygwin/include/cygwin/version.h3
-rw-r--r--winsup/cygwin/libc/bsdlib.cc34
-rw-r--r--winsup/cygwin/pinfo.cc37
-rw-r--r--winsup/cygwin/release/3.6.02
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:
-------------