summaryrefslogtreecommitdiffstats
path: root/lib/libutil
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1996-02-24 14:37:30 +0000
committerpeter <peter@FreeBSD.org>1996-02-24 14:37:30 +0000
commit4223430ef271f2fdfd2e4384dcb69393411e55f8 (patch)
tree00f5472548be9f315edc7d3c99327c3e16f41c16 /lib/libutil
parent427e11b898e376c5200a6077bb0cec0547ea6e28 (diff)
downloadFreeBSD-src-4223430ef271f2fdfd2e4384dcb69393411e55f8.zip
FreeBSD-src-4223430ef271f2fdfd2e4384dcb69393411e55f8.tar.gz
If the two recently added sysctl variables exist, use those rather than
the statically compiled PS_STRINGS and USRSTACK variables. This prevents programs using setproctitle from coredumping if the kernel VM is increased, and stops libkvm users (w, ps, etc) from needing to be recompiled if only the VM layout changes.
Diffstat (limited to 'lib/libutil')
-rw-r--r--lib/libutil/setproctitle.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/lib/libutil/setproctitle.c b/lib/libutil/setproctitle.c
index 2faf976..08efa99 100644
--- a/lib/libutil/setproctitle.c
+++ b/lib/libutil/setproctitle.c
@@ -11,19 +11,16 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. This work was done expressly for inclusion into FreeBSD. Other use
- * is permitted provided this notation is included.
- * 4. Absolutely no warranty of function or purpose is made by the author
+ * 3. Absolutely no warranty of function or purpose is made by the author
* Peter Wemm.
- * 5. Modifications may be freely made to this file providing the above
- * conditions are met.
*
- * $Id$
+ * $Id: setproctitle.c,v 1.1 1995/12/26 22:50:08 peter Exp $
*/
#include <sys/types.h>
#include <sys/param.h>
#include <sys/exec.h>
+#include <sys/sysctl.h>
#include <vm/vm.h>
#include <vm/vm_param.h>
@@ -71,10 +68,12 @@ setproctitle(fmt, va_alist)
#endif
{
char *p;
- int len;
static char buf[SPT_BUFSIZE];
static char *ps_argv[2];
va_list ap;
+ int mib[2];
+ struct ps_strings *ps_strings;
+ size_t len;
#if defined(__STDC__)
va_start(ap, fmt);
@@ -104,13 +103,21 @@ setproctitle(fmt, va_alist)
va_end(ap);
+ ps_strings = NULL;
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_PS_STRINGS;
+ len = sizeof(ps_strings);
+ if (sysctl(mib, 2, &ps_strings, &len, NULL, 0) < 0 ||
+ ps_strings == NULL)
+ ps_strings = PS_STRINGS;
+
/* PS_STRINGS points to zeroed memory on a style #2 kernel */
- if (PS_STRINGS->ps_argvstr) {
+ if (ps_strings->ps_argvstr) {
/* style #3 */
ps_argv[0] = buf;
ps_argv[1] = NULL;
- PS_STRINGS->ps_nargvstr = 1;
- PS_STRINGS->ps_argvstr = ps_argv;
+ ps_strings->ps_nargvstr = 1;
+ ps_strings->ps_argvstr = ps_argv;
} else {
/* style #2 */
OLD_PS_STRINGS->old_ps_nargvstr = 1;
OpenPOWER on IntegriCloud