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