From: Jean-Marc Pigeon (Delson) Date: Mon, 5 May 2025 13:31:18 +0000 (-0400) Subject: Able to specify feeder source address X-Git-Tag: tag-0.8~146 X-Git-Url: https://jmp-git.ovh.safe.ca/?a=commitdiff_plain;h=64451340281b1ae6d7baa3727ad07119dc864575;p=jmp%2Fmailleur Able to specify feeder source address --- diff --git a/app/feeder.c b/app/feeder.c index beee2a4..c4be65a 100644 --- a/app/feeder.c +++ b/app/feeder.c @@ -459,7 +459,8 @@ while (nextai_addr,ai->ai_addrlen)<0) { (void) rou_alert(0,"%s Unable to bind on IP/port <%s/%s> (error='%s')", OPEP,ai->ai_canonname,soc->port,strerror(errno)); @@ -573,7 +569,7 @@ return socptr; /* server. Return a socptr if successful. */ /* */ /********************************************************/ -PUBLIC SOCPTR *soc_openonesock(PROTYP proto,const char *ip,const char *port) +PUBLIC SOCPTR *soc_openonesock(PROTYP proto,const char *src,const char *ip,const char *port) { #define OPEP "devsoc.c:soc_openonesoc" @@ -627,7 +623,22 @@ while (proceed==true) { phase=999; //no need to go further } break; - case 3 : //connecting to remote + case 3 : //Need to bind from a specific source address + if (src!=(const char *)0) { + struct sockaddr_in server_addr; + + (void) memset(&server_addr,'\000',sizeof(server_addr)); + server_addr.sin_family=AF_INET; + inet_pton(AF_INET,src, &(server_addr.sin_addr)); + if (bind(handle,(struct sockaddr*)&server_addr,sizeof(server_addr))<0) { + (void) rou_alert(0,"%s Unable to bind on <%s> error=<%s>", + OPEP,src,strerror(errno)); + (void) close(handle); + phase=999; + } + } + break; + case 4 : //connecting to remote if (connect(handle,ai->ai_addr,ai->ai_addrlen)<0) { switch (errno) { case EINPROGRESS : //its acceptable @@ -636,12 +647,13 @@ while (proceed==true) { (void) rou_alert(1,"%s unable to make connection with '%s.%s' " "(error=<%s>)", OPEP,ip,port,strerror(errno)); + (void) close(handle); phase=999; break; } } break; - case 4 : //getting newhandle flag + case 5 : //getting newhandle flag if ((flags=fcntl(handle,F_GETFL,0))<0) { (void) rou_core_dump("%s, Unable to get socket descripteur on " "IP/PORT <%s/%s> (Bug? error=<%s>)", @@ -649,7 +661,7 @@ while (proceed==true) { phase=999; //never reached } break; - case 5 : //setting newhandle working mode + case 6 : //setting newhandle working mode if ((flags=fcntl(handle,F_SETFL,flags|O_NONBLOCK))<0) { (void) rou_core_dump("%s, Unable to set socket descripteur on " "IP/PORT <%s/%s> (Bug? error=<%s>)", @@ -657,7 +669,7 @@ while (proceed==true) { phase=999; //never reached } break; - case 6 : //socket is now ready + case 7 : //socket is now ready soc=newsocket(); soc->proto=proto; soc->connected=true; diff --git a/lib/devsoc.h b/lib/devsoc.h index 2a9f0ee..ff2552b 100644 --- a/lib/devsoc.h +++ b/lib/devsoc.h @@ -43,7 +43,7 @@ extern SOCPTR **soc_mkbindinf(SOCPTR **s,PROTYP proto, //procedure to open one exchange socket //to connect a remote smtp server -extern SOCPTR *soc_openonesock(PROTYP proto,const char *ip,const char *port); +extern SOCPTR *soc_openonesock(PROTYP proto,const char *src,const char *ip,const char *port); //procedure to close an exchange socket connected to a remote smtp server extern SOCPTR *soc_closeonesock(SOCPTR *socptr);