Ignore:
Timestamp:
Nov 14, 2012, 12:59:34 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: update vendor to 3.6.0

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vendor/current/source3/lib/system.c

    r587 r740  
    2222
    2323#include "includes.h"
     24#include "system/syslog.h"
     25#include "system/capability.h"
     26#include "system/passwd.h"
     27#include "system/filesys.h"
    2428
    2529#ifdef HAVE_SYS_PRCTL_H
     
    124128        do {
    125129                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
    127135        return ret;
    128136}
     
    138146        do {
    139147                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
    141153        return ret;
    142154}
     
    163175        do {
    164176                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
    166182        return ret;
    167183}
     
    208224
    209225/*******************************************************************
    210 A send wrapper that will deal with EINTR.
     226A send wrapper that will deal with EINTR or EAGAIN or EWOULDBLOCK.
    211227********************************************************************/
    212228
     
    217233        do {
    218234                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/*******************************************************************
     244A sendto wrapper that will deal with EINTR or EAGAIN or EWOULDBLOCK.
    225245********************************************************************/
    226246
     
    231251        do {
    232252                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/*******************************************************************
     262A recv wrapper that will deal with EINTR or EAGAIN or EWOULDBLOCK.
    239263********************************************************************/
    240264
     
    245269        do {
    246270                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
    248276        return ret;
    249277}
     
    259287        do {
    260288                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
    262294        return ret;
    263295}
     
    637669#elif defined(HAVE_POSIX_FALLOCATE) && !defined(HAVE_BROKEN_POSIX_FALLOCATE)
    638670        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;
    639696#else
    640697        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
     709int 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;
    641733#endif
    642734}
     
    741833}
    742834
     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
    743844
    744845/*******************************************************************
     
    776877#else
    777878        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
     888SMB_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;
    778897#endif
    779898}
     
    10311150}
    10321151
     1152#ifndef NGROUPS_MAX
     1153#define NGROUPS_MAX 32 /* Guess... */
     1154#endif
     1155
    10331156/**************************************************************************
    10341157 Returns equivalent to NGROUPS_MAX - using sysconf if needed.
     
    10511174
    10521175#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
    10531183static int sys_broken_getgroups(int setlen, gid_t *gidset)
    10541184{
     
    12301360
    12311361/**************************************************************************
    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 /**************************************************************************
    12761362 Extract a command into an arg list.
    12771363****************************************************************************/
     
    14401526
    14411527        SAFE_FREE(entry);
    1442         SAFE_FREE(argl);
     1528        TALLOC_FREE(argl);
    14431529        close(pipe_fds[0]);
    14441530        close(pipe_fds[1]);
     
    17661852                }
    17671853                /* 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);
    17691855
    17701856                for(i = 0; i < list_size; i += len + 1) {
     
    25572643}
    25582644#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 #else
    2580         errno = ENOSYS;
    2581         return -1;
    2582 #endif
    2583 }
    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 the
    2595          * 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 #endif
    2605         }
    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 #endif
    2623 
    2624         return connect(fd, addr, salen);
    2625 }
Note: See TracChangeset for help on using the changeset viewer.