changeset 9175:9ef2d07f786d HEAD

master: Don't fail startup if the full path to dovecot wasn't in argv[0].
author Timo Sirainen <tss@iki.fi>
date Wed, 29 Apr 2009 15:24:25 -0400
parents 1ad6926f46a2
children cf026a9180f1
files src/lib-master/master-service-settings.c
diffstat 1 files changed, 18 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-master/master-service-settings.c	Wed Apr 29 15:08:34 2009 -0400
+++ b/src/lib-master/master-service-settings.c	Wed Apr 29 15:24:25 2009 -0400
@@ -55,7 +55,21 @@
 static void ATTR_NORETURN
 master_service_exec_config(struct master_service *service, bool preserve_home)
 {
-	const char **conf_argv;
+	const char **conf_argv, *path, *const *paths, *binary_path;
+
+	binary_path = service->argv[0];
+	path = getenv("PATH");
+	if (*service->argv[0] != '/') {
+		/* we have to find our executable from path */
+		paths = t_strsplit(path, ":");
+		for (; *paths != NULL; paths++) {
+			path = t_strconcat(*paths, "/", binary_path, NULL);
+			if (access(path, X_OK) == 0) {
+				binary_path = path;
+				break;
+			}
+		}
+	}
 
 	if (!service->keep_environment)
 		master_service_env_clean(preserve_home);
@@ -68,8 +82,9 @@
 	conf_argv[3] = "-c";
 	conf_argv[4] = service->config_path;
 	conf_argv[5] = "-e";
-	memcpy(conf_argv+6, service->argv,
-	       (service->argc+1) * sizeof(conf_argv[0]));
+	conf_argv[6] = binary_path;
+	memcpy(conf_argv+7, service->argv + 1,
+	       (service->argc) * sizeof(conf_argv[0]));
 	execv(conf_argv[0], (char **)conf_argv);
 	i_fatal("execv(%s) failed: %m", conf_argv[0]);
 }