You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by so...@apache.org on 2006/01/30 22:29:18 UTC

svn commit: r373596 - in /httpd/mod_smtpd/trunk: modules/rcpt/ok/mod_smtpd_rcpt_ok.c src/mod_smtpd.h src/smtp_protocol.c

Author: soc-rian
Date: Mon Jan 30 13:29:15 2006
New Revision: 373596

URL: http://svn.apache.org/viewcvs?rev=373596&view=rev
Log:
Made disconnect booleans type-safe, added options for action hooks
to disconnect (by RFC 2821 standards).

Updated rcpt_ok module to correspond with current api.


Modified:
    httpd/mod_smtpd/trunk/modules/rcpt/ok/mod_smtpd_rcpt_ok.c
    httpd/mod_smtpd/trunk/src/mod_smtpd.h
    httpd/mod_smtpd/trunk/src/smtp_protocol.c

Modified: httpd/mod_smtpd/trunk/modules/rcpt/ok/mod_smtpd_rcpt_ok.c
URL: http://svn.apache.org/viewcvs/httpd/mod_smtpd/trunk/modules/rcpt/ok/mod_smtpd_rcpt_ok.c?rev=373596&r1=373595&r2=373596&view=diff
==============================================================================
--- httpd/mod_smtpd/trunk/modules/rcpt/ok/mod_smtpd_rcpt_ok.c (original)
+++ httpd/mod_smtpd/trunk/modules/rcpt/ok/mod_smtpd_rcpt_ok.c Mon Jan 30 13:29:15 2006
@@ -10,8 +10,9 @@
 
 module AP_MODULE_DECLARE_DATA smtpd_rcpt_ok_module;
 
