X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=etc%2Fafpd%2Fafp_dsi.c;h=cb1eb19f75d8d849a5153955fb745c3de82de91e;hb=465246e257d9aff9855e3e35d8fd5983db932b45;hp=e8bbc0174fad5551ed4a1a8843e31e78bab15b02;hpb=38ccba34fde227ceec6253f8537b42ce012da367;p=netatalk.git diff --git a/etc/afpd/afp_dsi.c b/etc/afpd/afp_dsi.c index e8bbc017..cb1eb19f 100644 --- a/etc/afpd/afp_dsi.c +++ b/etc/afpd/afp_dsi.c @@ -35,7 +35,7 @@ #include #include -#include "globals.h" +#include #include "switch.h" #include "auth.h" #include "fork.h" @@ -132,6 +132,28 @@ static void afp_dsi_die(int sig) } } +/* SIGQUIT handler */ +static void ipc_reconnect_handler(int sig _U_) +{ + DSI *dsi = (DSI *)AFPobj->handle; + + LOG(log_note, logtype_afpd, "ipc_reconnect_handler: got SIGQUIT, trying IPC reconnect"); + + if (reconnect_ipc(AFPobj) != 0) { + LOG(log_error, logtype_afpd, "ipc_reconnect_handler: failed IPC reconnect"); + afp_dsi_close(AFPobj); + exit(EXITERR_SYS); + } + + LOG(log_note, logtype_afpd, "ipc_reconnect_handler: resending client ID"); + if (ipc_child_write(AFPobj->ipc_fd, IPC_GETSESSION, AFPobj->sinfo.clientid_len, AFPobj->sinfo.clientid) != 0) { + LOG(log_error, logtype_afpd, "ipc_reconnect_handler: failed IPC ID resend"); + afp_dsi_close(AFPobj); + exit(EXITERR_SYS); + } + LOG(log_note, logtype_afpd, "ipc_reconnect_handler: done"); +} + /* SIGURG handler (primary reconnect) */ static void afp_dsi_transfer_session(int sig _U_) { @@ -361,28 +383,20 @@ void afp_over_dsi(AFPObj *obj) u_int32_t err, cmd; u_int8_t function; struct sigaction action; - struct pollfd pollfds[1]; 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; - pollfds[0].fd = obj->ipc_fd; - pollfds[0].events = POLLOUT; - memset(&action, 0, sizeof(action)); + sigfillset(&action.sa_mask); + action.sa_flags = SA_RESTART; /* install SIGHUP */ action.sa_handler = afp_dsi_reload; - sigemptyset( &action.sa_mask ); - sigaddset(&action.sa_mask, SIGALRM); - sigaddset(&action.sa_mask, SIGTERM); - sigaddset(&action.sa_mask, SIGUSR1); - sigaddset(&action.sa_mask, SIGINT); - sigaddset(&action.sa_mask, SIGUSR2); - action.sa_flags = SA_RESTART; if ( sigaction( SIGHUP, &action, NULL ) < 0 ) { LOG(log_error, logtype_afpd, "afp_over_dsi: sigaction: %s", strerror(errno) ); afp_dsi_die(EXITERR_SYS); @@ -390,13 +404,6 @@ void afp_over_dsi(AFPObj *obj) /* install SIGURG */ action.sa_handler = afp_dsi_transfer_session; - sigemptyset( &action.sa_mask ); - sigaddset(&action.sa_mask, SIGALRM); - sigaddset(&action.sa_mask, SIGTERM); - sigaddset(&action.sa_mask, SIGUSR1); - sigaddset(&action.sa_mask, SIGINT); - sigaddset(&action.sa_mask, SIGUSR2); - action.sa_flags = SA_RESTART; if ( sigaction( SIGURG, &action, NULL ) < 0 ) { LOG(log_error, logtype_afpd, "afp_over_dsi: sigaction: %s", strerror(errno) ); afp_dsi_die(EXITERR_SYS); @@ -404,27 +411,20 @@ void afp_over_dsi(AFPObj *obj) /* install SIGTERM */ action.sa_handler = afp_dsi_die; - sigemptyset( &action.sa_mask ); - sigaddset(&action.sa_mask, SIGALRM); - sigaddset(&action.sa_mask, SIGHUP); - sigaddset(&action.sa_mask, SIGUSR1); - sigaddset(&action.sa_mask, SIGINT); - sigaddset(&action.sa_mask, SIGUSR2); - action.sa_flags = SA_RESTART; if ( sigaction( SIGTERM, &action, NULL ) < 0 ) { LOG(log_error, logtype_afpd, "afp_over_dsi: sigaction: %s", strerror(errno) ); afp_dsi_die(EXITERR_SYS); } - /* Added for server message support */ + /* install SIGQUIT */ + action.sa_handler = ipc_reconnect_handler; + if ( sigaction(SIGQUIT, &action, NULL ) < 0 ) { + LOG(log_error, logtype_afpd, "afp_over_dsi: sigaction: %s", strerror(errno) ); + afp_dsi_die(EXITERR_SYS); + } + + /* SIGUSR2 - server message support */ action.sa_handler = afp_dsi_getmesg; - sigemptyset( &action.sa_mask ); - sigaddset(&action.sa_mask, SIGALRM); - sigaddset(&action.sa_mask, SIGTERM); - sigaddset(&action.sa_mask, SIGUSR1); - sigaddset(&action.sa_mask, SIGHUP); - sigaddset(&action.sa_mask, SIGINT); - action.sa_flags = SA_RESTART; if ( sigaction( SIGUSR2, &action, NULL) < 0 ) { LOG(log_error, logtype_afpd, "afp_over_dsi: sigaction: %s", strerror(errno) ); afp_dsi_die(EXITERR_SYS); @@ -432,12 +432,6 @@ void afp_over_dsi(AFPObj *obj) /* SIGUSR1 - set down in 5 minutes */ action.sa_handler = afp_dsi_timedown; - sigemptyset( &action.sa_mask ); - sigaddset(&action.sa_mask, SIGALRM); - sigaddset(&action.sa_mask, SIGHUP); - sigaddset(&action.sa_mask, SIGTERM); - sigaddset(&action.sa_mask, SIGINT); - sigaddset(&action.sa_mask, SIGUSR2); action.sa_flags = SA_RESTART; if ( sigaction( SIGUSR1, &action, NULL) < 0 ) { LOG(log_error, logtype_afpd, "afp_over_dsi: sigaction: %s", strerror(errno) ); @@ -446,23 +440,14 @@ void afp_over_dsi(AFPObj *obj) /* SIGINT - enable max_debug LOGging to /tmp/afpd.PID.XXXXXX */ action.sa_handler = afp_dsi_debug; - sigfillset( &action.sa_mask ); - action.sa_flags = SA_RESTART; if ( sigaction( SIGINT, &action, NULL) < 0 ) { LOG(log_error, logtype_afpd, "afp_over_dsi: sigaction: %s", strerror(errno) ); afp_dsi_die(EXITERR_SYS); } #ifndef DEBUGGING - /* tickle handler */ + /* SIGALRM - tickle handler */ action.sa_handler = alarm_handler; - sigemptyset(&action.sa_mask); - sigaddset(&action.sa_mask, SIGHUP); - sigaddset(&action.sa_mask, SIGTERM); - sigaddset(&action.sa_mask, SIGUSR1); - sigaddset(&action.sa_mask, SIGINT); - sigaddset(&action.sa_mask, SIGUSR2); - action.sa_flags = SA_RESTART; if ((sigaction(SIGALRM, &action, NULL) < 0) || (setitimer(ITIMER_REAL, &dsi->timer, NULL) < 0)) { afp_dsi_die(EXITERR_SYS); @@ -523,23 +508,6 @@ void afp_over_dsi(AFPObj *obj) * or a primary reconnect succeeds */ } - static int saved_ipcfd = -1; - if (saved_ipcfd == -1) - saved_ipcfd = obj->ipc_fd; - if (poll(pollfds, 1, 0) == 1) { - if (pollfds[0].revents & (POLLHUP | POLLERR)) { - if (saved_ipcfd == obj->ipc_fd && getppid() == 1) { - close(obj->ipc_fd); - sleep(30); /* give it enough time to start */ - if ((obj->ipc_fd = ipc_client_uds(_PATH_AFP_IPC)) == -1) { - LOG(log_error, logtype_afpd, "afp_over_dsi: cant reconnect to master"); - afp_dsi_die(EXITERR_SYS); - } - } - } - } - - if (!(dsi->flags & DSI_EXTSLEEP) && (dsi->flags & DSI_SLEEPING)) { LOG(log_debug, logtype_afpd, "afp_over_dsi: got data, ending normal sleep"); dsi->flags &= ~DSI_SLEEPING;