}
static int make_socket_fd(const char* address, int flags) {
- _cleanup_free_ char *p = NULL;
SocketAddress a;
int fd, r;
_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)
/* 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);
" -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"
assert(argc >= 0);
assert(argv);
- while ((c = getopt_long(argc, argv, "+hl:saE:", options, NULL)) >= 0)
+ while ((c = getopt_long(argc, argv, "+hl:aE:", options, NULL)) >= 0)
switch(c) {
case 'h':
return help();
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;
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);