Changeset 988 for vendor/current/source3/lib/recvfile.c
- Timestamp:
- Nov 24, 2016, 1:14:11 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
vendor/current/source3/lib/recvfile.c
r746 r988 26 26 #include "includes.h" 27 27 #include "system/filesys.h" 28 #include "lib/util/sys_rw.h" 28 29 29 30 /* Do this on our own in TRANSFER_BUF_SIZE chunks. … … 45 46 static ssize_t default_sys_recvfile(int fromfd, 46 47 int tofd, 47 SMB_OFF_Toffset,48 off_t offset, 48 49 size_t count) 49 50 { … … 52 53 size_t bufsize = MIN(TRANSFER_BUF_SIZE,count); 53 54 size_t total_written = 0; 54 char *buffer = NULL;55 char buffer[bufsize]; 55 56 56 57 DEBUG(10,("default_sys_recvfile: from = %d, to = %d, " … … 63 64 } 64 65 65 if (tofd != -1 && offset != ( SMB_OFF_T)-1) {66 if ( sys_lseek(tofd, offset, SEEK_SET) == -1) {66 if (tofd != -1 && offset != (off_t)-1) { 67 if (lseek(tofd, offset, SEEK_SET) == -1) { 67 68 if (errno != ESPIPE) { 68 69 return -1; 69 70 } 70 71 } 71 }72 73 buffer = SMB_MALLOC_ARRAY(char, bufsize);74 if (buffer == NULL) {75 return -1;76 72 } 77 73 … … 81 77 size_t toread = MIN(bufsize,count - total); 82 78 83 /* Read from socket - ignore EINTR. */ 84 read_ret = sys_read(fromfd, buffer, toread); 79 /* 80 * Read from socket - ignore EINTR. 81 * Can't use sys_read() as that also 82 * ignores EAGAIN and EWOULDBLOCK. 83 */ 84 do { 85 read_ret = read(fromfd, buffer, toread); 86 } while (read_ret == -1 && errno == EINTR); 87 88 if (read_ret == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) { 89 /* 90 * fromfd socket is in non-blocking mode. 91 * If we already read some and wrote 92 * it successfully, return that. 93 * Only return -1 if this is the first read 94 * attempt. Caller will handle both cases. 95 */ 96 if (total_written != 0) { 97 return total_written; 98 } 99 return -1; 100 } 101 85 102 if (read_ret <= 0) { 86 103 /* EOF or socket error. */ 87 free(buffer);88 104 return -1; 89 105 } … … 120 136 } 121 137 122 free(buffer);123 138 if (saved_errno) { 124 139 /* Return the correct write error. */ … … 141 156 ssize_t sys_recvfile(int fromfd, 142 157 int tofd, 143 SMB_OFF_Toffset,158 off_t offset, 144 159 size_t count) 145 160 { … … 191 206 return default_sys_recvfile(fromfd, tofd, 192 207 offset, count); 208 } 209 if (errno == EAGAIN || errno == EWOULDBLOCK) { 210 /* 211 * fromfd socket is in non-blocking mode. 212 * If we already read some and wrote 213 * it successfully, return that. 214 * Only return -1 if this is the first read 215 * attempt. Caller will handle both cases. 216 */ 217 if (total_written != 0) { 218 return total_written; 219 } 220 return -1; 193 221 } 194 222 break; … … 231 259 ssize_t sys_recvfile(int fromfd, 232 260 int tofd, 233 SMB_OFF_Toffset,261 off_t offset, 234 262 size_t count) 235 263 { … … 241 269 Throw away "count" bytes from the client socket. 242 270 Returns count or -1 on error. 271 Must only operate on a blocking socket. 243 272 *****************************************************************/ 244 273 … … 247 276 size_t total = 0; 248 277 size_t bufsize = MIN(TRANSFER_BUF_SIZE,count); 249 char *buffer = NULL; 278 char buffer[bufsize]; 279 int old_flags = 0; 250 280 251 281 if (count == 0) { … … 253 283 } 254 284 255 buffer = SMB_MALLOC_ARRAY(char, bufsize);256 if ( buffer == NULL) {285 old_flags = fcntl(sockfd, F_GETFL, 0); 286 if (set_blocking(sockfd, true) == -1) { 257 287 return -1; 258 288 } … … 266 296 if (read_ret <= 0) { 267 297 /* EOF or socket error. */ 268 free(buffer);269 return -1;298 count = (size_t)-1; 299 goto out; 270 300 } 271 301 total += read_ret; 272 302 } 273 303 274 free(buffer); 304 out: 305 306 if (fcntl(sockfd, F_SETFL, old_flags) == -1) { 307 return -1; 308 } 275 309 return count; 276 310 }
Note:
See TracChangeset
for help on using the changeset viewer.