$OpenBSD: patch-buffer_c,v 1.2 2010/05/22 21:28:21 espie Exp $ --- buffer.c.orig Sat Oct 30 18:54:47 1999 +++ buffer.c Sat May 22 23:27:19 2010 @@ -118,6 +118,7 @@ #endif -extern char *shmat(); +#include +#include /* General macros */ #define TRUE 1 @@ -168,7 +169,7 @@ int max_shmem = DEF_SHMEM; /* the shared memory id of the buffer */ int buffer_id = NONE; struct block { - int bytes; + int *bytes; char *data; } *curr_block; @@ -185,12 +186,13 @@ struct buffer { int next_block_in; int next_block_out; - struct block block[ MAX_BLOCKS ]; - /* These actual space for the blocks is here - the array extends * pass 1 */ char data_space[ 1 ]; } *pbuffer = NO_BUFFER; + +struct block block[ MAX_BLOCKS ]; + int buffer_size; int fdin = 0; @@ -447,7 +449,7 @@ buffer_allocate() /* Allow for the data space */ buffer_size = sizeof( struct buffer ) + - ((blocks * blocksize) - sizeof( char )); + (blocks * (sizeof(int) + blocksize) - sizeof( char )); /* Create the space for the buffer */ buffer_id = shmget( IPC_PRIVATE, @@ -533,8 +535,13 @@ get_buffer() /* Setup the data space pointers */ for( b = 0; b < blocks; b++ ) - pbuffer->block[ b ].data = - &pbuffer->data_space[ b * blocksize ]; + { + block[ b ].bytes = + (int *)&pbuffer->data_space[ b * blocksize + b * sizeof(int)]; + block[ b ].data = + &pbuffer->data_space[ b * blocksize + + ( b + 1 ) * sizeof(int)]; + } } @@ -592,7 +599,7 @@ get_next_free_block() /* Maybe wait till there is room in the buffer */ lock( pbuffer->semid, pbuffer->blocks_free_lock ); - curr_block = &pbuffer->block[ pbuffer->next_block_in ]; + curr_block = &block[ pbuffer->next_block_in ]; pbuffer->next_block_in = INC( pbuffer->next_block_in ); } @@ -605,7 +612,7 @@ fill_block() static char eof_reached = 0; if( eof_reached ){ - curr_block->bytes = 0; + *curr_block->bytes = 0; unlock( pbuffer->semid, pbuffer->blocks_used_lock ); return 0; } @@ -631,10 +638,10 @@ fill_block() /* number of bytes available. Zero will be taken as eof */ if( !padblock || toread == blocksize ) - curr_block->bytes = blocksize - toread; + *curr_block->bytes = blocksize - toread; else { if( toread ) bzero( start, toread ); - curr_block->bytes = blocksize; + *curr_block->bytes = blocksize; } if( debug > 1 ) @@ -642,7 +649,7 @@ fill_block() unlock( pbuffer->semid, pbuffer->blocks_used_lock ); - return curr_block->bytes; + return *curr_block->bytes; } /* Write the buffer to stdout */ @@ -697,14 +704,14 @@ get_next_filled_block() /* Hang till some data is available */ lock( pbuffer->semid, pbuffer->blocks_used_lock ); - curr_block = &pbuffer->block[ pbuffer->next_block_out ]; + curr_block = &block[ pbuffer->next_block_out ]; pbuffer->next_block_out = INC( pbuffer->next_block_out ); } data_to_write() { - return curr_block->bytes; + return *curr_block->bytes; } write_blocks_to_stdout( filled, first_block ) @@ -714,7 +721,7 @@ write_blocks_to_stdout( filled, first_block ) pbuffer->next_block_out = first_block; while( filled-- ){ - curr_block = &pbuffer->block[ pbuffer->next_block_out ]; + curr_block = &block[ pbuffer->next_block_out ]; pbuffer->next_block_out = INC( pbuffer->next_block_out ); write_block_to_stdout(); } @@ -734,7 +741,7 @@ write_block_to_stdout() next_k = showevery; } - if( (written = write( fdout, curr_block->data, curr_block->bytes )) != curr_block->bytes ){ + if( (written = write( fdout, curr_block->data, *curr_block->bytes )) != *curr_block->bytes ){ report_proc(); perror( "write of data failed" ); fprintf( stderr, "bytes to write=%d, bytes written=%d, total written %10luK\n", curr_block->bytes, written, outk ); @@ -745,7 +752,7 @@ write_block_to_stdout() usleep( write_pause ); } - out = curr_block->bytes / 1024; + out = *curr_block->bytes / 1024; outk += out; last_gb += out;