summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Harris <jgh146exb@wizmail.org>2022-06-02 15:33:32 +0100
committerJeremy Harris <jgh146exb@wizmail.org>2022-06-02 16:21:48 +0100
commit3db0f5bebe1573c0609eaf1d29bf69da173a67aa (patch)
tree4496d4e11702658c74b29f398d7d48cbb67cb802
parent188691cb2c99e98d54d79c5a2a2f5b09cdab8a4c (diff)
downloadexim4-3db0f5bebe1573c0609eaf1d29bf69da173a67aa.tar.gz
Deduplicate coding between exim and eximon
-rw-r--r--src/OS/Makefile-Base25
-rw-r--r--src/exim_monitor/em_main.c36
-rwxr-xr-xsrc/scripts/MakeLinks2
-rw-r--r--src/src/host.c71
-rw-r--r--src/src/host_address.c80
5 files changed, 97 insertions, 117 deletions
diff --git a/src/OS/Makefile-Base b/src/OS/Makefile-Base
index 78f5516a7..99a9f7e75 100644
--- a/src/OS/Makefile-Base
+++ b/src/OS/Makefile-Base
@@ -1,4 +1,5 @@
# This file is the basis of the main makefile for Exim and friends. The
+#
# makefile at the top level arranges to build the main makefile by calling
# scripts/Configure-Makefile from within the build directory. This
# concatenates the configuration settings from Local/Makefile and other,
@@ -485,7 +486,7 @@ OBJ_LOOKUPS = lookups/lf_quote.o lookups/lf_check_file.o lookups/lf_sqlperform.o
OBJ_EXIM = acl.o base64.o child.o crypt16.o daemon.o dbfn.o debug.o deliver.o \
directory.o dns.o drtables.o enq.o exim.o expand.o filter.o \
filtertest.o globals.o dkim.o dkim_transport.o dnsbl.o hash.o \
- header.o host.o ip.o log.o lss.o match.o md5.o moan.o \
+ header.o host.o host_address.o ip.o log.o lss.o match.o md5.o moan.o \
os.o parse.o priv.o queue.o \
rda.o readconf.o receive.o retry.o rewrite.o rfc2047.o \
route.o search.o sieve.o smtp_in.o smtp_out.o spool_in.o spool_out.o \
@@ -601,10 +602,11 @@ MONBIN = em_StripChart.o $(EXIMON_TEXTPOP) em_globals.o em_init.o \
# The complete modules list also includes some specially compiled versions of
# code from the main Exim source tree.
-OBJ_MONBIN = util-spool_in.o \
+OBJ_MONBIN = util-host_address.o \
+ util-queue.o \
+ util-spool_in.o \
util-store.o \
util-string.o \
- util-queue.o \
util-tod.o \
util-tree.o \
$(MONBIN)
@@ -721,6 +723,14 @@ exim_dbmbuild.o: $(HDRS) exim_dbmbuild.c
# Utilities use special versions of some modules - typically with debugging
# calls cut out.
+util-host_address.o: $(HDRS) host_address.c
+ @echo "$(CC) -DCOMPILE_UTILITY host_address.c"
+ $(FE)$(CC) -c $(CFLAGS) $(INCLUDE) -DCOMPILE_UTILITY -o util-host_address.o host_address.c
+
+util-md5.o: $(HDRS) md5.c
+ @echo "$(CC) -DCOMPILE_UTILITY queue.c"
+ $(FE)$(CC) -c $(CFLAGS) $(INCLUDE) -DCOMPILE_UTILITY -o util-md5.o md5.c
+
util-spool_in.o: $(HDRS) spool_in.c
@echo "$(CC) -DCOMPILE_UTILITY spool_in.c"
$(FE)$(CC) -c $(CFLAGS) $(INCLUDE) -DCOMPILE_UTILITY -o util-spool_in.o spool_in.c
@@ -733,10 +743,6 @@ util-string.o: $(HDRS) string.c
@echo "$(CC) -DCOMPILE_UTILITY string.c"
$(FE)$(CC) -c $(CFLAGS) $(INCLUDE) -DCOMPILE_UTILITY -o util-string.o string.c
-util-md5.o: $(HDRS) md5.c
- @echo "$(CC) -DCOMPILE_UTILITY queue.c"
- $(FE)$(CC) -c $(CFLAGS) $(INCLUDE) -DCOMPILE_UTILITY -o util-md5.o md5.c
-
util-queue.o: $(HDRS) queue.c
@echo "$(CC) -DCOMPILE_UTILITY queue.c"
$(FE)$(CC) -c $(CFLAGS) $(INCLUDE) -DCOMPILE_UTILITY -o util-queue.o queue.c
@@ -787,6 +793,7 @@ globals.o: $(HDRS) globals.c
hash.o: $(HDRS) hash.c
header.o: $(HDRS) header.c
host.o: $(HDRS) host.c
+host_address.o: $(HDRS) host_address.c
ip.o: $(HDRS) ip.c
log.o: $(HDRS) log.c
lss.o: $(HDRS) lss.c
@@ -962,13 +969,13 @@ test_dbfn: config.h dbfn.c dummies.o sa-globals.o sa-os.o store.o \
rm -f dbfn.o store.o
test_host: config.h child.c host.c dns.c dummies.c sa-globals.o os.o \
- store.o string.o tod.o tree.o
+ host_address.o store.o string.o tod.o tree.o
$(CC) -c $(CFLAGS) $(INCLUDE) -DSTAND_ALONE -DTEST_HOST child.c
$(CC) -c $(CFLAGS) $(INCLUDE) -DSTAND_ALONE -DTEST_HOST host.c
$(CC) -c $(CFLAGS) $(INCLUDE) -DSTAND_ALONE -DTEST_HOST dns.c
$(CC) -c $(CFLAGS) $(INCLUDE) -DSTAND_ALONE -DTEST_HOST dummies.c
$(LNCC) -o test_host $(LFLAGS) \
- host.o child.o dns.o dummies.o sa-globals.o os.o store.o string.o \
+ host.o host_address.o child.o dns.o dummies.o sa-globals.o os.o store.o string.o \
tod.o tree.o $(LIBS) $(LIBRESOLV)
rm -f child.o dummies.o host.o dns.o
diff --git a/src/exim_monitor/em_main.c b/src/exim_monitor/em_main.c
index 69de8dc4d..86caf71eb 100644
--- a/src/exim_monitor/em_main.c
+++ b/src/exim_monitor/em_main.c
@@ -180,42 +180,6 @@ va_end(ap);
/*************************************************
-* Extract port from address string *
-*************************************************/
-
-/* In the spool file, a host plus port is given as an IP address followed by a
-dot and a port number. This function decodes this. It is needed by the
-spool-reading function, and copied here to avoid having to include the whole
-host.c module. One day the interaction between exim and eximon with regard to
-included code MUST be tidied up!
-
-Argument:
- address points to the string; if there is a port, the '.' in the string
- is overwritten with zero to terminate the address
-
-Returns: 0 if there is no port, else the port number.
-*/
-
-int
-host_address_extract_port(uschar *address)
-{
-int skip = -3; /* Skip 3 dots in IPv4 addresses */
-address--;
-while (*(++address) != 0)
- {
- int ch = *address;
- if (ch == ':') skip = 0; /* Skip 0 dots in IPv6 addresses */
- else if (ch == '.' && skip++ >= 0) break;
- }
-if (*address == 0) return 0;
-*address++ = 0;
-return Uatoi(address);
-}
-
-
-
-
-/*************************************************
* SIGCHLD handler *
*************************************************/
diff --git a/src/scripts/MakeLinks b/src/scripts/MakeLinks
index 9cdb931f3..afc2fab32 100755
--- a/src/scripts/MakeLinks
+++ b/src/scripts/MakeLinks
@@ -102,7 +102,7 @@ for f in blob.h dbfunctions.h exim.h functions.h globals.h \
acl.c buildconfig.c base64.c child.c crypt16.c daemon.c dbfn.c debug.c \
deliver.c directory.c dns.c dnsbl.c drtables.c dummies.c enq.c exim.c \
exim_dbmbuild.c exim_dbutil.c exim_lock.c expand.c filter.c filtertest.c \
- globals.c hash.c header.c host.c ip.c log.c lss.c match.c md5.c moan.c \
+ globals.c hash.c header.c host.c host_address.c ip.c log.c lss.c match.c md5.c moan.c \
parse.c perl.c priv.c queue.c rda.c readconf.c receive.c retry.c rewrite.c \
rfc2047.c route.c search.c setenv.c environment.c \
sieve.c smtp_in.c smtp_out.c spool_in.c spool_out.c std-crypto.c store.c \
diff --git a/src/src/host.c b/src/src/host.c
index f69e0341a..fed9f4b5f 100644
--- a/src/src/host.c
+++ b/src/src/host.c
@@ -363,77 +363,6 @@ while ((name = string_nextinlist(&list, &sep, NULL, 0)))
}
-
-
-
-/*************************************************
-* Extract port from address string *
-*************************************************/
-
-/* In the spool file, and in the -oMa and -oMi options, a host plus port is
-given as an IP address followed by a dot and a port number. This function
-decodes this.
-
-An alternative format for the -oMa and -oMi options is [ip address]:port which
-is what Exim 4 uses for output, because it seems to becoming commonly used,
-whereas the dot form confuses some programs/people. So we recognize that form
-too.
-
-Argument:
- address points to the string; if there is a port, the '.' in the string
- is overwritten with zero to terminate the address; if the string
- is in the [xxx]:ppp format, the address is shifted left and the
- brackets are removed
-
-Returns: 0 if there is no port, else the port number. If there's a syntax
- error, leave the incoming address alone, and return 0.
-*/
-
-int
-host_address_extract_port(uschar *address)
-{
-int port = 0;
-uschar *endptr;
-
-/* Handle the "bracketed with colon on the end" format */
-
-if (*address == '[')
- {
- uschar *rb = address + 1;
- while (*rb != 0 && *rb != ']') rb++;
- if (*rb++ == 0) return 0; /* Missing ]; leave invalid address */
- if (*rb == ':')
- {
- port = Ustrtol(rb + 1, &endptr, 10);
- if (*endptr != 0) return 0; /* Invalid port; leave invalid address */
- }
- else if (*rb != 0) return 0; /* Bad syntax; leave invalid address */
- memmove(address, address + 1, rb - address - 2);
- rb[-2] = 0;
- }
-
-/* Handle the "dot on the end" format */
-
-else
- {
- int skip = -3; /* Skip 3 dots in IPv4 addresses */
- address--;
- while (*(++address) != 0)
- {
- int ch = *address;
- if (ch == ':') skip = 0; /* Skip 0 dots in IPv6 addresses */
- else if (ch == '.' && skip++ >= 0) break;
- }
- if (*address == 0) return 0;
- port = Ustrtol(address + 1, &endptr, 10);
- if (*endptr != 0) return 0; /* Invalid port; leave invalid address */
- *address = 0;
- }
-
-return port;
-}
-
-
/*************************************************
* Get port from a host item's name *
*************************************************/
diff --git a/src/src/host_address.c b/src/src/host_address.c
new file mode 100644
index 000000000..9e6f958be
--- /dev/null
+++ b/src/src/host_address.c
@@ -0,0 +1,80 @@
+/*************************************************
+* Exim - an Internet mail transport agent *
+*************************************************/
+
+/* Copyright (c) The Exim Maintainers 2020 - 2022 */
+/* Copyright (c) University of Cambridge 1995 - 2018 */
+/* See the file NOTICE for conditions of use and distribution. */
+
+#include "exim.h"
+
+/*************************************************
+* Extract port from address string *
+*************************************************/
+
+/* In the spool file, and in the -oMa and -oMi options, a host plus port is
+given as an IP address followed by a dot and a port number. This function
+decodes this.
+
+An alternative format for the -oMa and -oMi options is [ip address]:port which
+is what Exim 4 uses for output, because it seems to becoming commonly used,
+whereas the dot form confuses some programs/people. So we recognize that form
+too.
+
+Argument:
+ address points to the string; if there is a port, the '.' in the string
+ is overwritten with zero to terminate the address; if the string
+ is in the [xxx]:ppp format, the address is shifted left and the
+ brackets are removed
+
+Returns: 0 if there is no port, else the port number. If there's a syntax
+ error, leave the incoming address alone, and return 0.
+*/
+
+int
+host_address_extract_port(uschar * address)
+{
+int port = 0;
+uschar *endptr;
+
+/* Handle the "bracketed with colon on the end" format */
+
+if (*address == '[')
+ {
+ uschar *rb = address + 1;
+ while (*rb != 0 && *rb != ']') rb++;
+ if (*rb++ == 0) return 0; /* Missing ]; leave invalid address */
+ if (*rb == ':')
+ {
+ port = Ustrtol(rb + 1, &endptr, 10);
+ if (*endptr != 0) return 0; /* Invalid port; leave invalid address */
+ }
+ else if (*rb != 0) return 0; /* Bad syntax; leave invalid address */
+ memmove(address, address + 1, rb - address - 2);
+ rb[-2] = 0;
+ }
+
+/* Handle the "dot on the end" format */
+
+else
+ {
+ int skip = -3; /* Skip 3 dots in IPv4 addresses */
+ address--;
+ while (*(++address) != 0)
+ {
+ int ch = *address;
+ if (ch == ':') skip = 0; /* Skip 0 dots in IPv6 addresses */
+ else if (ch == '.' && skip++ >= 0) break;
+ }
+ if (*address == 0) return 0;
+ port = Ustrtol(address + 1, &endptr, 10);
+ if (*endptr != 0) return 0; /* Invalid port; leave invalid address */
+ *address = 0;
+ }
+
+return port;
+}
+
+/* vi: aw ai sw=2
+*/
+/* End of host.c */