diff options
-rw-r--r-- | source3/include/includes.h | 13 | ||||
-rw-r--r-- | source3/smbwrapper/realcalls.h | 22 | ||||
-rw-r--r-- | source3/smbwrapper/smbw.c | 109 | ||||
-rw-r--r-- | source3/smbwrapper/wrapped.c | 359 |
4 files changed, 206 insertions, 297 deletions
diff --git a/source3/include/includes.h b/source3/include/includes.h index c9a5e8b271..2c4c09f675 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -25,19 +25,6 @@ #include "config.h" #endif -#ifdef NO_PROTO -/* get rid of prototypes for smbwrapper */ -#define _NO_PROTO - -#ifdef HAVE_SYS_CDEFS_H -#include <sys/cdefs.h> -#ifdef __P -#undef __P -#define __P(x) () -#endif -#endif -#endif - #include "local.h" #ifdef AIX diff --git a/source3/smbwrapper/realcalls.h b/source3/smbwrapper/realcalls.h index 20055a30ad..1a201895b6 100644 --- a/source3/smbwrapper/realcalls.h +++ b/source3/smbwrapper/realcalls.h @@ -19,6 +19,12 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#if HAVE_SYS_SYSCALL_H +#include <sys/syscall.h> +#elif HAVE_SYSCALL_H +#include <syscall.h> +#endif + #ifdef IRIX /* amazingly, IRIX gets its own syscall numbers wrong! */ #ifdef SYSVoffset @@ -63,19 +69,19 @@ #endif #ifdef HAVE__OPENDIR -#define real_opendir(fn) ((DIR *)_opendir(fn)) +#define real_opendir(fn) (_opendir(fn)) #elif SYS_opendir -#define real_opendir(fn) ((DIR *)syscall(SYS_opendir,(fn))) +#define real_opendir(fn) (syscall(SYS_opendir,(fn))) #elif HAVE___OPENDIR -#define real_opendir(fn) ((DIR *)__opendir(fn)) +#define real_opendir(fn) (__opendir(fn)) #endif #ifdef HAVE__READDIR -#define real_readdir(d) ((struct dirent *)_readdir(d)) +#define real_readdir(d) (_readdir(d)) #elif HAVE___READDIR -#define real_readdir(d) ((struct dirent *)__readdir(d)) +#define real_readdir(d) (__readdir(d)) #elif SYS_readdir -#define real_readdir(d) ((struct dirent *)syscall(SYS_readdir,(d))) +#define real_readdir(d) (syscall(SYS_readdir,(d))) #endif #ifdef HAVE__CLOSEDIR @@ -192,9 +198,9 @@ #endif #ifdef HAVE__READDIR64 -#define real_readdir64(d) ((struct dirent64 *)_readdir64(d)) +#define real_readdir64(d) (_readdir64(d)) #elif HAVE___READDIR64 -#define real_readdir64(d) ((struct dirent64 *)__readdir64(d)) +#define real_readdir64(d) (__readdir64(d)) #endif #ifdef HAVE__LLSEEK diff --git a/source3/smbwrapper/smbw.c b/source3/smbwrapper/smbw.c index 9fd6ebd317..32b785c327 100644 --- a/source3/smbwrapper/smbw.c +++ b/source3/smbwrapper/smbw.c @@ -35,6 +35,9 @@ fstring smbw_prefix = SMBW_PREFIX; int smbw_busy=0; +/* needs to be here because of dumb include files on some systems */ +int creat_bits = O_WRONLY|O_CREAT|O_TRUNC; + /***************************************************** initialise structures *******************************************************/ @@ -1322,3 +1325,109 @@ int smbw_fork(void) /* and continue in the child */ return 0; } + +#ifdef HAVE_ACL +/***************************************************** +say no to acls +*******************************************************/ +int smbw_acl(const char *pathp, int cmd, int nentries, aclent_t *aclbufp) +{ + if (cmd == GETACL || cmd == GETACLCNT) return 0; + errno = ENOSYS; + return -1; +} +#endif + +#ifdef HAVE_FACL +/***************************************************** +say no to acls +*******************************************************/ +int smbw_facl(int fd, int cmd, int nentries, aclent_t *aclbufp) +{ + if (cmd == GETACL || cmd == GETACLCNT) return 0; + errno = ENOSYS; + return -1; +} +#endif + + +#ifdef HAVE_STAT64 +/* this can't be in wrapped.c because of include conflicts */ +void stat64_convert(struct stat *st, struct stat64 *st64) +{ + st64->st_size = st->st_size; + st64->st_mode = st->st_mode; + st64->st_ino = st->st_ino; + st64->st_dev = st->st_dev; + st64->st_rdev = st->st_rdev; + st64->st_nlink = st->st_nlink; + st64->st_uid = st->st_uid; + st64->st_gid = st->st_gid; + st64->st_atime = st->st_atime; + st64->st_mtime = st->st_mtime; + st64->st_ctime = st->st_ctime; + st64->st_blksize = st->st_blksize; + st64->st_blocks = st->st_blocks; +} +#endif + +#ifdef HAVE_READDIR64 +void dirent64_convert(struct dirent *d, struct dirent64 *d64) +{ + d64->d_ino = d->d_ino; + d64->d_off = d->d_off; + d64->d_reclen = d->d_reclen; + pstrcpy(d64->d_name, d->d_name); +} +#endif + + +#ifdef HAVE___XSTAT +/* Definition of `struct stat' used in the linux kernel.. */ +struct kernel_stat { + unsigned short int st_dev; + unsigned short int __pad1; + unsigned long int st_ino; + unsigned short int st_mode; + unsigned short int st_nlink; + unsigned short int st_uid; + unsigned short int st_gid; + unsigned short int st_rdev; + unsigned short int __pad2; + unsigned long int st_size; + unsigned long int st_blksize; + unsigned long int st_blocks; + unsigned long int st_atime; + unsigned long int __unused1; + unsigned long int st_mtime; + unsigned long int __unused2; + unsigned long int st_ctime; + unsigned long int __unused3; + unsigned long int __unused4; + unsigned long int __unused5; +}; + +void xstat_convert(int vers, struct stat *st, struct kernel_stat *kbuf) +{ + if (vers == _STAT_VER_LINUX_OLD) { + memcpy(st, kbuf, sizeof(*st)); + return; + } + + ZERO_STRUCTP(st); + + st->st_dev = kbuf->st_dev; + st->st_ino = kbuf->st_ino; + st->st_mode = kbuf->st_mode; + st->st_nlink = kbuf->st_nlink; + st->st_uid = kbuf->st_uid; + st->st_gid = kbuf->st_gid; + st->st_rdev = kbuf->st_rdev; + st->st_size = kbuf->st_size; + st->st_blksize = kbuf->st_blksize; + st->st_blocks = kbuf->st_blocks; + st->st_atime = kbuf->st_atime; + st->st_mtime = kbuf->st_mtime; + st->st_ctime = kbuf->st_ctime; +} +#endif diff --git a/source3/smbwrapper/wrapped.c b/source3/smbwrapper/wrapped.c index 427075f1fe..98a62b6219 100644 --- a/source3/smbwrapper/wrapped.c +++ b/source3/smbwrapper/wrapped.c @@ -19,15 +19,11 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +/* NOTE: This file WILL produce compiler warnings. They are unavoidable */ -/* we don't want prototypes for this code */ -#define NO_PROTO - -#include "includes.h" - -#ifdef LINUX -#include "kernel_stat.h" -#endif +#include "config.h" +#include <sys/types.h> +#include <errno.h> #include "realcalls.h" int open(const char *name, int flags, mode_t mode) @@ -67,12 +63,12 @@ #ifdef HAVE__OPEN64 int _open64(const char *name, int flags, mode_t mode) { - return open64(name, flags, mode); + return open64(name, flags, mode); } #elif HAVE___OPEN64 int __open64(const char *name, int flags, mode_t mode) { - return open64(name, flags, mode); + return open64(name, flags, mode); } #endif #endif @@ -209,7 +205,7 @@ #ifdef real_getdents - int getdents(int fd, struct dirent *dirp, unsigned int count) + int getdents(int fd, void *dirp, unsigned int count) { if (smbw_fd(fd)) { return smbw_getdents(fd, dirp, count); @@ -220,12 +216,12 @@ #endif #ifdef HAVE___GETDENTS - int __getdents(int fd, struct dirent *dirp, unsigned int count) + int __getdents(int fd, void *dirp, unsigned int count) { return getdents(fd, dirp, count); } #elif HAVE__GETDENTS - int _getdents(int fd, struct dirent *dirp, unsigned int count) + int _getdents(int fd, void *dirp, unsigned int count) { return getdents(fd, dirp, count); } @@ -330,70 +326,6 @@ return real_chown(name, owner, group); } -#ifdef LINUX - int __fxstat(int vers, int fd, struct stat *st) -{ - struct kernel_stat kbuf; - int ret; - - if (smbw_fd(fd)) { - return smbw_fstat(fd, st); - } - - switch (vers) { - case _STAT_VER_LINUX_OLD: - /* Nothing to do. The struct is in the form the kernel expects - it to be. */ - return real_fstat(fd, (struct kernel_stat *)st); - break; - - case _STAT_VER_LINUX: - /* Do the system call. */ - ret = real_fstat(fd, &kbuf); - - st->st_dev = kbuf.st_dev; -#ifdef _HAVE___PAD1 - st->__pad1 = 0; -#endif - st->st_ino = kbuf.st_ino; - st->st_mode = kbuf.st_mode; - st->st_nlink = kbuf.st_nlink; - st->st_uid = kbuf.st_uid; - st->st_gid = kbuf.st_gid; - st->st_rdev = kbuf.st_rdev; -#ifdef _HAVE___PAD2 - st->__pad2 = 0; -#endif - st->st_size = kbuf.st_size; - st->st_blksize = kbuf.st_blksize; - st->st_blocks = kbuf.st_blocks; - st->st_atime = kbuf.st_atime; -#ifdef _HAVE___UNUSED1 - st->__unused1 = 0; -#endif - st->st_mtime = kbuf.st_mtime; -#ifdef _HAVE___UNUSED2 - st->__unused2 = 0; -#endif - st->st_ctime = kbuf.st_ctime; -#ifdef _HAVE___UNUSED3 - st->__unused3 = 0; -#endif -#ifdef _HAVE___UNUSED4 - st->__unused4 = 0; -#endif -#ifdef _HAVE___UNUSED5 - st->__unused5 = 0; -#endif - return ret; - - default: - errno = EINVAL; - return -1; - } -} -#endif - char *getcwd(char *buf, size_t size) { @@ -401,149 +333,72 @@ } -#ifdef LINUX - int __lxstat(int vers, const char *name, struct stat *st) -{ - struct kernel_stat kbuf; - int ret; + + int mkdir(const char *name, mode_t mode) +{ if (smbw_path(name)) { - return smbw_stat(name, st); + return smbw_mkdir(name, mode); } - switch (vers) { - case _STAT_VER_LINUX_OLD: - /* Nothing to do. The struct is in the form the kernel expects - it to be. */ - return real_lstat(name, (struct kernel_stat *)st); - break; + return real_mkdir(name, mode); +} - case _STAT_VER_LINUX: - /* Do the system call. */ - ret = real_lstat(name, &kbuf); - st->st_dev = kbuf.st_dev; -#ifdef _HAVE___PAD1 - st->__pad1 = 0; -#endif - st->st_ino = kbuf.st_ino; - st->st_mode = kbuf.st_mode; - st->st_nlink = kbuf.st_nlink; - st->st_uid = kbuf.st_uid; - st->st_gid = kbuf.st_gid; - st->st_rdev = kbuf.st_rdev; -#ifdef _HAVE___PAD2 - st->__pad2 = 0; -#endif - st->st_size = kbuf.st_size; - st->st_blksize = kbuf.st_blksize; - st->st_blocks = kbuf.st_blocks; - st->st_atime = kbuf.st_atime; -#ifdef _HAVE___UNUSED1 - st->__unused1 = 0; -#endif - st->st_mtime = kbuf.st_mtime; -#ifdef _HAVE___UNUSED2 - st->__unused2 = 0; -#endif - st->st_ctime = kbuf.st_ctime; -#ifdef _HAVE___UNUSED3 - st->__unused3 = 0; -#endif -#ifdef _HAVE___UNUSED4 - st->__unused4 = 0; -#endif -#ifdef _HAVE___UNUSED5 - st->__unused5 = 0; -#endif - return ret; +#if HAVE___FXSTAT + int __fxstat(int vers, int fd, void *st) +{ + long xx[32]; + int ret; - default: - errno = EINVAL; - return -1; + if (smbw_fd(fd)) { + return smbw_fstat(fd, st); } + + ret = real_fstat(fd, xx); + xstat_convert(vers, st, xx); + return ret; } #endif - - int mkdir(const char *name, mode_t mode) +#if HAVE___XSTAT + int __xstat(int vers, char *name, void *st) { + long xx[32]; + int ret; + if (smbw_path(name)) { - return smbw_mkdir(name, mode); + return smbw_stat(name, st); } - return real_mkdir(name, mode); + ret = real_stat(name, xx); + xstat_convert(vers, st, xx); + return ret; } +#endif -#ifdef LINUX - int __xstat(int vers, const char *name, struct stat *st) +#if HAVE___LXSTAT + int __lxstat(int vers, char *name, void *st) { - struct kernel_stat kbuf; + long xx[32]; int ret; if (smbw_path(name)) { return smbw_stat(name, st); } - switch (vers) { - case _STAT_VER_LINUX_OLD: - /* Nothing to do. The struct is in the form the kernel expects - it to be. */ - return real_stat(name, (struct kernel_stat *)st); - break; - - case _STAT_VER_LINUX: - /* Do the system call. */ - ret = real_stat(name, &kbuf); - - st->st_dev = kbuf.st_dev; -#ifdef _HAVE___PAD1 - st->__pad1 = 0; -#endif - st->st_ino = kbuf.st_ino; - st->st_mode = kbuf.st_mode; - st->st_nlink = kbuf.st_nlink; - st->st_uid = kbuf.st_uid; - st->st_gid = kbuf.st_gid; - st->st_rdev = kbuf.st_rdev; -#ifdef _HAVE___PAD2 - st->__pad2 = 0; -#endif - st->st_size = kbuf.st_size; - st->st_blksize = kbuf.st_blksize; - st->st_blocks = kbuf.st_blocks; - st->st_atime = kbuf.st_atime; -#ifdef _HAVE___UNUSED1 - st->__unused1 = 0; -#endif - st->st_mtime = kbuf.st_mtime; -#ifdef _HAVE___UNUSED2 - st->__unused2 = 0; -#endif - st->st_ctime = kbuf.st_ctime; -#ifdef _HAVE___UNUSED3 - st->__unused3 = 0; -#endif -#ifdef _HAVE___UNUSED4 - st->__unused4 = 0; -#endif -#ifdef _HAVE___UNUSED5 - st->__unused5 = 0; -#endif - return ret; - - default: - errno = EINVAL; - return -1; - } + ret = real_lstat(name, xx); + xstat_convert(vers, st, xx); + return ret; } #endif - int stat(const char *name, struct stat *st) + + int stat(const char *name, void *st) { #if HAVE___XSTAT - return __xstat(_STAT_VER, name, st); + return xstat(name, st); #else if (smbw_path(name)) { return smbw_stat(name, st); @@ -552,10 +407,10 @@ #endif } - int lstat(const char *name, struct stat *st) + int lstat(char *name, void *st) { #if HAVE___LXSTAT - return __lxstat(_STAT_VER, name, st); + return __lxstat(0, name, st); #else if (smbw_path(name)) { return smbw_stat(name, st); @@ -564,10 +419,10 @@ #endif } - int fstat(int fd, struct stat *st) + int fstat(int fd, void *st) { #if HAVE___LXSTAT - return __fxstat(_STAT_VER, fd, st); + return __fxstat(0, fd, st); #else if (smbw_fd(fd)) { return smbw_fstat(fd, st); @@ -599,7 +454,7 @@ #endif #ifdef HAVE_UTIMES - int utimes(const char *name,const struct timeval tvp[2]) + int utimes(const char *name,void *tvp) { if (smbw_path(name)) { return smbw_utimes(name, tvp); @@ -683,7 +538,7 @@ } #ifdef real_opendir - DIR *opendir(const char *name) + void *opendir(const char *name) { if (smbw_path(name)) { return smbw_opendir(name); @@ -694,7 +549,7 @@ #endif #ifdef real_readdir - struct dirent *readdir(DIR *dir) + void *readdir(void *dir) { if (smbw_dirp(dir)) { return smbw_readdir(dir); @@ -705,7 +560,7 @@ #endif #ifdef real_closedir - int closedir(DIR *dir) + int closedir(void *dir) { if (smbw_dirp(dir)) { return smbw_closedir(dir); @@ -716,7 +571,7 @@ #endif #ifdef real_telldir - off_t telldir(DIR *dir) + off_t telldir(void *dir) { if (smbw_dirp(dir)) { return smbw_telldir(dir); @@ -727,121 +582,84 @@ #endif #ifdef real_seekdir -#if SEEKDIR_RETURNS_VOID - void -#else - int -#endif -seekdir(DIR *dir, off_t offset) + int seekdir(void *dir, off_t offset) { if (smbw_dirp(dir)) { smbw_seekdir(dir, offset); - goto done; + return 0; } real_seekdir(dir, offset); - done: -#ifndef SEEKDIR_RETURNS_VOID return 0; -#endif } #endif #ifndef NO_ACL_WRAPPER - int acl(const char *pathp, int cmd, int nentries, aclent_t *aclbufp) + int acl(char *pathp, int cmd, int nentries, void *aclbufp) { if (smbw_path(pathp)) { - switch (cmd) { - case GETACL: - case GETACLCNT: - return 0; - default: - errno = ENOSYS; - return -1; - } + return smbw_acl(pathp, cmd, nentries, aclbufp); } - real_acl(pathp, cmd, nentries, aclbufp); + return real_acl(pathp, cmd, nentries, aclbufp); } #endif #ifndef NO_FACL_WRAPPER int facl(int fd, int cmd, int nentries, aclent_t *aclbufp) { - if (smbw_fd(fd)) { - switch (cmd) { - case GETACL: - case GETACLCNT: - return 0; - default: - errno = ENOSYS; - return -1; - } + if (smbw_path(pathp)) { + return smbw_facl(fd, cmd, nentries, aclbufp); } - real_facl(fd, cmd, nentries, aclbufp); + return real_facl(fd, cmd, nentries, aclbufp); } #endif int creat(const char *path, mode_t mode) { - return open(path, O_WRONLY|O_CREAT|O_TRUNC, mode); + extern int creat_bits; + return open(path, creat_bits, mode); } #ifdef HAVE_CREAT64 int creat64(const char *path, mode_t mode) { - return open64(path, O_WRONLY|O_CREAT|O_TRUNC, mode); + extern int creat_bits; + return open64(path, creat_bits, mode); } #endif #ifdef HAVE_STAT64 -static void stat64_convert(struct stat *st, struct stat64 *st64) -{ - st64->st_size = st->st_size; - st64->st_mode = st->st_mode; - st64->st_ino = st->st_ino; - st64->st_dev = st->st_dev; - st64->st_rdev = st->st_rdev; - st64->st_nlink = st->st_nlink; - st64->st_uid = st->st_uid; - st64->st_gid = st->st_gid; - st64->st_atime = st->st_atime; - st64->st_mtime = st->st_mtime; - st64->st_ctime = st->st_ctime; - st64->st_blksize = st->st_blksize; - st64->st_blocks = st->st_blocks; -} - - int stat64(const char *name, struct stat64 *st64) + int stat64(const char *name, void *st64) { if (smbw_path(name)) { - struct stat st; - int ret = stat(name, &st); - stat64_convert(&st, st64); + long xx[32]; + int ret = stat(name, xx); + stat64_convert(xx, st64); return ret; } return real_stat64(name, st64); } - int fstat64(int fd, struct stat64 *st64) + int fstat64(int fd, void *st64) { if (smbw_fd(fd)) { - struct stat st; - int ret = fstat(fd, &st); - stat64_convert(&st, st64); + long xx[32]; + int ret = fstat(fd, xx); + stat64_convert(xx, st64); return ret; } return real_fstat64(fd, st64); } - int lstat64(const char *name, struct stat64 *st64) + int lstat64(const char *name, void *st64) { if (smbw_path(name)) { - struct stat st; - int ret = lstat(name, &st); - stat64_convert(&st, st64); + long xx[32]; + int ret = lstat(name, xx); + stat64_convert(xx, st64); return ret; } return real_lstat64(name, st64); @@ -859,26 +677,14 @@ static void stat64_convert(struct stat *st, struct stat64 *st64) #endif #ifdef HAVE_READDIR64 -static void dirent64_convert(struct dirent *d, struct dirent64 *d64) -{ - d64->d_ino = d->d_ino; - d64->d_off = d->d_off; - d64->d_reclen = d->d_reclen; - strcpy(d64->d_name, d->d_name); -} - - struct dirent64 *readdir64(DIR *dir) + void *readdir64(void *dir) { if (smbw_dirp(dir)) { - struct dirent *d; - static union { - char buf[DIRP_SIZE]; - struct dirent64 d64; - } dbuf; + static long xx[70]; d = readdir(dir); if (!d) return NULL; - dirent64_convert(d, &dbuf.d64); - return &dbuf.d64; + dirent64_convert(d, xx); + return xx; } return real_readdir64(dir); } @@ -888,3 +694,4 @@ static void dirent64_convert(struct dirent *d, struct dirent64 *d64) { return smbw_fork(); } + |