assert(command);
assert(context);
assert(params);
- assert(!params->fds || FLAGS_SET(params->flags, EXEC_PASS_FDS));
assert(params->fds || (params->n_socket_fds + params->n_stashed_fds == 0 && !params->fd_names));
+ assert(params->n_stashed_fds == 0 || FLAGS_SET(params->flags, EXEC_PASS_FDS));
assert(!params->files_env); /* We fill this field, ensure it comes NULL-initialized to us */
assert(ret);
assert(fds);
assert(fd_names);
assert(n_socket_fds);
- assert(n_stashed_fds);
if (s->socket_fd >= 0) {
Socket *sock = ASSERT_PTR(SOCKET(UNIT_DEREF(s->accept_socket)));
}
}
- if (s->n_fd_store + s->n_extra_fds > 0) {
+ if (n_stashed_fds && s->n_fd_store + s->n_extra_fds > 0) {
int *t = reallocarray(rfds, rn_socket_fds + s->n_fd_store + s->n_extra_fds, sizeof(int));
if (!t)
return -ENOMEM;
*fds = TAKE_PTR(rfds);
*fd_names = TAKE_PTR(rfd_names);
*n_socket_fds = rn_socket_fds;
- *n_stashed_fds = s->n_fd_store + s->n_extra_fds;
+ if (n_stashed_fds)
+ *n_stashed_fds = s->n_fd_store + s->n_extra_fds;
return 0;
}
exec_params.flags &= ~EXEC_APPLY_CHROOT;
}
- if (FLAGS_SET(exec_params.flags, EXEC_PASS_FDS) ||
- s->exec_context.std_input == EXEC_INPUT_SOCKET ||
- s->exec_context.std_output == EXEC_OUTPUT_SOCKET ||
- s->exec_context.std_error == EXEC_OUTPUT_SOCKET) {
-
+ if (FLAGS_SET(exec_params.flags, EXEC_PASS_FDS)) {
r = service_collect_fds(s,
&exec_params.fds,
&exec_params.fd_names,
if (r < 0)
return r;
+ log_unit_debug(UNIT(s), "Passing %zu fds to service", exec_params.n_socket_fds + exec_params.n_stashed_fds);
+
exec_params.open_files = s->open_files;
- exec_params.flags |= EXEC_PASS_FDS;
+ } else if (s->exec_context.std_input == EXEC_INPUT_SOCKET ||
+ s->exec_context.std_output == EXEC_OUTPUT_SOCKET ||
+ s->exec_context.std_error == EXEC_OUTPUT_SOCKET) {
- log_unit_debug(UNIT(s), "Passing %zu fds to service", exec_params.n_socket_fds + exec_params.n_stashed_fds);
+ r = service_collect_fds(s,
+ &exec_params.fds,
+ &exec_params.fd_names,
+ &exec_params.n_socket_fds,
+ /* n_stashed_fds = */ NULL);
+ if (r < 0)
+ return r;
+
+ log_unit_debug(UNIT(s), "Passing %zu sockets to service", exec_params.n_socket_fds);
}
if (!FLAGS_SET(exec_params.flags, EXEC_IS_CONTROL) && s->type == SERVICE_EXEC) {