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