Attempt #2 at setting the egress interface
authorArt Cancro <ajc@citadel.org>
Thu, 7 Jun 2007 03:01:10 +0000 (03:01 +0000)
committerArt Cancro <ajc@citadel.org>
Thu, 7 Jun 2007 03:01:10 +0000 (03:01 +0000)
citadel/clientsocket.c

index 1fffa2bdc940c69d06ea046523eea78ec1023007..4ac1963d9c705e891c3fe9f6034fa01f0c03a5cc 100644 (file)
@@ -43,6 +43,7 @@ int sock_connect(char *host, char *service, char *protocol)
        struct servent *pse;
        struct protoent *ppe;
        struct sockaddr_in sin;
+       struct sockaddr_in egress_sin;
        int s, type;
 
        if (host == NULL) return(-1);
@@ -54,9 +55,6 @@ int sock_connect(char *host, char *service, char *protocol)
 
        memset(&sin, 0, sizeof(sin));
        sin.sin_family = AF_INET;
-       if (strlen(config.c_ip_addr) > 0) {
-               sin.sin_addr.s_addr = inet_addr(config.c_ip_addr);
-       }
 
        pse = getservbyname(service, protocol);
        if (pse) {
@@ -91,6 +89,19 @@ int sock_connect(char *host, char *service, char *protocol)
                return(-1);
        }
 
+       /* Set the outbound interface for egress */
+       memset(&egress_sin, 0, sizeof(egress_sin));
+       egress_sin.sin_family = AF_INET;
+       if (strlen(config.c_ip_addr) > 0) {
+               egress_sin.sin_addr.s_addr = inet_addr(config.c_ip_addr);
+               if (egress_sin.sin_addr.s_addr == !INADDR_ANY) {
+                       egress_sin.sin_addr.s_addr = INADDR_ANY;
+               }
+
+               /* If this bind fails, no problem; we can still egress from the default interface */
+               bind(s, (struct sockaddr *)&egress_sin, sizeof(egress_sin));
+        }
+
        if (connect(s, (struct sockaddr *) &sin, sizeof(sin)) < 0) {
                lprintf(CTDL_ERR, "Can't connect to %s:%s: %s\n",
                        host, service, strerror(errno));