177 stderr_readev->finish = NULL; |
177 stderr_readev->finish = NULL; |
178 |
178 |
179 Event *writeev = pool_malloc(sn->pool, sizeof(Event)); |
179 Event *writeev = pool_malloc(sn->pool, sizeof(Event)); |
180 ZERO(writeev, sizeof(Event)); |
180 ZERO(writeev, sizeof(Event)); |
181 writeev->cookie = handler; |
181 writeev->cookie = handler; |
182 // TODO: fn |
182 |
183 |
183 |
184 handler->writeev = writeev; |
184 handler->writeev = writeev; |
185 handler->stderrev = stderr_readev; |
185 handler->stderrev = stderr_readev; |
186 |
186 |
187 net_setnonblock(sn->csd, 1); |
187 net_setnonblock(sn->csd, 1); |
254 |
254 |
255 // initialize poll, if it isn't already active |
255 // initialize poll, if it isn't already active |
256 if(!handler->poll_out) { |
256 if(!handler->poll_out) { |
257 if(event_pollout(ev, sn->csd, handler->writeev)) { |
257 if(event_pollout(ev, sn->csd, handler->writeev)) { |
258 handler->result = REQ_ABORTED; |
258 handler->result = REQ_ABORTED; |
259 return 1; |
259 return 0; |
260 } |
260 } |
261 handler->poll_out = TRUE; |
261 handler->poll_out = TRUE; |
262 } |
262 } |
263 } else { |
263 } else { |
264 handler->result = REQ_ABORTED; |
264 handler->result = REQ_ABORTED; |
|
265 log_ereport(LOG_FAILURE, "cgi_try_write: %s", strerror(errno)); |
265 } |
266 } |
266 return 1; |
267 return 1; |
267 } |
268 } |
268 |
269 |
269 return 0; |
270 return 0; |
290 Request *rq = parser->rq; |
291 Request *rq = parser->rq; |
291 |
292 |
292 // try to flush handler->writebuf |
293 // try to flush handler->writebuf |
293 // if writebuf is empty, this does nothing and returns 0 |
294 // if writebuf is empty, this does nothing and returns 0 |
294 if(cgi_try_write_flush(handler, sn)) { |
295 if(cgi_try_write_flush(handler, sn)) { |
295 log_ereport(LOG_DEBUG, "cgi-send: req: %p write failed: abort", rq); |
296 if(handler->result == REQ_ABORTED) { |
296 return handler->result == REQ_ABORTED ? 0 : 1; |
297 log_ereport(LOG_DEBUG, "cgi-send: req: %p write failed: abort", rq); |
|
298 return 0; |
|
299 } else { |
|
300 return 1; |
|
301 } |
297 } |
302 } |
298 |
303 |
299 char buf[4096]; // I/O buffer |
304 char buf[4096]; // I/O buffer |
300 ssize_t r; |
305 ssize_t r; |
301 |
306 |
460 CGIResponseParser *parser = handler->parser; |
465 CGIResponseParser *parser = handler->parser; |
461 Session *sn = parser->sn; |
466 Session *sn = parser->sn; |
462 Request *rq = parser->rq; |
467 Request *rq = parser->rq; |
463 |
468 |
464 log_ereport(LOG_DEBUG, "cgi-send: req: %p event-finish", rq); |
469 log_ereport(LOG_DEBUG, "cgi-send: req: %p event-finish", rq); |
465 if(handler->result == REQ_ABORTED) { |
470 if(handler->result == REQ_ABORTED && handler->process.pid != 0) { |
466 log_ereport(LOG_FAILURE, "cgi-send: kill script: %s", handler->path); |
471 log_ereport(LOG_FAILURE, "cgi-send: kill script: %s", handler->path); |
467 kill(handler->process.pid, SIGKILL); |
472 |
|
473 killpg(handler->process.pid, SIGTERM); |
|
474 |
|
475 handler->process.pid = 0; |
468 } |
476 } |
469 |
477 |
470 if(!handler->stderr_finished) { |
478 if(!handler->stderr_finished) { |
471 // stderr handler is still active |
479 // stderr handler is still active |
472 // set stderr event finish function, to run the finish code later |
480 // set stderr event finish function, to run the finish code later |