view src/lib/process-title.c @ 9191:b340ecb24469 HEAD

Fix VPATH build of RQUOTA support. Some rpcgen derive #include "..." paths from the infile argument. This will be off for VPATH builds, as the generated rquota_xdr.c code will look in $(srcdir), but we'll generate the rquota.h file in $(builddir). Play safe and copy rquota.x to $(builddir) first. This fixes the build on openSUSE 11.1.
author Matthias Andree <>
date Tue, 07 Jul 2009 21:01:36 +0200
parents b9faf4db2a9f
children cf291558ce28
line wrap: on
line source

/* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */


#include "lib.h"
#include "process-title.h"

#include <stdlib.h> /* NetBSD, OpenBSD */
#include <unistd.h> /* FreeBSD */

/* NOTE: This really is a horrible hack, I don't recommend using it for
   anything else than debugging. */

static char *process_name = NULL;

static char *process_title;
static size_t process_title_len;

static void linux_proctitle_init(char *argv[], char *envp[])
	extern char **environ;
	char **p;
	int i;

	/* copy environment elsewhere */
	for (i = 0; envp[i] != NULL; i++)

	if ((p = malloc((i + 1) * sizeof(char *))) == NULL)
		i_fatal_status(FATAL_OUTOFMEM, "malloc() failed: %m");
	environ = p;

	for (i = 0; envp[i] != NULL; i++) {
		if ((environ[i] = strdup(envp[i])) == NULL)
			i_fatal_status(FATAL_OUTOFMEM, "strdup() failed: %m");
	environ[i] = NULL;

	/* memory is allocated so that argv[] comes first, environment next.
	   Calculate the max. size for process name with by checking the
	   address for last environment and it's length. */
	process_title = argv[0];
	process_title_len = (size_t) (envp[i-1] - argv[0]) + strlen(envp[i-1]);

static void linux_proctitle_set(const char *title)
	i_strocpy(process_title, title, process_title_len);


void process_title_init(char *argv[] ATTR_UNUSED,
			char *envp[] ATTR_UNUSED)
	linux_proctitle_init(argv, envp);
	process_name = argv[0];

void process_title_set(const char *title ATTR_UNUSED)
	i_assert(process_name != NULL);

	if (title == NULL)
		setproctitle("%s", process_name);
		setproctitle("%s %s", process_name, title);
	linux_proctitle_set(t_strconcat(process_name, " ", title, NULL));