]> mj.ucw.cz Git - libucw.git/blob - lib/proctitle.c
Define setproctitle() and use it for gatherer thread status reporting.
[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_start, *spt_end;
15
16 void
17 setproctitle_init(int argc, char **argv)
18 {
19 #ifdef linux
20 #if 0                                   /* FIXME: This doesn't work. Why? */
21   uns i, len;
22   char **env, *t;
23
24   /* Create a backup copy of environment */
25   len = 0;
26   for (i=0; __environ[i]; i++)
27     len += strlen(__environ[i]) + 1;
28   env = xmalloc(sizeof(char *)*(i+1));
29   t = xmalloc(len);
30   spt_end = __environ[0];
31   for (i=0; __environ[i]; i++)
32     {
33       env[i] = t;
34       len = strlen(__environ[i]) + 1;
35       memcpy(t, __environ[i], len);
36       t += len;
37       spt_end = MAX(spt_end, __environ[i] + len);
38     }
39   env[i] = NULL;
40   __environ[0] = NULL;
41   spt_start = (byte *)(__environ+1);
42   __environ = env;
43   argv[0] = spt_start;
44 #else
45   spt_start = argv[0];
46   spt_end = argv[argc-1] + strlen(argv[argc-1]) - 1;
47 #endif
48 #endif
49 }
50
51 void
52 setproctitle(char *msg, ...)
53 {
54   va_list args;
55   byte buf[256];
56   int n;
57
58   va_start(args, msg);
59   if (spt_end > spt_start)
60     {
61       n = vsnprintf(buf, sizeof(buf), msg, args);
62       if (n >= (int) sizeof(buf) || n < 0)
63         sprintf(buf, "<too-long>");
64       n = spt_end - spt_start;
65       strncpy(spt_start, buf, n);
66       spt_start[n] = 0;
67     }
68   va_end(args);
69 }