Changeset 745 for trunk/server/source3/lib/system.c
- Timestamp:
- Nov 27, 2012, 4:43:17 PM (13 years ago)
- Location:
- trunk/server
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/server
- Property svn:mergeinfo changed
/vendor/current merged: 581,587,591,594,597,600,615,618,740
- Property svn:mergeinfo changed
-
trunk/server/source3/lib/system.c
r590 r745 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 26 30 #include <sys/prctl.h> 31 #endif 32 #ifdef __OS2__ 33 #define pipe(A) os2_pipe(A) 27 34 #endif 28 35 … … 124 131 do { 125 132 ret = read(fd, buf, count); 126 } while (ret == -1 && errno == EINTR); 133 #if defined(EWOULDBLOCK) 134 } while (ret == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)); 135 #else 136 } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); 137 #endif 127 138 return ret; 128 139 } … … 138 149 do { 139 150 ret = write(fd, buf, count); 140 } while (ret == -1 && errno == EINTR); 151 #if defined(EWOULDBLOCK) 152 } while (ret == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)); 153 #else 154 } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); 155 #endif 141 156 return ret; 142 157 } … … 163 178 do { 164 179 ret = writev(fd, iov, iovcnt); 165 } while (ret == -1 && errno == EINTR); 180 #if defined(EWOULDBLOCK) 181 } while (ret == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)); 182 #else 183 } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); 184 #endif 166 185 return ret; 167 186 } … … 208 227 209 228 /******************************************************************* 210 A send wrapper that will deal with EINTR .229 A send wrapper that will deal with EINTR or EAGAIN or EWOULDBLOCK. 211 230 ********************************************************************/ 212 231 … … 217 236 do { 218 237 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. 238 #if defined(EWOULDBLOCK) 239 } while (ret == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)); 240 #else 241 } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); 242 #endif 243 return ret; 244 } 245 246 /******************************************************************* 247 A sendto wrapper that will deal with EINTR or EAGAIN or EWOULDBLOCK. 225 248 ********************************************************************/ 226 249 … … 231 254 do { 232 255 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. 256 #if defined(EWOULDBLOCK) 257 } while (ret == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)); 258 #else 259 } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); 260 #endif 261 return ret; 262 } 263 264 /******************************************************************* 265 A recv wrapper that will deal with EINTR or EAGAIN or EWOULDBLOCK. 239 266 ********************************************************************/ 240 267 … … 245 272 do { 246 273 ret = recv(fd, buf, count, flags); 247 } while (ret == -1 && errno == EINTR); 274 #if defined(EWOULDBLOCK) 275 } while (ret == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)); 276 #else 277 } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); 278 #endif 248 279 return ret; 249 280 } … … 259 290 do { 260 291 ret = recvfrom(s, buf, len, flags, from, fromlen); 261 } while (ret == -1 && errno == EINTR); 292 #if defined(EWOULDBLOCK) 293 } while (ret == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)); 294 #else 295 } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); 296 #endif 262 297 return ret; 263 298 } … … 637 672 #elif defined(HAVE_POSIX_FALLOCATE) && !defined(HAVE_BROKEN_POSIX_FALLOCATE) 638 673 return posix_fallocate(fd, offset, len); 674 #elif defined(F_RESVSP64) 675 /* this handles XFS on IRIX */ 676 struct flock64 fl; 677 SMB_OFF_T new_len = offset + len; 678 int ret; 679 struct stat64 sbuf; 680 681 /* unlikely to get a too large file on a 64bit system but ... */ 682 if (new_len < 0) 683 return EFBIG; 684 685 fl.l_whence = SEEK_SET; 686 fl.l_start = offset; 687 fl.l_len = len; 688 689 ret=fcntl(fd, F_RESVSP64, &fl); 690 691 if (ret != 0) 692 return errno; 693 694 /* Make sure the file gets enlarged after we allocated space: */ 695 fstat64(fd, &sbuf); 696 if (new_len > sbuf.st_size) 697 ftruncate64(fd, new_len); 698 return 0; 639 699 #else 640 700 return ENOSYS; 701 #endif 702 } 703 704 /******************************************************************* 705 An fallocate() function that matches the semantics of the Linux one. 706 ********************************************************************/ 707 708 #ifdef HAVE_LINUX_FALLOC_H 709 #include <linux/falloc.h> 710 #endif 711 712 int sys_fallocate(int fd, enum vfs_fallocate_mode mode, SMB_OFF_T offset, SMB_OFF_T len) 713 { 714 #if defined(HAVE_LINUX_FALLOCATE64) || defined(HAVE_LINUX_FALLOCATE) 715 int lmode; 716 switch (mode) { 717 case VFS_FALLOCATE_EXTEND_SIZE: 718 lmode = 0; 719 break; 720 case VFS_FALLOCATE_KEEP_SIZE: 721 lmode = FALLOC_FL_KEEP_SIZE; 722 break; 723 default: 724 errno = EINVAL; 725 return -1; 726 } 727 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_OFF64_T) && defined(HAVE_LINUX_FALLOCATE64) 728 return fallocate64(fd, lmode, offset, len); 729 #elif defined(HAVE_LINUX_FALLOCATE) 730 return fallocate(fd, lmode, offset, len); 731 #endif 732 #else 733 /* TODO - plumb in fallocate from other filesysetms like VXFS etc. JRA. */ 734 errno = ENOSYS; 735 return -1; 641 736 #endif 642 737 } … … 743 838 } 744 839 840 841 #if HAVE_KERNEL_SHARE_MODES 842 #ifndef LOCK_MAND 843 #define LOCK_MAND 32 /* This is a mandatory flock */ 844 #define LOCK_READ 64 /* ... Which allows concurrent read operations */ 845 #define LOCK_WRITE 128 /* ... Which allows concurrent write operations */ 846 #define LOCK_RW 192 /* ... Which allows concurrent read & write ops */ 847 #endif 848 #endif 745 849 746 850 /******************************************************************* … … 778 882 #else 779 883 return opendir(name); 884 #endif 885 } 886 887 /******************************************************************* 888 An fdopendir wrapper that will deal with 64 bit filesizes. 889 Ugly hack - we need dirfd for this to work correctly in the 890 calling code.. JRA. 891 ********************************************************************/ 892 893 SMB_STRUCT_DIR *sys_fdopendir(int fd) 894 { 895 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_FDOPENDIR64) && defined(HAVE_DIRFD) 896 return fdopendir64(fd); 897 #elif defined(HAVE_FDOPENDIR) && defined(HAVE_DIRFD) 898 return fdopendir(fd); 899 #else 900 errno = ENOSYS; 901 return NULL; 780 902 #endif 781 903 } … … 1033 1155 } 1034 1156 1157 #ifndef NGROUPS_MAX 1158 #define NGROUPS_MAX 32 /* Guess... */ 1159 #endif 1160 1035 1161 /************************************************************************** 1036 1162 Returns equivalent to NGROUPS_MAX - using sysconf if needed. … … 1053 1179 1054 1180 #if defined(HAVE_BROKEN_GETGROUPS) 1181 1182 #ifdef HAVE_BROKEN_GETGROUPS 1183 #define GID_T int 1184 #else 1185 #define GID_T gid_t 1186 #endif 1187 1055 1188 static int sys_broken_getgroups(int setlen, gid_t *gidset) 1056 1189 { … … 1232 1365 1233 1366 /************************************************************************** 1234 Wrappers for setpwent(), getpwent() and endpwent()1235 ****************************************************************************/1236 1237 void sys_setpwent(void)1238 {1239 setpwent();1240 }1241 1242 struct passwd *sys_getpwent(void)1243 {1244 return getpwent();1245 }1246 1247 void sys_endpwent(void)1248 {1249 endpwent();1250 }1251 1252 /**************************************************************************1253 Wrappers for getpwnam(), getpwuid(), getgrnam(), getgrgid()1254 ****************************************************************************/1255 1256 1257 struct passwd *sys_getpwnam(const char *name)1258 {1259 return getpwnam(name);1260 }1261 1262 struct passwd *sys_getpwuid(uid_t uid)1263 {1264 return getpwuid(uid);1265 }1266 1267 struct group *sys_getgrnam(const char *name)1268 {1269 return getgrnam(name);1270 }1271 1272 struct group *sys_getgrgid(gid_t gid)1273 {1274 return getgrgid(gid);1275 }1276 1277 /**************************************************************************1278 1367 Extract a command into an arg list. 1279 1368 ****************************************************************************/ … … 1442 1531 1443 1532 SAFE_FREE(entry); 1444 SAFE_FREE(argl);1533 TALLOC_FREE(argl); 1445 1534 close(pipe_fds[0]); 1446 1535 close(pipe_fds[1]); … … 1774 1863 } 1775 1864 /* Shift results back, so we can prepend prefixes */ 1776 buf = memmove(list + len, list, list_size);1865 buf = (char *)memmove(list + len, list, list_size); 1777 1866 1778 1867 for(i = 0; i < list_size; i += len + 1) { … … 2583 2672 } 2584 2673 #endif /* WITH_AIO */ 2585 2586 int sys_getpeereid( int s, uid_t *uid)2587 {2588 #if defined(HAVE_PEERCRED)2589 struct ucred cred;2590 socklen_t cred_len = sizeof(struct ucred);2591 int ret;2592 2593 ret = getsockopt(s, SOL_SOCKET, SO_PEERCRED, (void *)&cred, &cred_len);2594 if (ret != 0) {2595 return -1;2596 }2597 2598 if (cred_len != sizeof(struct ucred)) {2599 errno = EINVAL;2600 return -1;2601 }2602 2603 *uid = cred.uid;2604 return 0;2605 #else2606 errno = ENOSYS;2607 return -1;2608 #endif2609 }2610 2611 int sys_getnameinfo(const struct sockaddr *psa,2612 socklen_t salen,2613 char *host,2614 size_t hostlen,2615 char *service,2616 size_t servlen,2617 int flags)2618 {2619 /*2620 * For Solaris we must make sure salen is the2621 * correct length for the incoming sa_family.2622 */2623 2624 if (salen == sizeof(struct sockaddr_storage)) {2625 salen = sizeof(struct sockaddr_in);2626 #if defined(HAVE_IPV6)2627 if (psa->sa_family == AF_INET6) {2628 salen = sizeof(struct sockaddr_in6);2629 }2630 #endif2631 }2632 return getnameinfo(psa, salen, host, hostlen, service, servlen, flags);2633 }2634 2635 int sys_connect(int fd, const struct sockaddr * addr)2636 {2637 socklen_t salen = -1;2638 2639 if (addr->sa_family == AF_INET) {2640 salen = sizeof(struct sockaddr_in);2641 } else if (addr->sa_family == AF_UNIX) {2642 salen = sizeof(struct sockaddr_un);2643 }2644 #if defined(HAVE_IPV6)2645 else if (addr->sa_family == AF_INET6) {2646 salen = sizeof(struct sockaddr_in6);2647 }2648 #endif2649 2650 return connect(fd, addr, salen);2651 }
Note:
See TracChangeset
for help on using the changeset viewer.