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

Reply via email to