summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/includes.h13
-rw-r--r--source3/smbwrapper/realcalls.h22
-rw-r--r--source3/smbwrapper/smbw.c109
-rw-r--r--source3/smbwrapper/wrapped.c359
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();
}
+