Lines 16-35
Link Here
|
16 |
int leftlen; |
16 |
int leftlen; |
17 |
int leftpos; |
17 |
int leftpos; |
18 |
int leftflagcr = 0; |
18 |
int leftflagcr = 0; |
19 |
|
19 |
|
20 |
int rightstatus = 0; |
20 |
int rightstatus = 0; |
21 |
char rightbuf[512]; |
21 |
char rightbuf[512]; |
22 |
int rightlen; |
22 |
int rightlen; |
23 |
int rightpos; |
23 |
int rightpos; |
24 |
int rightflagcr = 0; |
24 |
int rightflagcr = 0; |
25 |
|
25 |
|
|
|
26 |
#define NULL ((void *)0) |
27 |
int active = 1; |
28 |
int gotleft_tls = 0; |
29 |
static char left_tls[] = "STARTTLS"; |
30 |
static char right_tls[] = "220"; |
31 |
static char *left_p = NULL; |
32 |
static char *right_p = NULL; |
33 |
|
26 |
void doit(int fdleft,int fdright) |
34 |
void doit(int fdleft,int fdright) |
27 |
{ |
35 |
{ |
28 |
struct taia stamp; |
36 |
struct taia stamp; |
29 |
struct taia deadline; |
37 |
struct taia deadline; |
30 |
iopause_fd x[4]; |
38 |
iopause_fd x[4]; |
31 |
int xlen; |
39 |
int xlen; |
32 |
iopause_fd *io0; |
40 |
iopause_fd *io0; |
33 |
iopause_fd *ioleft; |
41 |
iopause_fd *ioleft; |
34 |
iopause_fd *io1; |
42 |
iopause_fd *io1; |
35 |
iopause_fd *ioright; |
43 |
iopause_fd *ioright; |
Lines 76-98
Link Here
|
76 |
if (r <= 0) { |
84 |
if (r <= 0) { |
77 |
leftstatus = -1; |
85 |
leftstatus = -1; |
78 |
close(fdleft); |
86 |
close(fdleft); |
79 |
} |
87 |
} |
80 |
else { |
88 |
else { |
81 |
leftstatus = 1; |
89 |
leftstatus = 1; |
82 |
leftpos = 0; |
90 |
leftpos = 0; |
83 |
leftlen = 0; |
91 |
leftlen = 0; |
84 |
for (i = 0;i < r;++i) { |
92 |
for (i = 0;i < r;++i) { |
85 |
ch = prebuf[i]; |
93 |
ch = prebuf[i]; |
86 |
if (ch == '\n') |
94 |
if (active) |
87 |
if (!leftflagcr) |
95 |
if (ch == '\n') { |
88 |
leftbuf[leftlen++] = '\r'; |
96 |
if (!leftflagcr) |
|
|
97 |
leftbuf[leftlen++] = '\r'; |
98 |
gotleft_tls = (left_p != NULL && *left_p == 0); |
99 |
if (gotleft_tls) |
100 |
right_p = right_tls; |
101 |
left_p = left_tls; |
102 |
} else if (left_p != NULL && *left_p != 0) { |
103 |
if (ch == *left_p) |
104 |
left_p++; |
105 |
else |
106 |
left_p = NULL; |
107 |
} |
89 |
leftbuf[leftlen++] = ch; |
108 |
leftbuf[leftlen++] = ch; |
90 |
leftflagcr = (ch == '\r'); |
109 |
leftflagcr = (ch == '\r'); |
91 |
} |
110 |
} |
92 |
} |
111 |
} |
93 |
} |
112 |
} |
94 |
|
113 |
|
95 |
if (ioleft && ioleft->revents) { |
114 |
if (ioleft && ioleft->revents) { |
96 |
r = write(fdleft,leftbuf + leftpos,leftlen - leftpos); |
115 |
r = write(fdleft,leftbuf + leftpos,leftlen - leftpos); |
97 |
if (r == -1) break; |
116 |
if (r == -1) break; |
98 |
leftpos += r; |
117 |
leftpos += r; |
Lines 100-122
Link Here
|
100 |
} |
119 |
} |
101 |
|
120 |
|
102 |
if (ioright && ioright->revents) { |
121 |
if (ioright && ioright->revents) { |
103 |
r = read(fdright,prebuf,sizeof prebuf); |
122 |
r = read(fdright,prebuf,sizeof prebuf); |
104 |
if (r <= 0) break; |
123 |
if (r <= 0) break; |
105 |
rightstatus = 1; |
124 |
rightstatus = 1; |
106 |
rightpos = 0; |
125 |
rightpos = 0; |
107 |
rightlen = 0; |
126 |
rightlen = 0; |
108 |
for (i = 0;i < r;++i) { |
127 |
for (i = 0;i < r;++i) { |
109 |
ch = prebuf[i]; |
128 |
ch = prebuf[i]; |
110 |
if (ch == '\n') |
129 |
if (active) |
111 |
if (!rightflagcr) |
130 |
if (ch == '\n') { |
112 |
rightbuf[rightlen++] = '\r'; |
131 |
if (!rightflagcr) |
|
|
132 |
rightbuf[rightlen++] = '\r'; |
133 |
active = !(right_p != NULL && *right_p == 0); |
134 |
right_p = NULL; |
135 |
} else if (right_p != NULL && *right_p != 0) { |
136 |
if (ch == *right_p) |
137 |
right_p++; |
138 |
else |
139 |
right_p = NULL; |
140 |
} |
113 |
rightbuf[rightlen++] = ch; |
141 |
rightbuf[rightlen++] = ch; |
114 |
rightflagcr = (ch == '\r'); |
142 |
rightflagcr = (ch == '\r'); |
115 |
} |
143 |
} |
116 |
} |
144 |
} |
117 |
|
145 |
|
118 |
if (io1 && io1->revents) { |
146 |
if (io1 && io1->revents) { |
119 |
r = write(1,rightbuf + rightpos,rightlen - rightpos); |
147 |
r = write(1,rightbuf + rightpos,rightlen - rightpos); |
120 |
if (r == -1) break; |
148 |
if (r == -1) break; |
121 |
rightpos += r; |
149 |
rightpos += r; |
122 |
if (rightpos == rightlen) rightstatus = 0; |
150 |
if (rightpos == rightlen) rightstatus = 0; |