yet another attempt at making this stuff portable. This time I use
authorAndrew Tridgell <tridge@samba.org>
Wed, 7 Oct 1998 09:57:22 +0000 (09:57 +0000)
committerAndrew Tridgell <tridge@samba.org>
Wed, 7 Oct 1998 09:57:22 +0000 (09:57 +0000)
minimal includes in wrapped.c

source/include/includes.h
source/smbwrapper/realcalls.h
source/smbwrapper/smbw.c
source/smbwrapper/wrapped.c

index c9a5e8b271a01e4621fb600ead7c2a92e2925bba..2c4c09f6752697a86ed03594d6854d4dab98d618 100644 (file)
 #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
index 20055a30ad1d31feade71e40ebe2dd12d4d8959c..1a201895b6da0068fd05fabde2a36ababe951b5c 100644 (file)
    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
 #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
 #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
index 9fd6ebd317a8cf2ce10b0ce1719dceed06eaf6ac..32b785c327454a4e6b6f63ed3c1e99fccc62599f 100644 (file)
@@ -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
index 427075f1fe66ad3c941f0478ffcde624553a00cc..98a62b621933bb2d799218d42154a938a3371cdf 100644 (file)
    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)
 #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
 
 
 #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);
 #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);
 }
        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)
 {
 }
 
 
-#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);
 #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);
 #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);
 #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);
 }
 
 #ifdef real_opendir
DIR *opendir(const char *name)
void *opendir(const char *name)
 {
        if (smbw_path(name)) {
                return smbw_opendir(name);
 #endif
 
 #ifdef real_readdir
struct dirent *readdir(DIR *dir)
void *readdir(void *dir)
 {
        if (smbw_dirp(dir)) {
                return smbw_readdir(dir);
 #endif
 
 #ifdef real_closedir
- int closedir(DIR *dir)
+ int closedir(void *dir)
 {
        if (smbw_dirp(dir)) {
                return smbw_closedir(dir);
 #endif
 
 #ifdef real_telldir
- off_t telldir(DIR *dir)
+ off_t telldir(void *dir)
 {
        if (smbw_dirp(dir)) {
                return smbw_telldir(dir);
 #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();
 }
+