Tidying: enum for smtp_write_mail_and_rcpt_cmds() retcodes
authorJeremy Harris <jgh146exb@wizmail.org>
Fri, 29 Dec 2023 22:12:58 +0000 (22:12 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Fri, 29 Dec 2023 23:13:52 +0000 (23:13 +0000)
src/src/macros.h
src/src/transports/smtp.c
src/src/transports/smtp.h
src/src/verify.c

index e2c1d0f948b1fa5e325bbb1a534e078f2a952edd..5279f70d0153a173d3903e815697912a00c51424 100644 (file)
@@ -1175,4 +1175,14 @@ typedef unsigned mcs_flags;
 #define SR_FINAL       TRUE
 #define SR_NOT_FINAL   FALSE
 
+/* Return codes for smtp_write_mail_and_rcpt_cmds() */
+typedef enum {
+  sw_mrc_ok,   /* good, rcpt results in addr->transport_return (PENDING_OK, DEFER, FAIL) */
+  sw_mrc_bad_mail,             /* MAIL response error */
+  sw_mrc_bad_read,             /* any non-MAIL read i/o error */
+  sw_mrc_nonmail_read_timeo,   /* non-MAIL response timeout */
+  sw_mrc_bad_internal,         /* internal error; channel still usable */
+  sw_mrc_tx_fail,              /* transmit failed */
+} sw_mrc_t;
+
 /* End of macros.h */
index 194671272523fce8dd1a56484aa69295678f3f13..817d729a7ca8ac422c967b253ab1442fd733771c 100644 (file)
@@ -3415,17 +3415,11 @@ if (sx->peer_offered & OPTION_DSN && !(addr->dsn_flags & rf_dsnlasthop))
 
 
 
-/*
-Return:
- 0     good, rcpt results in addr->transport_return (PENDING_OK, DEFER, FAIL)
- -1    MAIL response error
- -2    any non-MAIL read i/o error
- -3    non-MAIL response timeout
- -4    internal error; channel still usable
- -5    transmit failed
+/* Send MAIL FROM and RCPT TO commands.
+See sw_mrc_t definition for return codes.
  */
 
-int
+sw_mrc_t
 smtp_write_mail_and_rcpt_cmds(smtp_context * sx, int * yield)
 {
 address_item * addr;
@@ -3438,7 +3432,7 @@ int rc;
 if (build_mailcmd_options(sx, sx->first_addr) != OK)
   {
   *yield = ERROR;
-  return -4;
+  return sw_mrc_bad_internal;
   }
 
 /* From here until we send the DATA command, we can make use of PIPELINING
@@ -3466,7 +3460,7 @@ sx->pending_MAIL = TRUE;     /* The block starts with MAIL */
       {
       set_errno_nohost(sx->addrlist, ERRNO_EXPANDFAIL, errstr, DEFER, FALSE, &sx->delivery_start);
       *yield = ERROR;
-      return -4;
+      return sw_mrc_bad_internal;
       }
     setflag(sx->addrlist, af_utf8_downcvt);
     }
@@ -3481,7 +3475,7 @@ mail_command = string_copy(big_buffer);  /* Save for later error message */
 switch(rc)
   {
   case -1:                /* Transmission error */
-    return -5;
+    return sw_mrc_bad_mail;
 
   case +1:                /* Cmd was sent */
     if (!smtp_read_response(sx, sx->buffer, sizeof(sx->buffer), '2',
@@ -3492,7 +3486,7 @@ switch(rc)
        errno = ERRNO_MAIL4XX;
        sx->addrlist->more_errno |= ((sx->buffer[1] - '0')*10 + sx->buffer[2] - '0') << 8;
        }
-      return -1;
+      return sw_mrc_bad_mail;
       }
     sx->pending_MAIL = FALSE;
     break;
@@ -3567,14 +3561,14 @@ for (addr = sx->first_addr, address_count = 0, pipe_limit = 100;
     {
     /*XXX could we use a per-address errstr here? Not fail the whole send? */
     errno = ERRNO_EXPANDFAIL;
-    return -5;         /*XXX too harsh? */
+    return sw_mrc_tx_fail;             /*XXX too harsh? */
     }
 #endif
 
   cmds_sent = smtp_write_command(sx, no_flush ? SCMD_BUFFER : SCMD_FLUSH,
     "RCPT TO:<%s>%s%s\r\n", rcpt_addr, sx->igquotstr, sx->buffer);
 
-  if (cmds_sent < 0) return -5;
+  if (cmds_sent < 0) return sw_mrc_tx_fail;
   if (cmds_sent > 0)
     {
     switch(sync_responses(sx, cmds_sent, 0))
@@ -3596,17 +3590,17 @@ for (addr = sx->first_addr, address_count = 0, pipe_limit = 100;
                DEBUG(D_transport) debug_printf("seen 452 too-many-rcpts\n");
                sx->RCPT_452 = FALSE;
                /* sx->next_addr has been reset for fast_retry */
-               return 0;
+               return sw_mrc_ok;
                }
              break;
 
-      case RESP_RCPT_TIMEO:        return -3;  /* Timeout on RCPT */
-      case RESP_RCPT_ERROR:        return -2;  /* non-MAIL read i/o error */
-      default:                     return -1;  /* any MAIL error */
+      case RESP_RCPT_TIMEO:        return sw_mrc_nonmail_read_timeo;
+      case RESP_RCPT_ERROR:        return sw_mrc_bad_read;
+      default:                     return sw_mrc_bad_mail;     /* any MAIL error */
 
 #ifndef DISABLE_PIPE_CONNECT
-      case RESP_EPIPE_EHLO_ERR:            return -1;  /* non-2xx for pipelined banner or EHLO */
-      case RESP_EHLO_ERR_TLS:      return -1;  /* TLS first-read error */
+      case RESP_EPIPE_EHLO_ERR:            return sw_mrc_bad_mail;     /* non-2xx for pipelined banner or EHLO */
+      case RESP_EHLO_ERR_TLS:      return sw_mrc_bad_mail;     /* TLS first-read error */
 #endif
       }
     }
@@ -3617,7 +3611,7 @@ sx->next_addr = restart_addr ? restart_addr : addr;
 #else
 sx->next_addr = addr;
 #endif
-return 0;
+return sw_mrc_ok;
 }
 
 
@@ -3925,11 +3919,12 @@ else
 
   switch(smtp_write_mail_and_rcpt_cmds(sx, &yield))
     {
-    case 0:            break;
-    case -1: case -2:  goto RESPONSE_FAILED;
-    case -3:           goto END_OFF;
-    case -4:           goto SEND_QUIT;
-    default:           goto SEND_FAILED;
+    case sw_mrc_ok:                    break;
+    case sw_mrc_bad_mail:              goto RESPONSE_FAILED;
+    case sw_mrc_bad_read:              goto RESPONSE_FAILED;
+    case sw_mrc_nonmail_read_timeo:    goto END_OFF;
+    case sw_mrc_bad_internal:          goto SEND_QUIT;
+    default:                           goto SEND_FAILED;
     }
 
   /* If we are an MUA wrapper, abort if any RCPTs were rejected, either
index 1f888ee0bdb05900ff1225f0f829384ce3405a0c..ef9135838b66f964024f694c8527d76d34876757 100644 (file)
@@ -225,7 +225,7 @@ typedef struct {
 } smtp_context;
 
 extern int smtp_setup_conn(smtp_context *, BOOL);
-extern int smtp_write_mail_and_rcpt_cmds(smtp_context *, int *);
+extern sw_mrc_t smtp_write_mail_and_rcpt_cmds(smtp_context *, int *);
 extern int smtp_reap_early_pipe(smtp_context *, int *);
 
 
index 194e9a76a8896e27c1daeceb60fcdeed32fa0b1c..bde660063623a59e4cc3f5477247428c62bffc57 100644 (file)
@@ -823,7 +823,7 @@ tls_retry_connection:
       /* Remember when we last did a random test */
       new_domain_record.random_stamp = time(NULL);
 
-      if (smtp_write_mail_and_rcpt_cmds(sx, &yield) == 0)
+      if (smtp_write_mail_and_rcpt_cmds(sx, &yield) == sw_mrc_ok)
        switch(addr->transport_return)
          {
          case PENDING_OK:      /* random was accepted, unfortunately */
@@ -891,33 +891,34 @@ tls_retry_connection:
       done = FALSE;
       switch(smtp_write_mail_and_rcpt_cmds(sx, &yield))
        {
-       case 0:  switch(addr->transport_return) /* ok so far */
-                   {
-                   case PENDING_OK:  done = TRUE;
-                                     new_address_record.result = ccache_accept;
-                                     break;
-                   case FAIL:        done = TRUE;
-                                     yield = FAIL;
-                                     *failure_ptr = US"recipient";
-                                     new_address_record.result = ccache_reject;
-                                     break;
-                   default:          break;
-                   }
-                 break;
+       case sw_mrc_ok:
+         switch(addr->transport_return)        /* ok so far */
+           {
+           case PENDING_OK:  done = TRUE;
+                             new_address_record.result = ccache_accept;
+                             break;
+           case FAIL:        done = TRUE;
+                             yield = FAIL;
+                             *failure_ptr = US"recipient";
+                             new_address_record.result = ccache_reject;
+                             break;
+           default:          break;
+           }
+         break;
 
-       case -1:                                /* MAIL response error */
-                 *failure_ptr = US"mail";
-                 if (errno == 0 && sx->buffer[0] == '5')
-                   {
-                   setflag(addr, af_verify_nsfail);
-                   if (from_address[0] == 0)
-                     new_domain_record.result = ccache_reject_mfnull;
-                   }
-                 break;
-                                               /* non-MAIL read i/o error */
-                                               /* non-MAIL response timeout */
-                                               /* internal error; channel still usable */
-       default:  break;                        /* transmit failed */
+       case sw_mrc_bad_mail:                   /* MAIL response error */
+         *failure_ptr = US"mail";
+         if (errno == 0 && sx->buffer[0] == '5')
+           {
+           setflag(addr, af_verify_nsfail);
+           if (from_address[0] == 0)
+             new_domain_record.result = ccache_reject_mfnull;
+           }
+         break;
+                                       /* non-MAIL read i/o error */
+                                       /* non-MAIL response timeout */
+                                       /* internal error; channel still usable */
+       default:  break;                /* transmit failed */
        }
       }
 
@@ -955,7 +956,7 @@ tls_retry_connection:
        sx->completed_addr = FALSE;
        sx->avoid_option = OPTION_SIZE;
 
-       if(  smtp_write_mail_and_rcpt_cmds(sx, &yield) == 0
+       if(  smtp_write_mail_and_rcpt_cmds(sx, &yield) == sw_mrc_ok
          && addr->transport_return == PENDING_OK
          )
          done = TRUE;