src/server/safs/cgi.c

changeset 144
4b546c4f25ed
parent 133
87b405d61f64
child 145
1c93281ca4bf
equal deleted inserted replaced
143:6bf5d2f37425 144:4b546c4f25ed
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;
140 result = REQ_ABORTED; 142 result = REQ_ABORTED;
141 break; 143 break;
142 } 144 }
143 } 145 }
144 } 146 }
147
148 cgi_close(&cgip);
145 149
146 cgi_parser_free(parser); 150 cgi_parser_free(parser);
147 return result; 151 return result;
148 } 152 }
149 153
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;

mercurial