Fix 'ps' WAIT status display bug on setproctitle() platforms, cleared by
authorBruce Momjian <bruce@momjian.us>
Tue, 20 Mar 2001 22:31:54 +0000 (22:31 +0000)
committerBruce Momjian <bruce@momjian.us>
Tue, 20 Mar 2001 22:31:54 +0000 (22:31 +0000)
Tom Lane.

src/backend/utils/misc/ps_status.c

index 75d9f8802c7254d95f87623851fe13b0e7cf7aea..a977ee11ed4800234ccd7273a42fccbd6877b072 100644 (file)
@@ -5,7 +5,7 @@
  * to contain some useful information. Differs wildly across
  * platforms.
  *
- * $Header: /cvsroot/pgsql/src/backend/utils/misc/ps_status.c,v 1.2 2000/07/09 13:14:11 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/misc/ps_status.c,v 1.3 2001/03/20 22:31:54 momjian Exp $
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  * various details abducted from various places
@@ -44,7 +44,7 @@ extern char **environ;
  * PS_USE_PS_STRINGS
  *     assign PS_STRINGS->ps_argvstr = "string"
  *     (some BSD systems)
- * PS_USE_CHANCE_ARGV
+ * PS_USE_CHANGE_ARGV
  *     assign argv[0] = "string"
  *     (some other BSD systems)
  * PS_USE_CLOBBER_ARGV
@@ -189,64 +189,68 @@ init_ps_display(int argc, char *argv[],
 void
 set_ps_display(const char * value)
 {
+#ifndef PS_USE_NONE
    /* no ps display for stand-alone backend */
    if (!IsUnderPostmaster)
        return;
 
-#ifndef PS_USE_NONE
+# ifdef PS_USE_CLOBBER_ARGV
+   /* If ps_buffer is a pointer, it might still be null */
    if (!ps_buffer)
        return;
-# ifdef PS_USE_SETPROCTITLE
-   setproctitle("%s%s", ps_buffer, value);
+# endif
 
-# else /* not PS_USE_SETPROCTITLE */
-   {
-       size_t vallen = strlen(value);
+   /* Update ps_buffer to contain both fixed part and value */
+   StrNCpy(ps_buffer + ps_buffer_fixed_size, value,
+           ps_buffer_size - ps_buffer_fixed_size);
 
-       strncpy(ps_buffer + ps_buffer_fixed_size, value,
-               ps_buffer_size - ps_buffer_fixed_size);
+   /* Transmit new setting to kernel, if necessary */
 
-       if (ps_buffer_fixed_size + vallen >= ps_buffer_size)
-           ps_buffer[ps_buffer_size - 1] = 0;
-       else
-           ps_buffer[ps_buffer_fixed_size + vallen] = 0;
+# ifdef PS_USE_SETPROCTITLE
+   setproctitle("%s", ps_buffer);
+# endif
 
-#  ifdef PS_USE_PSTAT
+# ifdef PS_USE_PSTAT
        {
            union pstun pst;
 
            pst.pst_command = ps_buffer;
            pstat(PSTAT_SETCMD, pst, strlen(ps_buffer), 0, 0);
        }
-#  endif /* PS_USE_PSTAT */
+# endif /* PS_USE_PSTAT */
 
-#  ifdef PS_USE_PS_STRINGS
+# ifdef PS_USE_PS_STRINGS
        PS_STRINGS->ps_nargvstr = 1;
        PS_STRINGS->ps_argvstr = ps_buffer;
-#  endif /* PS_USE_PS_STRINGS */
+# endif /* PS_USE_PS_STRINGS */
 
-#  ifdef PS_USE_CLOBBER_ARGV
+# ifdef PS_USE_CLOBBER_ARGV
        {
            char * cp;
            /* pad unused memory */
-           for(cp = ps_buffer + ps_buffer_fixed_size + vallen;
+           for(cp = ps_buffer + strlen(ps_buffer);
                cp < ps_buffer + ps_buffer_size;
                cp++)
                *cp = PS_PADDING;
        }
-#  endif /* PS_USE_CLOBBER_ARGV */
-   }
-# endif /* not USE_SETPROCTITLE */
+# endif /* PS_USE_CLOBBER_ARGV */
+
 #endif /* not PS_USE_NONE */
 }
 
 
 /*
  * Returns what's currently in the ps display, in case someone needs
- * it.
+ * it.  Note that only the variable part is returned.
  */
 const char *
 get_ps_display(void)
 {
+#ifdef PS_USE_CLOBBER_ARGV
+   /* If ps_buffer is a pointer, it might still be null */
+   if (!ps_buffer)
+       return "";
+#endif
+
    return ps_buffer + ps_buffer_fixed_size;
 }