Mercurial > hg > nginx
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) |