src/server/safs/cgi.c

changeset 451
edbbb3000494
parent 450
d7b276de183b
child 497
8827517054ec
equal deleted inserted replaced
450:d7b276de183b 451:edbbb3000494
370 CGIHandler *handler = event->cookie; 370 CGIHandler *handler = event->cookie;
371 pool_handle_t *pool = handler->parser->sn->pool; 371 pool_handle_t *pool = handler->parser->sn->pool;
372 372
373 char buf[4096]; 373 char buf[4096];
374 char *line = buf; 374 char *line = buf;
375 int line_start = 0; 375 int line_start;
376 ssize_t r; 376 ssize_t r;
377 while((r = read(handler->process.err[0], buf, 4096)) > 0) { 377 while((r = read(handler->process.err[0], buf, 4096)) > 0) {
378 line_start = 0;
378 int pos = 0; 379 int pos = 0;
379 // log stderr output lines 380 // log stderr output lines
380 for(int i=0;i<r;i++) { 381 for(int i=0;i<r;i++) {
381 if(buf[i] == '\n') { 382 if(buf[i] == '\n') {
382 log_ereport( 383 log_ereport(
383 LOG_INFORM, 384 LOG_INFORM,
384 "cgi pid %d %s stderr: %.*s%.*s", 385 "cgi pid %d %s stderr: %.*s%.*s",
385 (int)handler->process.pid, 386 (int)handler->process.pid,
386 handler->path, 387 handler->path,
390 line + line_start); 391 line + line_start);
391 line_start = i+1; 392 line_start = i+1;
392 pos = i+1; 393 pos = i+1;
393 394
394 if(handler->stderr_tmp) { 395 if(handler->stderr_tmp) {
395 pool_free(pool, handler->stderr_tmp);
396 handler->stderr_tmp = NULL;
397 handler->stderr_tmplen = 0; 396 handler->stderr_tmplen = 0;
398 } 397 }
399 } 398 }
400 } 399 }
401 400
402 // check for incomplete line 401 // check for incomplete line
403 if(pos < r) { 402 if(pos < r) {
404 int tmplen = r-pos; 403 int tmplen = r-pos;
405 if(handler->stderr_tmp) { 404 if(handler->stderr_tmplen > 0) {
406 handler->stderr_tmp = pool_realloc(pool, handler->stderr_tmp, handler->stderr_tmplen + tmplen); 405 // append new text to the temp buffer
406 if(handler->stderr_tmplen + tmplen > handler->stderr_tmpalloc) {
407 handler->stderr_tmpalloc = handler->stderr_tmplen + tmplen;
408 handler->stderr_tmp = pool_realloc(pool, handler->stderr_tmp, handler->stderr_tmpalloc);
409 if(!handler->stderr_tmp) {
410 log_ereport(LOG_FAILURE, "send-cgi: cannot create tmp buffer for parsing stderr");
411 handler->stderr_tmpalloc = 0;
412 handler->stderr_tmplen = 0;
413 continue;
414 }
415 }
407 memcpy(handler->stderr_tmp + handler->stderr_tmplen, line + line_start, tmplen); 416 memcpy(handler->stderr_tmp + handler->stderr_tmplen, line + line_start, tmplen);
408 handler->stderr_tmplen += tmplen; 417 handler->stderr_tmplen += tmplen;
409 } else { 418 } else {
410 handler->stderr_tmp = pool_malloc(pool, tmplen); 419 if(handler->stderr_tmpalloc < tmplen) {
420 // tmp buffer too small or not allocated
421 handler->stderr_tmpalloc = tmplen < 256 ? 256 : tmplen;
422 if(handler->stderr_tmp) {
423 // free old tmp buf
424 // pool_realloc doesn't make sense here, because it
425 // is just free+malloc+memcpy and we don't need the
426 // memcpy part, because we are just reusing the buffer
427 // and the previous content doesn't matter
428 pool_free(pool, handler->stderr_tmp);
429 }
430 handler->stderr_tmp = pool_malloc(pool, handler->stderr_tmpalloc);
431 if(!handler->stderr_tmp) {
432 log_ereport(LOG_FAILURE, "send-cgi: cannot create tmp buffer for parsing stderr");
433 handler->stderr_tmpalloc = 0;
434 handler->stderr_tmplen = 0;
435 continue;
436 }
437 }
411 memcpy(handler->stderr_tmp, line + line_start, tmplen); 438 memcpy(handler->stderr_tmp, line + line_start, tmplen);
412 handler->stderr_tmplen = tmplen; 439 handler->stderr_tmplen = tmplen;
413 } 440 }
414 } else { 441 } else {
415 pool_free(pool, handler->stderr_tmp);
416 handler->stderr_tmp = NULL;
417 handler->stderr_tmplen = 0; 442 handler->stderr_tmplen = 0;
418 } 443 }
419 } 444 }
420 445
421 446

mercurial