diff options
author | Gerald Carter <jerry@samba.org> | 2007-02-28 14:35:26 +0000 |
---|---|---|
committer | Gerald Carter <jerry@samba.org> | 2007-02-28 14:35:26 +0000 |
commit | 80236f0d60ce013134c1ed5422d148e541f70a4f (patch) | |
tree | f71326fa71c0323e6b5d87b75b289d0608480f87 /source/lib/system.c | |
parent | f05f5dce39b11e937fb19270b7bcc888582edf35 (diff) | |
download | samba-80236f0d60ce013134c1ed5422d148e541f70a4f.tar.gz samba-80236f0d60ce013134c1ed5422d148e541f70a4f.tar.xz samba-80236f0d60ce013134c1ed5422d148e541f70a4f.zip |
r21585: Start syncing the monster that will become 3.0.25pre1
Still todo:
* release notes
* few minor outstanding patches
* additional idmap man pages
Diffstat (limited to 'source/lib/system.c')
-rw-r--r-- | source/lib/system.c | 216 |
1 files changed, 215 insertions, 1 deletions
diff --git a/source/lib/system.c b/source/lib/system.c index 2e5f42307bd..20b31113ecd 100644 --- a/source/lib/system.c +++ b/source/lib/system.c @@ -44,6 +44,27 @@ /******************************************************************* + A wrapper for memalign +********************************************************************/ + +void* sys_memalign( size_t align, size_t size ) +{ +#if defined(HAVE_MEMALIGN) + return memalign( align, size ); +#elif defined(HAVE_POSIX_MEMALIGN) + char *p = NULL; + int ret = posix_memalign( &p, align, size ); + if ( ret == 0 ) + return p; + + return NULL; +#else + DEBUG(0,("memalign functionalaity not available on this platform!\n")); + return NULL; +#endif +} + +/******************************************************************* A wrapper for usleep in case we don't have one. ********************************************************************/ @@ -105,7 +126,6 @@ ssize_t sys_write(int fd, const void *buf, size_t count) return ret; } - /******************************************************************* A pread wrapper that will deal with EINTR and 64-bit file offsets. ********************************************************************/ @@ -175,6 +195,20 @@ ssize_t sys_sendto(int s, const void *msg, size_t len, int flags, const struct } /******************************************************************* +A recv wrapper that will deal with EINTR. +********************************************************************/ + +ssize_t sys_recv(int fd, void *buf, size_t count, int flags) +{ + ssize_t ret; + + do { + ret = recv(fd, buf, count, flags); + } while (ret == -1 && errno == EINTR); + return ret; +} + +/******************************************************************* A recvfrom wrapper that will deal with EINTR. ********************************************************************/ @@ -366,6 +400,31 @@ FILE *sys_fopen(const char *path, const char *type) #endif } + +/******************************************************************* + A flock() wrapper that will perform the kernel flock. +********************************************************************/ + +void kernel_flock(int fd, uint32 share_mode) +{ +#if HAVE_KERNEL_SHARE_MODES + int kernel_mode = 0; + if (share_mode == FILE_SHARE_WRITE) { + kernel_mode = LOCK_MAND|LOCK_WRITE; + } else if (share_mode == FILE_SHARE_READ) { + kernel_mode = LOCK_MAND|LOCK_READ; + } else if (share_mode == FILE_SHARE_NONE) { + kernel_mode = LOCK_MAND; + } + if (kernel_mode) { + flock(fd, kernel_mode); + } +#endif + ; +} + + + /******************************************************************* An opendir wrapper that will deal with 64 bit filesizes. ********************************************************************/ @@ -922,6 +981,82 @@ void sys_endpwent(void) Wrappers for getpwnam(), getpwuid(), getgrnam(), getgrgid() ****************************************************************************/ +#ifdef ENABLE_BUILD_FARM_HACKS + +/* + * In the build farm we want to be able to join machines to the domain. As we + * don't have root access, we need to bypass direct access to /etc/passwd + * after a user has been created via samr. Fake those users. + */ + +static struct passwd *fake_pwd; +static int num_fake_pwd; + +struct passwd *sys_getpwnam(const char *name) +{ + int i; + + for (i=0; i<num_fake_pwd; i++) { + if (strcmp(fake_pwd[i].pw_name, name) == 0) { + DEBUG(10, ("Returning fake user %s\n", name)); + return &fake_pwd[i]; + } + } + + return getpwnam(name); +} + +struct passwd *sys_getpwuid(uid_t uid) +{ + int i; + + for (i=0; i<num_fake_pwd; i++) { + if (fake_pwd[i].pw_uid == uid) { + DEBUG(10, ("Returning fake user %s\n", + fake_pwd[i].pw_name)); + return &fake_pwd[i]; + } + } + + return getpwuid(uid); +} + +void faked_create_user(const char *name) +{ + int i; + uid_t uid; + struct passwd new_pwd; + + for (i=0; i<10; i++) { + generate_random_buffer((unsigned char *)&uid, + sizeof(uid)); + if (getpwuid(uid) == NULL) { + break; + } + } + + if (i==10) { + /* Weird. No free uid found... */ + return; + } + + new_pwd.pw_name = SMB_STRDUP(name); + new_pwd.pw_passwd = SMB_STRDUP("x"); + new_pwd.pw_uid = uid; + new_pwd.pw_gid = 100; + new_pwd.pw_gecos = SMB_STRDUP("faked user"); + new_pwd.pw_dir = SMB_STRDUP("/nodir"); + new_pwd.pw_shell = SMB_STRDUP("/bin/false"); + + ADD_TO_ARRAY(NULL, struct passwd, new_pwd, &fake_pwd, + &num_fake_pwd); + + DEBUG(10, ("Added fake user %s, have %d fake users\n", + name, num_fake_pwd)); +} + +#else + struct passwd *sys_getpwnam(const char *name) { return getpwnam(name); @@ -932,6 +1067,8 @@ struct passwd *sys_getpwuid(uid_t uid) return getpwuid(uid); } +#endif + struct group *sys_getgrnam(const char *name) { return getgrnam(name); @@ -1417,7 +1554,12 @@ int sys_dup2(int oldfd, int newfd) ssize_t sys_getxattr (const char *path, const char *name, void *value, size_t size) { #if defined(HAVE_GETXATTR) +#ifndef XATTR_ADD_OPT return getxattr(path, name, value, size); +#else + int options = 0; + return getxattr(path, name, value, size, 0, options); +#endif #elif defined(HAVE_GETEA) return getea(path, name, value, size); #elif defined(HAVE_EXTATTR_GET_FILE) @@ -1462,6 +1604,9 @@ ssize_t sys_lgetxattr (const char *path, const char *name, void *value, size_t s { #if defined(HAVE_LGETXATTR) return lgetxattr(path, name, value, size); +#elif defined(HAVE_GETXATTR) && defined(XATTR_ADD_OPT) + int options = XATTR_NOFOLLOW; + return getxattr(path, name, value, size, 0, options); #elif defined(HAVE_LGETEA) return lgetea(path, name, value, size); #elif defined(HAVE_EXTATTR_GET_LINK) @@ -1501,7 +1646,12 @@ ssize_t sys_lgetxattr (const char *path, const char *name, void *value, size_t s ssize_t sys_fgetxattr (int filedes, const char *name, void *value, size_t size) { #if defined(HAVE_FGETXATTR) +#ifndef XATTR_ADD_OPT return fgetxattr(filedes, name, value, size); +#else + int options = 0; + return fgetxattr(filedes, name, value, size, 0, options); +#endif #elif defined(HAVE_FGETEA) return fgetea(filedes, name, value, size); #elif defined(HAVE_EXTATTR_GET_FD) @@ -1702,7 +1852,12 @@ static ssize_t irix_attr_list(const char *path, int filedes, char *list, size_t ssize_t sys_listxattr (const char *path, char *list, size_t size) { #if defined(HAVE_LISTXATTR) +#ifndef XATTR_ADD_OPT return listxattr(path, list, size); +#else + int options = 0; + return listxattr(path, list, size, options); +#endif #elif defined(HAVE_LISTEA) return listea(path, list, size); #elif defined(HAVE_EXTATTR_LIST_FILE) @@ -1721,6 +1876,9 @@ ssize_t sys_llistxattr (const char *path, char *list, size_t size) { #if defined(HAVE_LLISTXATTR) return llistxattr(path, list, size); +#elif defined(HAVE_LISTXATTR) && defined(XATTR_ADD_OPT) + int options = XATTR_NOFOLLOW; + return listxattr(path, list, size, options); #elif defined(HAVE_LLISTEA) return llistea(path, list, size); #elif defined(HAVE_EXTATTR_LIST_LINK) @@ -1738,7 +1896,12 @@ ssize_t sys_llistxattr (const char *path, char *list, size_t size) ssize_t sys_flistxattr (int filedes, char *list, size_t size) { #if defined(HAVE_FLISTXATTR) +#ifndef XATTR_ADD_OPT return flistxattr(filedes, list, size); +#else + int options = 0; + return flistxattr(filedes, list, size, options); +#endif #elif defined(HAVE_FLISTEA) return flistea(filedes, list, size); #elif defined(HAVE_EXTATTR_LIST_FD) @@ -1756,7 +1919,12 @@ ssize_t sys_flistxattr (int filedes, char *list, size_t size) int sys_removexattr (const char *path, const char *name) { #if defined(HAVE_REMOVEXATTR) +#ifndef XATTR_ADD_OPT return removexattr(path, name); +#else + int options = 0; + return removexattr(path, name, options); +#endif #elif defined(HAVE_REMOVEEA) return removeea(path, name); #elif defined(HAVE_EXTATTR_DELETE_FILE) @@ -1783,6 +1951,9 @@ int sys_lremovexattr (const char *path, const char *name) { #if defined(HAVE_LREMOVEXATTR) return lremovexattr(path, name); +#elif defined(HAVE_REMOVEXATTR) && defined(XATTR_ADD_OPT) + int options = XATTR_NOFOLLOW; + return removexattr(path, name, options); #elif defined(HAVE_LREMOVEEA) return lremoveea(path, name); #elif defined(HAVE_EXTATTR_DELETE_LINK) @@ -1808,7 +1979,12 @@ int sys_lremovexattr (const char *path, const char *name) int sys_fremovexattr (int filedes, const char *name) { #if defined(HAVE_FREMOVEXATTR) +#ifndef XATTR_ADD_OPT return fremovexattr(filedes, name); +#else + int options = 0; + return fremovexattr(filedes, name, options); +#endif #elif defined(HAVE_FREMOVEEA) return fremoveea(filedes, name); #elif defined(HAVE_EXTATTR_DELETE_FD) @@ -1839,7 +2015,12 @@ int sys_fremovexattr (int filedes, const char *name) int sys_setxattr (const char *path, const char *name, const void *value, size_t size, int flags) { #if defined(HAVE_SETXATTR) +#ifndef XATTR_ADD_OPT return setxattr(path, name, value, size, flags); +#else + int options = 0; + return setxattr(path, name, value, size, 0, options); +#endif #elif defined(HAVE_SETEA) return setea(path, name, value, size, flags); #elif defined(HAVE_EXTATTR_SET_FILE) @@ -1888,6 +2069,9 @@ int sys_lsetxattr (const char *path, const char *name, const void *value, size_t { #if defined(HAVE_LSETXATTR) return lsetxattr(path, name, value, size, flags); +#elif defined(HAVE_SETXATTR) && defined(XATTR_ADD_OPT) + int options = XATTR_NOFOLLOW; + return setxattr(path, name, value, size, 0, options); #elif defined(LSETEA) return lsetea(path, name, value, size, flags); #elif defined(HAVE_EXTATTR_SET_LINK) @@ -1936,7 +2120,12 @@ int sys_lsetxattr (const char *path, const char *name, const void *value, size_t int sys_fsetxattr (int filedes, const char *name, const void *value, size_t size, int flags) { #if defined(HAVE_FSETXATTR) +#ifndef XATTR_ADD_OPT return fsetxattr(filedes, name, value, size, flags); +#else + int options = 0; + return fsetxattr(filedes, name, value, size, 0, options); +#endif #elif defined(HAVE_FSETEA) return fsetea(filedes, name, value, size, flags); #elif defined(HAVE_EXTATTR_SET_FD) @@ -2164,3 +2353,28 @@ int sys_aio_suspend(const SMB_STRUCT_AIOCB * const cblist[], int n, const struct return -1; } #endif /* WITH_AIO */ + +int sys_getpeereid( int s, uid_t *uid) +{ +#if defined(HAVE_PEERCRED) + struct ucred cred; + socklen_t cred_len = sizeof(struct ucred); + int ret; + + ret = getsockopt(s, SOL_SOCKET, SO_PEERCRED, (void *)&cred, &cred_len); + if (ret != 0) { + return -1; + } + + if (cred_len != sizeof(struct ucred)) { + errno = EINVAL; + return -1; + } + + *uid = cred.uid; + return 0; +#else + errno = ENOSYS; + return -1; +#endif +} |