From 465246e257d9aff9855e3e35d8fd5983db932b45 Mon Sep 17 00:00:00 2001 From: Frank Lahm Date: Thu, 26 May 2011 13:33:05 +0200 Subject: [PATCH] First working IPC reconnect --- etc/afpd/Makefile.am | 2 +- etc/afpd/afp_config.c | 2 +- etc/afpd/afp_config.h | 2 +- etc/afpd/afp_dsi.c | 102 +++++++++----------------- etc/afpd/afp_options.c | 2 +- etc/afpd/afp_util.c | 2 +- etc/afpd/appl.c | 2 +- etc/afpd/auth.c | 10 +-- etc/afpd/auth.h | 2 +- etc/afpd/catsearch.c | 2 +- etc/afpd/desktop.c | 2 +- etc/afpd/desktop.h | 2 +- etc/afpd/dircache.c | 3 +- etc/afpd/directory.c | 2 +- etc/afpd/directory.h | 2 +- etc/afpd/enumerate.c | 2 +- etc/afpd/extattrs.c | 2 +- etc/afpd/file.c | 2 +- etc/afpd/file.h | 2 +- etc/afpd/filedir.c | 2 +- etc/afpd/filedir.h | 2 +- etc/afpd/fork.c | 3 +- etc/afpd/gettok.c | 2 +- etc/afpd/icon.h | 2 +- etc/afpd/main.c | 48 +++++------- etc/afpd/mangle.h | 2 +- etc/afpd/messages.c | 3 +- etc/afpd/misc.h | 2 +- etc/afpd/ofork.c | 2 +- etc/afpd/status.c | 2 +- etc/afpd/status.h | 3 +- etc/afpd/switch.c | 3 +- etc/afpd/uam.c | 2 +- etc/afpd/uam_auth.h | 2 +- etc/afpd/volume.c | 2 +- etc/afpd/volume.h | 2 +- etc/uams/uams_dhx2_pam.c | 2 +- include/atalk/Makefile.am | 2 +- include/atalk/dsi.h | 2 + {etc/afpd => include/atalk}/globals.h | 0 include/atalk/server_ipc.h | 4 +- libatalk/dsi/dsi_stream.c | 4 +- libatalk/util/logger.c | 1 + libatalk/util/server_ipc.c | 47 ++++++++---- 44 files changed, 139 insertions(+), 154 deletions(-) rename {etc/afpd => include/atalk}/globals.h (100%) diff --git a/etc/afpd/Makefile.am b/etc/afpd/Makefile.am index dd81a3f7..5dd97e43 100644 --- a/etc/afpd/Makefile.am +++ b/etc/afpd/Makefile.am @@ -69,7 +69,7 @@ endif noinst_HEADERS = auth.h afp_config.h desktop.h directory.h file.h \ - filedir.h fork.h globals.h icon.h mangle.h misc.h status.h switch.h \ + filedir.h fork.h icon.h mangle.h misc.h status.h switch.h \ uam_auth.h uid.h unix.h volume.h hash.h acls.h acl_mappings.h extattrs.h \ dircache.h afp_zeroconf.h afp_avahi.h diff --git a/etc/afpd/afp_config.c b/etc/afpd/afp_config.c index 7f5fd1f1..291148c3 100644 --- a/etc/afpd/afp_config.c +++ b/etc/afpd/afp_config.c @@ -36,7 +36,7 @@ #include #endif -#include "globals.h" +#include #include "afp_config.h" #include "uam_auth.h" #include "status.h" diff --git a/etc/afpd/afp_config.h b/etc/afpd/afp_config.h index ba800ce3..7d5c482a 100644 --- a/etc/afpd/afp_config.h +++ b/etc/afpd/afp_config.h @@ -11,7 +11,7 @@ #include #include -#include "globals.h" +#include typedef struct AFPConfig { AFPObj obj; 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; diff --git a/etc/afpd/afp_options.c b/etc/afpd/afp_options.c index ab33ebee..5cb205db 100644 --- a/etc/afpd/afp_options.c +++ b/etc/afpd/afp_options.c @@ -34,8 +34,8 @@ #include #include #include +#include -#include "globals.h" #include "status.h" #include "auth.h" #include "dircache.h" diff --git a/etc/afpd/afp_util.c b/etc/afpd/afp_util.c index 7cf78ed2..a8282c22 100644 --- a/etc/afpd/afp_util.c +++ b/etc/afpd/afp_util.c @@ -15,7 +15,7 @@ #endif /* HAVE_CONFIG_H */ #include -#include "globals.h" +#include const char *AfpNum2name(int num) { diff --git a/etc/afpd/appl.c b/etc/afpd/appl.c index fe9ff250..51b64ef2 100644 --- a/etc/afpd/appl.c +++ b/etc/afpd/appl.c @@ -22,9 +22,9 @@ #include #include #include +#include #include "volume.h" -#include "globals.h" #include "directory.h" #include "file.h" #include "desktop.h" diff --git a/etc/afpd/auth.c b/etc/afpd/auth.c index 25ed6049..a41c624d 100644 --- a/etc/afpd/auth.c +++ b/etc/afpd/auth.c @@ -39,8 +39,8 @@ extern void afp_get_cmdline( int *ac, char ***av ); #include #include #include +#include -#include "globals.h" #include "auth.h" #include "uam_auth.h" #include "switch.h" @@ -597,10 +597,10 @@ int afp_getsession( if (!obj->sinfo.clientid) { obj->sinfo.clientid = malloc(idlen + 8); memcpy(obj->sinfo.clientid, p, idlen + 8); + obj->sinfo.clientid_len = idlen + 8; } - if (ipc_child_write(&obj->ipc_fd, IPC_GETSESSION, idlen+8, p) == -1) { - - } + if (ipc_child_write(obj->ipc_fd, IPC_GETSESSION, idlen+8, p) != 0) + return AFPERR_MISC; tklen = obj->sinfo.sessiontoken_len; token = obj->sinfo.sessiontoken; } @@ -682,7 +682,7 @@ int afp_disconnect(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, setitimer(ITIMER_REAL, &none, NULL); /* check for old session, possibly transfering session from here to there */ - if (ipc_child_write(&obj->ipc_fd, IPC_DISCOLDSESSION, tklen, &token) == -1) + if (ipc_child_write(obj->ipc_fd, IPC_DISCOLDSESSION, tklen, &token) != 0) goto exit; /* write uint16_t DSI request ID */ if (writet(obj->ipc_fd, &dsi->header.dsi_requestID, 2, 0, 2) != 2) { diff --git a/etc/afpd/auth.h b/etc/afpd/auth.h index 21574c29..d26354f3 100644 --- a/etc/afpd/auth.h +++ b/etc/afpd/auth.h @@ -16,7 +16,7 @@ #include #endif /* HAVE_SYS_CDEFS_H */ -#include "globals.h" +#include struct afp_versions { char *av_name; diff --git a/etc/afpd/catsearch.c b/etc/afpd/catsearch.c index d0e89f39..a488501e 100644 --- a/etc/afpd/catsearch.c +++ b/etc/afpd/catsearch.c @@ -47,13 +47,13 @@ #include #include #include +#include #include "desktop.h" #include "directory.h" #include "dircache.h" #include "file.h" #include "volume.h" -#include "globals.h" #include "filedir.h" #include "fork.h" diff --git a/etc/afpd/desktop.c b/etc/afpd/desktop.c index 9f105e13..8b6efd7e 100644 --- a/etc/afpd/desktop.c +++ b/etc/afpd/desktop.c @@ -31,10 +31,10 @@ #include #include #include +#include #include "volume.h" #include "directory.h" #include "fork.h" -#include "globals.h" #include "desktop.h" #include "mangle.h" diff --git a/etc/afpd/desktop.h b/etc/afpd/desktop.h index 039fa6ae..a220a478 100644 --- a/etc/afpd/desktop.h +++ b/etc/afpd/desktop.h @@ -27,7 +27,7 @@ #define AFPD_DESKTOP_H 1 #include -#include "globals.h" +#include #include "volume.h" struct savedt { diff --git a/etc/afpd/dircache.c b/etc/afpd/dircache.c index 44b74ada..5a702fa5 100644 --- a/etc/afpd/dircache.c +++ b/etc/afpd/dircache.c @@ -31,11 +31,12 @@ #include #include #include +#include #include "dircache.h" #include "directory.h" #include "hash.h" -#include "globals.h" + /* * Directory Cache diff --git a/etc/afpd/directory.c b/etc/afpd/directory.c index 1181a94e..fc0c5632 100644 --- a/etc/afpd/directory.c +++ b/etc/afpd/directory.c @@ -29,6 +29,7 @@ #include #include #include +#include #include "directory.h" #include "dircache.h" @@ -37,7 +38,6 @@ #include "fork.h" #include "file.h" #include "filedir.h" -#include "globals.h" #include "unix.h" #include "mangle.h" #include "hash.h" diff --git a/etc/afpd/directory.h b/etc/afpd/directory.h index b5fd7405..e9c6a457 100644 --- a/etc/afpd/directory.h +++ b/etc/afpd/directory.h @@ -37,8 +37,8 @@ #endif #include +#include -#include "globals.h" #include "volume.h" /* directory bits */ diff --git a/etc/afpd/enumerate.c b/etc/afpd/enumerate.c index 0bc24cec..fe5a66d9 100644 --- a/etc/afpd/enumerate.c +++ b/etc/afpd/enumerate.c @@ -22,12 +22,12 @@ #include #include #include +#include #include "desktop.h" #include "directory.h" #include "dircache.h" #include "volume.h" -#include "globals.h" #include "file.h" #include "fork.h" #include "filedir.h" diff --git a/etc/afpd/extattrs.c b/etc/afpd/extattrs.c index 649cc6a3..40298b50 100644 --- a/etc/afpd/extattrs.c +++ b/etc/afpd/extattrs.c @@ -28,8 +28,8 @@ #include #include #include +#include -#include "globals.h" #include "volume.h" #include "desktop.h" #include "directory.h" diff --git a/etc/afpd/file.c b/etc/afpd/file.c index 75dbb6c7..323642f9 100644 --- a/etc/afpd/file.c +++ b/etc/afpd/file.c @@ -37,6 +37,7 @@ char *strchr (), *strrchr (); #include #include #include +#include #include "directory.h" #include "dircache.h" @@ -45,7 +46,6 @@ char *strchr (), *strrchr (); #include "fork.h" #include "file.h" #include "filedir.h" -#include "globals.h" #include "unix.h" /* the format for the finderinfo fields (from IM: Toolbox Essentials): diff --git a/etc/afpd/file.h b/etc/afpd/file.h index 483f6be6..077cd120 100644 --- a/etc/afpd/file.h +++ b/etc/afpd/file.h @@ -31,8 +31,8 @@ #include #include #include +#include -#include "globals.h" #include "volume.h" #include "directory.h" diff --git a/etc/afpd/filedir.c b/etc/afpd/filedir.c index d10c6359..356d8210 100644 --- a/etc/afpd/filedir.c +++ b/etc/afpd/filedir.c @@ -40,6 +40,7 @@ char *strchr (), *strrchr (); #include #include #include +#include #include "directory.h" #include "dircache.h" @@ -47,7 +48,6 @@ char *strchr (), *strrchr (); #include "volume.h" #include "fork.h" #include "file.h" -#include "globals.h" #include "filedir.h" #include "unix.h" diff --git a/etc/afpd/filedir.h b/etc/afpd/filedir.h index c5b85756..5daf73f3 100644 --- a/etc/afpd/filedir.h +++ b/etc/afpd/filedir.h @@ -7,7 +7,7 @@ #include #include -#include "globals.h" +#include #include "volume.h" extern struct afp_options default_options; diff --git a/etc/afpd/fork.c b/etc/afpd/fork.c index f4d0d04c..b867e4dd 100644 --- a/etc/afpd/fork.c +++ b/etc/afpd/fork.c @@ -26,13 +26,12 @@ #include #include #include - #include #include +#include #include "fork.h" #include "file.h" -#include "globals.h" #include "directory.h" #include "desktop.h" #include "volume.h" diff --git a/etc/afpd/gettok.c b/etc/afpd/gettok.c index d4e4d8f5..6c9d473b 100644 --- a/etc/afpd/gettok.c +++ b/etc/afpd/gettok.c @@ -29,7 +29,7 @@ char *strchr (), *strrchr (); #include #include -#include "globals.h" +#include static char *l_curr; static char *l_end; diff --git a/etc/afpd/icon.h b/etc/afpd/icon.h index 47815e3d..c3214a0a 100644 --- a/etc/afpd/icon.h +++ b/etc/afpd/icon.h @@ -9,7 +9,7 @@ #define AFPD_ICON_H 1 #include -#include "globals.h" +#include static const unsigned char apple_atalk_icon[] = { /* default appletalk icon */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, diff --git a/etc/afpd/main.c b/etc/afpd/main.c index cb2a943f..eb979140 100644 --- a/etc/afpd/main.c +++ b/etc/afpd/main.c @@ -34,8 +34,8 @@ #include #include #include +#include -#include "globals.h" #include "afp_config.h" #include "status.h" #include "fork.h" @@ -120,9 +120,16 @@ static void afp_goaway(int sig) switch( sig ) { - case SIGTERM : - LOG(log_note, logtype_afpd, "AFP Server shutting down on SIGTERM"); - + case SIGTERM: + case SIGQUIT: + switch (sig) { + case SIGTERM: + LOG(log_note, logtype_afpd, "AFP Server shutting down on SIGTERM"); + break; + case SIGQUIT: + LOG(log_note, logtype_afpd, "AFP Server shutting down on SIGQUIT, NOT disconnecting clients"); + break; + } if (server_children) server_child_kill(server_children, CHILD_DSIFORK, sig); @@ -133,17 +140,6 @@ static void afp_goaway(int sig) exit(0); break; - case SIGQUIT: - LOG(log_note, logtype_afpd, "AFP Server shutting down on SIGQUIT, NOT disconnecting clients"); - - for (config = configs; config; config = config->next) - if (config->server_cleanup) - config->server_cleanup(config); - - server_unlock(default_options.pidfile); - exit(0); - break; - case SIGUSR1 : nologin++; auth_unload(); @@ -443,20 +439,15 @@ int main(int ac, char **av) case IPC_FD: child = (afp_child_t *)polldata[i].data; - if (fdset[i].revents & POLLIN) { - LOG(log_debug, logtype_afpd, "main: IPC request from child[%u]", child->pid); - if ((ret = ipc_server_read(server_children, child->ipc_fds[0])) == 0) { - fdset_del_fd(&fdset, &polldata, &fdset_used, &fdset_size, child->ipc_fds[0]); - close(child->ipc_fds[0]); - child->ipc_fds[0] = -1; - if (child->disasociated) - server_child_remove(server_children, CHILD_DSIFORK, child->pid); - } - } else { + LOG(log_note, logtype_afpd, "main: IPC request from child[%u]", child->pid); + + if ((ret = ipc_server_read(server_children, child->ipc_fds[0])) == 0) { + fdset_del_fd(&fdset, &polldata, &fdset_used, &fdset_size, child->ipc_fds[0]); + close(child->ipc_fds[0]); + child->ipc_fds[0] = -1; if (child->disasociated) { - fdset_del_fd(&fdset, &polldata, &fdset_used, &fdset_size, child->ipc_fds[0]); - close(child->ipc_fds[0]); - child->ipc_fds[0] = -1; + LOG(log_note, logtype_afpd, "main: removing reattached child[%u]", child->pid); + server_child_remove(server_children, CHILD_DSIFORK, child->pid); } } break; @@ -471,6 +462,7 @@ int main(int ac, char **av) LOG(log_error, logtype_afpd, "main: readt: %s", strerror(errno)); close(fd[0]); } + LOG(log_note, logtype_afpd, "main: welcome back child[%u]", pid); if ((child = server_child_add(server_children, CHILD_DSIFORK, pid, fd)) == NULL) { LOG(log_error, logtype_afpd, "main: server_child_add"); close(fd[0]); diff --git a/etc/afpd/mangle.h b/etc/afpd/mangle.h index 6c6ed75d..dce7e616 100644 --- a/etc/afpd/mangle.h +++ b/etc/afpd/mangle.h @@ -13,8 +13,8 @@ #include #include #include +#include -#include "globals.h" #include "volume.h" #include "directory.h" diff --git a/etc/afpd/messages.c b/etc/afpd/messages.c index 13e03f40..2784e826 100644 --- a/etc/afpd/messages.c +++ b/etc/afpd/messages.c @@ -20,7 +20,8 @@ #include #include #include -#include "globals.h" +#include + #include "misc.h" diff --git a/etc/afpd/misc.h b/etc/afpd/misc.h index dded79b1..9f3d70bf 100644 --- a/etc/afpd/misc.h +++ b/etc/afpd/misc.h @@ -6,7 +6,7 @@ #define AFPD_MISC_H 1 #include -#include "globals.h" +#include /* FP functions */ /* messages.c */ diff --git a/etc/afpd/ofork.c b/etc/afpd/ofork.c index ec0c6e28..6182fcff 100644 --- a/etc/afpd/ofork.c +++ b/etc/afpd/ofork.c @@ -21,8 +21,8 @@ #include #include #include +#include -#include "globals.h" #include "volume.h" #include "directory.h" #include "fork.h" diff --git a/etc/afpd/status.c b/etc/afpd/status.c index cbf59892..f89615b1 100644 --- a/etc/afpd/status.c +++ b/etc/afpd/status.c @@ -36,8 +36,8 @@ #include #include #include +#include -#include "globals.h" /* includes */ #include "status.h" #include "afp_config.h" #include "icon.h" diff --git a/etc/afpd/status.h b/etc/afpd/status.h index 3a29a174..ae16bb49 100644 --- a/etc/afpd/status.h +++ b/etc/afpd/status.h @@ -4,7 +4,8 @@ #include #include #include -#include "globals.h" +#include + #include "afp_config.h" /* we use these to prevent whacky alignment problems */ diff --git a/etc/afpd/switch.c b/etc/afpd/switch.c index 7dbd9ab7..5c98e8df 100644 --- a/etc/afpd/switch.c +++ b/etc/afpd/switch.c @@ -31,8 +31,7 @@ #include #include - -#include "globals.h" +#include /* grab the FP functions */ #include "auth.h" diff --git a/etc/afpd/uam.c b/etc/afpd/uam.c index 92173915..37ef9dd2 100644 --- a/etc/afpd/uam.c +++ b/etc/afpd/uam.c @@ -50,8 +50,8 @@ char *strchr (), *strrchr (); #include #include #include +#include -#include "globals.h" #include "afp_config.h" #include "auth.h" #include "uam_auth.h" diff --git a/etc/afpd/uam_auth.h b/etc/afpd/uam_auth.h index 7c879b31..18f010bb 100644 --- a/etc/afpd/uam_auth.h +++ b/etc/afpd/uam_auth.h @@ -14,7 +14,7 @@ #include #include -#include "globals.h" +#include struct uam_mod { void *uam_module; diff --git a/etc/afpd/volume.c b/etc/afpd/volume.c index 05bda9d4..3404048a 100644 --- a/etc/afpd/volume.c +++ b/etc/afpd/volume.c @@ -50,12 +50,12 @@ char *strchr (), *strrchr (); #include #include #include +#include #ifdef CNID_DB #include #endif /* CNID_DB*/ -#include "globals.h" #include "directory.h" #include "file.h" #include "volume.h" diff --git a/etc/afpd/volume.h b/etc/afpd/volume.h index fd2d2251..2339ca8c 100644 --- a/etc/afpd/volume.h +++ b/etc/afpd/volume.h @@ -13,8 +13,8 @@ #include #include #include +#include -#include "globals.h" #if 0 #include "hash.h" #endif diff --git a/etc/uams/uams_dhx2_pam.c b/etc/uams/uams_dhx2_pam.c index 46c0d970..b95e1587 100644 --- a/etc/uams/uams_dhx2_pam.c +++ b/etc/uams/uams_dhx2_pam.c @@ -32,7 +32,7 @@ #include #include -#include "../afpd/globals.h" +#include /* Number of bits for p which we generate. Everybode out there uses 512, so we beet them */ #define PRIMEBITS 1024 diff --git a/include/atalk/Makefile.am b/include/atalk/Makefile.am index 2bf09187..a75839c2 100644 --- a/include/atalk/Makefile.am +++ b/include/atalk/Makefile.am @@ -8,4 +8,4 @@ atalkinclude_HEADERS = \ server_ipc.h tdb.h uam.h unicode.h util.h uuid.h volinfo.h \ zip.h ea.h acl.h unix.h directory.h hash.h volume.h -noinst_HEADERS = cnid_dbd_private.h cnid_private.h bstradd.h bstrlib.h errchk.h ftw.h +noinst_HEADERS = cnid_dbd_private.h cnid_private.h bstradd.h bstrlib.h errchk.h ftw.h globals.h diff --git a/include/atalk/dsi.h b/include/atalk/dsi.h index 8fcb950b..757cedbe 100644 --- a/include/atalk/dsi.h +++ b/include/atalk/dsi.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #ifdef __OpenBSD__ @@ -59,6 +60,7 @@ struct dsi_block { /* child and parent processes might interpret a couple of these * differently. */ typedef struct DSI { + AFPObj *AFPobj; dsi_proto protocol; struct dsi_block header; struct sockaddr_storage server, client; diff --git a/etc/afpd/globals.h b/include/atalk/globals.h similarity index 100% rename from etc/afpd/globals.h rename to include/atalk/globals.h diff --git a/include/atalk/server_ipc.h b/include/atalk/server_ipc.h index 8704c6ba..aca04f80 100644 --- a/include/atalk/server_ipc.h +++ b/include/atalk/server_ipc.h @@ -2,13 +2,15 @@ #define ATALK_SERVER_IPC_H #include +#include #define IPC_DISCOLDSESSION 0 #define IPC_GETSESSION 1 extern int ipc_server_uds(const char *name); extern int ipc_client_uds(const char *name); +extern int reconnect_ipc(AFPObj *); extern int ipc_server_read(server_child *children, int fd); -extern ssize_t ipc_child_write(int *fd, uint16_t command, int len, void *token); +extern int ipc_child_write(int fd, uint16_t command, int len, void *token); #endif /* IPC_GETSESSION_LOGIN */ diff --git a/libatalk/dsi/dsi_stream.c b/libatalk/dsi/dsi_stream.c index 394b707a..5943337d 100644 --- a/libatalk/dsi/dsi_stream.c +++ b/libatalk/dsi/dsi_stream.c @@ -246,7 +246,7 @@ int dsi_disconnect(DSI *dsi) { dsi->proto_close(dsi); /* 1 */ dsi->flags |= DSI_DISCONNECTED; /* 2 */ - if (getppid() == 1 || geteuid() == 0) + if (geteuid() == 0) return -1; return 0; } @@ -383,7 +383,7 @@ size_t dsi_stream_read(DSI *dsi, void *data, const size_t length) while (stored < length) { len = buf_read(dsi, (u_int8_t *) data + stored, length - stored); if (len == -1 && (errno == EINTR || errno == EAGAIN)) { - LOG(log_debug, logtype_dsi, "dsi_stream_read: select read loop"); + LOG(log_maxdebug, logtype_dsi, "dsi_stream_read: select read loop"); continue; } else if (len > 0) { stored += len; diff --git a/libatalk/util/logger.c b/libatalk/util/logger.c index eb98f45b..e13ada17 100644 --- a/libatalk/util/logger.c +++ b/libatalk/util/logger.c @@ -542,6 +542,7 @@ void make_log_entry(enum loglevels loglevel, enum logtypes logtype, if (type_configs[logtype].level >= log_debug) goto log; /* bypass flooding checks */ + goto log; /* Prevent flooding: hash the message and check if we got the same one recently */ int hash = hash_message(temp_buffer) + log_src_linenumber; diff --git a/libatalk/util/server_ipc.c b/libatalk/util/server_ipc.c index 1060fde8..8d305ba8 100644 --- a/libatalk/util/server_ipc.c +++ b/libatalk/util/server_ipc.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -26,6 +27,8 @@ #include #include #include +#include +#include #define IPC_HEADERLEN 14 #define IPC_MAXMSGSIZE 90 @@ -161,11 +164,13 @@ int ipc_client_uds(const char *name) address_length = sizeof(address.sun_family) + sprintf(address.sun_path, name); EC_ZERO_LOG( connect(fd, (struct sockaddr *)&address, address_length) ); /* 1 */ + LOG(log_note, logtype_afpd, "ipc_client_uds: connected to master"); if (writet(fd, &pid, sizeof(pid_t), 0, 1) != sizeof(pid_t)) { LOG(log_error, logtype_afpd, "ipc_client_uds: writet: %s", strerror(errno)); EC_FAIL; } + LOG(log_note, logtype_afpd, "ipc_client_uds: sent pid"); EC_CLEANUP: if (ret != 0) { @@ -175,6 +180,30 @@ EC_CLEANUP: return fd; } +int reconnect_ipc(AFPObj *obj) +{ + int retrycount = 0; + + LOG(log_note, logtype_afpd, "reconnect_ipc: start"); + + close(obj->ipc_fd); + obj->ipc_fd = -1; + + srandom(getpid()); + sleep((random() % 10) + 5); /* give it enough time to start */ + + while (retrycount++ < 10) { + if ((obj->ipc_fd = ipc_client_uds(_PATH_AFP_IPC)) == -1) { + LOG(log_error, logtype_afpd, "reconnect_ipc: cant reconnect to master"); + sleep(1); + continue; + } + LOG(log_note, logtype_afpd, "reconnect_ipc: succesfull IPC reconnect"); + return 0; + } + return -1; +} + /* ----------------- * Ipc format * command @@ -272,9 +301,8 @@ int ipc_server_read(server_child *children, int fd) } /* ----------------- */ -ssize_t ipc_child_write(int *fd, uint16_t command, int len, void *msg) +int ipc_child_write(int fd, uint16_t command, int len, void *msg) { - static int fd_saved = -1; char block[IPC_MAXMSGSIZE], *p; pid_t pid; uid_t uid; @@ -282,9 +310,6 @@ ssize_t ipc_child_write(int *fd, uint16_t command, int len, void *msg) p = block; - if (fd_saved == -1) - fd_saved = *fd; - memset ( p, 0 , IPC_MAXMSGSIZE); if (len + IPC_HEADERLEN > IPC_MAXMSGSIZE) return -1; @@ -312,16 +337,10 @@ ssize_t ipc_child_write(int *fd, uint16_t command, int len, void *msg) LOG(log_debug, logtype_afpd, "ipc_child_write(%s)", ipc_cmd_str[command]); - if ((ret = writet(*fd, block, len+IPC_HEADERLEN, 0, 1)) == -1) { - if (*fd == fd_saved && getppid() == 1) { - /* still using original socketpair IPC fd, master was possibly restarted, try reestablish connection across uds */ - if ((*fd = ipc_client_uds(_PATH_AFP_IPC)) == -1) - return -1; - /* now try again */ - ret = writet(*fd, block, len+IPC_HEADERLEN, 0, 1); - } + if ((ret = writet(fd, block, len+IPC_HEADERLEN, 0, 1)) != -len+IPC_HEADERLEN) { + return -1; } - return ret; + return 0; } -- 2.39.2