X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fafpd%2Fmain.c;h=c056a737c0a9e64f8c89c5b1e68718c6d63943b4;hb=15c1fc2f2328736dd428ec3be37c893d8ee2e065;hp=8c3f43ad6fe03826356c5df894102f9907944499;hpb=9fcb3ed9f1911a4960c82d7f86d82e60fefeeabc;p=netatalk.git diff --git a/etc/afpd/main.c b/etc/afpd/main.c index 8c3f43ad..c056a737 100644 --- a/etc/afpd/main.c +++ b/etc/afpd/main.c @@ -11,10 +11,8 @@ #include #include #include - #include #include -#include #include #include #include @@ -22,20 +20,23 @@ #include #include +#include #include - -#include #include #include -#include -#include #include #include #include #include #include +#include +#include #include +#include "event2/event.h" +#include "event2/http.h" +#include "event2/rpc.h" + #include "afp_config.h" #include "status.h" #include "fork.h" @@ -51,8 +52,12 @@ static int argc = 0; static char **argv = NULL; #endif /* TRU64 */ +#define AFP_LISTENERS 32 +#define FDSET_SAFETY 5 + unsigned char nologin = 0; struct afp_options default_options; + static AFPConfig *configs; static server_child *server_children; static sig_atomic_t reloadconfig = 0; @@ -92,13 +97,25 @@ static void fd_set_listening_sockets(void) for (config = configs; config; config = config->next) { if (config->fd < 0) /* for proxies */ continue; - fdset_add_fd(&fdset, &polldata, &fdset_used, &fdset_size, config->fd, LISTEN_FD, config); + fdset_add_fd(default_options.connections + AFP_LISTENERS + FDSET_SAFETY, + &fdset, + &polldata, + &fdset_used, + &fdset_size, + config->fd, + LISTEN_FD, + config); } - if (default_options.flags & OPTION_KEEPSESSIONS) { - LOG(log_note, logtype_afpd, "Activating continous service"); - fdset_add_fd(&fdset, &polldata, &fdset_used, &fdset_size, disasociated_ipc_fd, DISASOCIATED_IPC_FD, NULL); - } + if (default_options.flags & OPTION_KEEPSESSIONS) + fdset_add_fd(default_options.connections + AFP_LISTENERS + FDSET_SAFETY, + &fdset, + &polldata, + &fdset_used, + &fdset_size, + disasociated_ipc_fd, + DISASOCIATED_IPC_FD, + NULL); } static void fd_reset_listening_sockets(void) @@ -118,11 +135,7 @@ static void fd_reset_listening_sockets(void) /* ------------------ */ static void afp_goaway(int sig) { - AFPConfig *config; - -#ifndef NO_DDP - asp_kill(sig); -#endif /* ! NO_DDP */ + AFPConfig *config; switch( sig ) { @@ -213,16 +226,16 @@ static int setlimits(void) struct rlimit rlim; if (getrlimit(RLIMIT_NOFILE, &rlim) != 0) { - LOG(log_error, logtype_afpd, "setlimits: %s", strerror(errno)); - exit(1); + LOG(log_warning, logtype_afpd, "setlimits: reading current limits failed: %s", strerror(errno)); + return -1; } if (rlim.rlim_cur != RLIM_INFINITY && rlim.rlim_cur < 65535) { rlim.rlim_cur = 65535; if (rlim.rlim_max != RLIM_INFINITY && rlim.rlim_max < 65535) rlim.rlim_max = 65535; if (setrlimit(RLIMIT_NOFILE, &rlim) != 0) { - LOG(log_error, logtype_afpd, "setlimits: %s", strerror(errno)); - exit(1); + LOG(log_warning, logtype_afpd, "setlimits: increasing limits failed: %s", strerror(errno)); + return -1; } } return 0; @@ -243,29 +256,30 @@ int main(int ac, char **av) set_auth_parameters( ac, av ); #endif /* TRU64 */ + /* Parse argv args and initialize default options */ + afp_options_init(&default_options); + if (!afp_options_parse(ac, av, &default_options)) + exit(EXITERR_CONF); + + if (check_lockfile("afpd", default_options.pidfile) != 0) + exit(EXITERR_SYS); + + if (!(default_options.flags & OPTION_DEBUG) && (daemonize(0, 0) != 0)) + exit(EXITERR_SYS); + + if (create_lockfile("afpd", default_options.pidfile) != 0) + exit(EXITERR_SYS); + /* Log SIGBUS/SIGSEGV SBT */ fault_setup(NULL); /* Default log setup: log to syslog */ + set_processname("afpd"); setuplog("default log_note"); - afp_options_init(&default_options); - if (!afp_options_parse(ac, av, &default_options)) - exit(EXITERR_CONF); - - /* Save the user's current umask for use with CNID (and maybe some - * other things, too). */ + /* Save the user's current umask */ default_options.save_mask = umask( default_options.umask ); - switch(server_lock("afpd", default_options.pidfile, - default_options.flags & OPTION_DEBUG)) { - case -1: /* error */ - exit(EXITERR_SYS); - case 0: /* child */ - break; - default: /* server */ - exit(0); - } atexit(afp_exit); /* install child handler for asp and dsi. we do this before afp_goaway @@ -377,11 +391,22 @@ int main(int ac, char **av) } pthread_sigmask(SIG_UNBLOCK, &sigs, NULL); - /* Register CNID */ + /* Initialize */ cnid_init(); - + if (locktable_init("XXX") != 0) + exit(EXITERR_SYS); +#if 0 + if (rpc_init("127.0.0.1", 4701) != 0) + exit(EXITERR_SYS); +#endif + /* watch atp, dsi sockets and ipc parent/child file descriptor. */ - disasociated_ipc_fd = ipc_server_uds(_PATH_AFP_IPC); + + if (default_options.flags & OPTION_KEEPSESSIONS) { + LOG(log_note, logtype_afpd, "Activating continous service"); + disasociated_ipc_fd = ipc_server_uds(_PATH_AFP_IPC); + } + fd_set_listening_sockets(); /* set limits */ @@ -456,7 +481,14 @@ int main(int ac, char **av) /* config->server_start is afp_config.c:dsi_start() for DSI */ if (child = config->server_start(config, configs, server_children)) { /* Add IPC fd to select fd set */ - fdset_add_fd(&fdset, &polldata, &fdset_used, &fdset_size, child->ipc_fds[0], IPC_FD, child); + fdset_add_fd(default_options.connections + AFP_LISTENERS + FDSET_SAFETY, + &fdset, + &polldata, + &fdset_used, + &fdset_size, + child->ipc_fds[0], + IPC_FD, + child); } break; @@ -493,7 +525,14 @@ int main(int ac, char **av) break; } child->disasociated = 1; - fdset_add_fd(&fdset, &polldata, &fdset_used, &fdset_size, fd[0], IPC_FD, child); + fdset_add_fd(default_options.connections + AFP_LISTENERS + FDSET_SAFETY, + &fdset, + &polldata, + &fdset_used, + &fdset_size, + fd[0], + IPC_FD, + child); break; default: