MCPcopy Create free account
hub / github.com/boostorg/build / read_descriptor

Function read_descriptor

src/engine/execunix.cpp:373–429  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

371 */
372
373static 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

Callers 1

exec_waitFunction · 0.85

Calls 2

out_dataFunction · 0.85
err_dataFunction · 0.85

Tested by

no test coverage detected