-static smtpd_retcode default_rcpt(smtpd_conn_rec *scr, smtpd_return_data *out,
-                                  char *address, apr_table_t *rcpt_param)
+static smtpd_retcode default_rcpt(smtpd_session_rec *scr, char *address,
+                                  apr_table_t *rcpt_param,
+                                  smtpd_return_data **out_data)
 {
     rcpt_ok_config *pConfig =
       ap_get_module_config(scr->s->module_config,

Modified: httpd/mod_smtpd/trunk/src/mod_smtpd.h
URL: http://svn.apache.org/viewcvs/httpd/mod_smtpd/trunk/src/mod_smtpd.h?rev=373596&r1=373595&r2=373596&view=diff
==============================================================================
--- httpd/mod_smtpd/trunk/src/mod_smtpd.h (original)
+++ httpd/mod_smtpd/trunk/src/mod_smtpd.h Mon Jan 30 13:29:15 2006
@@ -53,10 +53,8 @@
     SMTPD_DECLINED,
     SMTPD_DENY,
     SMTPD_DENYSOFT,
-    SMTPD_DENY_DISCONNECT,
-    SMTPD_DENYSOFT_DISCONNECT,
+    SMTPD_DISCONNECT,
     SMTPD_DONE,
-    SMTPD_DONE_DISCONNECT,
     SMTPD_OK
 } smtpd_retcode;
 

Modified: httpd/mod_smtpd/trunk/src/smtp_protocol.c
URL: http://svn.apache.org/viewcvs/httpd/mod_smtpd/trunk/src/smtp_protocol.c?rev=373596&r1=373595&r2=373596&view=diff
==============================================================================
--- httpd/mod_smtpd/trunk/src/smtp_protocol.c (original)
+++ httpd/mod_smtpd/trunk/src/smtp_protocol.c Mon Jan 30 13:29:15 2006
@@ -46,14 +46,14 @@
 extern ap_regex_t *rcpt_compiled_regex;
 extern ap_regex_t *vrfy_compiled_regex;
 
-static int smtpd_handler_helo(smtpd_session_rec *, char *, int);
-static int smtpd_handler_mail(smtpd_session_rec *, char *);
-static int smtpd_handler_rcpt(smtpd_session_rec *, char *);
-static int smtpd_handler_data(smtpd_session_rec *, char *);
-static int smtpd_handler_rset(smtpd_session_rec *, char *);
-static int smtpd_handler_quit(smtpd_session_rec *, char *);
-static int smtpd_handler_vrfy(smtpd_session_rec *, char *);
-static int smtpd_handle_unrecognized_command(smtpd_session_rec *, char *, char *);
+static smtpd_bool smtpd_handler_helo(smtpd_session_rec *, char *, smtpd_bool);
+static smtpd_bool smtpd_handler_mail(smtpd_session_rec *, char *);
+static smtpd_bool smtpd_handler_rcpt(smtpd_session_rec *, char *);
+static smtpd_bool smtpd_handler_data(smtpd_session_rec *, char *);
+static smtpd_bool smtpd_handler_rset(smtpd_session_rec *, char *);
+static smtpd_bool smtpd_handler_quit(smtpd_session_rec *, char *);
+static smtpd_bool smtpd_handler_vrfy(smtpd_session_rec *, char *);
+static smtpd_bool smtpd_handle_unrecognized_command(smtpd_session_rec *, char *, char *);
 
 static void smtpd_respond_msgs(smtpd_session_rec *scr, int status,
                                char *default_string, apr_array_header_t *msgs)
@@ -83,7 +83,7 @@
     char cmdbuff[BUFFER_STR_LEN];
     char *buffer = cmdbuff;
     char *command;
-    int disconnect;
+    smtpd_bool disconnect;
     smtpd_return_data *out_data;
 
     smtpd_run_on_connect(scr);
@@ -117,10 +117,10 @@
         ap_str_tolower(command);
 
         if (ap_strcmp_match("ehlo", command) == 0) {
-            disconnect = smtpd_handler_helo(scr, buffer, 1);
+            disconnect = smtpd_handler_helo(scr, buffer, SMTPD_TRUE);
         }
         else if (ap_strcmp_match("helo", command) == 0) {
-            disconnect = smtpd_handler_helo(scr, buffer, 0);
+            disconnect = smtpd_handler_helo(scr, buffer, SMTPD_FALSE);
         }
         else if (ap_strcmp_match("mail", command) == 0) {
             disconnect = smtpd_handler_mail(scr, buffer);
@@ -136,7 +136,7 @@
         }
         else if (ap_strcmp_match("noop", command) == 0) {
             smtpd_respond_oneline(scr, 250, "Ok");
-            disconnect = 0;
+            disconnect = SMTPD_FALSE;
         }
         else if (ap_strcmp_match("vrfy", command) == 0) {
             disconnect = smtpd_handler_vrfy(scr, buffer);
@@ -149,7 +149,7 @@
               smtpd_handle_unrecognized_command(scr, command, buffer);
         }
         
-        if (disconnect)
+        if (disconnect == SMTPD_TRUE)
             break;
 
         buffer = cmdbuff;
@@ -158,11 +158,10 @@
     return;
 }
 
-static int smtpd_handle_unrecognized_command(smtpd_session_rec *scr,
-                                             char *command,
-                                             char *data)
+static smtpd_bool smtpd_handle_unrecognized_command(smtpd_session_rec *scr,
+                                              char *command,
+                                              char *data)
 {
-    int disconnect = 0;
     smtpd_return_data *out_data;
     
     switch(smtpd_run_unrecognized_command(scr, command, data, &out_data)) {
@@ -179,10 +178,10 @@
         break;
     }
 
-    return disconnect;
+    return SMTPD_FALSE;
 }
 
-static int smtpd_default_ehlo(smtpd_session_rec *scr, char *buffer)
+static void smtpd_default_ehlo(smtpd_session_rec *scr, char *buffer)
 {
     /* RFC 2821 states that when ehlo or helo is received, reset */
     /* state */
@@ -205,10 +204,9 @@
         smtpd_respond_oneline(scr, 250, scr->helo);
     }
 
-    return 0;
 }
 
