Changeset 164
- Timestamp:
- Feb 9, 2009, 9:26:35 AM (17 years ago)
- File:
-
- 1 edited
-
branches/samba-3.0/source/lib/system.c (modified) (19 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/samba-3.0/source/lib/system.c
r163 r164 29 29 #endif 30 30 31 #ifdef __OS2__32 unsigned long _System DosSleep (unsigned long ulInterval);33 // On OS/2 - we randomly get 'Resource Temporarily Unavailable' errors - ignore these34 // ticket:69 code may enter an infinite loop, added a 60sec timeout35 #define OS2_EAGAIN_RETRY_INIT time_t t1 = time(NULL);36 #define OS2_EAGAIN_RETRY_CHECK \37 if (ret == -1) { \38 DEBUG(10,("sys_read: op failed, errno: %d,%s\n", errno, strerror(errno))); \39 } \40 if (ret==-1 && errno==EAGAIN) { \41 DosSleep(100); \42 if (time(NULL) - t1 > 60) \43 break; \44 errno = EINTR; \45 }46 #else47 #define OS2_EAGAIN_RETRY_INIT48 #define OS2_EAGAIN_RETRY_CHECK49 #endif50 51 31 /* 52 32 The idea is that this file will eventually have wrappers around all … … 139 119 A read wrapper that will deal with EINTR. 140 120 ********************************************************************/ 141 121 #ifndef __OS2__ 142 122 ssize_t sys_read(int fd, void *buf, size_t count) 143 123 { 144 OS2_EAGAIN_RETRY_INIT;145 124 ssize_t ret; 125 146 126 do { 147 127 ret = read(fd, buf, count); 148 OS2_EAGAIN_RETRY_CHECK;149 128 } while (ret == -1 && errno == EINTR); 150 129 return ret; 151 130 } 131 #else 132 ssize_t sys_read(int fd, void *buf, size_t count) 133 { 134 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 #endif 152 161 153 162 /******************************************************************* 154 163 A write wrapper that will deal with EINTR. 155 164 ********************************************************************/ 156 165 166 #ifndef __OS2__ 157 167 ssize_t sys_write(int fd, const void *buf, size_t count) 158 168 { 159 169 ssize_t ret; 170 160 171 do { 161 172 ret = write(fd, buf, count); 162 #ifndef __OS2__163 173 } while (ret == -1 && errno == EINTR); 164 #else165 /* On OS/2 - we randomly get 'Resource Temporarily Unavailable' errors - ignore these */166 } while (ret == -1 && ((errno == EINTR)||(errno == EAGAIN)));167 #endif168 if (errno == EAGAIN)169 174 return ret; 170 175 } 176 177 #else 178 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 #endif 171 207 172 208 /******************************************************************* … … 1030 1066 if((group_list = (GID_T *)malloc(setlen * sizeof(GID_T))) == NULL) { 1031 1067 DEBUG(0,("sys_setgroups: Malloc fail.\n")); 1032 return -1; 1068 return -1; 1033 1069 } 1034 1070 … … 1119 1155 for (i=0; i<10; i++) { 1120 1156 generate_random_buffer((unsigned char *)&uid, 1121 sizeof(uid));1157 sizeof(uid)); 1122 1158 if (getpwuid(uid) == NULL) { 1123 1159 break; … … 1139 1175 1140 1176 ADD_TO_ARRAY(NULL, struct passwd, new_pwd, &fake_pwd, 1141 &num_fake_pwd);1177 &num_fake_pwd); 1142 1178 1143 1179 DEBUG(10, ("Added fake user %s, have %d fake users\n", … … 1577 1613 { 1578 1614 #if defined(HAVE_DLSYM) 1579 return dlsym(handle, symbol);1580 #else 1581 return NULL;1615 return dlsym(handle, symbol); 1616 #else 1617 return NULL; 1582 1618 #endif 1583 1619 } … … 1825 1861 1826 1862 static struct { 1827 int space;1863 int space; 1828 1864 const char *name; 1829 1865 size_t len; … … 1831 1867 extattr[] = { 1832 1868 { EXTATTR_NAMESPACE_SYSTEM, EXTATTR_PREFIX("system.") }, 1833 { EXTATTR_NAMESPACE_USER, EXTATTR_PREFIX("user.") },1869 { EXTATTR_NAMESPACE_USER, EXTATTR_PREFIX("user.") }, 1834 1870 }; 1835 1871 … … 1927 1963 1928 1964 while (True) { 1929 if (filedes)1965 if (filedes) 1930 1966 retval = attr_listf(filedes, attr_buffer, ATTR_MAX_VALUELEN, flags, cursor); 1931 else1967 else 1932 1968 retval = attr_list(path, attr_buffer, ATTR_MAX_VALUELEN, flags, cursor); 1933 if (retval) break;1934 for (index = 0; index < al->al_count; index++) {1969 if (retval) break; 1970 for (index = 0; index < al->al_count; index++) { 1935 1971 ae = ATTR_ENTRY(attr_buffer, index); 1936 1972 ent_size = strlen(ae->a_name) + sizeof("user."); 1937 1973 if (left >= ent_size) { 1938 strncpy(bp, "user.", sizeof("user."));1939 strncat(bp, ae->a_name, ent_size - sizeof("user."));1940 bp += ent_size;1941 left -= ent_size;1974 strncpy(bp, "user.", sizeof("user.")); 1975 strncat(bp, ae->a_name, ent_size - sizeof("user.")); 1976 bp += ent_size; 1977 left -= ent_size; 1942 1978 } else if (size) { 1943 errno = ERANGE;1944 retval = -1;1945 break;1979 errno = ERANGE; 1980 retval = -1; 1981 break; 1946 1982 } 1947 1983 total_size += ent_size; 1948 }1949 if (al->al_more == 0) break;1984 } 1985 if (al->al_more == 0) break; 1950 1986 } 1951 1987 if (retval == 0) { 1952 flags |= ATTR_ROOT;1953 cursor = 0;1954 while (True) {1988 flags |= ATTR_ROOT; 1989 cursor = 0; 1990 while (True) { 1955 1991 if (filedes) 1956 retval = attr_listf(filedes, attr_buffer, ATTR_MAX_VALUELEN, flags, cursor);1992 retval = attr_listf(filedes, attr_buffer, ATTR_MAX_VALUELEN, flags, cursor); 1957 1993 else 1958 retval = attr_list(path, attr_buffer, ATTR_MAX_VALUELEN, flags, cursor);1994 retval = attr_list(path, attr_buffer, ATTR_MAX_VALUELEN, flags, cursor); 1959 1995 if (retval) break; 1960 1996 for (index = 0; index < al->al_count; index++) { 1961 ae = ATTR_ENTRY(attr_buffer, index);1962 ent_size = strlen(ae->a_name) + sizeof("system.");1963 if (left >= ent_size) {1997 ae = ATTR_ENTRY(attr_buffer, index); 1998 ent_size = strlen(ae->a_name) + sizeof("system."); 1999 if (left >= ent_size) { 1964 2000 strncpy(bp, "system.", sizeof("system.")); 1965 2001 strncat(bp, ae->a_name, ent_size - sizeof("system.")); 1966 2002 bp += ent_size; 1967 2003 left -= ent_size; 1968 } else if (size) {2004 } else if (size) { 1969 2005 errno = ERANGE; 1970 2006 retval = -1; 1971 2007 break; 1972 }1973 total_size += ent_size;2008 } 2009 total_size += ent_size; 1974 2010 } 1975 2011 if (al->al_more == 0) break; 1976 }2012 } 1977 2013 } 1978 2014 return (ssize_t)(retval ? retval : total_size); … … 2200 2236 2201 2237 #if !defined(HAVE_SETXATTR) 2202 #define XATTR_CREATE 0x1 /* set value, fail if attr already exists */2203 #define XATTR_REPLACE 0x2 /* set value, fail if attr does not exist */2238 #define XATTR_CREATE 0x1 /* set value, fail if attr already exists */ 2239 #define XATTR_REPLACE 0x2 /* set value, fail if attr does not exist */ 2204 2240 #endif 2205 2241 … … 2439 2475 int newfd = dup(attrdirfd); 2440 2476 /* CAUTION: The originating file descriptor should not be 2441 used again following the call to fdopendir().2442 For that reason we dup() the file descriptor2443 here to make things more clear. */2477 used again following the call to fdopendir(). 2478 For that reason we dup() the file descriptor 2479 here to make things more clear. */ 2444 2480 dirp = fdopendir(newfd); 2445 2481 … … 2531 2567 Return the major devicenumber for UNIX extensions. 2532 2568 ****************************************************************************/ 2533 2569 2534 2570 uint32 unix_dev_major(SMB_DEV_T dev) 2535 2571 { 2536 2572 #if defined(HAVE_DEVICE_MAJOR_FN) 2537 return (uint32)major(dev);2538 #else 2539 return (uint32)(dev >> 8);2540 #endif 2541 } 2542 2573 return (uint32)major(dev); 2574 #else 2575 return (uint32)(dev >> 8); 2576 #endif 2577 } 2578 2543 2579 /**************************************************************************** 2544 2580 Return the minor devicenumber for UNIX extensions. 2545 2581 ****************************************************************************/ 2546 2582 2547 2583 uint32 unix_dev_minor(SMB_DEV_T dev) 2548 2584 { 2549 2585 #if defined(HAVE_DEVICE_MINOR_FN) 2550 return (uint32)minor(dev);2551 #else 2552 return (uint32)(dev & 0xff);2586 return (uint32)minor(dev); 2587 #else 2588 return (uint32)(dev & 0xff); 2553 2589 #endif 2554 2590 } … … 2559 2595 An aio_read wrapper that will deal with 64-bit sizes. 2560 2596 ********************************************************************/ 2561 2597 2562 2598 int sys_aio_read(SMB_STRUCT_AIOCB *aiocb) 2563 2599 { 2564 2600 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_AIOCB64) && defined(HAVE_AIO_READ64) 2565 return aio_read64(aiocb);2601 return aio_read64(aiocb); 2566 2602 #elif defined(HAVE_AIO_READ) 2567 return aio_read(aiocb);2603 return aio_read(aiocb); 2568 2604 #else 2569 2605 errno = ENOSYS; … … 2575 2611 An aio_write wrapper that will deal with 64-bit sizes. 2576 2612 ********************************************************************/ 2577 2613 2578 2614 int sys_aio_write(SMB_STRUCT_AIOCB *aiocb) 2579 2615 { 2580 2616 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_AIOCB64) && defined(HAVE_AIO_WRITE64) 2581 return aio_write64(aiocb);2617 return aio_write64(aiocb); 2582 2618 #elif defined(HAVE_AIO_WRITE) 2583 return aio_write(aiocb);2619 return aio_write(aiocb); 2584 2620 #else 2585 2621 errno = ENOSYS; … … 2591 2627 An aio_return wrapper that will deal with 64-bit sizes. 2592 2628 ********************************************************************/ 2593 2629 2594 2630 ssize_t sys_aio_return(SMB_STRUCT_AIOCB *aiocb) 2595 2631 { 2596 2632 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_AIOCB64) && defined(HAVE_AIO_RETURN64) 2597 return aio_return64(aiocb);2633 return aio_return64(aiocb); 2598 2634 #elif defined(HAVE_AIO_RETURN) 2599 return aio_return(aiocb);2635 return aio_return(aiocb); 2600 2636 #else 2601 2637 errno = ENOSYS; … … 2611 2647 { 2612 2648 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_AIOCB64) && defined(HAVE_AIO_CANCEL64) 2613 return aio_cancel64(fd, aiocb);2649 return aio_cancel64(fd, aiocb); 2614 2650 #elif defined(HAVE_AIO_CANCEL) 2615 return aio_cancel(fd, aiocb);2651 return aio_cancel(fd, aiocb); 2616 2652 #else 2617 2653 errno = ENOSYS; … … 2627 2663 { 2628 2664 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_AIOCB64) && defined(HAVE_AIO_ERROR64) 2629 return aio_error64(aiocb);2665 return aio_error64(aiocb); 2630 2666 #elif defined(HAVE_AIO_ERROR) 2631 return aio_error(aiocb);2667 return aio_error(aiocb); 2632 2668 #else 2633 2669 errno = ENOSYS; … … 2643 2679 { 2644 2680 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_AIOCB64) && defined(HAVE_AIO_FSYNC64) 2645 return aio_fsync64(op, aiocb);2681 return aio_fsync64(op, aiocb); 2646 2682 #elif defined(HAVE_AIO_FSYNC) 2647 return aio_fsync(op, aiocb);2683 return aio_fsync(op, aiocb); 2648 2684 #else 2649 2685 errno = ENOSYS; … … 2659 2695 { 2660 2696 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_AIOCB64) && defined(HAVE_AIO_SUSPEND64) 2661 return aio_suspend64(cblist, n, timeout);2697 return aio_suspend64(cblist, n, timeout); 2662 2698 #elif defined(HAVE_AIO_FSYNC) 2663 return aio_suspend(cblist, n, timeout);2699 return aio_suspend(cblist, n, timeout); 2664 2700 #else 2665 2701 errno = ENOSYS;
Note:
See TracChangeset
for help on using the changeset viewer.
