]> arthur.barton.de Git - netatalk.git/commitdiff
IPC for disasociated afpd processes via UNIX domain sockets
authorFrank Lahm <franklahm@googlemail.com>
Wed, 25 May 2011 10:21:46 +0000 (12:21 +0200)
committerFrank Lahm <franklahm@googlemail.com>
Wed, 25 May 2011 10:21:46 +0000 (12:21 +0200)
etc/afpd/main.c
include/atalk/paths.h
include/atalk/server_ipc.h
include/atalk/util.h
libatalk/util/server_ipc.c

index 16476c5376511de92ab2cb918fc12f6b40fb108a..0df5a5b71bc49136d88bd1033880121b213a6fba 100644 (file)
@@ -63,7 +63,7 @@ static struct pollfd *fdset;
 static struct polldata *polldata;
 static int fdset_size;          /* current allocated size */
 static int fdset_used;          /* number of used elements */
-
+static int disasociated_ipc_fd; /* disasociated sessions uses this fd for IPC */
 
 #ifdef TRU64
 void afp_get_cmdline( int *ac, char ***av)
@@ -94,6 +94,7 @@ static void fd_set_listening_sockets(void)
             continue;
         fdset_add_fd(&fdset, &polldata, &fdset_used, &fdset_size, config->fd, LISTEN_FD, config);
     }
+    fdset_add_fd(&fdset, &polldata, &fdset_used, &fdset_size, disasociated_ipc_fd, DISASOCIATED_IPC_FD, NULL);
 }
  
 static void fd_reset_listening_sockets(void)
@@ -105,6 +106,7 @@ static void fd_reset_listening_sockets(void)
             continue;
         fdset_del_fd(&fdset, &polldata, &fdset_used, &fdset_size, config->fd);
     }
+    fdset_del_fd(&fdset, &polldata, &fdset_used, &fdset_size, disasociated_ipc_fd);
 }
 
 /* ------------------ */
@@ -367,6 +369,7 @@ int main(int ac, char **av)
     cnid_init();
 
     /* watch atp, dsi sockets and ipc parent/child file descriptor. */
+    disasociated_ipc_fd = ipc_server_uds(_PATH_AFP_IPC);
     fd_set_listening_sockets();
 
     /* set limits */
index 2e75b461b53c0ab198b2a8f44aecf08057c32ea3..ec67a4e3f27e1768af46f5dcce4916c89c7a3720 100644 (file)
@@ -75,6 +75,7 @@
 #  define _PATH_AFPDLOCK       ATALKPATHCAT(_PATH_LOCKDIR,"afpd.pid")
 #else
 #  define _PATH_AFPDLOCK       ATALKPATHCAT(_PATH_LOCKDIR,"afpd")
+#define _PATH_AFP_IPC       ATALKPATHCAT(_PATH_LOCKDIR,"afpd_ipc")
 #endif
 
 /*
index 332897a0993bd2f34ca3be79f942bfd75fe27818..bdfc37a5ebc1228e5f029fbb1ba56e641cd15bc4 100644 (file)
@@ -6,7 +6,8 @@
 #define IPC_DISCOLDSESSION   0
 #define IPC_GETSESSION       1
 
-int ipc_server_read(server_child *children, int fd);
-int ipc_child_write(int fd, uint16_t command, int len, void *token);
+extern int ipc_server_uds(const char *name);
+extern int ipc_server_read(server_child *children, int fd);
+extern int ipc_child_write(int fd, uint16_t command, int len, void *token);
 
 #endif /* IPC_GETSESSION_LOGIN */
index 999f14daac86349e508be888df10e0a40a987123..94edbb82b4896e7c098c0efb8304920bbcef5ea9 100644 (file)
@@ -138,7 +138,7 @@ extern void apply_ip_mask(struct sockaddr *ai, int maskbits);
 extern int compare_ip(const struct sockaddr *sa1, const struct sockaddr *sa2);
 
 /* Structures and functions dealing with dynamic pollfd arrays */
-enum fdtype {IPC_FD, LISTEN_FD};
+enum fdtype {IPC_FD, LISTEN_FD, DISASOCIATED_IPC_FD};
 struct polldata {
     enum fdtype fdtype; /* IPC fd or listening socket fd                 */
     void *data;         /* pointer to AFPconfig for listening socket and *
index 1115551ee4e10826f56aaa1d8fd2b807ecb25371..400b2b4d8eab852ad29d8d6a3ae0e562fc4ee7de 100644 (file)
@@ -16,6 +16,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <sys/socket.h>
+#include <sys/un.h>
 #include <errno.h>
 #include <signal.h>
 
 #include <atalk/server_ipc.h>
 #include <atalk/logger.h>
 #include <atalk/util.h>
+#include <atalk/errchk.h>
+
+#define IPC_HEADERLEN 14
+#define IPC_MAXMSGSIZE 90
 
 typedef struct ipc_header {
        uint16_t command;
@@ -99,8 +104,38 @@ static int ipc_get_session(struct ipc_header *ipc, server_child *children)
     return 0;
 }
 
-#define IPC_HEADERLEN 14
-#define IPC_MAXMSGSIZE 90
+/***********************************************************************************
+ * Public functions
+ ***********************************************************************************/
+
+/*!
+ * Listen on UNIX domain socket "name" for IPD from old sesssion
+ *
+ * @args name    (r) file name to use for UNIX domain socket
+ * @returns      socket fd, -1 on error
+ */
+int ipc_server_uds(const char *name)
+{
+    EC_INIT;
+    struct sockaddr_un address;
+    socklen_t address_length;
+    int fd = -1;
+
+    EC_NEG1_LOG( fd = socket(PF_UNIX, SOCK_STREAM, 0) );
+    unlink(name);
+    address.sun_family = AF_UNIX;
+    address_length = sizeof(address.sun_family) + sprintf(address.sun_path, name);
+    EC_ZERO_LOG( bind(fd, (struct sockaddr *)&address, address_length) );
+    EC_ZERO_LOG( listen(fd, 1024) );
+
+EC_CLEANUP:
+    if (ret != 0) {
+
+        return -1;
+    }
+    LOG(log_note, logtype_afpd, "ipc_server_uds: fd: %d", fd);
+    return fd;
+}
 
 /* ----------------- 
  * Ipc format
@@ -108,7 +143,7 @@ static int ipc_get_session(struct ipc_header *ipc, server_child *children)
  * pid
  * uid
  * 
-*/
+ */
 
 /*!
  * Read a IPC message from a child