2 * UCW Library -- Setting of Process Title
4 * (c) 2001--2006 Martin Mares <mj@ucw.cz>
6 * This software may be freely distributed and used according to the terms
7 * of the GNU Lesser General Public License.
18 static char **spt_argv;
19 static char *spt_start, *spt_end;
22 setproctitle_init(int argc, char **argv)
26 char **env, **oldenv, *t;
30 /* Create a backup copy of environment */
33 for (i=0; oldenv[i]; i++)
34 len += strlen(oldenv[i]) + 1;
35 __environ = env = xmalloc(sizeof(char *)*(i+1));
37 for (i=0; oldenv[i]; i++)
40 len = strlen(oldenv[i]) + 1;
41 memcpy(t, oldenv[i], len);
46 /* Scan for consecutive free space */
47 spt_start = spt_end = argv[0];
48 for (i=0; i<argc; i++)
49 if (!i || spt_end+1 == argv[i])
50 spt_end = argv[i] + strlen(argv[i]);
51 for (i=0; oldenv[i]; i++)
52 if (spt_end+1 == oldenv[i])
53 spt_end = oldenv[i] + strlen(oldenv[i]);
55 /* Recalculate program_invocation_name, otherwise syslog() will be confused. */
56 char *name = xstrdup(argv[0]);
57 program_invocation_name = name;
58 char *p = strrchr(name, '/');
60 program_invocation_short_name = p + 1;
62 program_invocation_short_name = name;
67 setproctitle(const char *msg, ...)
74 if (spt_end > spt_start)
76 n = vsnprintf(buf, sizeof(buf), msg, args);
77 if (n >= (int) sizeof(buf) || n < 0)
78 sprintf(buf, "<too-long>");
79 n = spt_end - spt_start;
80 strncpy(spt_start, buf, n);
82 spt_argv[0] = spt_start;
91 return (spt_start < spt_end) ? spt_start : NULL;