]> sourceware.org Git - newlib-cygwin.git/commitdiff
Cygwin: implement setproctitle topic/3.6 github/topic/3.6
authorCorinna Vinschen <corinna@vinschen.de>
Wed, 31 Jan 2024 18:54:13 +0000 (19:54 +0100)
committerCorinna Vinschen <corinna@vinschen.de>
Wed, 31 Jan 2024 19:11:58 +0000 (20:11 +0100)
Make sure to create commandline according to setting of setproctitle.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
newlib/libc/include/sys/unistd.h
winsup/cygwin/cygwin.din
winsup/cygwin/globals.cc
winsup/cygwin/include/cygwin/version.h
winsup/cygwin/libc/bsdlib.cc
winsup/cygwin/pinfo.cc
winsup/cygwin/release/3.6.0

index 00901540fc5f5a45e75684cbe4652a1aa739894d..13b0c166f1a7b47f4bc45baf4d47d9166e4d5fbb 100644 (file)
@@ -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);
index 6bac40cc066f52a6b0fea7f946c3e76ed9aae75c..be9efdc00f44dc04988cdd8ed0478c09bd6c570f 100644 (file)
@@ -1353,6 +1353,7 @@ setpassent NOSIGFE
 setpgid SIGFE
 setpgrp SIGFE
 setpriority SIGFE
+setproctitle SIGFE
 setprogname NOSIGFE
 setprotoent = cygwin_setprotoent SIGFE
 setpwent NOSIGFE
index 654b836c289038ae5a48659717c8297641ceb287..885ada85e7b86883ab1799a058c82f3c6232905a 100644 (file)
@@ -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 */;
 
index 6679eedd95058bd4d0376ba04ab62e08c26bb282..d12ea9c89d623f6379f196ddd463a4610502a7c9 100644 (file)
@@ -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
index 8e108272417fcad5228b04177247025fe81aadcd..14df033353634b3cad0548d1352c636c1a3b4641 100644 (file)
@@ -257,6 +257,40 @@ setprogname (const char *newprogname)
   __endtry
 }
 
+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)
 {
index 5fd11f570c3c259970f70ceab672f65fef1f30f1..7f1f41d79177df0df7b65776360bd6d6d9c12590 100644 (file)
@@ -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;
 }
index 5536d39a3effdcefd1d5fd25d777851285a2fd42..561637c397e6861ed7b427055d6ec95d62bdc518 100644 (file)
@@ -5,6 +5,8 @@ What's new:
 
 - New API calls: fdclosedir, posix_getdents.
 
+- New API call: setproctitle.
+
 
 What changed:
 -------------
This page took 0.044696 seconds and 5 git commands to generate.