const struct master_service_settings_input *input)
{
const char **conf_argv, *binary_path = service->argv[0];
- const char *home = NULL, *user = NULL, *timestamp = NULL;
+ const char *home = NULL, *user = NULL, *timestamp = NULL, *error = NULL;
unsigned int i, argv_max_count;
- (void)t_binary_abspath(&binary_path);
+ if (!t_binary_abspath(&binary_path, &error)) {
+ i_fatal("t_binary_abspath(%s) failed: %s", binary_path, error);
+ }
if (!service->keep_environment && !input->preserve_environment) {
if (input->preserve_home)
return 0;
}
-bool t_binary_abspath(const char **binpath)
+bool t_binary_abspath(const char **binpath, const char **error_r)
{
const char *path_env, *const *paths;
string_t *path;
/* relative to current directory */
const char *error;
if (t_abspath(*binpath, binpath, &error) < 0) {
- i_error("t_abspath(%s) failed: %s",
- *binpath, error);
+ *error_r = t_strdup_printf("t_abspath(%s) failed: %s",
+ *binpath, error);
return FALSE;
}
return TRUE;
}
str_truncate(path, 0);
}
+ *error_r = "Could not find the wanted executable from PATH";
+ return FALSE;
+ } else {
+ *error_r = "PATH environment variable undefined";
+ return FALSE;
}
- return FALSE;
}
int t_readlink(const char *path, const char **dest_r, const char **error_r);
/* Update binpath to be absolute:
- a) begins with '/' -> no change
- b) contains '/' -> assume relative to working directory
- c) set to first executable that's found from $PATH
-
- If no usable binary was found, return FALSE. */
-bool t_binary_abspath(const char **binpath);
+ * a) begins with '/' -> no change
+ * b) contains '/' -> assume relative to working directory
+ * c) set to first executable that's found from $PATH
+ *
+ * error_r is set on failure, and cannot be NULL.
+ */
+bool t_binary_abspath(const char **binpath, const char **error_r);
#endif