- Timestamp:
- Apr 14, 2009, 3:59:26 PM (16 years ago)
- Location:
- branches/samba-3.0/source/lib
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/samba-3.0/source/lib/system.c
r164 r170 115 115 #endif /* HAVE_USLEEP */ 116 116 } 117 118 117 /******************************************************************* 119 118 A read wrapper that will deal with EINTR. 120 119 ********************************************************************/ 121 #ifndef __OS2__122 120 ssize_t sys_read(int fd, void *buf, size_t count) 123 121 { 124 122 ssize_t ret; 125 126 123 do { 127 124 ret = read(fd, buf, count); … … 129 126 return ret; 130 127 } 131 #else 132 ssize_t sys_read(int fd, void *buf, size_t count) 128 /******************************************************************* 129 A write wrapper that will deal with EINTR. 130 ********************************************************************/ 131 ssize_t sys_write(int fd, const void *buf, size_t count) 133 132 { 134 133 ssize_t ret; 135 int fds, err = 0;136 137 int timeout=1000; /* Timeout for select */138 do {139 if (err == EAGAIN && timeout != 0) {140 fds = fd;141 ret = os2_select(&fds, 1, 0, 0, timeout);142 if (ret != 1) {143 err = errno;144 DEBUG(3,("sys_read: select ret: %d,%s\n", ret, strerror(errno)));145 if (ret == 0) {146 err = errno = EAGAIN;147 ret = -1;148 continue;149 }150 if (err == EINTR)151 continue;152 return -1;153 }154 }155 ret = read(fd, buf, count);156 err = errno;157 } while (ret == -1 && (errno == EINTR || (errno == EAGAIN && timeout != 0)));158 return ret;159 }160 #endif161 162 /*******************************************************************163 A write wrapper that will deal with EINTR.164 ********************************************************************/165 166 #ifndef __OS2__167 ssize_t sys_write(int fd, const void *buf, size_t count)168 {169 ssize_t ret;170 171 134 do { 172 135 ret = write(fd, buf, count); … … 174 137 return ret; 175 138 } 176 177 #else178 ssize_t sys_write(int fd, const void *buf, size_t count)179 {180 ssize_t ret;181 int fds, err = 0;182 183 int timeout=1000; /* Timeout for select */184 do {185 if (err == EAGAIN && timeout != 0) {186 fds = fd;187 ret = os2_select(&fds, 0, 1, 0, timeout);188 if (ret != 1) {189 err = errno;190 DEBUG(3,("sys_write: select ret: %d,%s\n", ret, strerror(errno)));191 if (ret == 0) {192 err = errno = EAGAIN;193 ret = -1;194 continue;195 }196 if (err == EINTR)197 continue;198 return -1;199 }200 }201 ret = write(fd, buf, count);202 err = errno;203 } while (ret == -1 && (errno == EINTR || (errno == EAGAIN && timeout != 0)));204 return ret;205 }206 #endif207 208 139 /******************************************************************* 209 140 A pread wrapper that will deal with EINTR and 64-bit file offsets. 210 141 ********************************************************************/ 211 212 142 #if defined(HAVE_PREAD) || defined(HAVE_PREAD64) 213 143 ssize_t sys_pread(int fd, void *buf, size_t count, SMB_OFF_T off) 214 144 { 215 145 ssize_t ret; 216 217 146 do { 218 147 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_OFF64_T) && defined(HAVE_PREAD64) … … 221 150 ret = pread(fd, buf, count, off); 222 151 #endif 223 #ifndef __OS2__224 152 } while (ret == -1 && errno == EINTR); 225 #else226 /* On OS/2 - we randomly get 'Resource Temporarily Unavailable' errors - ignore these */227 } while (ret == -1 && ((errno == EINTR)||(errno == EAGAIN)));228 #endif229 153 return ret; 230 154 } 231 155 #endif 232 233 156 /******************************************************************* 234 157 A write wrapper that will deal with EINTR and 64-bit file offsets. 235 158 ********************************************************************/ 236 237 159 #if defined(HAVE_PWRITE) || defined(HAVE_PWRITE64) 238 160 ssize_t sys_pwrite(int fd, const void *buf, size_t count, SMB_OFF_T off) 239 161 { 240 162 ssize_t ret; 241 242 163 do { 243 164 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_OFF64_T) && defined(HAVE_PWRITE64) … … 246 167 ret = pwrite(fd, buf, count, off); 247 168 #endif 248 #ifndef __OS2__249 169 } while (ret == -1 && errno == EINTR); 250 #else251 /* On OS/2 - we randomly get 'Resource Temporarily Unavailable' errors - ignore these */252 } while (ret == -1 && ((errno == EINTR)||(errno == EAGAIN)));253 #endif254 170 return ret; 255 171 } 256 172 #endif 257 258 173 /******************************************************************* 259 174 A send wrapper that will deal with EINTR. 260 175 ********************************************************************/ 261 262 176 ssize_t sys_send(int s, const void *msg, size_t len, int flags) 263 177 { 264 178 ssize_t ret; 265 266 179 do { 267 180 ret = send(s, msg, len, flags); 268 #ifndef __OS2__269 181 } while (ret == -1 && errno == EINTR); 270 #else271 /* On OS/2 - we randomly get 'Resource Temporarily Unavailable' errors - ignore these */272 } while (ret == -1 && ((errno == EINTR)||(errno == EAGAIN)));273 #endif274 182 return ret; 275 183 } 276 277 184 /******************************************************************* 278 185 A sendto wrapper that will deal with EINTR. 279 186 ********************************************************************/ 280 281 187 ssize_t sys_sendto(int s, const void *msg, size_t len, int flags, const struct sockaddr *to, socklen_t tolen) 282 188 { 283 189 ssize_t ret; 284 285 190 do { 286 191 ret = sendto(s, msg, len, flags, to, tolen); 287 #ifndef __OS2__288 192 } while (ret == -1 && errno == EINTR); 289 #else290 /* On OS/2 - we randomly get 'Resource Temporarily Unavailable' errors - ignore these */291 } while (ret == -1 && ((errno == EINTR)||(errno == EAGAIN)));292 #endif293 193 return ret; 294 194 } 295 296 195 /******************************************************************* 297 196 A recv wrapper that will deal with EINTR. 298 197 ********************************************************************/ 299 300 198 ssize_t sys_recv(int fd, void *buf, size_t count, int flags) 301 199 { 302 200 ssize_t ret; 303 304 201 do { 305 202 ret = recv(fd, buf, count, flags); … … 307 204 return ret; 308 205 } 309 310 206 /******************************************************************* 311 207 A recvfrom wrapper that will deal with EINTR. 312 208 ********************************************************************/ 313 314 209 ssize_t sys_recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen) 315 210 { 316 211 ssize_t ret; 317 318 212 do { 319 213 ret = recvfrom(s, buf, len, flags, from, fromlen); 320 #ifndef __OS2__321 214 } while (ret == -1 && errno == EINTR); 322 #else323 /* On OS/2 - we randomly get 'Resource Temporarily Unavailable' errors - ignore these */324 } while (ret == -1 && ((errno == EINTR)||(errno == EAGAIN)));325 #endif326 215 return ret; 327 216 } 328 329 217 /******************************************************************* 330 218 A fcntl wrapper that will deal with EINTR. 331 219 ********************************************************************/ 332 333 220 int sys_fcntl_ptr(int fd, int cmd, void *arg) 334 221 { 335 222 int ret; 336 337 223 do { 338 224 ret = fcntl(fd, cmd, arg); 339 #ifndef __OS2__340 225 } while (ret == -1 && errno == EINTR); 341 #else342 /* On OS/2 - we randomly get 'Resource Temporarily Unavailable' errors - ignore these */343 } while (ret == -1 && ((errno == EINTR)||(errno == EAGAIN)));344 #endif345 226 return ret; 346 227 } 347 348 228 /******************************************************************* 349 229 A fcntl wrapper that will deal with EINTR. 350 230 ********************************************************************/ 351 352 231 int sys_fcntl_long(int fd, int cmd, long arg) 353 232 { 354 233 int ret; 355 356 234 do { 357 235 ret = fcntl(fd, cmd, arg); 358 #ifndef __OS2__359 236 } while (ret == -1 && errno == EINTR); 360 #else361 /* On OS/2 - we randomly get 'Resource Temporarily Unavailable' errors - ignore these */362 } while (ret == -1 && ((errno == EINTR)||(errno == EAGAIN)));363 #endif364 365 237 return ret; 366 238 } -
branches/samba-3.0/source/lib/util.c
r165 r170 747 747 if((val = sys_fcntl_long(fd, F_GETFL, 0)) == -1) 748 748 return -1; 749 #ifndef __OS2__ 749 750 if(set) /* Turn blocking on - ie. clear nonblock flag */ 750 751 val &= ~FLAG_TO_SET; … … 752 753 val |= FLAG_TO_SET; 753 754 return sys_fcntl_long( fd, F_SETFL, val); 755 #else 756 if(set) /* turn blocking on - ie. clear nonblock flag */ 757 val = 0; 758 else 759 val = 1; 760 return os2_ioctl(fd, FIONBIO, (char *) &val, sizeof(val)); 761 #endif 762 754 763 #undef FLAG_TO_SET 755 764 }
Note:
See TracChangeset
for help on using the changeset viewer.