Changeset 740 for vendor/current/source3/lib/system.c
- Timestamp:
- Nov 14, 2012, 12:59:34 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
vendor/current/source3/lib/system.c
r587 r740 22 22 23 23 #include "includes.h" 24 #include "system/syslog.h" 25 #include "system/capability.h" 26 #include "system/passwd.h" 27 #include "system/filesys.h" 24 28 25 29 #ifdef HAVE_SYS_PRCTL_H … … 124 128 do { 125 129 ret = read(fd, buf, count); 126 } while (ret == -1 && errno == EINTR); 130 #if defined(EWOULDBLOCK) 131 } while (ret == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)); 132 #else 133 } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); 134 #endif 127 135 return ret; 128 136 } … … 138 146 do { 139 147 ret = write(fd, buf, count); 140 } while (ret == -1 && errno == EINTR); 148 #if defined(EWOULDBLOCK) 149 } while (ret == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)); 150 #else 151 } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); 152 #endif 141 153 return ret; 142 154 } … … 163 175 do { 164 176 ret = writev(fd, iov, iovcnt); 165 } while (ret == -1 && errno == EINTR); 177 #if defined(EWOULDBLOCK) 178 } while (ret == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)); 179 #else 180 } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); 181 #endif 166 182 return ret; 167 183 } … … 208 224 209 225 /******************************************************************* 210 A send wrapper that will deal with EINTR .226 A send wrapper that will deal with EINTR or EAGAIN or EWOULDBLOCK. 211 227 ********************************************************************/ 212 228 … … 217 233 do { 218 234 ret = send(s, msg, len, flags); 219 } while (ret == -1 && errno == EINTR); 220 return ret; 221 } 222 223 /******************************************************************* 224 A sendto wrapper that will deal with EINTR. 235 #if defined(EWOULDBLOCK) 236 } while (ret == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)); 237 #else 238 } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); 239 #endif 240 return ret; 241 } 242 243 /******************************************************************* 244 A sendto wrapper that will deal with EINTR or EAGAIN or EWOULDBLOCK. 225 245 ********************************************************************/ 226 246 … … 231 251 do { 232 252 ret = sendto(s, msg, len, flags, to, tolen); 233 } while (ret == -1 && errno == EINTR); 234 return ret; 235 } 236 237 /******************************************************************* 238 A recv wrapper that will deal with EINTR. 253 #if defined(EWOULDBLOCK) 254 } while (ret == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)); 255 #else 256 } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); 257 #endif 258 return ret; 259 } 260 261 /******************************************************************* 262 A recv wrapper that will deal with EINTR or EAGAIN or EWOULDBLOCK. 239 263 ********************************************************************/ 240 264 … … 245 269 do { 246 270 ret = recv(fd, buf, count, flags); 247 } while (ret == -1 && errno == EINTR); 271 #if defined(EWOULDBLOCK) 272 } while (ret == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)); 273 #else 274 } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); 275 #endif 248 276 return ret; 249 277 } … … 259 287 do { 260 288 ret = recvfrom(s, buf, len, flags, from, fromlen); 261 } while (ret == -1 && errno == EINTR); 289 #if defined(EWOULDBLOCK) 290 } while (ret == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)); 291 #else 292 } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); 293 #endif 262 294 return ret; 263 295 } … … 637 669 #elif defined(HAVE_POSIX_FALLOCATE) && !defined(HAVE_BROKEN_POSIX_FALLOCATE) 638 670 return posix_fallocate(fd, offset, len); 671 #elif defined(F_RESVSP64) 672 /* this handles XFS on IRIX */ 673 struct flock64 fl; 674 SMB_OFF_T new_len = offset + len; 675 int ret; 676 struct stat64 sbuf; 677 678 /* unlikely to get a too large file on a 64bit system but ... */ 679 if (new_len < 0) 680 return EFBIG; 681 682 fl.l_whence = SEEK_SET; 683 fl.l_start = offset; 684 fl.l_len = len; 685 686 ret=fcntl(fd, F_RESVSP64, &fl); 687 688 if (ret != 0) 689 return errno; 690 691 /* Make sure the file gets enlarged after we allocated space: */ 692 fstat64(fd, &sbuf); 693 if (new_len > sbuf.st_size) 694 ftruncate64(fd, new_len); 695 return 0; 639 696 #else 640 697 return ENOSYS; 698 #endif 699 } 700 701 /******************************************************************* 702 An fallocate() function that matches the semantics of the Linux one. 703 ********************************************************************/ 704 705 #ifdef HAVE_LINUX_FALLOC_H 706 #include <linux/falloc.h> 707 #endif 708 709 int sys_fallocate(int fd, enum vfs_fallocate_mode mode, SMB_OFF_T offset, SMB_OFF_T len) 710 { 711 #if defined(HAVE_LINUX_FALLOCATE64) || defined(HAVE_LINUX_FALLOCATE) 712 int lmode; 713 switch (mode) { 714 case VFS_FALLOCATE_EXTEND_SIZE: 715 lmode = 0; 716 break; 717 case VFS_FALLOCATE_KEEP_SIZE: 718 lmode = FALLOC_FL_KEEP_SIZE; 719 break; 720 default: 721 errno = EINVAL; 722 return -1; 723 } 724 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_OFF64_T) && defined(HAVE_LINUX_FALLOCATE64) 725 return fallocate64(fd, lmode, offset, len); 726 #elif defined(HAVE_LINUX_FALLOCATE) 727 return fallocate(fd, lmode, offset, len); 728 #endif 729 #else 730 /* TODO - plumb in fallocate from other filesysetms like VXFS etc. JRA. */ 731 errno = ENOSYS; 732 return -1; 641 733 #endif 642 734 } … … 741 833 } 742 834 835 836 #if HAVE_KERNEL_SHARE_MODES 837 #ifndef LOCK_MAND 838 #define LOCK_MAND 32 /* This is a mandatory flock */ 839 #define LOCK_READ 64 /* ... Which allows concurrent read operations */ 840 #define LOCK_WRITE 128 /* ... Which allows concurrent write operations */ 841 #define LOCK_RW 192 /* ... Which allows concurrent read & write ops */ 842 #endif 843 #endif 743 844 744 845 /******************************************************************* … … 776 877 #else 777 878 return opendir(name); 879 #endif 880 } 881 882 /******************************************************************* 883 An fdopendir wrapper that will deal with 64 bit filesizes. 884 Ugly hack - we need dirfd for this to work correctly in the 885 calling code.. JRA. 886 ********************************************************************/ 887 888 SMB_STRUCT_DIR *sys_fdopendir(int fd) 889 { 890 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_FDOPENDIR64) && defined(HAVE_DIRFD) 891 return fdopendir64(fd); 892 #elif defined(HAVE_FDOPENDIR) && defined(HAVE_DIRFD) 893 return fdopendir(fd); 894 #else 895 errno = ENOSYS; 896 return NULL; 778 897 #endif 779 898 } … … 1031 1150 } 1032 1151 1152 #ifndef NGROUPS_MAX 1153 #define NGROUPS_MAX 32 /* Guess... */ 1154 #endif 1155 1033 1156 /************************************************************************** 1034 1157 Returns equivalent to NGROUPS_MAX - using sysconf if needed. … … 1051 1174 1052 1175 #if defined(HAVE_BROKEN_GETGROUPS) 1176 1177 #ifdef HAVE_BROKEN_GETGROUPS 1178 #define GID_T int 1179 #else 1180 #define GID_T gid_t 1181 #endif 1182 1053 1183 static int sys_broken_getgroups(int setlen, gid_t *gidset) 1054 1184 { … … 1230 1360 1231 1361 /************************************************************************** 1232 Wrappers for setpwent(), getpwent() and endpwent()1233 ****************************************************************************/1234 1235 void sys_setpwent(void)1236 {1237 setpwent();1238 }1239 1240 struct passwd *sys_getpwent(void)1241 {1242 return getpwent();1243 }1244 1245 void sys_endpwent(void)1246 {1247 endpwent();1248 }1249 1250 /**************************************************************************1251 Wrappers for getpwnam(), getpwuid(), getgrnam(), getgrgid()1252 ****************************************************************************/1253 1254 1255 struct passwd *sys_getpwnam(const char *name)1256 {1257 return getpwnam(name);1258 }1259 1260 struct passwd *sys_getpwuid(uid_t uid)1261 {1262 return getpwuid(uid);1263 }1264 1265 struct group *sys_getgrnam(const char *name)1266 {1267 return getgrnam(name);1268 }1269 1270 struct group *sys_getgrgid(gid_t gid)1271 {1272 return getgrgid(gid);1273 }1274 1275 /**************************************************************************1276 1362 Extract a command into an arg list. 1277 1363 ****************************************************************************/ … … 1440 1526 1441 1527 SAFE_FREE(entry); 1442 SAFE_FREE(argl);1528 TALLOC_FREE(argl); 1443 1529 close(pipe_fds[0]); 1444 1530 close(pipe_fds[1]); … … 1766 1852 } 1767 1853 /* Shift results back, so we can prepend prefixes */ 1768 buf = memmove(list + len, list, list_size);1854 buf = (char *)memmove(list + len, list, list_size); 1769 1855 1770 1856 for(i = 0; i < list_size; i += len + 1) { … … 2557 2643 } 2558 2644 #endif /* WITH_AIO */ 2559 2560 int sys_getpeereid( int s, uid_t *uid)2561 {2562 #if defined(HAVE_PEERCRED)2563 struct ucred cred;2564 socklen_t cred_len = sizeof(struct ucred);2565 int ret;2566 2567 ret = getsockopt(s, SOL_SOCKET, SO_PEERCRED, (void *)&cred, &cred_len);2568 if (ret != 0) {2569 return -1;2570 }2571 2572 if (cred_len != sizeof(struct ucred)) {2573 errno = EINVAL;2574 return -1;2575 }2576 2577 *uid = cred.uid;2578 return 0;2579 #else2580 errno = ENOSYS;2581 return -1;2582 #endif2583 }2584 2585 int sys_getnameinfo(const struct sockaddr *psa,2586 socklen_t salen,2587 char *host,2588 size_t hostlen,2589 char *service,2590 size_t servlen,2591 int flags)2592 {2593 /*2594 * For Solaris we must make sure salen is the2595 * correct length for the incoming sa_family.2596 */2597 2598 if (salen == sizeof(struct sockaddr_storage)) {2599 salen = sizeof(struct sockaddr_in);2600 #if defined(HAVE_IPV6)2601 if (psa->sa_family == AF_INET6) {2602 salen = sizeof(struct sockaddr_in6);2603 }2604 #endif2605 }2606 return getnameinfo(psa, salen, host, hostlen, service, servlen, flags);2607 }2608 2609 int sys_connect(int fd, const struct sockaddr * addr)2610 {2611 socklen_t salen = -1;2612 2613 if (addr->sa_family == AF_INET) {2614 salen = sizeof(struct sockaddr_in);2615 } else if (addr->sa_family == AF_UNIX) {2616 salen = sizeof(struct sockaddr_un);2617 }2618 #if defined(HAVE_IPV6)2619 else if (addr->sa_family == AF_INET6) {2620 salen = sizeof(struct sockaddr_in6);2621 }2622 #endif2623 2624 return connect(fd, addr, salen);2625 }
Note:
See TracChangeset
for help on using the changeset viewer.