95 ssize_t n = 0; |
95 ssize_t n = 0; |
96 while(n < content_length) { |
96 while(n < content_length) { |
97 r = netbuf_getbytes(sn->inbuf, buf, 4096); |
97 r = netbuf_getbytes(sn->inbuf, buf, 4096); |
98 if(r <= 0) { |
98 if(r <= 0) { |
99 // TODO: handleerror |
99 // TODO: handleerror |
|
100 cgi_close(&cgip); |
100 return REQ_ABORTED; |
101 return REQ_ABORTED; |
101 } |
102 } |
102 write(cgip.in[1], buf, r); |
103 write(cgip.in[1], buf, r); |
103 n += r; |
104 n += r; |
104 } |
105 } |
105 } |
106 } |
106 close(cgip.in[1]); |
107 close(cgip.in[1]); |
|
108 cgip.in[1] = -1; |
107 |
109 |
108 // read from child |
110 // read from child |
109 CGIResponseParser *parser = cgi_parser_new(sn, rq); |
111 CGIResponseParser *parser = cgi_parser_new(sn, rq); |
110 WSBool cgiheader = TRUE; |
112 WSBool cgiheader = TRUE; |
111 ssize_t wr = 0; |
113 ssize_t wr = 0; |
194 // execute program |
198 // execute program |
195 exit(execve(script.ptr, argv, envp)); |
199 exit(execve(script.ptr, argv, envp)); |
196 } else { |
200 } else { |
197 // parent |
201 // parent |
198 close(p->out[1]); |
202 close(p->out[1]); |
|
203 p->out[1] = -1; |
199 } |
204 } |
200 |
205 |
201 return REQ_PROCEED; |
206 return REQ_PROCEED; |
|
207 } |
|
208 |
|
209 void cgi_close(CGIProcess *p) { |
|
210 if(p->in[0] != -1) { |
|
211 close(p->in[0]); |
|
212 } |
|
213 if(p->in[1] != -1) { |
|
214 close(p->in[1]); |
|
215 } |
|
216 if(p->out[0] != -1) { |
|
217 close(p->out[0]); |
|
218 } |
|
219 if(p->out[1] != -1) { |
|
220 close(p->out[1]); |
|
221 } |
202 } |
222 } |
203 |
223 |
204 CGIResponseParser* cgi_parser_new(Session *sn, Request *rq) { |
224 CGIResponseParser* cgi_parser_new(Session *sn, Request *rq) { |
205 CGIResponseParser* parser = pool_malloc(sn->pool, sizeof(CGIResponseParser)); |
225 CGIResponseParser* parser = pool_malloc(sn->pool, sizeof(CGIResponseParser)); |
206 parser->sn = sn; |
226 parser->sn = sn; |