This file is part of systemd.
Copyright 2013 Zbigniew Jędrzejewski-Szmek
-
- systemd is free software; you can redistribute it and/or modify it
- under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
-
- systemd is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with systemd; If not, see <http://www.gnu.org/licenses/>.
***/
#include <getopt.h>
static int add_epoll(int epoll_fd, int fd) {
struct epoll_event ev = {
- .events = EPOLLIN
+ .events = EPOLLIN,
+ .data.fd = fd,
};
- int r;
assert(epoll_fd >= 0);
assert(fd >= 0);
- ev.data.fd = fd;
- r = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &ev);
- if (r < 0)
+ if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &ev) < 0)
return log_error_errno(errno, "Failed to add event on epoll fd:%d for fd:%d: %m", epoll_fd, fd);
return 0;
if (arg_inetd) {
assert(n_fds == 1);
- r = dup2(start_fd, STDIN_FILENO);
- if (r < 0)
- return log_error_errno(errno, "Failed to dup connection to stdin: %m");
-
- r = dup2(start_fd, STDOUT_FILENO);
+ r = rearrange_stdio(start_fd, start_fd, STDERR_FILENO); /* invalidates start_fd on success + error */
if (r < 0)
- return log_error_errno(errno, "Failed to dup connection to stdout: %m");
+ return log_error_errno(errno, "Failed to move fd to stdin+stdout: %m");
- start_fd = safe_close(start_fd);
} else {
if (start_fd != SD_LISTEN_FDS_START) {
assert(n_fds == 1);
- r = dup2(start_fd, SD_LISTEN_FDS_START);
- if (r < 0)
+ if (dup2(start_fd, SD_LISTEN_FDS_START) < 0)
return log_error_errno(errno, "Failed to dup connection: %m");
safe_close(start_fd);
.sa_handler = sigchld_hdl,
};
- int r;
-
- r = sigaction(SIGCHLD, &act, 0);
- if (r < 0)
+ if (sigaction(SIGCHLD, &act, 0) < 0)
return log_error_errno(errno, "Failed to install SIGCHLD handler: %m");
return 0;
for (;;) {
struct epoll_event event;
- r = epoll_wait(epoll_fd, &event, 1, -1);
- if (r < 0) {
+ if (epoll_wait(epoll_fd, &event, 1, -1) < 0) {
if (errno == EINTR)
continue;