_WCRTLINK int chsize( int handle, long size ) { long curOffset, endOffset; char buf[512]; long diff; unsigned amount; int retCode; __handle_check( handle, -1 ); /*** Prepare to change the size ***/ _AccessFileH( handle ); curOffset = __lseek( handle, 0L, SEEK_CUR ); /* get current offset */ if( curOffset == -1 ) { _ReleaseFileH( handle ); return( -1 ); } endOffset = __lseek( handle, 0L, SEEK_END ); /* get file size */ if( endOffset == -1 ) { _ReleaseFileH( handle ); return( -1 ); } if( size > endOffset ) { /*** Increase file size ***/ diff = size - endOffset; /* number of bytes to pad */ memset( buf, 0, 512 ); /* zero buffer */ do { if( diff >= 512 ) { amount = 512; } else { amount = (unsigned)diff; } retCode = write( handle, buf, amount ); if( retCode != amount ) { __set_errno( ENOSPC ); retCode = -1; break; } diff -= amount; } while( diff != 0 ); if( retCode != -1 ) retCode = 0; } else { /*** Shrink file ***/ retCode = DosNewSize( handle, size ); if( retCode != 0 ) { __set_errno_dos( retCode ); retCode = -1; } if( curOffset > size ) curOffset = size; } /*** Clean up and go home ***/ curOffset = __lseek( handle, curOffset, SEEK_SET ); if( curOffset == -1 ) retCode = -1; _ReleaseFileH( handle ); return( retCode ); }
int _fast setfsize(int fd, long size) { return ((int)DosNewSize((HFILE)fd, (ULONG)size)); }