Mercurial > hg > nginx
comparison src/imap/ngx_imap_handler.c @ 421:01456a419cf9
nginx-0.0.10-2004-09-10-18:32:02 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Fri, 10 Sep 2004 14:32:02 +0000 |
parents | 33a8253115b4 |
children | edaefb2a20fc |
comparison
equal
deleted
inserted
replaced
420:33a8253115b4 | 421:01456a419cf9 |
---|---|
79 if (s->buffer == NULL) { | 79 if (s->buffer == NULL) { |
80 ngx_imap_close_connection(s->connection); | 80 ngx_imap_close_connection(s->connection); |
81 return; | 81 return; |
82 } | 82 } |
83 | 83 |
84 c->read->event_handler = ngx_pop3_auth_state; | |
85 | |
84 ngx_pop3_auth_state(rev); | 86 ngx_pop3_auth_state(rev); |
85 } | 87 } |
86 | 88 |
87 | 89 |
88 static void ngx_pop3_auth_state(ngx_event_t *rev) | 90 static void ngx_pop3_auth_state(ngx_event_t *rev) |
89 { | 91 { |
92 ngx_uint_t quit; | |
90 u_char *text; | 93 u_char *text; |
91 ssize_t size; | 94 ssize_t size; |
92 ngx_int_t rc; | 95 ngx_int_t rc; |
93 ngx_connection_t *c; | 96 ngx_connection_t *c; |
94 ngx_imap_session_t *s; | 97 ngx_imap_session_t *s; |
95 | 98 |
96 c = rev->data; | 99 c = rev->data; |
97 s = c->data; | 100 s = c->data; |
98 | 101 |
102 ngx_log_debug0(NGX_LOG_DEBUG_IMAP, c->log, 0, "pop3 auth state"); | |
103 | |
99 /* TODO: timeout */ | 104 /* TODO: timeout */ |
100 | 105 |
101 rc = ngx_pop3_read_command(s); | 106 rc = ngx_pop3_read_command(s); |
102 | 107 |
103 if (rc == NGX_AGAIN || rc == NGX_ERROR) { | 108 if (rc == NGX_AGAIN || rc == NGX_ERROR) { |
104 return; | 109 return; |
105 } | 110 } |
106 | 111 |
107 s->state = 0; | 112 quit = 0; |
113 text = pop3_ok; | |
114 size = sizeof(pop3_ok) - 1; | |
115 | |
116 if (rc == NGX_OK) { | |
117 switch (s->imap_state) { | |
118 | |
119 case ngx_pop3_start: | |
120 | |
121 switch (s->command) { | |
122 | |
123 case NGX_POP3_USER: | |
124 if (s->args.nelts == 1) { | |
125 s->imap_state = ngx_pop3_user; | |
126 } else { | |
127 rc = NGX_IMAP_PARSE_INVALID_COMMAND; | |
128 } | |
129 | |
130 break; | |
131 | |
132 case NGX_POP3_QUIT: | |
133 quit = 1; | |
134 break; | |
135 | |
136 default: | |
137 s->imap_state = ngx_pop3_start; | |
138 rc = NGX_IMAP_PARSE_INVALID_COMMAND; | |
139 break; | |
140 } | |
141 | |
142 break; | |
143 | |
144 case ngx_pop3_user: | |
145 | |
146 switch (s->command) { | |
147 | |
148 case NGX_POP3_PASS: | |
149 if (s->args.nelts == 1) { | |
150 /* STUB */ s->imap_state = ngx_pop3_start; | |
151 } else { | |
152 rc = NGX_IMAP_PARSE_INVALID_COMMAND; | |
153 } | |
154 | |
155 break; | |
156 | |
157 case NGX_POP3_QUIT: | |
158 quit = 1; | |
159 break; | |
160 | |
161 default: | |
162 s->imap_state = ngx_pop3_start; | |
163 rc = NGX_IMAP_PARSE_INVALID_COMMAND; | |
164 break; | |
165 } | |
166 | |
167 break; | |
168 } | |
169 } | |
108 | 170 |
109 if (rc == NGX_IMAP_PARSE_INVALID_COMMAND) { | 171 if (rc == NGX_IMAP_PARSE_INVALID_COMMAND) { |
110 text = pop3_invalid_command; | 172 text = pop3_invalid_command; |
111 size = sizeof(pop3_invalid_command) - 1; | 173 size = sizeof(pop3_invalid_command) - 1; |
112 | |
113 } else { | |
114 text = pop3_ok; | |
115 size = sizeof(pop3_ok) - 1; | |
116 } | 174 } |
117 | 175 |
118 if (ngx_send(c, text, size) < size) { | 176 if (ngx_send(c, text, size) < size) { |
119 /* | 177 /* |
120 * we treat the incomplete sending as NGX_ERROR | 178 * we treat the incomplete sending as NGX_ERROR |
121 * because it is very strange here | 179 * because it is very strange here |
122 */ | 180 */ |
123 ngx_imap_close_connection(c); | 181 ngx_imap_close_connection(c); |
124 return; | 182 return; |
125 } | 183 } |
184 | |
185 if (quit) { | |
186 ngx_imap_close_connection(c); | |
187 return; | |
188 } | |
189 | |
190 s->args.nelts = 0; | |
191 s->buffer->pos = s->buffer->start; | |
192 s->buffer->last = s->buffer->start; | |
126 } | 193 } |
127 | 194 |
128 | 195 |
129 static ngx_int_t ngx_pop3_read_command(ngx_imap_session_t *s) | 196 static ngx_int_t ngx_pop3_read_command(ngx_imap_session_t *s) |
130 { | 197 { |