I've seen some requests for a patch similar to this in the past and has
helped me.
Unfortunately, my to-be-old ISP had slow network abuse practices and
ended up being placed in some blacklists. Thankfully I had another set
of IP addresses assigned for the machine in a different address range
which wasn't blacklisted.
I developed this patch to add a configuration option which will make
courieresmtp bind() to a local IP before connecting to the remote
system.
Sam, I've sent this patch in the past, but with no comments and I see
it's still not in 0.44.2. Are you interested in this patch? Should I
make some changes? Should I stop sending it?
JE
diff -urN courier-0.44.0/courier/courierd.dist.in
courier-0.44.0-je/courier/courierd.dist.in
--- courier-0.44.0/courier/courierd.dist.in 2002-03-15 19:17:18.000000000 +0000
+++ courier-0.44.0-je/courier/courierd.dist.in 2003-10-31 22:27:17.000000000 +0000
@@ -96,6 +96,14 @@
ESMTP_CORK=1
+##NAME: SOURCE_ADDRESS:0
+#
+# Specify the source IP address to be used when making ESMTP connections
+# outbound to deliver mail. If this value is not specified or "0", the
+# kernel will assign the source IP address.
+#
+# SOURCE_ADDRESS=127.0.0.1
+
##NAME: UUXFLAGS:0
#
# Specify additional flags to uux. Allowed flags are -g [grade], -j, and
diff -urN courier-0.44.0/courier/module.esmtp/esmtpclient.c
courier-0.44.0-je/courier/module.esmtp/esmtpclient.c
--- courier-0.44.0/courier/module.esmtp/esmtpclient.c 2003-01-05 04:06:08.000000000
+0000
+++ courier-0.44.0-je/courier/module.esmtp/esmtpclient.c 2003-10-31
22:28:34.000000000 +0000
@@ -283,6 +283,28 @@
return (0);
}
+static int get_sourceaddr(int af, RFC1035_NETADDR *addrbuf,
+ const struct sockaddr **addrptr, int *addrptrlen)
+{
+ int rc;
+ RFC1035_ADDR in;
+ const char *buf=getenv("SOURCE_ADDRESS");
+
+ if (buf && strcmp(buf, "0")) {
+ rc = rfc1035_aton(buf, &in);
+ if (rc != 0)
+ return rc;
+ } else
+ in = RFC1035_ADDRANY;
+
+ rc = rfc1035_mkaddress(af, addrbuf, &in, htons(0),
+ addrptr, addrptrlen);
+ if (rc != 0)
+ return rc;
+
+ return 0;
+}
+
/* Attempt to deliver a message */
static void sendesmtp(struct moduledel *del, struct ctlfile *ctf)
@@ -419,9 +441,9 @@
RFC1035_ADDR addr;
int port;
int af;
- RFC1035_NETADDR addrbuf;
- const struct sockaddr *saddr;
- int saddrlen;
+ RFC1035_NETADDR addrbuf, saddrbuf;
+ const struct sockaddr *addrptr, *saddrptr;
+ int addrptrlen, saddrptrlen;
if (q && q->priority == p->priority)
break;
@@ -446,8 +468,12 @@
if ((sockfd=rfc1035_mksocket(SOCK_STREAM, 0, &af))
>= 0 &&
rfc1035_mkaddress(af, &addrbuf, &addr, port,
- &saddr, &saddrlen) == 0 &&
- s_connect(sockfd, saddr, saddrlen,
+ &addrptr, &addrptrlen) == 0 &&
+ get_sourceaddr(af, &saddrbuf, &saddrptr,
+ &saddrptrlen) == 0 &&
+ rfc1035_bindsource(sockfd, saddrptr,
+ saddrptrlen) == 0 &&
+ s_connect(sockfd, addrptr, addrptrlen,
connect_timeout) == 0)
{
/*
diff -urN courier-0.44.0/rfc1035/Makefile.am courier-0.44.0-je/rfc1035/Makefile.am
--- courier-0.44.0/rfc1035/Makefile.am 2003-04-21 22:07:07.000000000 +0000
+++ courier-0.44.0-je/rfc1035/Makefile.am 2003-10-31 22:27:17.000000000 +0000
@@ -15,7 +15,7 @@
rfc1035mksocket.c rfc1035mxlist.c rfc1035mxlist.h rfc1035qa.c \
rfc1035qptr.c rfc1035reply.c rfc1035resolve.c rfc1035sameip.c \
rfc1035search.c rfc1035sockaddrip.c rfc1035sockaddrport.c \
- rfc1035str.c rfc1035tcp.c rfc1035udp.c
+ rfc1035str.c rfc1035tcp.c rfc1035udp.c rfc1035bindsource.c
noinst_PROGRAMS=testlookup
diff -urN courier-0.44.0/rfc1035/rfc1035bindsource.c
courier-0.44.0-je/rfc1035/rfc1035bindsource.c
--- courier-0.44.0/rfc1035/rfc1035bindsource.c 1970-01-01 00:00:00.000000000 +0000
+++ courier-0.44.0-je/rfc1035/rfc1035bindsource.c 2003-10-31 22:27:17.000000000
+0000
@@ -0,0 +1,22 @@
+/*
+** Copyright 1998 - 2000 Double Precision, Inc.
+** See COPYING for distribution information.
+*/
+#include "config.h"
+#include "rfc1035.h"
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <errno.h>
+
+static const char rcsid[]="$Id$";
+
+/*
+** Bind a socket to a local IP. This is used to control the source IP
+** address when making TCP connection.
+*/
+
+int rfc1035_bindsource(int sockfd, const struct sockaddr *addr, int addrlen)
+{
+ return bind(sockfd, addr, addrlen);
+}
diff -urN courier-0.44.0/rfc1035/rfc1035.h courier-0.44.0-je/rfc1035/rfc1035.h
--- courier-0.44.0/rfc1035/rfc1035.h 2002-06-24 18:53:18.000000000 +0000
+++ courier-0.44.0-je/rfc1035/rfc1035.h 2003-10-31 22:27:17.000000000 +0000
@@ -28,10 +28,12 @@
typedef struct in6_addr RFC1035_ADDR;
typedef struct sockaddr_in6 RFC1035_SOCKADDR;
typedef struct sockaddr_storage RFC1035_NETADDR;
+#define RFC1035_ADDRANY in6addr_any
#else
typedef struct in_addr RFC1035_ADDR;
typedef struct sockaddr_in RFC1035_SOCKADDR;
typedef struct sockaddr RFC1035_NETADDR;
+#define RFC1035_ADDRANY INADDR_ANY
#endif
#define RFC1035_TYPE_A 1
@@ -527,6 +529,9 @@
int rfc1035_same_ip(const void *, int, const void *, int);
+int rfc1035_bindsource(int sockfd, /* Socket fd */
+ const struct sockaddr *addr, /* Buffer to socket address */
+ int addrlen); /* Size of socket address */
/*
** First try to create an IPv6 socket, then, if we fail, an IPv4 socket.
diff -urN courier-0.44.0/rfc1035/rfc1035mkaddress.c
courier-0.44.0-je/rfc1035/rfc1035mkaddress.c
--- courier-0.44.0/rfc1035/rfc1035mkaddress.c 2000-05-28 21:51:49.000000000 +0000
+++ courier-0.44.0-je/rfc1035/rfc1035mkaddress.c 2003-10-31 22:27:17.000000000
+0000
@@ -42,7 +42,7 @@
return (0);
}
- if (af != AF_INET || !IN6_IS_ADDR_V4MAPPED(addr))
+ if (af != AF_INET || (!IN6_IS_ADDR_V4MAPPED(addr) && memcmp(addr,
&in6addr_any, sizeof(*addr))))
{
errno=EAFNOSUPPORT;
return (-1);
-------------------------------------------------------
This SF.net email is sponsored by: IBM Linux Tutorials.
Become an expert in LINUX or just sharpen your skills. Sign up for IBM's
Free Linux Tutorials. Learn everything from the bash shell to sys admin.
Click now! http://ads.osdn.com/?ad_id=1278&alloc_id=3371&op=click
_______________________________________________
courier-users mailing list
[EMAIL PROTECTED]
Unsubscribe: https://lists.sourceforge.net/lists/listinfo/courier-users