Module Name: src Committed By: christos Date: Wed Dec 7 22:52:54 UTC 2011
Modified Files: src/usr.sbin/sup/source: setproctitle.c Log Message: be more portable, explain what we are doing, simplify. To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/usr.sbin/sup/source/setproctitle.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.sbin/sup/source/setproctitle.c diff -u src/usr.sbin/sup/source/setproctitle.c:1.3 src/usr.sbin/sup/source/setproctitle.c:1.4 --- src/usr.sbin/sup/source/setproctitle.c:1.3 Mon Apr 28 16:24:17 2008 +++ src/usr.sbin/sup/source/setproctitle.c Wed Dec 7 17:52:54 2011 @@ -27,10 +27,13 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include <sys/param.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h> +#include <limits.h> +#include <unistd.h> #ifdef NEED_SETPROCTITLE @@ -42,18 +45,42 @@ setproctitle(const char *fmt, ...) va_list ap; char buf[1024]; int len; - char *pname, *p; - char **args = __environ - 2; + char *pname, *p, *s; + /* + * Assumes that stack grows down, and than environ has not bee + * reallocated because of setenv() required growth. Stack layout: + * + * argc + * argv[0] + * ... + * argv[n] + * NULL + * environ[0] + * ... + * environ[n] + * NULL + */ + /* 1 for the first entry, 1 for the NULL */ + char **args = __environ - 2, *s; +#ifdef _SC_ARG_MAX + s = (char *)sysconf(_SC_ARG_MAX); +#elifdef ARG_MAX + s = (char *)ARG_MAX; +#elifdef NCARGS + s = (char *)NCARGS; +#else + s = (char *)(256 * 1024); +#endif /* * Keep going while it looks like a pointer. We'll stop at argc, - * Assume that we have < 10K args. + * Which is a lot smaller than a pointer, limited by ARG_MAX */ - while (*args > (char *)10240) + while (*args > s) args--; - pname = *++args; - *(int *)((int *)pname - 1) = 1; /* *argc = 1; */ + *(int *)args = 1; /* *argc = 1; */ + pname = *++args; /* pname = argv[0] */ /* Just the last component of the name */ if ((p = strrchr(pname, '/')) != NULL)