From db31c40bccb5ee32bef0ef6f1b348a66fbdf061e Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Thu, 7 Jun 2007 03:01:10 +0000 Subject: [PATCH] Attempt #2 at setting the egress interface --- citadel/clientsocket.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/citadel/clientsocket.c b/citadel/clientsocket.c index 1fffa2bdc..4ac1963d9 100644 --- a/citadel/clientsocket.c +++ b/citadel/clientsocket.c @@ -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)); -- 2.39.2