--- include/setproctitle.c.orig 1970-01-01 01:00:00.000000000 +0100 +++ include/setproctitle.c 2010-05-09 00:38:37.000000000 +0200 @@ -0,0 +1,109 @@ +/* proctitle code - we know this to work only on linux... */ + +/* +** SETPROCTITLE -- set process title for ps (from sendmail) +** +** Parameters: +** fmt -- a printf style format string. +** +** Returns: +** none. +** +** Side Effects: +** Clobbers argv of our main procedure so ps(1) will +** display the title. +*/ + +#include +#include +#include +#include +#include "setproctitle.h" + +#ifndef SPT_BUFSIZE +#define SPT_BUFSIZE 2048 +#endif + +extern char** environ; + +static char** argv0; +static int argv_lth; + +void +initproctitle (int argc, char **argv) { + int i; + char **envp = environ; + + /* + * Move the environment so we can reuse the memory. + * (Code borrowed from sendmail.) + * WARNING: ugly assumptions on memory layout here; + * if this ever causes problems, #undef DO_PS_FIDDLING + */ + for (i = 0; envp[i] != NULL; i++) + continue; + environ = (char **) malloc(sizeof(char *) * (i + 1)); + if (environ == NULL) + return; + for (i = 0; envp[i] != NULL; i++) + if ((environ[i] = strdup(envp[i])) == NULL) + return; + environ[i] = NULL; + + argv0 = argv; + if (i > 0) + argv_lth = envp[i-1] + strlen(envp[i-1]) - argv0[0]; + else + argv_lth = argv0[argc-1] + strlen(argv0[argc-1]) - argv0[0]; +} + +#if 0 +/* Nice code, but many places do not know about vsnprintf ... */ +void +setproctitle (const char *fmt,...) { + int i; + char buf[SPT_BUFSIZE]; + va_list ap; + + if (!argv0) + return; + + va_start(ap, fmt); + (void) vsnprintf(buf, SPT_BUFSIZE, fmt, ap); + va_end(ap); + + i = strlen (buf); + if (i > argv_lth - 2) { + i = argv_lth - 2; + buf[i] = '\0'; + } + memset(argv0[0], '\0', argv_lth); /* clear the memory area */ + (void) strcpy (argv0[0], buf); + + argv0[1] = NULL; +} +#else +void +setproctitle (const char *prog, const char *txt) { + int i; + char buf[SPT_BUFSIZE]; + + if (!argv0) + return; + + if (strlen(prog) + strlen(txt) + 5 > SPT_BUFSIZE) + return; + + (void) sprintf(buf, "%s -- %s", prog, txt); + + i = strlen (buf); + if (i > argv_lth - 2) { + i = argv_lth - 2; + buf[i] = '\0'; + } + memset(argv0[0], '\0', argv_lth); /* clear the memory area */ + (void) strcpy (argv0[0], buf); + + argv0[1] = NULL; +} +#endif