#define _GNU_SOURCE #include #include #include #include #include #include extern char **environ; static char **argv_buffer = NULL; static size_t argv_size = 0; int main(int argc, char *argv[]); void set_proc_title_init(int argc, char *argv[]); void set_proc_title(const char *format, ...); int main(int argc, char *argv[]) { time_t t; struct tm *tmp; char s[256]; set_proc_title_init(argc, argv); while(1) { t = time(NULL); tmp = localtime(&t); strftime(s, sizeof(s), "%F %T", tmp); set_proc_title("You would see my binary's name here, but instead, I'll tell you the time is: %s", s); sleep(1); } exit(0); return 0; } /* this code borrowed from hal-daemon's util_helper.c */ void set_proc_title_init(int argc, char *argv[]) { unsigned int i; char **new_environ; char *endptr; /* This code is really really ugly. We make some memory layout * assumptions and reuse the environment array as memory to store * our process title in */ for (i = 0; environ[i] != NULL; i++) ; endptr = i ? environ[i - 1] + strlen(environ[i - 1]) : argv[argc - 1] + strlen(argv[argc - 1]); argv_buffer = argv; argv_size = endptr - argv_buffer[0]; /* Make a copy of environ */ new_environ = malloc(sizeof(char*) * (i + 1)); for (i = 0; environ[i] != NULL; i++) new_environ[i] = strdup(environ[i]); new_environ[i] = NULL; environ = new_environ; } /* this code borrowed from avahi-daemon's setproctitle.c (LGPL v2) */ void set_proc_title(const char *format, ...) { size_t len; va_list ap; if (argv_buffer != NULL) { va_start(ap, format); vsnprintf(argv_buffer[0], argv_size, format, ap); va_end(ap); len = strlen(argv_buffer[0]); memset(argv_buffer[0] + len, 0, argv_size - len); argv_buffer[1] = NULL; } }