| 298 | */ |
| 299 | |
| 300 | static int read_descriptor( int i, int s ) |
| 301 | { |
| 302 | int ret; |
| 303 | char buffer[ BUFSIZ ]; |
| 304 | |
| 305 | while ( 0 < ( ret = fread( buffer, sizeof( char ), BUFSIZ - 1, |
| 306 | cmdtab[ i ].stream[ s ] ) ) ) |
| 307 | { |
| 308 | buffer[ ret ] = 0; |
| 309 | if ( !cmdtab[ i ].buffer[ s ] ) |
| 310 | { |
| 311 | /* Never been allocated. */ |
| 312 | if ( globs.max_buf && ret > globs.max_buf ) |
| 313 | { |
| 314 | ret = globs.max_buf; |
| 315 | buffer[ ret ] = 0; |
| 316 | } |
| 317 | cmdtab[ i ].buf_size[ s ] = ret + 1; |
| 318 | cmdtab[ i ].buffer[ s ] = (char*)BJAM_MALLOC_ATOMIC( ret + 1 ); |
| 319 | memcpy( cmdtab[ i ].buffer[ s ], buffer, ret + 1 ); |
| 320 | } |
| 321 | else |
| 322 | { |
| 323 | /* Previously allocated. */ |
| 324 | if ( cmdtab[ i ].buf_size[ s ] < globs.max_buf || !globs.max_buf ) |
| 325 | { |
| 326 | char * tmp = cmdtab[ i ].buffer[ s ]; |
| 327 | int const old_len = cmdtab[ i ].buf_size[ s ] - 1; |
| 328 | int const new_len = old_len + ret + 1; |
| 329 | cmdtab[ i ].buf_size[ s ] = new_len; |
| 330 | cmdtab[ i ].buffer[ s ] = (char*)BJAM_MALLOC_ATOMIC( new_len ); |
| 331 | memcpy( cmdtab[ i ].buffer[ s ], tmp, old_len ); |
| 332 | memcpy( cmdtab[ i ].buffer[ s ] + old_len, buffer, ret + 1 ); |
| 333 | BJAM_FREE( tmp ); |
| 334 | } |
| 335 | } |
| 336 | } |
| 337 | |
| 338 | /* If buffer full, ensure last buffer char is newline so that jam log |
| 339 | * contains the command status at beginning of it own line instead of |
| 340 | * appended to end of the previous output. |
| 341 | */ |
| 342 | if ( globs.max_buf && globs.max_buf <= cmdtab[ i ].buf_size[ s ] ) |
| 343 | cmdtab[ i ].buffer[ s ][ cmdtab[ i ].buf_size[ s ] - 2 ] = '\n'; |
| 344 | |
| 345 | return feof( cmdtab[ i ].stream[ s ] ); |
| 346 | } |
| 347 | |
| 348 | |
| 349 | /* |