comparison src/mail/ngx_mail_smtp_handler.c @ 1483:46f364406994

ngx_mail_smtp_create_buffer()
author Igor Sysoev <igor@sysoev.ru>
date Fri, 14 Sep 2007 14:13:25 +0000
parents 4606dce4f416
children c788d2b877be
comparison
equal deleted inserted replaced
1482:4606dce4f416 1483:46f364406994
9 #include <ngx_event.h> 9 #include <ngx_event.h>
10 #include <ngx_mail.h> 10 #include <ngx_mail.h>
11 11
12 12
13 static void ngx_mail_smtp_invalid_pipelining(ngx_event_t *rev); 13 static void ngx_mail_smtp_invalid_pipelining(ngx_event_t *rev);
14 static ngx_int_t ngx_mail_smtp_create_buffer(ngx_mail_session_t *s,
15 ngx_connection_t *c);
14 16
15 static ngx_int_t ngx_mail_smtp_helo(ngx_mail_session_t *s, ngx_connection_t *c); 17 static ngx_int_t ngx_mail_smtp_helo(ngx_mail_session_t *s, ngx_connection_t *c);
16 static ngx_int_t ngx_mail_smtp_auth(ngx_mail_session_t *s, ngx_connection_t *c); 18 static ngx_int_t ngx_mail_smtp_auth(ngx_mail_session_t *s, ngx_connection_t *c);
17 static ngx_int_t ngx_mail_smtp_mail(ngx_mail_session_t *s, ngx_connection_t *c); 19 static ngx_int_t ngx_mail_smtp_mail(ngx_mail_session_t *s, ngx_connection_t *c);
18 static ngx_int_t ngx_mail_smtp_starttls(ngx_mail_session_t *s, 20 static ngx_int_t ngx_mail_smtp_starttls(ngx_mail_session_t *s,
49 ngx_mail_session_internal_server_error(s); 51 ngx_mail_session_internal_server_error(s);
50 return; 52 return;
51 } 53 }
52 } 54 }
53 55
54 if (s->buffer == NULL) {
55 if (ngx_array_init(&s->args, c->pool, 2, sizeof(ngx_str_t))
56 == NGX_ERROR)
57 {
58 ngx_mail_session_internal_server_error(s);
59 return;
60 }
61
62 s->buffer = ngx_create_temp_buf(c->pool, cscf->smtp_client_buffer_size);
63 if (s->buffer == NULL) {
64 ngx_mail_session_internal_server_error(s);
65 return;
66 }
67 }
68
69 timeout = cscf->smtp_greeting_delay ? cscf->smtp_greeting_delay: 56 timeout = cscf->smtp_greeting_delay ? cscf->smtp_greeting_delay:
70 cscf->timeout; 57 cscf->timeout;
71 ngx_add_timer(c->read, timeout); 58 ngx_add_timer(c->read, timeout);
72 59
73 if (ngx_handle_read_event(c->read, 0) == NGX_ERROR) { 60 if (ngx_handle_read_event(c->read, 0) == NGX_ERROR) {
117 s->out = cscf->smtp_greeting; 104 s->out = cscf->smtp_greeting;
118 105
119 } else { 106 } else {
120 107
121 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "invalid pipelining"); 108 ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "invalid pipelining");
109
110 if (s->buffer == NULL) {
111 if (ngx_mail_smtp_create_buffer(s, c) != NGX_OK) {
112 return;
113 }
114 }
122 115
123 if (ngx_mail_smtp_discard_command(s, c, 116 if (ngx_mail_smtp_discard_command(s, c,
124 "client was rejected before greeting: \"%V\"") 117 "client was rejected before greeting: \"%V\"")
125 != NGX_OK) 118 != NGX_OK)
126 { 119 {
152 return; 145 return;
153 } 146 }
154 147
155 s = c->data; 148 s = c->data;
156 149
150 if (s->buffer == NULL) {
151 if (ngx_mail_smtp_create_buffer(s, c) != NGX_OK) {
152 return;
153 }
154 }
155
157 s->mail_state = ngx_smtp_start; 156 s->mail_state = ngx_smtp_start;
158 c->read->handler = ngx_mail_smtp_auth_state; 157 c->read->handler = ngx_mail_smtp_auth_state;
159 158
160 ngx_mail_smtp_auth_state(rev); 159 ngx_mail_smtp_auth_state(rev);
160 }
161
162
163 static ngx_int_t
164 ngx_mail_smtp_create_buffer(ngx_mail_session_t *s, ngx_connection_t *c)
165 {
166 ngx_mail_core_srv_conf_t *cscf;
167
168 if (ngx_array_init(&s->args, c->pool, 2, sizeof(ngx_str_t)) == NGX_ERROR) {
169 ngx_mail_session_internal_server_error(s);
170 return NGX_ERROR;
171 }
172
173 cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module);
174
175 s->buffer = ngx_create_temp_buf(c->pool, cscf->smtp_client_buffer_size);
176 if (s->buffer == NULL) {
177 ngx_mail_session_internal_server_error(s);
178 return NGX_ERROR;
179 }
180
181 return NGX_OK;
161 } 182 }
162 183
163 184
164 void 185 void
165 ngx_mail_smtp_auth_state(ngx_event_t *rev) 186 ngx_mail_smtp_auth_state(ngx_event_t *rev)