first pass at updating head branch to be to be the same as the SAMBA_2_0 branch
[jra/samba/.git] / source3 / smbwrapper / wrapped.c
index 025bbcc2db8bd947cc0913617d7b98b1980618c4..1b356e6a26defa186dfe58ae7e91e4002329fe9a 100644 (file)
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
+/* NOTE: This file WILL produce compiler warnings. They are unavoidable 
 
-#include "wrapper.h"
+   Do not try and get rid of them by including other include files or
+   by including includes.h or proto.h or you will break portability. 
+  */
 
-#ifdef HAVE__OPEN
-__asm__(".globl _open; _open = open");
-#elif HAVE___OPEN
-__asm__(".globl __open; __open = open");
+#include "config.h"
+#include <sys/types.h>
+#include <errno.h>
+#include "realcalls.h"
+
+#ifndef NULL
+# define NULL ((void *)0)
 #endif
 
- int open(const char *name, int flags, mode_t mode)
+ int open(char *name, int flags, mode_t mode)
 {
        if (smbw_path(name)) {
                return smbw_open(name, flags, mode);
@@ -37,8 +43,21 @@ __asm__(".globl __open; __open = open");
        return real_open(name, flags, mode);
 }
 
+#ifdef HAVE__OPEN
+ int _open(char *name, int flags, mode_t mode) 
+{
+       return open(name, flags, mode);
+}
+#elif HAVE___OPEN
+ int __open(char *name, int flags, mode_t mode) 
+{
+       return open(name, flags, mode);
+}
+#endif
+
+
 #ifdef HAVE_OPEN64
- int open64(const char *name, int flags, mode_t mode)
+ int open64(char *name, int flags, mode_t mode)
 {
        if (smbw_path(name)) {
                return smbw_open(name, flags, mode);
@@ -48,6 +67,20 @@ __asm__(".globl __open; __open = open");
 }
 #endif
 
+#ifndef NO_OPEN64_ALIAS
+#ifdef HAVE__OPEN64
+ int _open64(char *name, int flags, mode_t mode) 
+{
+       return open64(name, flags, mode);
+}
+#elif HAVE___OPEN64
+ int __open64(char *name, int flags, mode_t mode) 
+{
+       return open64(name, flags, mode);
+}
+#endif
+#endif
+
 #ifdef HAVE_PREAD
  ssize_t pread(int fd, void *buf, size_t size, off_t ofs)
 {
@@ -93,57 +126,68 @@ __asm__(".globl __open; __open = open");
 #endif
 
 
-#ifdef HAVE___CHDIR
-__asm__(".globl __chdir; __chdir = chdir");
-#elif HAVE__CHDIR
-__asm__(".globl _chdir; _chdir = chdir");
-#endif
-
- int chdir(const char *name)
+ int chdir(char *name)
 {
        return smbw_chdir(name);
 }
 
-
-
-#ifdef HAVE___CLOSE
-__asm__(".globl __close; __close = close");
-#elif HAVE__CLOSE
-__asm__(".globl _close; _close = close");
+#ifdef HAVE___CHDIR
+ int __chdir(char *name)
+{
+       return chdir(name);
+}
+#elif HAVE__CHDIR
+ int _chdir(char *name)
+{
+       return chdir(name);
+}
 #endif
 
- ssize_t close(int fd)
+
+ int close(int fd)
 {
        if (smbw_fd(fd)) {
                return smbw_close(fd);
        }
+       if (smbw_local_fd(fd)) {
+               errno = EBADF;
+               return -1;
+       }
 
        return real_close(fd);
 }
 
-
-#ifdef HAVE___FCHDIR
-__asm__(".globl __fchdir; __fchdir = fchdir");
-#elif HAVE__FCHDIR
-__asm__(".globl _fchdir; _fchdir = fchdir");
+#ifdef HAVE___CLOSE
+ int __close(int fd)
+{
+       return close(fd);
+}
+#elif HAVE__CLOSE
+ int _close(int fd)
+{
+       return close(fd);
+}
 #endif
 
+
  int fchdir(int fd)
 {
-       if (smbw_fd(fd)) {
-               return smbw_fchdir(fd);
-       }
-
-       return real_fchdir(fd);
+       return smbw_fchdir(fd);
 }
 
-
-#ifdef HAVE___FCNTL
-__asm__(".globl __fcntl; __fcntl = fcntl");
-#elif HAVE__FCNTL
-__asm__(".globl _fcntl; _fcntl = fcntl");
+#ifdef HAVE___FCHDIR
+ int __fchdir(int fd)
+{
+       return fchdir(fd);
+}
+#elif HAVE__FCHDIR
+ int _fchdir(int fd)
+{
+       return fchdir(fd);
+}
 #endif
 
+
  int fcntl(int fd, int cmd, long arg)
 {
        if (smbw_fd(fd)) {
@@ -154,14 +198,22 @@ __asm__(".globl _fcntl; _fcntl = fcntl");
 }
 
 
-
-#ifdef HAVE___GETDENTS
-__asm__(".globl __getdents; __getdents = getdents");
-#elif HAVE__GETDENTS
-__asm__(".globl _getdents; _getdents = getdents");
+#ifdef HAVE___FCNTL
+ int __fcntl(int fd, int cmd, long arg)
+{
+       return fcntl(fd, cmd, arg);
+}
+#elif HAVE__FCNTL
+ int _fcntl(int fd, int cmd, long arg)
+{
+       return fcntl(fd, cmd, arg);
+}
 #endif
 
- int getdents(int fd, struct dirent *dirp, unsigned int count)
+
+
+#ifdef real_getdents
+ int getdents(int fd, void *dirp, unsigned int count)
 {
        if (smbw_fd(fd)) {
                return smbw_getdents(fd, dirp, count);
@@ -169,15 +221,22 @@ __asm__(".globl _getdents; _getdents = getdents");
 
        return real_getdents(fd, dirp, count);
 }
+#endif
 
-
-#ifdef HAVE___LSEEK
-__asm__(".globl __lseek; __lseek = lseek");
-#elif HAVE__LSEEK
-__asm__(".globl _lseek; _lseek = lseek");
+#ifdef HAVE___GETDENTS
+ int __getdents(int fd, void *dirp, unsigned int count)
+{
+       return getdents(fd, dirp, count);
+}
+#elif HAVE__GETDENTS
+ int _getdents(int fd, void *dirp, unsigned int count)
+{
+       return getdents(fd, dirp, count);
+}
 #endif
 
- ssize_t lseek(int fd, off_t offset, int whence)
+
+ off_t lseek(int fd, off_t offset, int whence)
 {
        if (smbw_fd(fd)) {
                return smbw_lseek(fd, offset, whence);
@@ -186,14 +245,19 @@ __asm__(".globl _lseek; _lseek = lseek");
        return real_lseek(fd, offset, whence);
 }
 
-
-
-#ifdef HAVE___READ
-__asm__(".globl __read; __read = read");
-#elif HAVE__READ
-__asm__(".globl _read; _read = read");
+#ifdef HAVE___LSEEK
+ off_t __lseek(int fd, off_t offset, int whence)
+{
+       return lseek(fd, offset, whence);
+}
+#elif HAVE__LSEEK
+ off_t _lseek(int fd, off_t offset, int whence)
+{
+       return lseek(fd, offset, whence);
+}
 #endif
 
+
  ssize_t read(int fd, void *buf, size_t count)
 {
        if (smbw_fd(fd)) {
@@ -203,13 +267,19 @@ __asm__(".globl _read; _read = read");
        return real_read(fd, buf, count);
 }
 
-
-#ifdef HAVE___WRITE
-__asm__(".globl __write; __write = write");
-#elif HAVE__WRITE
-__asm__(".globl _write; _write = write");
+#ifdef HAVE___READ
+ ssize_t __read(int fd, void *buf, size_t count)
+{
+       return read(fd, buf, count);
+}
+#elif HAVE__READ
+ ssize_t _read(int fd, void *buf, size_t count)
+{
+       return read(fd, buf, count);
+}
 #endif
 
+
  ssize_t write(int fd, void *buf, size_t count)
 {
        if (smbw_fd(fd)) {
@@ -219,8 +289,21 @@ __asm__(".globl _write; _write = write");
        return real_write(fd, buf, count);
 }
 
+#ifdef HAVE___WRITE
+ ssize_t __write(int fd, void *buf, size_t count)
+{
+       return write(fd, buf, count);
+}
+#elif HAVE__WRITE
+ ssize_t _write(int fd, void *buf, size_t count)
+{
+       return write(fd, buf, count);
+}
+#endif
 
- int access(const char *name, int mode)
+
+
+ int access(char *name, int mode)
 {
        if (smbw_path(name)) {
                return smbw_access(name, mode);
@@ -231,7 +314,7 @@ __asm__(".globl _write; _write = write");
 
 
 
- int chmod(const char *name,mode_t mode)
+ int chmod(char *name,mode_t mode)
 {
        if (smbw_path(name)) {
                return smbw_chmod(name, mode);
@@ -242,7 +325,7 @@ __asm__(".globl _write; _write = write");
 
 
 
- int chown(const char *name,uid_t owner, gid_t group)
+ int chown(char *name,uid_t owner, gid_t group)
 {
        if (smbw_path(name)) {
                return smbw_chown(name, owner, group);
@@ -251,220 +334,79 @@ __asm__(".globl _write; _write = write");
        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);
-       }
+ char *getcwd(char *buf, size_t size)
+{
+       return (char *)smbw_getcwd(buf, size);
+}
 
-       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;
+ int mkdir(char *name, mode_t mode)
+{
+       if (smbw_path(name)) {
+               return smbw_mkdir(name, mode);
        }
-}
-#endif
-
 
- char *getcwd(char *buf, size_t size)
-{
-       return smbw_getcwd(buf, size);
+       return real_mkdir(name, mode);
 }
 
 
-#ifdef LINUX
- int __lxstat(int vers, const char *name, struct stat *st)
+#if HAVE___FXSTAT
+ int __fxstat(int vers, int fd, void *st)
 {
-       struct kernel_stat kbuf;
+       double xx[32];
        int ret;
 
-       if (smbw_path(name)) {
-               return smbw_stat(name, st);
+       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_lstat(name, (struct kernel_stat *)st);
-               break;
-
-       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;
-
-       default:
-               errno = EINVAL;
-               return -1;
-       }
+       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)
 {
+       double 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;
+       double 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(char *name, void *st)
 {
 #if HAVE___XSTAT
-       return __xstat(_STAT_VER, name, st);
+       return __xstat(0, name, st);
 #else
        if (smbw_path(name)) {
                return smbw_stat(name, st);
@@ -473,10 +415,10 @@ __asm__(".globl _write; _write = write");
 #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);
@@ -485,10 +427,10 @@ __asm__(".globl _write; _write = write");
 #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);
@@ -498,7 +440,7 @@ __asm__(".globl _write; _write = write");
 }
 
 
- int unlink(const char *name)
+ int unlink(char *name)
 {
        if (smbw_path(name)) {
                return smbw_unlink(name);
@@ -508,7 +450,8 @@ __asm__(".globl _write; _write = write");
 }
 
 
- int utime(const char *name,void *tvp)
+#ifdef HAVE_UTIME
+ int utime(char *name,void *tvp)
 {
        if (smbw_path(name)) {
                return smbw_utime(name, tvp);
@@ -516,6 +459,18 @@ __asm__(".globl _write; _write = write");
 
        return real_utime(name, tvp);
 }
+#endif
+
+#ifdef HAVE_UTIMES
+ int utimes(char *name,void *tvp)
+{
+       if (smbw_path(name)) {
+               return smbw_utimes(name, tvp);
+       }
+
+       return real_utimes(name, tvp);
+}
+#endif
 
  int readlink(char *path, char *buf, size_t bufsize)
 {
@@ -527,7 +482,7 @@ __asm__(".globl _write; _write = write");
 }
 
 
- int rename(const char *oldname,const char *newname)
+ int rename(char *oldname,char *newname)
 {
        int p1, p2;
        p1 = smbw_path(oldname); 
@@ -544,7 +499,7 @@ __asm__(".globl _write; _write = write");
        return real_rename(oldname, newname);
 }
 
- int rmdir(const char *name)
+ int rmdir(char *name)
 {
        if (smbw_path(name)) {
                return smbw_rmdir(name);
@@ -554,7 +509,7 @@ __asm__(".globl _write; _write = write");
 }
 
 
- int symlink(const char *topath,const char *frompath)
+ int symlink(char *topath,char *frompath)
 {
        int p1, p2;
        p1 = smbw_path(topath); 
@@ -590,26 +545,30 @@ __asm__(".globl _write; _write = write");
        return real_dup2(oldfd, newfd);
 }
 
- DIR *opendir(const char *name)
+#ifdef real_opendir
+ void *opendir(char *name)
 {
-       DIR *ret;
        if (smbw_path(name)) {
-               return smbw_opendir(name);
+               return (void *)smbw_opendir(name);
        }
 
-       return real_opendir(name);
+       return (void *)real_opendir(name);
 }
+#endif
 
- struct dirent *readdir(DIR *dir)
+#ifdef real_readdir
+ void *readdir(void *dir)
 {
        if (smbw_dirp(dir)) {
-               return smbw_readdir(dir);
+               return (void *)smbw_readdir(dir);
        }
 
-       return real_readdir(dir);
+       return (void *)real_readdir(dir);
 }
+#endif
 
- int closedir(DIR *dir)
+#ifdef real_closedir
+ int closedir(void *dir)
 {
        if (smbw_dirp(dir)) {
                return smbw_closedir(dir);
@@ -617,9 +576,10 @@ __asm__(".globl _write; _write = write");
 
        return real_closedir(dir);
 }
+#endif
 
-#ifndef NO_TELLDIR_WRAPPER
- off_t telldir(DIR *dir)
+#ifdef real_telldir
+ off_t telldir(void *dir)
 {
        if (smbw_dirp(dir)) {
                return smbw_telldir(dir);
@@ -629,113 +589,85 @@ __asm__(".globl _write; _write = write");
 }
 #endif
 
-#ifndef NO_SEEKDIR_WRAPPER
void seekdir(DIR *dir, off_t offset)
+#ifdef real_seekdir
int seekdir(void *dir, off_t offset)
 {
        if (smbw_dirp(dir)) {
                smbw_seekdir(dir, offset);
-               return;
+               return 0;
        }
 
        real_seekdir(dir, offset);
+       return 0;
 }
 #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)
+ int  facl(int fd,  int  cmd,  int  nentries, void *aclbufp)
 {
        if (smbw_fd(fd)) {
-               switch (cmd) {
-               case GETACL:
-               case GETACLCNT:
-                       return 0;
-               default:
-                       errno = ENOSYS;
-                       return -1;
-               }
+               return smbw_facl(fd, cmd, nentries, aclbufp);
        }
 
-       real_facl(fd, cmd, nentries, aclbufp);
+       return real_facl(fd, cmd, nentries, aclbufp);
 }
 #endif
 
-#ifndef LINUX
- int creat(const char *path, mode_t mode)
+ int creat(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);
 }
 
- int creat64(const char *path, mode_t mode)
+#ifdef HAVE_CREAT64
+ int creat64(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(char *name, void *st64)
 {
        if (smbw_path(name)) {
-               struct stat st;
-               int ret = stat(name, &st);
-               stat64_convert(&st, st64);
+               double 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);
+               double 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(char *name, void *st64)
 {
        if (smbw_path(name)) {
-               struct stat st;
-               int ret = lstat(name, &st);
-               stat64_convert(&st, st64);
+               double xx[32];
+               int ret = lstat(name, xx);
+               stat64_convert(xx, st64);
                return ret;
        }
        return real_lstat64(name, st64);
@@ -753,27 +685,22 @@ 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;
-               d = readdir(dir);
+               static double xx[70];
+               void *d;
+               d = (void *)readdir(dir);
                if (!d) return NULL;
-               dirent64_convert(d, &dbuf.d64);
-               return &dbuf.d64;
+               dirent64_convert(d, xx);
+               return xx;
        }
-       return real_readdir64(dir);
+       return (void *)real_readdir64(dir);
 }
 #endif
+
+ int fork(void)
+{
+       return smbw_fork();
+}
+