| 371 | */ |
| 372 | |
| 373 | static int read_descriptor( int i, int s ) |
| 374 | { |
| 375 | int ret; |
| 376 | char buffer[ BUFSIZ ]; |
| 377 | |
| 378 | while ( 0 < ( ret = fread( buffer, sizeof( char ), BUFSIZ - 1, |
| 379 | cmdtab[ i ].stream[ s ] ) ) ) |
| 380 | { |
| 381 | buffer[ ret ] = 0; |
| 382 | |
| 383 | /* Copy it to our output if appropriate */ |
| 384 | if ( ! ( cmdtab[ i ].flags & EXEC_CMD_QUIET ) ) |
| 385 | { |
| 386 | if ( s == OUT && ( globs.pipe_action != 2 ) ) |
| 387 | out_data( buffer ); |
| 388 | else if ( s == ERR && ( globs.pipe_action & 2 ) ) |
| 389 | err_data( buffer ); |
| 390 | } |
| 391 | |
| 392 | if ( !cmdtab[ i ].buffer[ s ] ) |
| 393 | { |
| 394 | /* Never been allocated. */ |
| 395 | if ( globs.max_buf && ret > globs.max_buf ) |
| 396 | { |
| 397 | ret = globs.max_buf; |
| 398 | buffer[ ret ] = 0; |
| 399 | } |
| 400 | cmdtab[ i ].buf_size[ s ] = ret + 1; |
| 401 | cmdtab[ i ].buffer[ s ] = (char*)BJAM_MALLOC_ATOMIC( ret + 1 ); |
| 402 | memcpy( cmdtab[ i ].buffer[ s ], buffer, ret + 1 ); |
| 403 | } |
| 404 | else |
| 405 | { |
| 406 | /* Previously allocated. */ |
| 407 | if ( cmdtab[ i ].buf_size[ s ] < globs.max_buf || !globs.max_buf ) |
| 408 | { |
| 409 | char * tmp = cmdtab[ i ].buffer[ s ]; |
| 410 | int const old_len = cmdtab[ i ].buf_size[ s ] - 1; |
| 411 | int const new_len = old_len + ret + 1; |
| 412 | cmdtab[ i ].buf_size[ s ] = new_len; |
| 413 | cmdtab[ i ].buffer[ s ] = (char*)BJAM_MALLOC_ATOMIC( new_len ); |
| 414 | memcpy( cmdtab[ i ].buffer[ s ], tmp, old_len ); |
| 415 | memcpy( cmdtab[ i ].buffer[ s ] + old_len, buffer, ret + 1 ); |
| 416 | BJAM_FREE( tmp ); |
| 417 | } |
| 418 | } |
| 419 | } |
| 420 | |
| 421 | /* If buffer full, ensure last buffer char is newline so that jam log |
| 422 | * contains the command status at beginning of it own line instead of |
| 423 | * appended to end of the previous output. |
| 424 | */ |
| 425 | if ( globs.max_buf && globs.max_buf <= cmdtab[ i ].buf_size[ s ] ) |
| 426 | cmdtab[ i ].buffer[ s ][ cmdtab[ i ].buf_size[ s ] - 2 ] = '\n'; |
| 427 | |
| 428 | return feof( cmdtab[ i ].stream[ s ] ); |
| 429 | } |
| 430 | |