#include "status.h"
#include "fork.h"
#include "uam_auth.h"
+#include "afp_zeroconf.h"
#ifdef TRU64
#include <sys/security.h>
static server_child *server_children;
static fd_set save_rfds;
static int Ipc_fd = -1;
+static sig_atomic_t reloadconfig = 0;
#ifdef TRU64
void afp_get_cmdline( int *ac, char ***av)
dsi_kill(sig);
switch( sig ) {
+
case SIGTERM :
LOG(log_info, logtype_afpd, "shutting down on signal %d", sig );
+ AFPConfig *config;
+ for (config = configs; config; config = config->next)
+ if (config->server_cleanup)
+ config->server_cleanup(config);
+ afp_exit(0);
break;
+
case SIGUSR1 :
- case SIGHUP :
- /* w/ a configuration file, we can force a re-read if we want */
nologin++;
auth_unload();
- if (sig == SIGHUP || ((nologin + 1) & 1)) {
- AFPConfig *config;
-
- LOG(log_info, logtype_afpd, "re-reading configuration file");
- for (config = configs; config; config = config->next)
- if (config->server_cleanup)
- config->server_cleanup(config);
+ LOG(log_info, logtype_afpd, "disallowing logins");
+ break;
- /* configfree close atp socket used for DDP tickle, there's an issue
- * with atp tid.
- */
- configfree(configs, NULL);
- if (!(configs = configinit(&default_options))) {
- LOG(log_error, logtype_afpd, "config re-read: no servers configured");
- afp_exit(EXITERR_CONF);
- }
- set_fd(Ipc_fd);
- } else {
- LOG(log_info, logtype_afpd, "disallowing logins");
- }
- if (sig == SIGHUP) {
- nologin = 0;
- }
+ case SIGHUP :
+ /* w/ a configuration file, we can force a re-read if we want */
+ reloadconfig = 1;
break;
+
default :
LOG(log_error, logtype_afpd, "afp_goaway: bad signal" );
}
- if ( sig == SIGTERM ) {
- AFPConfig *config;
-
- for (config = configs; config; config = config->next)
- if (config->server_cleanup)
- config->server_cleanup(config);
-
- afp_exit(0);
- }
return;
}
#endif
sigaddset(&sigs, SIGCHLD);
- sigprocmask(SIG_BLOCK, &sigs, NULL);
+ pthread_sigmask(SIG_BLOCK, &sigs, NULL);
if (!(configs = configinit(&default_options))) {
LOG(log_error, logtype_afpd, "main: no servers configured");
afp_exit(EXITERR_CONF);
}
- sigprocmask(SIG_UNBLOCK, &sigs, NULL);
+ pthread_sigmask(SIG_UNBLOCK, &sigs, NULL);
/* Register CNID */
cnid_init();
* solution. */
while (1) {
rfds = save_rfds;
- sigprocmask(SIG_UNBLOCK, &sigs, NULL);
+ pthread_sigmask(SIG_UNBLOCK, &sigs, NULL);
ret = select(FD_SETSIZE, &rfds, NULL, NULL, NULL);
- sigprocmask(SIG_BLOCK, &sigs, NULL);
+ pthread_sigmask(SIG_BLOCK, &sigs, NULL);
+ int saveerrno = errno;
+
+ if (reloadconfig) {
+ nologin++;
+ auth_unload();
+ AFPConfig *config;
+
+ LOG(log_info, logtype_afpd, "re-reading configuration file");
+ for (config = configs; config; config = config->next)
+ if (config->server_cleanup)
+ config->server_cleanup(config);
+
+ /* configfree close atp socket used for DDP tickle, there's an issue
+ * with atp tid. */
+ configfree(configs, NULL);
+ if (!(configs = configinit(&default_options))) {
+ LOG(log_error, logtype_afpd, "config re-read: no servers configured");
+ afp_exit(EXITERR_CONF);
+ }
+ set_fd(Ipc_fd);
+ nologin = 0;
+ reloadconfig = 0;
+ errno = saveerrno;
+ }
+
if (ret < 0) {
if (errno == EINTR)
continue;
* chance to add the child in. */
sigemptyset(&sig);
sigaddset(&sig, SIGCHLD);
- sigprocmask(SIG_BLOCK, &sig, &oldsig);
+ pthread_sigmask(SIG_BLOCK, &sig, &oldsig);
/* it's possible that the child could have already died before the
- * sigprocmask. we need to check for this. */
+ * pthread_sigmask. we need to check for this. */
if (kill(pid, 0) < 0) {
- sigprocmask(SIG_SETMASK, &oldsig, NULL);
+ pthread_sigmask(SIG_SETMASK, &oldsig, NULL);
return 1;
}
/* if we already have an entry. just return. */
if (resolve_child(fork->table, pid)) {
- sigprocmask(SIG_SETMASK, &oldsig, NULL);
+ pthread_sigmask(SIG_SETMASK, &oldsig, NULL);
return 0;
}
if ((child = (struct server_child_data *)
calloc(1, sizeof(struct server_child_data))) == NULL) {
- sigprocmask(SIG_SETMASK, &oldsig, NULL);
+ pthread_sigmask(SIG_SETMASK, &oldsig, NULL);
return -1;
}
child->killed = 0;
hash_child(fork->table, child);
children->count++;
- sigprocmask(SIG_SETMASK, &oldsig, NULL);
+ pthread_sigmask(SIG_SETMASK, &oldsig, NULL);
return 0;
}
sigaddset(&sigs, SIGHUP);
sigaddset(&sigs, SIGUSR1);
sigaddset(&sigs, SIGCHLD);
- sigprocmask(SIG_UNBLOCK, &sigs, NULL);
+ pthread_sigmask(SIG_UNBLOCK, &sigs, NULL);
}