Ignore:
Timestamp:
Nov 27, 2012, 4:43:17 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: updated trunk to 3.6.0

Location:
trunk/server
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/server

  • trunk/server/source3/lib/system.c

    r590 r745  
    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
    2630#include <sys/prctl.h>
     31#endif
     32#ifdef __OS2__
     33#define pipe(A) os2_pipe(A)
    2734#endif
    2835
     
    124131        do {
    125132                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
    127138        return ret;
    128139}
     
    138149        do {
    139150                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
    141156        return ret;
    142157}
     
    163178        do {
    164179                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
    166185        return ret;
    167186}
     
    208227
    209228/*******************************************************************
    210 A send wrapper that will deal with EINTR.
     229A send wrapper that will deal with EINTR or EAGAIN or EWOULDBLOCK.
    211230********************************************************************/
    212231
     
    217236        do {
    218237                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/*******************************************************************
     247A sendto wrapper that will deal with EINTR or EAGAIN or EWOULDBLOCK.
    225248********************************************************************/
    226249
     
    231254        do {
    232255                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/*******************************************************************
     265A recv wrapper that will deal with EINTR or EAGAIN or EWOULDBLOCK.
    239266********************************************************************/
    240267
     
    245272        do {
    246273                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
    248279        return ret;
    249280}
     
    259290        do {
    260291                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
    262297        return ret;
    263298}
     
    637672#elif defined(HAVE_POSIX_FALLOCATE) && !defined(HAVE_BROKEN_POSIX_FALLOCATE)
    638673        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;
    639699#else
    640700        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
     712int 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;
    641736#endif
    642737}
     
    743838}
    744839
     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
    745849
    746850/*******************************************************************
     
    778882#else
    779883        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
     893SMB_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;
    780902#endif
    781903}
     
    10331155}
    10341156
     1157#ifndef NGROUPS_MAX
     1158#define NGROUPS_MAX 32 /* Guess... */
     1159#endif
     1160
    10351161/**************************************************************************
    10361162 Returns equivalent to NGROUPS_MAX - using sysconf if needed.
     
    10531179
    10541180#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
    10551188static int sys_broken_getgroups(int setlen, gid_t *gidset)
    10561189{
     
    12321365
    12331366/**************************************************************************
    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 /**************************************************************************
    12781367 Extract a command into an arg list.
    12791368****************************************************************************/
     
    14421531
    14431532        SAFE_FREE(entry);
    1444         SAFE_FREE(argl);
     1533        TALLOC_FREE(argl);
    14451534        close(pipe_fds[0]);
    14461535        close(pipe_fds[1]);
     
    17741863                }
    17751864                /* 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);
    17771866
    17781867                for(i = 0; i < list_size; i += len + 1) {
     
    25832672}
    25842673#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 #else
    2606         errno = ENOSYS;
    2607         return -1;
    2608 #endif
    2609 }
    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 the
    2621          * 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 #endif
    2631         }
    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 #endif
    2649 
    2650         return connect(fd, addr, salen);
    2651 }
Note: See TracChangeset for help on using the changeset viewer.