Changeset 164 for branches/samba-3.0
- Timestamp:
- Feb 9, 2009, 9:26:35 AM (17 years ago)
- File:
-
- 1 edited
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 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 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 1580 #else 1581 1615 return dlsym(handle, symbol); 1616 #else 1617 return NULL; 1582 1618 #endif 1583 1619 } … … 1825 1861 1826 1862 static struct { 1827 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 1869 { EXTATTR_NAMESPACE_USER, EXTATTR_PREFIX("user.") }, 1834 1870 }; 1835 1871 … … 1927 1963 1928 1964 while (True) { 1929 1965 if (filedes) 1930 1966 retval = attr_listf(filedes, attr_buffer, ATTR_MAX_VALUELEN, flags, cursor); 1931 1967 else 1932 1968 retval = attr_list(path, attr_buffer, ATTR_MAX_VALUELEN, flags, cursor); 1933 1934 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 1939 1940 1941 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 1944 1945 1979 errno = ERANGE; 1980 retval = -1; 1981 break; 1946 1982 } 1947 1983 total_size += ent_size; 1948 1949 1984 } 1985 if (al->al_more == 0) break; 1950 1986 } 1951 1987 if (retval == 0) { 1952 1953 1954 1988 flags |= ATTR_ROOT; 1989 cursor = 0; 1990 while (True) { 1955 1991 if (filedes) 1956 1992 retval = attr_listf(filedes, attr_buffer, ATTR_MAX_VALUELEN, flags, cursor); 1957 1993 else 1958 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 1962 1963 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 2004 } else if (size) { 1969 2005 errno = ERANGE; 1970 2006 retval = -1; 1971 2007 break; 1972 1973 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 2203 #define XATTR_REPLACE 0x2 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 2442 2443 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 2538 #else 2539 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 2551 #else 2552 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 2601 return aio_read64(aiocb); 2566 2602 #elif defined(HAVE_AIO_READ) 2567 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 2617 return aio_write64(aiocb); 2582 2618 #elif defined(HAVE_AIO_WRITE) 2583 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 2633 return aio_return64(aiocb); 2598 2634 #elif defined(HAVE_AIO_RETURN) 2599 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 2649 return aio_cancel64(fd, aiocb); 2614 2650 #elif defined(HAVE_AIO_CANCEL) 2615 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 2665 return aio_error64(aiocb); 2630 2666 #elif defined(HAVE_AIO_ERROR) 2631 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 2681 return aio_fsync64(op, aiocb); 2646 2682 #elif defined(HAVE_AIO_FSYNC) 2647 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 2697 return aio_suspend64(cblist, n, timeout); 2662 2698 #elif defined(HAVE_AIO_FSYNC) 2663 2699 return aio_suspend(cblist, n, timeout); 2664 2700 #else 2665 2701 errno = ENOSYS;
Note:
See TracChangeset
for help on using the changeset viewer.