+static void catch_child(int sig _U_)
+{
+ sigchild = 1;
+}
+
+/* ----------------------- */
+static void set_signal(void)
+{
+ struct sigaction sv;
+ sigset_t set;
+
+ memset(&sv, 0, sizeof(sv));
+
+ /* Catch SIGCHLD */
+ sv.sa_handler = catch_child;
+ sv.sa_flags = SA_NOCLDSTOP;
+ sigemptyset(&sv.sa_mask);
+ if (sigaction(SIGCHLD, &sv, NULL) < 0) {
+ LOG(log_error, logtype_cnid, "cnid_metad: sigaction: %s", strerror(errno));
+ daemon_exit(EXITERR_SYS);
+ }
+
+ /* Catch SIGTERM */
+ sv.sa_handler = sigterm_handler;
+ sigfillset(&sv.sa_mask );
+ if (sigaction(SIGTERM, &sv, NULL ) < 0 ) {
+ LOG(log_error, logtype_afpd, "sigaction: %s", strerror(errno) );
+ daemon_exit(EXITERR_SYS);
+ }
+
+ /* Ignore the rest */
+ sv.sa_handler = SIG_IGN;
+ sigemptyset(&sv.sa_mask );
+ if (sigaction(SIGALRM, &sv, NULL ) < 0 ) {
+ LOG(log_error, logtype_afpd, "sigaction: %s", strerror(errno) );
+ daemon_exit(EXITERR_SYS);
+ }
+ sv.sa_handler = SIG_IGN;
+ sigemptyset(&sv.sa_mask );
+ if (sigaction(SIGHUP, &sv, NULL ) < 0 ) {
+ LOG(log_error, logtype_afpd, "sigaction: %s", strerror(errno) );
+ daemon_exit(EXITERR_SYS);
+ }
+ sv.sa_handler = SIG_IGN;
+ sigemptyset(&sv.sa_mask );
+ if (sigaction(SIGUSR1, &sv, NULL ) < 0 ) {
+ LOG(log_error, logtype_afpd, "sigaction: %s", strerror(errno) );
+ daemon_exit(EXITERR_SYS);
+ }
+ sv.sa_handler = SIG_IGN;
+ sigemptyset(&sv.sa_mask );
+ if (sigaction(SIGUSR2, &sv, NULL ) < 0 ) {
+ LOG(log_error, logtype_afpd, "sigaction: %s", strerror(errno) );
+ daemon_exit(EXITERR_SYS);
+ }
+ sv.sa_handler = SIG_IGN;
+ sigemptyset(&sv.sa_mask );
+ if (sigaction(SIGPIPE, &sv, NULL ) < 0 ) {
+ LOG(log_error, logtype_afpd, "sigaction: %s", strerror(errno) );
+ daemon_exit(EXITERR_SYS);
+ }
+
+ /* block everywhere but in pselect */
+ sigemptyset(&set);
+ sigaddset(&set, SIGCHLD);
+ sigprocmask(SIG_BLOCK, &set, NULL);
+}
+
+static int setlimits(void)
+{
+ struct rlimit rlim;
+
+ if (getrlimit(RLIMIT_NOFILE, &rlim) != 0) {
+ LOG(log_error, logtype_afpd, "setlimits: %s", strerror(errno));
+ exit(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);
+ }
+ }
+ return 0;