+ }
+ execve(command->path, final_argv, final_env);
+ *error = EXIT_EXEC;
+ return -errno;
+}
+
+int exec_spawn(ExecCommand *command,
+ const ExecContext *context,
+ const ExecParameters *params,
+ ExecRuntime *runtime,
+ pid_t *ret) {
+
+ _cleanup_strv_free_ char **files_env = NULL;
+ int *fds = NULL; unsigned n_fds = 0;
+ char *line, **argv;
+ int socket_fd;
+ pid_t pid;
+ int err;
+
+ assert(command);
+ assert(context);
+ assert(ret);
+ assert(params);
+ assert(params->fds || params->n_fds <= 0);
+
+ if (context->std_input == EXEC_INPUT_SOCKET ||
+ context->std_output == EXEC_OUTPUT_SOCKET ||
+ context->std_error == EXEC_OUTPUT_SOCKET) {
+
+ if (params->n_fds != 1)
+ return -EINVAL;
+
+ socket_fd = params->fds[0];
+ } else {
+ socket_fd = -1;
+ fds = params->fds;
+ n_fds = params->n_fds;
+ }
+
+ err = exec_context_load_environment(context, params->unit_id, &files_env);
+ if (err < 0) {
+ log_unit_struct(params->unit_id,
+ LOG_ERR,
+ LOG_MESSAGE("Failed to load environment files: %s", strerror(-err)),
+ LOG_ERRNO(-err),
+ NULL);
+ return err;
+ }
+
+ argv = params->argv ?: command->argv;
+
+ line = exec_command_line(argv);
+ if (!line)
+ return log_oom();
+
+ log_unit_struct(params->unit_id,
+ LOG_DEBUG,
+ "EXECUTABLE=%s", command->path,
+ LOG_MESSAGE("About to execute: %s", line),
+ NULL);
+ free(line);
+
+ pid = fork();
+ if (pid < 0)
+ return -errno;
+
+ if (pid == 0) {
+ int r;