/* 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_PADCHAR #define SPT_PADCHAR ' ' #endif #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,...) { char *p; 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'; } (void) strcpy (argv0[0], buf); p = &argv0[0][i]; while (i < argv_lth) *p++ = SPT_PADCHAR, i++; argv0[1] = NULL; } #else void setproctitle (const char *prog, const char *txt) { char *p; 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'; } (void) strcpy (argv0[0], buf); p = &argv0[0][i]; while (i < argv_lth) *p++ = SPT_PADCHAR, i++; argv0[1] = NULL; } #endif