-static int smtpd_default_helo(smtpd_session_rec *scr, char *buffer)
+static void smtpd_default_helo(smtpd_session_rec *scr, char *buffer)
 {
     /* RFC 2821 states that when ehlo or helo is received, reset */
     /* state */
@@ -219,16 +217,15 @@
     scr->protocol_type = SMTPD_PROTOCOL_SMTP;
 
     smtpd_respond_oneline(scr, 250, scr->helo);
-
-    return 0;
 }
 
 
-static int smtpd_handler_helo(smtpd_session_rec *scr, char *buffer, int esmtp)
+static smtpd_bool smtpd_handler_helo(smtpd_session_rec *scr, char *buffer,
+                                     smtpd_bool esmtp)
 {
     int error;
-    int disconnect = 0;
     smtpd_return_data *out_data = NULL;
+    smtpd_bool disconnect = SMTPD_FALSE;
 
     if (buffer == NULL) {
         goto syntax_error;
@@ -238,17 +235,21 @@
 
     if (error) {
     syntax_error:
-        smtpd_respond_oneline(scr, 501, esmtp
+        smtpd_respond_oneline(scr, 501, esmtp == SMTPD_TRUE
                               ? "Syntax: EHLO hostname"
                               : "Syntax: HELO hostname");
         return disconnect;
     }
     
-    switch(esmtp
+    switch(esmtp == SMTPD_TRUE
            ? smtpd_run_ehlo(scr, buffer, &out_data)
            : smtpd_run_helo(scr, buffer, &out_data)) {
     case SMTPD_DONE:
         break;
+    case SMTPD_DISCONNECT:
+        disconnect = SMTPD_TRUE;
+        smtpd_respond(scr, 421, "Error: Internal", out_data);
+        break;
     case SMTPD_DENY:
         smtpd_respond(scr, 550, "Denied", out_data);
         break;
@@ -256,11 +257,15 @@
         smtpd_respond(scr, 450, "Temporarily Denied", out_data);
         break;
     default:
-        disconnect = esmtp
-          ? smtpd_default_helo(scr, buffer)
-          : smtpd_default_ehlo(scr, buffer);
+        if (esmtp == SMTPD_TRUE) {
+            smtpd_default_helo(scr, buffer);
+        }
+        else {
+            smtpd_default_ehlo(scr, buffer);
+        }
         break;
     }
+
     return disconnect;
 }
 
@@ -290,7 +295,7 @@
     }
 }
 
-static int smtpd_default_mail(smtpd_session_rec *scr, char *email_address,
+static void smtpd_default_mail(smtpd_session_rec *scr, char *email_address,
                               apr_table_t *mail_parameters)
 {
     smtpd_envelope_rec *str = scr->envelope;
@@ -306,17 +311,15 @@
                       APR_OVERLAP_TABLES_SET);
     str->trans_state = SMTPD_STATE_GOT_MAIL;
     smtpd_respond_oneline(scr, 250, "Ok");
-
-    return 0;
 }   
 
-static int smtpd_handler_mail(smtpd_session_rec *scr, char *buffer)
+static smtpd_bool smtpd_handler_mail(smtpd_session_rec *scr, char *buffer)
 {
     char *email_address;
     int error;
-    int disconnect = 0;
     apr_table_t *mail_parameters;
     smtpd_return_data *out_data = NULL;
+    smtpd_bool disconnect = SMTPD_FALSE;
 
     /* already got mail */
     if (scr->envelope->trans_state == SMTPD_STATE_GOT_MAIL) {
@@ -334,7 +337,7 @@
     syntax_error:
         smtpd_respond_oneline(scr, 501, "Syntax: MAIL FROM:<reverse-path> "
                               "mail-parameters");
-        return disconnect;
+        return SMTPD_FALSE;
     }
 
     /* logging will be robustified later 
@@ -360,6 +363,10 @@
     switch(smtpd_run_mail(scr, email_address, mail_parameters, &out_data)) {
     case SMTPD_DONE:
         break;
+    case SMTPD_DISCONNECT:
+        disconnect = SMTPD_TRUE;
+        smtpd_respond(scr, 421, "Error: Internal", out_data);
+        break;
     case SMTPD_DENY:
         ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, scr->s,
                      "deny mail from %s (%s)", email_address,
@@ -373,14 +380,14 @@
         smtpd_respond(scr, 450, "Temporarily denied", out_data);
         break;
     default:
-        disconnect = smtpd_default_mail(scr, email_address, mail_parameters);
+        smtpd_default_mail(scr, email_address, mail_parameters);
         break;
     }
     
     return disconnect;
 }
 
-static int smtpd_default_rcpt(smtpd_session_rec *scr, char *email_address,
+static void smtpd_default_rcpt(smtpd_session_rec *scr, char *email_address,
                               apr_table_t *rcpt_parameters)
 {
     smtpd_envelope_rec *str = scr->envelope;
@@ -393,17 +400,15 @@
       apr_pstrdup(str->p, email_address);
     str->trans_state = SMTPD_STATE_GOT_RCPT;
     smtpd_respond_oneline(scr, 250, "Ok");
- 
-    return 0;
 }
 
-static int smtpd_handler_rcpt(smtpd_session_rec *scr, char *buffer)
+static smtpd_bool smtpd_handler_rcpt(smtpd_session_rec *scr, char *buffer)
 {
     char *email_address;
     int error;
-    int disconnect = 0;
     apr_table_t *rcpt_parameters;
     smtpd_return_data *out_data = NULL;
+    smtpd_bool disconnect = SMTPD_FALSE;
         
     /* need mail first */
     if ((scr->envelope->trans_state != SMTPD_STATE_GOT_MAIL) &&
@@ -443,6 +448,10 @@
     switch(smtpd_run_rcpt(scr, email_address, rcpt_parameters, &out_data)) {
     case SMTPD_DONE:
         break;
+    case SMTPD_DISCONNECT:
+        disconnect = SMTPD_TRUE;
+        smtpd_respond(scr, 421, "Error: Internal", out_data);
+        break;
     case SMTPD_DENY:
         smtpd_respond(scr, 550, "Relaying denied", out_data);
         break;
@@ -450,7 +459,7 @@
         smtpd_respond(scr, 450, "Relaying temporarily denied", out_data);
         break;
     case SMTPD_OK: /* recipient is okay */
-        disconnect = smtpd_default_rcpt(scr, email_address, rcpt_parameters);
+        smtpd_default_rcpt(scr, email_address, rcpt_parameters);
         break;
     default:
         smtpd_respond_oneline(scr, 450,
@@ -462,14 +471,12 @@
 }
 
 
-static int smtpd_queue(smtpd_session_rec *scr)
+static void smtpd_queue(smtpd_session_rec *scr)
 {
     smtpd_run_on_queue(scr);
 
     /* simple for now */
     smtpd_respond_msgs(scr, 220, "Queued", scr->queued_greeting);
-
-    return 0;
 }
 
 /* for debugging
@@ -531,13 +538,13 @@
     apr_pool_destroy(p);
 }
 
-static int smtpd_default_data(smtpd_session_rec *scr)
+static smtpd_bool smtpd_default_data(smtpd_session_rec *scr)
 {
     int rv;
-    int disconnect = 0;
     apr_file_t *tfp;
     smtpd_envelope_rec *str = scr->envelope;
     smtpd_header_filter_ctx header_ctx = {0, scr, NULL, NULL};
+    smtpd_bool disconnect = SMTPD_FALSE;
    
     /* get temporary file pointer */
     {
@@ -547,8 +554,7 @@
         rv = apr_temp_dir_get(&tempdir, scr->per_command_pool);
         if (rv) {
             smtpd_respond_oneline(scr, 421, "Error: Internal");
-            disconnect = 1;
-            return disconnect;
+            return SMTPD_TRUE;
         }
 
         tempfile = apr_psprintf(scr->per_command_pool, "%s/tmp.XXXXXX", tempdir);
@@ -559,8 +565,7 @@
         if (rv != APR_SUCCESS) {
             smtpd_respond_oneline(scr, 421, "Error: Internal");
             /* file error close connection */
-            disconnect = 1;
-            return disconnect;
+            return SMTPD_TRUE;
         }
     }
 
@@ -640,6 +645,10 @@
         switch(smtpd_run_data_post(scr, &out_data)) {
         case SMTPD_DONE:
             break;
+        case SMTPD_DISCONNECT:
+            disconnect = SMTPD_TRUE;
+            smtpd_respond(scr, 421, "Error: Internal", out_data);
+            break;
         case SMTPD_DENY:
             smtpd_respond(scr, 552, "Message denied", out_data);
             smtpd_reset_envelope(scr);
@@ -649,7 +658,7 @@
             smtpd_reset_envelope(scr);
             break;
         default:
-            disconnect = smtpd_queue(scr);
+            smtpd_queue(scr);
             smtpd_reset_envelope(scr);
             break;
         }
@@ -659,9 +668,9 @@
     return disconnect;
 }
 
-static int smtpd_handler_data(smtpd_session_rec *scr, char *buffer)
+static smtpd_bool smtpd_handler_data(smtpd_session_rec *scr, char *buffer)
 {
-    int disconnect = 0;
+    smtpd_bool disconnect = SMTPD_FALSE;
     smtpd_return_data *out_data = NULL;
 
     /* qpsmtpd does this after calling smtpd_run_data()
@@ -680,6 +689,10 @@
     switch(smtpd_run_data(scr, &out_data)) {
     case SMTPD_DONE:
         break;
+    case SMTPD_DISCONNECT:
+        disconnect = SMTPD_TRUE;
+        smtpd_respond(scr, 421, "Error: Internal", out_data);
+        break;
     case SMTPD_DENY:
         /* REVIEW: should we reset state here? */
         /* smtpd_clear_request_rec(sr); */
@@ -698,38 +711,40 @@
     return disconnect;
 }
 
-static int smtpd_handler_rset(smtpd_session_rec *scr, char *buffer)
+static smtpd_bool smtpd_handler_rset(smtpd_session_rec *scr, char *buffer)
 {
     if (buffer != NULL) {
         smtpd_respond_oneline(scr, 501, "Syntax: RSET");
-        return 501;
     }
-
-    smtpd_reset_envelope(scr);
-    smtpd_respond_oneline(scr, 250, "Ok");
+    else {
+        smtpd_reset_envelope(scr);
+        smtpd_respond_oneline(scr, 250, "Ok");
+    }
     
-    return 250;
+    return SMTPD_FALSE;
 }
 
-static int smtpd_handler_quit(smtpd_session_rec *scr, char *buffer)
+static smtpd_bool smtpd_handler_quit(smtpd_session_rec *scr, char *buffer)
 {
+    smtpd_bool disconnect = SMTPD_FALSE;
+
     if (buffer != NULL) {
         smtpd_respond_oneline(scr, 501, "Syntax: QUIT");
-        return 501;
+    }
+    else {
+        smtpd_run_on_quit(scr);
+        smtpd_respond_msgs(scr, 221, "Bye", scr->quit_greeting);
+        disconnect = SMTPD_TRUE;
     }
 
-    smtpd_run_on_quit(scr);
-
-    smtpd_respond_msgs(scr, 221, "Bye", scr->quit_greeting);
-
-    return 1;
+    return disconnect;
 }
 
-static int smtpd_handler_vrfy(smtpd_session_rec *scr, char *buffer)
+static smtpd_bool smtpd_handler_vrfy(smtpd_session_rec *scr, char *buffer)
 {
     int error;
-    int disconnect = 0;
     smtpd_return_data *out_data = NULL;
+    smtpd_bool disconnect = SMTPD_FALSE;
     
     if (buffer == NULL) {
         goto syntax_error;
@@ -745,6 +760,10 @@
 
     switch(smtpd_run_vrfy(scr, buffer, &out_data)) {
     case SMTPD_DONE:
+        break;
+    case SMTPD_DISCONNECT:
+        disconnect = SMTPD_TRUE;
+        smtpd_respond(scr, 421, "Error: Internal", out_data);
         break;
     case SMTPD_DENY:
         smtpd_respond(scr, 554, "Address denied", out_data);