]> mj.ucw.cz Git - libucw.git/commitdiff
Define setproctitle() and use it for gatherer thread status reporting.
authorMartin Mares <mj@ucw.cz>
Sat, 17 Mar 2001 14:42:16 +0000 (14:42 +0000)
committerMartin Mares <mj@ucw.cz>
Sat, 17 Mar 2001 14:42:16 +0000 (14:42 +0000)
lib/Makefile
lib/lib.h
lib/proctitle.c [new file with mode: 0644]

index 66a5a72cc700c41c4aa82a2f8d4a9fcfa0f7bbee..c76105d69cf53f33fcb18116a179e50c8230c642 100644 (file)
@@ -7,7 +7,7 @@ SHLIB_OBJS=alloc.o alloc_str.o ctmatch.o db.o fastbuf.o fb-file.o fb-mem.o lists
        log.o log2.o md5.o md5hex.o mmap.o pagecache.o patimatch.o patmatch.o pool.o \
        prime.o random.o realloc.o regex.o temp.o timer.o url.o wildmatch.o \
        wordsplit.o str_ctype.o str_upper.o bucket.o conf.o object.o sorter.o \
-       finger.o
+       finger.o proctitle.o
 
 obj/lib/libsh.a: $(addprefix obj/lib/,$(SHLIB_OBJS))
 
index eb079dcd6fe94139b24643c856a1dc7e21256d8e..05bde59ef85f7107fdd2d02f18a31068b6ba341f 100644 (file)
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -184,4 +184,9 @@ uns random_max(uns);
 void *mmap_file(byte *name, unsigned *len, int writeable);
 void munmap_file(void *start, unsigned len);
 
+/* proctitle.c */
+
+void setproctitle_init(int argc, char **argv);
+void setproctitle(char *msg, ...) __attribute__((format(printf,1,2)));
+
 #endif
diff --git a/lib/proctitle.c b/lib/proctitle.c
new file mode 100644 (file)
index 0000000..e5f9bd4
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ *     Sherlock Library -- Setting of Process Title
+ *
+ *     (c) 2001 Martin Mares <mj@ucw.cz>
+ */
+
+#include "lib/lib.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <unistd.h>
+
+static char *spt_start, *spt_end;
+
+void
+setproctitle_init(int argc, char **argv)
+{
+#ifdef linux
+#if 0                                  /* FIXME: This doesn't work. Why? */
+  uns i, len;
+  char **env, *t;
+
+  /* Create a backup copy of environment */
+  len = 0;
+  for (i=0; __environ[i]; i++)
+    len += strlen(__environ[i]) + 1;
+  env = xmalloc(sizeof(char *)*(i+1));
+  t = xmalloc(len);
+  spt_end = __environ[0];
+  for (i=0; __environ[i]; i++)
+    {
+      env[i] = t;
+      len = strlen(__environ[i]) + 1;
+      memcpy(t, __environ[i], len);
+      t += len;
+      spt_end = MAX(spt_end, __environ[i] + len);
+    }
+  env[i] = NULL;
+  __environ[0] = NULL;
+  spt_start = (byte *)(__environ+1);
+  __environ = env;
+  argv[0] = spt_start;
+#else
+  spt_start = argv[0];
+  spt_end = argv[argc-1] + strlen(argv[argc-1]) - 1;
+#endif
+#endif
+}
+
+void
+setproctitle(char *msg, ...)
+{
+  va_list args;
+  byte buf[256];
+  int n;
+
+  va_start(args, msg);
+  if (spt_end > spt_start)
+    {
+      n = vsnprintf(buf, sizeof(buf), msg, args);
+      if (n >= (int) sizeof(buf) || n < 0)
+       sprintf(buf, "<too-long>");
+      n = spt_end - spt_start;
+      strncpy(spt_start, buf, n);
+      spt_start[n] = 0;
+    }
+  va_end(args);
+}