Changeset 751 for trunk/server/source3/lib/recvfile.c
- Timestamp:
- Nov 29, 2012, 1:59:04 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/server/source3/lib/recvfile.c
r745 r751 34 34 * as we're below the Samba vfs layer. 35 35 * 36 * If tofd is -1 we just drain the incoming socket of count37 * bytes without writing to the outgoing fd.38 * If a write fails we do the same (to cope with disk full)39 * errors.40 *41 36 * Returns -1 on short reads from fromfd (read error) 42 37 * and sets errno. 43 38 * 44 39 * Returns number of bytes written to 'tofd' 45 * or thrown away if 'tofd == -1'.46 40 * return != count then sets errno. 47 41 * Returns count if complete success. … … 100 94 num_written = 0; 101 95 102 while (num_written < read_ret) { 96 /* Don't write any more after a write error. */ 97 while (tofd != -1 && (num_written < read_ret)) { 103 98 ssize_t write_ret; 104 99 105 if (tofd == -1) { 106 write_ret = read_ret; 107 } else { 108 /* Write to file - ignore EINTR. */ 109 write_ret = sys_write(tofd, 110 buffer + num_written, 111 read_ret - num_written); 112 113 if (write_ret <= 0) { 114 /* write error - stop writing. */ 115 tofd = -1; 116 saved_errno = errno; 117 continue; 118 } 100 /* Write to file - ignore EINTR. */ 101 write_ret = sys_write(tofd, 102 buffer + num_written, 103 read_ret - num_written); 104 105 if (write_ret <= 0) { 106 /* write error - stop writing. */ 107 tofd = -1; 108 if (total_written == 0) { 109 /* Ensure we return 110 -1 if the first 111 write failed. */ 112 total_written = -1; 113 } 114 saved_errno = errno; 115 break; 119 116 } 120 117 … … 218 215 219 216 done: 220 if ( total_written <count) {217 if (count) { 221 218 int saved_errno = errno; 222 if (drain_socket(fromfd, count-total_written) != 223 count-total_written) { 219 if (drain_socket(fromfd, count) != count) { 224 220 /* socket is dead. */ 225 221 return -1; … … 247 243 /***************************************************************** 248 244 Throw away "count" bytes from the client socket. 245 Returns count or -1 on error. 249 246 *****************************************************************/ 250 247 251 248 ssize_t drain_socket(int sockfd, size_t count) 252 249 { 253 return default_sys_recvfile(sockfd, -1, (SMB_OFF_T)-1, count); 254 } 250 size_t total = 0; 251 size_t bufsize = MIN(TRANSFER_BUF_SIZE,count); 252 char *buffer = NULL; 253 254 if (count == 0) { 255 return 0; 256 } 257 258 buffer = SMB_MALLOC_ARRAY(char, bufsize); 259 if (buffer == NULL) { 260 return -1; 261 } 262 263 while (total < count) { 264 ssize_t read_ret; 265 size_t toread = MIN(bufsize,count - total); 266 267 /* Read from socket - ignore EINTR. */ 268 read_ret = sys_read(sockfd, buffer, toread); 269 if (read_ret <= 0) { 270 /* EOF or socket error. */ 271 free(buffer); 272 return -1; 273 } 274 total += read_ret; 275 } 276 277 free(buffer); 278 return count; 279 }
Note:
See TracChangeset
for help on using the changeset viewer.