src/server/safs/cgi.c

changeset 498
0d80f8a2b29f
parent 497
8827517054ec
child 499
ef77854a91f3
equal deleted inserted replaced
497:8827517054ec 498:0d80f8a2b29f
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

mercurial