]> SAFE projects GIT repository - jmp/mailleur/commitdiff
Able to specify feeder source address
authorJean-Marc Pigeon (Delson) <jmp@safe.ca>
Mon, 5 May 2025 13:31:18 +0000 (09:31 -0400)
committerJean-Marc Pigeon (Delson) <jmp@safe.ca>
Mon, 5 May 2025 13:31:18 +0000 (09:31 -0400)
app/feeder.c
data-tst/feed00.tst
lib/devsoc.c
lib/devsoc.h

index beee2a434a97486d7d8ca3a2d203fccb958883c1..c4be65a89cb9e48939b5a26244a2e635fe41e2ff 100644 (file)
@@ -459,7 +459,8 @@ while (next<argc) {
     case  0     :       //display scanned file
       break;
     case  1     :       //opening a socket
-      socptr=soc_openonesock(pro_smtp,argv[0],argv[1]);
+      //socptr=soc_openonesock(pro_smtp,"127.63.31.15",argv[0],argv[1]);
+      socptr=soc_openonesock(pro_smtp,(const char *)0,argv[0],argv[1]);
       if (socptr==(SOCPTR *)0) {
         (void) rou_alert(0,"Unable to contact remote!");
         phase=999;
index c68c2c5dda9a08c6b4b21be639a76212045b7445..de07b5cc73a9125b1c49167f7188de7e211ebb05 100644 (file)
@@ -12,7 +12,8 @@
 T:basic test function
 R:220 mailleur.example.com ESMTP (cleartext) emlrcvr...
 S:EHLO example.com
-R:250-mailleur.example.com, link (cleartext) ready, your IP/FQDN=[127.0.0.1/localhost.localdomain]
+#R:250-mailleur.example.com, link (cleartext) ready, your IP/FQDN=[127.0.0.1/localhost.localdomain]
+R:250-mailleur.example.com, link (cleartext) ready, your IP/FQDN...
 R:250-SIZE 52428800
 R:250-STARTTLS
 R:250-8BITMIME
@@ -23,7 +24,8 @@ R:250 HELP
 C:GOTLS
 R:250 Link now encryp...
 S:EHLO example.com
-R:250-mailleur.example.com, link (crypted) ready, your IP/FQDN=[127.0.0.1/localhost.localdomain]
+#R:250-mailleur.example.com, link (crypted) ready, your IP/FQDN=[127.0.0.1/localhost.localdomain]
+R:250-mailleur.example.com, link (crypted) ready, your IP/FQDN...
 R:250-SIZE 52428800
 R:250-8BITMIME
 R:250-ENHANCEDSTATUSCODES
index e3e8f8c052032ab7052d662ac659e649ce918832..6cb7adaaa35e7016a997b9a54e82a32cc46e3243 100644 (file)
@@ -415,7 +415,6 @@ static int bindhandle(struct addrinfo *ai,SOCTYP *soc)
 
 int handle;
 struct linger slg;
-struct sockaddr_in server_addr;
 int reuse;
 int phase;
 _Bool proceed;
@@ -460,9 +459,6 @@ while (proceed==true) {
        }
       break;
     case 4     :       //getting socket option
-      server_addr.sin_family = AF_INET;
-      inet_pton(AF_INET,"127.0.0.1", &(server_addr.sin_addr));
-      server_addr.sin_port = htons(2525);
       if (bind(handle,ai->ai_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;
index 2a9f0ee9b95f118979c3754009dfd744009214e1..ff2552b33fa88b6233e292bad83264da794ae75f 100644 (file)
@@ -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);