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)
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)
continue;
fdset_del_fd(&fdset, &polldata, &fdset_used, &fdset_size, config->fd);
}
+ fdset_del_fd(&fdset, &polldata, &fdset_used, &fdset_size, disasociated_ipc_fd);
}
/* ------------------ */
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 */
# 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
/*
#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 */
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 *
#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;
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
* pid
* uid
*
-*/
+ */
/*!
* Read a IPC message from a child