summaryrefslogtreecommitdiffstats
path: root/common/osdep/proctitle.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/osdep/proctitle.c')
-rw-r--r--common/osdep/proctitle.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/common/osdep/proctitle.c b/common/osdep/proctitle.c
new file mode 100644
index 00000000..c6891e67
--- /dev/null
+++ b/common/osdep/proctitle.c
@@ -0,0 +1,71 @@
+/* $Id$ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include "osdep.h"
+
+#ifdef NEED_SETPROCTITLE
+
+static char **Argv = NULL; /* pointer to argument vector */
+static int argv_size; /* end of argv */
+
+extern char **environ;
+
+void
+initsetproctitle(int argc, char **argv, char **envp)
+{
+ int i, len=0, nenv=0;
+
+ /*
+ * Move the environment so setproctitle can use the space at the top of
+ * memory.
+ */
+ for (i = 0; envp[i]; i++)
+ len += strlen(envp[i])+1;
+
+ nenv = i + 1;
+ len += sizeof(char*)*nenv;
+ environ = malloc(len);
+ len = 0;
+ for (i = 0; envp[i]; i++) {
+ environ[i] = (char*)environ + nenv * sizeof(char*) + len;
+ strcpy(environ[i], envp[i]);
+ len += strlen(envp[i])+1;
+ }
+ environ[i] = NULL;
+
+ /* Save start and extent of argv for setproctitle. */
+ Argv = argv;
+ if (i > 0)
+ argv_size = envp[i - 1] + strlen(envp[i - 1]) - Argv[0];
+ else
+ argv_size = argv[argc - 1] + strlen(argv[argc - 1]) - Argv[0];
+}
+
+static void
+do_setproctitle(const char *cmdline)
+{
+ int len;
+
+ len = strlen(cmdline) + 1; // +1 for '\0'
+ if (len > argv_size - 2) // 2 ??
+ len = argv_size - 2;
+ memset(Argv[0], 0, argv_size);
+ strlcpy(Argv[0], cmdline, len);
+ Argv[1] = NULL;
+}
+
+void
+setproctitle(const char *format,...)
+{
+ char buf[256];
+ va_list args;
+ va_start(args, format);
+ vsnprintf(buf, sizeof(buf), format, args);
+ do_setproctitle(buf);
+ va_end(args);
+}
+
+#endif
+