comparison src/imap/ngx_imap_proxy.c @ 418:cf072d26d6d6

nginx-0.0.10-2004-09-08-09:18:51 import
author Igor Sysoev <igor@sysoev.ru>
date Wed, 08 Sep 2004 05:18:51 +0000
parents
children 47709bff4468
comparison
equal deleted inserted replaced
417:0526206251f6 418:cf072d26d6d6
1
2 #include <ngx_config.h>
3 #include <ngx_core.h>
4 #include <ngx_event.h>
5 #include <ngx_imap.h>
6
7
8 static void ngx_imap_proxy_close_session(ngx_imap_session_t *s);
9
10
11 void ngx_imap_proxy_handler(ngx_event_t *ev)
12 {
13 ssize_t n;
14 ngx_buf_t *b;
15 ngx_uint_t data, do_write;
16 ngx_connection_t *c, *src, *dst;
17 ngx_imap_session_t *s;
18
19 c = ev->data;
20 s = c->data;
21
22 if (c == s->connection) {
23 src = c;
24 dst = s->proxy->connection;
25 b = s->proxy->downstream_buffer;
26
27 } else {
28 src = s->proxy->connection;
29 dst = c;
30 b = s->proxy->upstream_buffer;
31 }
32
33 do_write = ev->write ? 1 : 0;
34
35 do {
36 data = 0;
37
38 if (do_write == 1) {
39 if (dst->write->ready && b->pos < b->last) {
40 n = ngx_send(dst, b->pos, b->last - b->pos);
41
42 if (n == NGX_ERROR) {
43 ngx_imap_proxy_close_session(s);
44 return;
45 }
46
47 if (n > 0) {
48 data = 1;
49 b->pos += n;
50
51 if (b->pos == b->last) {
52 b->pos = b->start;
53 b->last = b->start;
54 }
55 }
56 }
57 }
58
59 if (src->read->ready && b->last < b->end) {
60 n = ngx_recv(src, b->last, b->end - b->last);
61
62 if (n == NGX_ERROR || n == 0) {
63 ngx_imap_proxy_close_session(s);
64 return;
65 }
66
67 if (n > 0) {
68 data = 1;
69 do_write = 1;
70 b->last += n;
71 }
72 }
73
74 } while (data);
75 }
76
77
78 static void ngx_imap_proxy_close_session(ngx_imap_session_t *s)
79 {
80 }