diff src/mail/ngx_mail_handler.c @ 1487:f69493e8faab

ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
author Igor Sysoev <igor@sysoev.ru>
date Sat, 15 Sep 2007 16:51:16 +0000
parents 4606dce4f416
children 93ff27726d2e
line wrap: on
line diff
--- a/src/mail/ngx_mail_handler.c
+++ b/src/mail/ngx_mail_handler.c
@@ -18,34 +18,6 @@ static void ngx_mail_ssl_handshake_handl
 #endif
 
 
-static ngx_mail_init_session_pt  ngx_mail_init_sessions[] = {
-   ngx_mail_pop3_init_session,
-   ngx_mail_imap_init_session,
-   ngx_mail_smtp_init_session
-};
-
-
-static ngx_mail_init_protocol_pt  ngx_mail_init_protocols[] = {
-   ngx_mail_pop3_init_protocol,
-   ngx_mail_imap_init_protocol,
-   ngx_mail_smtp_init_protocol
-};
-
-
-static ngx_mail_parse_command_pt  ngx_mail_parse_commands[] = {
-   ngx_mail_pop3_parse_command,
-   ngx_mail_imap_parse_command,
-   ngx_mail_smtp_parse_command
-};
-
-
-static ngx_str_t  internal_server_errors[] = {
-   ngx_string("-ERR internal server error" CRLF),
-   ngx_string("* BAD internal server error" CRLF),
-   ngx_string("451 4.3.2 Internal server error" CRLF),
-};
-
-
 void
 ngx_mail_init_connection(ngx_connection_t *c)
 {
@@ -210,17 +182,20 @@ ngx_mail_ssl_init_connection(ngx_ssl_t *
 static void
 ngx_mail_ssl_handshake_handler(ngx_connection_t *c)
 {
-    ngx_mail_session_t  *s;
+    ngx_mail_session_t        *s;
+    ngx_mail_core_srv_conf_t  *cscf;
 
     if (c->ssl->handshaked) {
 
         s = c->data;
 
         if (s->starttls) {
-            c->read->handler = ngx_mail_init_protocols[s->protocol];
+            cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);
+
+            c->read->handler = cscf->protocol->init_protocol;
             c->write->handler = ngx_mail_send;
 
-            ngx_mail_init_protocols[s->protocol](c->read);
+            cscf->protocol->init_protocol(c->read);
 
             return;
         }
@@ -245,7 +220,7 @@ ngx_mail_init_session(ngx_connection_t *
 
     cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);
 
-    s->protocol = cscf->protocol;
+    s->protocol = cscf->protocol->type;
 
     s->ctx = ngx_pcalloc(c->pool, sizeof(void *) * ngx_mail_max_module);
     if (s->ctx == NULL) {
@@ -255,7 +230,7 @@ ngx_mail_init_session(ngx_connection_t *
 
     c->write->handler = ngx_mail_send;
 
-    ngx_mail_init_sessions[s->protocol](s, c);
+    cscf->protocol->init_session(s, c);
 }
 
 
@@ -567,9 +542,10 @@ ngx_mail_send(ngx_event_t *wev)
 ngx_int_t
 ngx_mail_read_command(ngx_mail_session_t *s, ngx_connection_t *c)
 {
-    ssize_t    n;
-    ngx_int_t  rc;
-    ngx_str_t  l;
+    ssize_t                    n;
+    ngx_int_t                  rc;
+    ngx_str_t                  l;
+    ngx_mail_core_srv_conf_t  *cscf;
 
     n = c->recv(c, s->buffer->last, s->buffer->end - s->buffer->last);
 
@@ -591,7 +567,9 @@ ngx_mail_read_command(ngx_mail_session_t
         return NGX_AGAIN;
     }
 
-    rc = ngx_mail_parse_commands[s->protocol](s);
+    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);
+
+    rc = cscf->protocol->parse_command(s);
 
     if (rc == NGX_AGAIN) {
 
@@ -644,7 +622,11 @@ ngx_mail_auth(ngx_mail_session_t *s, ngx
 void
 ngx_mail_session_internal_server_error(ngx_mail_session_t *s)
 {
-    s->out = internal_server_errors[s->protocol];
+    ngx_mail_core_srv_conf_t  *cscf;
+
+    cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);
+
+    s->out = cscf->protocol->internal_server_error;
     s->quit = 1;
 
     ngx_mail_send(s->connection->write);