]> mj.ucw.cz Git - libucw.git/blob - lib/proctitle.c
malloc -> xmalloc.
[libucw.git] / lib / proctitle.c
1 /*
2  *      Sherlock Library -- Setting of Process Title
3  *
4  *      (c) 2001 Martin Mares <mj@ucw.cz>
5  */
6
7 #include "lib/lib.h"
8
9 #include <stdio.h>
10 #include <string.h>
11 #include <stdarg.h>
12 #include <unistd.h>
13
14 static char **spt_argv;
15 static char *spt_start, *spt_end;
16
17 void
18 setproctitle_init(int argc, char **argv)
19 {
20 #ifdef linux
21   int i, len;
22   char **env, **oldenv, *t;
23
24   spt_argv = argv;
25
26   /* Create a backup copy of environment */
27   oldenv = __environ;
28   len = 0;
29   for (i=0; oldenv[i]; i++)
30     len += strlen(oldenv[i]) + 1;
31   __environ = env = xmalloc(sizeof(char *)*(i+1));
32   t = xmalloc(len);
33   for (i=0; oldenv[i]; i++)
34     {
35       env[i] = t;
36       len = strlen(oldenv[i]) + 1;
37       memcpy(t, oldenv[i], len);
38       t += len;
39     }
40   env[i] = NULL;
41
42   /* Scan for consecutive free space */
43   spt_start = spt_end = argv[0];
44   for (i=0; i<argc; i++)
45     if (!i || spt_end+1 == argv[i])
46       spt_end = argv[i] + strlen(argv[i]);
47   for (i=0; oldenv[i]; i++)
48     if (spt_end+1 == oldenv[i])
49       spt_end = oldenv[i] + strlen(oldenv[i]);
50 #endif
51 }
52
53 void
54 setproctitle(char *msg, ...)
55 {
56   va_list args;
57   byte buf[256];
58   int n;
59
60   va_start(args, msg);
61   if (spt_end > spt_start)
62     {
63       n = vsnprintf(buf, sizeof(buf), msg, args);
64       if (n >= (int) sizeof(buf) || n < 0)
65         sprintf(buf, "<too-long>");
66       n = spt_end - spt_start;
67       strncpy(spt_start, buf, n);
68       spt_start[n] = 0;
69       spt_argv[0] = spt_start;
70       spt_argv[1] = NULL;
71     }
72   va_end(args);
73 }