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 |