static void afp_dsi_close(AFPObj *obj)
{
DSI *dsi = obj->dsi;
-
+ sigset_t sigs;
+
close(obj->ipc_fd);
obj->ipc_fd = -1;
}
}
- close_all_vol();
- if (obj->logout)
+ close_all_vol(obj);
+ if (obj->logout) {
+ /* Block sigs, PAM/systemd/whoever might send us a SIG??? in (*obj->logout)() -> pam_close_session() */
+ sigfillset(&sigs);
+ pthread_sigmask(SIG_BLOCK, &sigs, NULL);
(*obj->logout)();
+ }
LOG(log_note, logtype_afpd, "AFP statistics: %.2f KB read, %.2f KB written",
dsi->read_count/1024.0, dsi->write_count/1024.0);
}
}
-/* -------------------------------------------
- afp over dsi. this never returns.
-*/
-void afp_over_dsi(AFPObj *obj)
+void afp_over_dsi_sighandlers(AFPObj *obj)
{
DSI *dsi = (DSI *) obj->dsi;
- int rc_idx;
- uint32_t err, cmd;
- uint8_t function;
struct sigaction action;
- AFPobj = obj;
- dsi->AFPobj = obj;
- obj->exit = afp_dsi_die;
- obj->reply = (int (*)()) dsi_cmdreply;
- obj->attention = (int (*)(void *, AFPUserBytes)) dsi_attention;
- dsi->tickle = 0;
-
memset(&action, 0, sizeof(action));
sigfillset(&action.sa_mask);
action.sa_flags = SA_RESTART;
afp_dsi_die(EXITERR_SYS);
}
#endif /* DEBUGGING */
+}
+
+/* -------------------------------------------
+ afp over dsi. this never returns.
+*/
+void afp_over_dsi(AFPObj *obj)
+{
+ DSI *dsi = (DSI *) obj->dsi;
+ int rc_idx;
+ uint32_t err, cmd;
+ uint8_t function;
+
+ AFPobj = obj;
+ obj->exit = afp_dsi_die;
+ obj->reply = (int (*)()) dsi_cmdreply;
+ obj->attention = (int (*)(void *, AFPUserBytes)) dsi_attention;
+ dsi->tickle = 0;
+
+ afp_over_dsi_sighandlers(obj);
if (dircache_init(obj->options.dircachesize) != 0)
afp_dsi_die(EXITERR_SYS);
LOG(log_debug, logtype_afpd, "<== Start AFP command: %s", AfpNum2name(function));
err = (*afp_switch[function])(obj,
- (char *)&dsi->commands, dsi->cmdlen,
+ dsi->commands, dsi->cmdlen,
(char *)&dsi->data, &dsi->datalen);
LOG(log_debug, logtype_afpd, "==> Finished AFP command: %s -> %s",
LOG(log_debug, logtype_afpd, "<== Start AFP command: %s", AfpNum2name(function));
err = (*afp_switch[function])(obj,
- (char *)&dsi->commands, dsi->cmdlen,
+ dsi->commands, dsi->cmdlen,
(char *)&dsi->data, &dsi->datalen);
LOG(log_debug, logtype_afpd, "==> Finished AFP command: %s -> %s",