summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Harris <jgh146exb@wizmail.org>2022-06-11 13:20:17 +0100
committerJeremy Harris <jgh146exb@wizmail.org>2022-06-11 14:15:04 +0100
commit46cb87a295735ab4452ad1ca304f2c19ded2624c (patch)
tree999e61c94e03a8e2d71b73f5c6161c42c231b0ce
parent9f5f6f757d86cd2539cbfba1f3230df743c30189 (diff)
downloadexim4-46cb87a295735ab4452ad1ca304f2c19ded2624c.tar.gz
helper fn for daemon notifier
-rw-r--r--src/src/daemon.c30
-rw-r--r--src/src/expand.c12
-rw-r--r--src/src/functions.h3
-rw-r--r--src/src/queue.c14
4 files changed, 26 insertions, 33 deletions
diff --git a/src/src/daemon.c b/src/src/daemon.c
index 8e8a515e4..a5eb707d0 100644
--- a/src/src/daemon.c
+++ b/src/src/daemon.c
@@ -1132,13 +1132,29 @@ exim_exit(EXIT_SUCCESS);
* Listener socket for local work prompts *
*************************************************/
+ssize_t
+daemon_notifier_sockname(struct sockaddr_un * sup)
+{
+#ifdef EXIM_HAVE_ABSTRACT_UNIX_SOCKETS
+sup->sun_path[0] = 0; /* Abstract local socket addr - Linux-specific? */
+return offsetof(struct sockaddr_un, sun_path) + 1
+ + snprintf(sup->sun_path+1, sizeof(sup->sun_path)-1, "%s",
+ expand_string(notifier_socket));
+#else
+return offsetof(struct sockaddr_un, sun_path)
+ + snprintf(sup->sun_path, sizeof(sup->sun_path), "%s",
+ expand_string(notifier_socket));
+#endif
+}
+
+
static void
daemon_notifier_socket(void)
{
int fd;
const uschar * where;
struct sockaddr_un sa_un = {.sun_family = AF_UNIX};
-int len;
+ssize_t len;
if (!notifier_socket || !*notifier_socket)
{
@@ -1163,20 +1179,15 @@ if ((fd = socket(PF_UNIX, SOCK_DGRAM, 0)) < 0)
(void)fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
#endif
+len = daemon_notifier_sockname(&sa_un);
+
#ifdef EXIM_HAVE_ABSTRACT_UNIX_SOCKETS
-sa_un.sun_path[0] = 0; /* Abstract local socket addr - Linux-specific? */
-len = offsetof(struct sockaddr_un, sun_path) + 1
- + snprintf(sa_un.sun_path+1, sizeof(sa_un.sun_path)-1, "%s",
- expand_string(notifier_socket));
DEBUG(D_any) debug_printf(" @%s\n", sa_un.sun_path+1);
#else /* filesystem-visible and persistent; will neeed removal */
-len = offsetof(struct sockaddr_un, sun_path)
- + snprintf(sa_un.sun_path, sizeof(sa_un.sun_path), "%s",
- expand_string(notifier_socket));
DEBUG(D_any) debug_printf(" %s\n", sa_un.sun_path);
#endif
-if (bind(fd, (const struct sockaddr *)&sa_un, len) < 0)
+if (bind(fd, (const struct sockaddr *)&sa_un, (socklen_t)len) < 0)
{ where = US"bind"; goto bad; }
#ifdef SO_PASSCRED /* Linux */
@@ -1302,7 +1313,6 @@ return FALSE;
-
/*************************************************
* Exim Daemon Mainline *
*************************************************/
diff --git a/src/src/expand.c b/src/src/expand.c
index 03ae3206e..9b54ccad1 100644
--- a/src/src/expand.c
+++ b/src/src/expand.c
@@ -1777,17 +1777,7 @@ debug_printf("local addr '%s%s'\n",
sa_un.sun_path + (*sa_un.sun_path ? 0 : 1));
#endif
-#ifdef EXIM_HAVE_ABSTRACT_UNIX_SOCKETS
-sa_un.sun_path[0] = 0; /* Abstract local socket addr - Linux-specific? */
-len = offsetof(struct sockaddr_un, sun_path) + 1
- + snprintf(sa_un.sun_path+1, sizeof(sa_un.sun_path)-1, "%s",
- expand_string(notifier_socket));
-#else
-len = offsetof(struct sockaddr_un, sun_path)
- + snprintf(sa_un.sun_path, sizeof(sa_un.sun_path), "%s",
- expand_string(notifier_socket));
-#endif
-
+len = daemon_notifier_sockname(&sa_un);
if (connect(fd, (const struct sockaddr *)&sa_un, len) < 0)
{ where = US"connect"; goto bad2; }
diff --git a/src/src/functions.h b/src/src/functions.h
index 224666cb1..9c5e379d4 100644
--- a/src/src/functions.h
+++ b/src/src/functions.h
@@ -182,6 +182,9 @@ extern BOOL cutthrough_predata(void);
extern void release_cutthrough_connection(const uschar *);
extern void daemon_go(void);
+#ifndef COMPILE_UTILITY
+extern ssize_t daemon_notifier_sockname(struct sockaddr_un *);
+#endif
#ifdef EXPERIMENTAL_DCC
extern int dcc_process(uschar **);
diff --git a/src/src/queue.c b/src/src/queue.c
index 4bdd6fb14..c0a1cd182 100644
--- a/src/src/queue.c
+++ b/src/src/queue.c
@@ -1562,19 +1562,9 @@ memcpy(buf+1, msgid, MESSAGE_ID_LENGTH+1);
if ((fd = socket(AF_UNIX, SOCK_DGRAM, 0)) >= 0)
{
struct sockaddr_un sa_un = {.sun_family = AF_UNIX};
+ ssize_t len = daemon_notifier_sockname(&sa_un);
-#ifdef EXIM_HAVE_ABSTRACT_UNIX_SOCKETS
- int len = offsetof(struct sockaddr_un, sun_path) + 1
- + snprintf(sa_un.sun_path+1, sizeof(sa_un.sun_path)-1, "%s",
- expand_string(notifier_socket));
- sa_un.sun_path[0] = 0;
-#else
- int len = offsetof(struct sockaddr_un, sun_path)
- + snprintf(sa_un.sun_path, sizeof(sa_un.sun_path), "%s",
- expand_string(notifier_socket));
-#endif
-
- if (sendto(fd, buf, sizeof(buf), 0, (struct sockaddr *)&sa_un, len) < 0)
+ if (sendto(fd, buf, sizeof(buf), 0, (struct sockaddr *)&sa_un, (socklen_t)len) < 0)
DEBUG(D_queue_run)
debug_printf("%s: sendto %s\n", __FUNCTION__, strerror(errno));
close(fd);