chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
bus: make sure exit-on-idle logic works on kdbus systems that do not generate NameLost
[elogind.git]
/
src
/
activate
/
activate.c
diff --git
a/src/activate/activate.c
b/src/activate/activate.c
index f0944aac5c846e9339f887b639a4a14109869581..d73c16e8ab7aee220220b5efb57e538d9f80816c 100644
(file)
--- a/
src/activate/activate.c
+++ b/
src/activate/activate.c
@@
-58,7
+58,6
@@
static int add_epoll(int epoll_fd, int fd) {
}
static int make_socket_fd(const char* address, int flags) {
}
static int make_socket_fd(const char* address, int flags) {
- _cleanup_free_ char *p = NULL;
SocketAddress a;
int fd, r;
SocketAddress a;
int fd, r;
@@
-100,6
+99,17
@@
static int open_sockets(int *epoll_fd, bool accept) {
}
}
}
}
+ /* Close logging and all other descriptors */
+ if (arg_listen) {
+ int except[3 + n];
+
+ for (fd = 0; fd < SD_LISTEN_FDS_START + n; fd++)
+ except[fd] = fd;
+
+ log_close();
+ close_all_fds(except, 3 + n);
+ }
+
/** Note: we leak some fd's on error here. I doesn't matter
* much, since the program will exit immediately anyway, but
* would be a pain to fix.
/** Note: we leak some fd's on error here. I doesn't matter
* much, since the program will exit immediately anyway, but
* would be a pain to fix.
@@
-109,6
+119,7
@@
static int open_sockets(int *epoll_fd, bool accept) {
fd = make_socket_fd(*address, SOCK_STREAM | (arg_accept*SOCK_CLOEXEC));
if (fd < 0) {
fd = make_socket_fd(*address, SOCK_STREAM | (arg_accept*SOCK_CLOEXEC));
if (fd < 0) {
+ log_open();
log_error("Failed to open '%s': %s", *address, strerror(-fd));
return fd;
}
log_error("Failed to open '%s': %s", *address, strerror(-fd));
return fd;
}
@@
-117,6
+128,9
@@
static int open_sockets(int *epoll_fd, bool accept) {
count ++;
}
count ++;
}
+ if (arg_listen)
+ log_open();
+
*epoll_fd = epoll_create1(EPOLL_CLOEXEC);
if (*epoll_fd < 0) {
log_error("Failed to create epoll object: %m");
*epoll_fd = epoll_create1(EPOLL_CLOEXEC);
if (*epoll_fd < 0) {
log_error("Failed to create epoll object: %m");
@@
-127,7
+141,7
@@
static int open_sockets(int *epoll_fd, bool accept) {
_cleanup_free_ char *name = NULL;
getsockname_pretty(fd, &name);
_cleanup_free_ char *name = NULL;
getsockname_pretty(fd, &name);
- log_info("Listening on %s
.", strna(name)
);
+ log_info("Listening on %s
as %i.", strna(name), fd
);
r = add_epoll(*epoll_fd, fd);
if (r < 0)
r = add_epoll(*epoll_fd, fd);
if (r < 0)
@@
-262,6
+276,8
@@
static int do_accept(const char* name, char **argv, char **envp, int fd) {
/* SIGCHLD handler. */
static void sigchld_hdl(int sig, siginfo_t *t, void *data) {
/* SIGCHLD handler. */
static void sigchld_hdl(int sig, siginfo_t *t, void *data) {
+ PROTECT_ERRNO;
+
log_info("Child %d died with code %d", t->si_pid, t->si_status);
/* Wait for a dead child. */
waitpid(t->si_pid, NULL, 0);
log_info("Child %d died with code %d", t->si_pid, t->si_status);
/* Wait for a dead child. */
waitpid(t->si_pid, NULL, 0);
@@
-269,10
+285,10
@@
static void sigchld_hdl(int sig, siginfo_t *t, void *data) {
static int install_chld_handler(void) {
int r;
static int install_chld_handler(void) {
int r;
- struct sigaction act
;
- zero(act);
- act.sa_flags = SA_SIGINFO;
-
act.sa_sigaction = sigchld_hdl
;
+ struct sigaction act
= {
+ .sa_flags = SA_SIGINFO,
+ .sa_sigaction = sigchld_hdl,
+
}
;
r = sigaction(SIGCHLD, &act, 0);
if (r < 0)
r = sigaction(SIGCHLD, &act, 0);
if (r < 0)
@@
-287,6
+303,8
@@
static int help(void) {
" -l --listen=ADDR Listen for raw connections at ADDR\n"
" -a --accept Spawn separate child for each connection\n"
" -h --help Show this help and exit\n"
" -l --listen=ADDR Listen for raw connections at ADDR\n"
" -a --accept Spawn separate child for each connection\n"
" -h --help Show this help and exit\n"
+ " -E --environment=NAME[=VALUE]\n"
+ " Pass an environment variable to children\n"
" --version Print version string and exit\n"
"\n"
"Note: file descriptors from sd_listen_fds() will be passed through.\n"
" --version Print version string and exit\n"
"\n"
"Note: file descriptors from sd_listen_fds() will be passed through.\n"
@@
-315,7
+333,7
@@
static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0);
assert(argv);
assert(argc >= 0);
assert(argv);
- while ((c = getopt_long(argc, argv, "+hl:
s
aE:", options, NULL)) >= 0)
+ while ((c = getopt_long(argc, argv, "+hl:aE:", options, NULL)) >= 0)
switch(c) {
case 'h':
return help();
switch(c) {
case 'h':
return help();
@@
-381,6
+399,10
@@
int main(int argc, char **argv, char **envp) {
n = open_sockets(&epoll_fd, arg_accept);
if (n < 0)
return EXIT_FAILURE;
n = open_sockets(&epoll_fd, arg_accept);
if (n < 0)
return EXIT_FAILURE;
+ if (n == 0) {
+ log_error("No sockets to listen on specified or passed in.");
+ return EXIT_FAILURE;
+ }
for (;;) {
struct epoll_event event;
for (;;) {
struct epoll_event event;
@@
-394,7
+416,7
@@
int main(int argc, char **argv, char **envp) {
return EXIT_FAILURE;
}
return EXIT_FAILURE;
}
- log_info("Communication attempt on fd
:%d
", event.data.fd);
+ log_info("Communication attempt on fd
%i.
", event.data.fd);
if (arg_accept) {
r = do_accept(argv[optind], argv + optind, envp,
event.data.fd);
if (arg_accept) {
r = do_accept(argv[optind], argv + optind, envp,
event.data.fd);