Changeset 7131
- Timestamp:
- Nov 20, 2008, 5:19:59 PM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/libtransmission/inout.c
r7061 r7131 36 36 37 37 #ifdef WIN32 38 #define lseek _lseeki6439 38 #if defined(read) 40 39 #undef read 41 40 #endif 42 41 #define read _read 43 42 44 43 #if defined(write) 45 44 #undef write 46 45 #endif 47 46 #define write _write … … 49 48 50 49 enum { TR_IO_READ, TR_IO_WRITE }; 50 51 static int64_t 52 tr_lseek( int fd, int64_t offset, int whence ) 53 { 54 #if defined(_LARGEFILE_SOURCE) 55 return lseek64( fd, (off64_t)offset, whence ); 56 #elif defined(WIN32) 57 return _lseeki64( fd, offset, whence ); 58 #else 59 return lseek( fd, (off_t)offset, whence ); 60 #endif 61 } 51 62 52 63 /* returns 0 on success, or an errno on failure */ … … 86 97 else if( ( fd = tr_fdFileCheckout ( tor->downloadDir, file->name, ioMode == TR_IO_WRITE, !file->dnd, file->length ) ) < 0 ) 87 98 err = errno; 88 else if( lseek( fd, (off_t)fileOffset, SEEK_SET ) == ( (off_t)-1 ))99 else if( tr_lseek( fd, (int64_t)fileOffset, SEEK_SET ) == -1 ) 89 100 err = errno; 90 101 else if( func( fd, buf, buflen ) != buflen ) … … 118 129 tr_piece_index_t pieceIndex, 119 130 uint32_t pieceOffset, 120 tr_file_index_t * fileIndex, 121 uint64_t * fileOffset ) 122 { 123 const uint64_t offset = tr_pieceOffset( tor, pieceIndex, pieceOffset, 124 0 ); 131 tr_file_index_t * fileIndex, 132 uint64_t * fileOffset ) 133 { 134 const uint64_t offset = tr_pieceOffset( tor, pieceIndex, pieceOffset, 0 ); 125 135 const tr_file * file; 126 136 … … 136 146 assert( tor->info.files[*fileIndex].offset + *fileOffset == offset ); 137 147 } 138 139 #ifdef WIN32140 /* return 0 on success, or an errno on failure */141 static int142 ensureMinimumFileSize( const tr_torrent * tor,143 tr_file_index_t fileIndex,144 uint64_t minBytes )145 {146 int fd;147 int err;148 struct stat sb;149 const tr_file * file = &tor->info.files[fileIndex];150 151 assert( 0 <= fileIndex && fileIndex < tor->info.fileCount );152 assert( minBytes <= file->length );153 154 fd = tr_fdFileCheckout( tor->downloadDir,155 file->name, TRUE, !file->dnd, file->length );156 157 if( fd < 0 ) /* bad fd */158 err = errno;159 else if( fstat ( fd, &sb ) ) /* how big is the file? */160 err = errno;161 else if( sb.st_size >= (off_t)minBytes ) /* already big enough */162 err = 0;163 else if( !ftruncate( fd, minBytes ) ) /* grow it */164 err = 0;165 else /* couldn't grow it */166 err = errno;167 168 if( fd >= 0 )169 tr_fdFileReturn( fd );170 171 return err;172 }173 174 #endif175 148 176 149 /* returns 0 on success, or an errno on failure */ … … 202 175 file->length - fileOffset ); 203 176 204 #ifdef WIN32205 if( ioMode == TR_IO_WRITE )206 err = ensureMinimumFileSize( tor, fileIndex,207 fileOffset + bytesThisPass );208 if( !err )209 #endif210 177 err = readOrWriteBytes( tor, ioMode, 211 178 fileIndex, fileOffset, buf, bytesThisPass );
Note: See TracChangeset
for help on using the changeset viewer.