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 linux
-__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);
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 linux
-__asm__(".globl __chdir; __chdir = chdir");
+#ifdef HAVE_OPEN64
+ int open64(char *name, int flags, mode_t mode)
+{
+ if (smbw_path(name)) {
+ return smbw_open(name, flags, mode);
+ }
+
+ return real_open64(name, flags, mode);
+}
#endif
- int chdir(const char *name)
+#ifndef NO_OPEN64_ALIAS
+#ifdef HAVE__OPEN64
+ int _open64(char *name, int flags, mode_t mode)
{
- return smbw_chdir(name);
+ 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)
+{
+ if (smbw_fd(fd)) {
+ return smbw_pread(fd, buf, size, ofs);
+ }
+ return real_pread(fd, buf, size, ofs);
+}
+#endif
-#ifdef linux
-__asm__(".globl __close; __close = close");
+#ifdef HAVE_PREAD64
+ ssize_t pread64(int fd, void *buf, size_t size, off64_t ofs)
+{
+ if (smbw_fd(fd)) {
+ return smbw_pread(fd, buf, size, ofs);
+ }
+
+ return real_pread64(fd, buf, size, ofs);
+}
#endif
- ssize_t close(int fd)
+#ifdef HAVE_PWRITE
+ ssize_t pwrite(int fd, void *buf, size_t size, off_t ofs)
{
if (smbw_fd(fd)) {
- return smbw_close(fd);
+ return smbw_pwrite(fd, buf, size, ofs);
}
- return real_close(fd);
+ return real_pwrite(fd, buf, size, ofs);
}
+#endif
+#ifdef HAVE_PWRITE64
+ ssize_t pwrite64(int fd, void *buf, size_t size, off64_t ofs)
+{
+ if (smbw_fd(fd)) {
+ return smbw_pwrite(fd, buf, size, ofs);
+ }
-#ifdef linux
-__asm__(".globl __fchdir; __fchdir = fchdir");
+ return real_pwrite64(fd, buf, size, ofs);
+}
#endif
- int fchdir(int fd)
+
+ int chdir(char *name)
+{
+ return smbw_chdir(name);
+}
+
+#ifdef HAVE___CHDIR
+ int __chdir(char *name)
+{
+ return chdir(name);
+}
+#elif HAVE__CHDIR
+ int _chdir(char *name)
+{
+ return chdir(name);
+}
+#endif
+
+
+ int close(int fd)
{
if (smbw_fd(fd)) {
- return smbw_fchdir(fd);
+ return smbw_close(fd);
+ }
+ if (smbw_local_fd(fd)) {
+ errno = EBADF;
+ return -1;
}
- return real_fchdir(fd);
+ return real_close(fd);
}
+#ifdef HAVE___CLOSE
+ int __close(int fd)
+{
+ return close(fd);
+}
+#elif HAVE__CLOSE
+ int _close(int fd)
+{
+ return close(fd);
+}
+#endif
+
-#ifdef linux
-__asm__(".globl __fcntl; __fcntl = fcntl");
+ int fchdir(int fd)
+{
+ return smbw_fchdir(fd);
+}
+
+#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)) {
}
-
-#ifdef linux
-__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(unsigned 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);
return real_getdents(fd, dirp, count);
}
+#endif
-
-#ifdef linux
-__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);
return real_lseek(fd, offset, whence);
}
-
-
-#ifdef linux
-__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)) {
return real_read(fd, buf, count);
}
-
-#ifdef linux
-__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)) {
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);
- int chmod(const char *name,mode_t mode)
+ int chmod(char *name,mode_t mode)
{
if (smbw_path(name)) {
return smbw_chmod(name, mode);
- 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);
return real_chown(name, owner, group);
}
- int closedir(DIR *dir)
+
+ char *getcwd(char *buf, size_t size)
+{
+ return (char *)smbw_getcwd(buf, size);
+}
+
+
+
+
+ int mkdir(char *name, mode_t mode)
{
- if (smbw_dirp(dir)) {
- return smbw_closedir(dir);
+ if (smbw_path(name)) {
+ return smbw_mkdir(name, mode);
}
- return real_closedir(dir);
+ return real_mkdir(name, mode);
}
- int __fxstat(int vers, int fd, 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_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;
- }
+ ret = real_fstat(fd, xx);
+ xstat_convert(vers, st, xx);
+ return ret;
}
+#endif
-
- char *getcwd(char *buf, size_t size)
-{
- return smbw_getcwd(buf, size);
-}
-
-
-
- int __lxstat(int vers, const char *name, struct stat *st)
+#if HAVE___XSTAT
+ int __xstat(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_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_stat(name, xx);
+ xstat_convert(vers, st, xx);
+ return ret;
}
+#endif
-
- int mkdir(const char *name, mode_t mode)
+#if HAVE___LXSTAT
+ int __lxstat(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_lstat(name, xx);
+ xstat_convert(vers, st, xx);
+ return ret;
}
+#endif
- void seekdir(DIR *dir, off_t offset)
+ int stat(char *name, void *st)
{
- if (smbw_dirp(dir)) {
- smbw_seekdir(dir, offset);
- return;
+#if HAVE___XSTAT
+ return __xstat(0, name, st);
+#else
+ if (smbw_path(name)) {
+ return smbw_stat(name, st);
}
-
- real_seekdir(dir, offset);
+ return real_stat(name, st);
+#endif
}
-
- int __xstat(int vers, const char *name, struct stat *st)
+ int lstat(char *name, void *st)
{
- struct kernel_stat kbuf;
- int ret;
-
+#if HAVE___LXSTAT
+ return __lxstat(0, name, st);
+#else
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;
+ return real_lstat(name, st);
#endif
- return ret;
-
- default:
- errno = EINVAL;
- return -1;
- }
}
- int stat(const char *name, struct stat *st)
+ int fstat(int fd, void *st)
{
- return __xstat(_STAT_VER, name, st);
-}
-
-
- off_t telldir(DIR *dir)
-{
- if (smbw_dirp(dir)) {
- return smbw_telldir(dir);
+#if HAVE___LXSTAT
+ return __fxstat(0, fd, st);
+#else
+ if (smbw_fd(fd)) {
+ return smbw_fstat(fd, st);
}
-
- return real_telldir(dir);
+ return real_fstat(fd, st);
+#endif
}
- int unlink(const char *name)
+ int unlink(char *name)
{
if (smbw_path(name)) {
return smbw_unlink(name);
}
- 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);
return real_utime(name, tvp);
}
+#endif
- DIR *opendir(const char *name)
+#ifdef HAVE_UTIMES
+ int utimes(char *name,void *tvp)
{
if (smbw_path(name)) {
- return smbw_opendir(name);
+ return smbw_utimes(name, tvp);
}
- return real_opendir(name);
-}
-
-
- struct dirent *readdir(DIR *dir)
-{
- if (smbw_dirp(dir)) {
- return smbw_readdir(dir);
- }
-
- return real_readdir(dir);
+ return real_utimes(name, tvp);
}
+#endif
int readlink(char *path, char *buf, size_t bufsize)
{
}
- int rename(const char *oldname,const char *newname)
+ int rename(char *oldname,char *newname)
{
int p1, p2;
p1 = smbw_path(oldname);
return real_rename(oldname, newname);
}
- int rmdir(const char *name)
+ int rmdir(char *name)
{
if (smbw_path(name)) {
return smbw_rmdir(name);
}
- int symlink(const char *topath,const char *frompath)
+ int symlink(char *topath,char *frompath)
{
int p1, p2;
p1 = smbw_path(topath);
return real_dup2(oldfd, newfd);
}
+
+#ifdef real_opendir
+ void *opendir(char *name)
+{
+ if (smbw_path(name)) {
+ return (void *)smbw_opendir(name);
+ }
+
+ return (void *)real_opendir(name);
+}
+#endif
+
+#ifdef real_readdir
+ void *readdir(void *dir)
+{
+ if (smbw_dirp(dir)) {
+ return (void *)smbw_readdir(dir);
+ }
+
+ return (void *)real_readdir(dir);
+}
+#endif
+
+#ifdef real_closedir
+ int closedir(void *dir)
+{
+ if (smbw_dirp(dir)) {
+ return smbw_closedir(dir);
+ }
+
+ return real_closedir(dir);
+}
+#endif
+
+#ifdef real_telldir
+ off_t telldir(void *dir)
+{
+ if (smbw_dirp(dir)) {
+ return smbw_telldir(dir);
+ }
+
+ return real_telldir(dir);
+}
+#endif
+
+#ifdef real_seekdir
+ int seekdir(void *dir, off_t offset)
+{
+ if (smbw_dirp(dir)) {
+ smbw_seekdir(dir, offset);
+ return 0;
+ }
+
+ real_seekdir(dir, offset);
+ return 0;
+}
+#endif
+
+
+#ifndef NO_ACL_WRAPPER
+ int acl(char *pathp, int cmd, int nentries, void *aclbufp)
+{
+ if (smbw_path(pathp)) {
+ return smbw_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, void *aclbufp)
+{
+ if (smbw_fd(fd)) {
+ return smbw_facl(fd, cmd, nentries, aclbufp);
+ }
+
+ return real_facl(fd, cmd, nentries, aclbufp);
+}
+#endif
+
+ int creat(char *path, mode_t mode)
+{
+ extern int creat_bits;
+ return open(path, creat_bits, mode);
+}
+
+#ifdef HAVE_CREAT64
+ int creat64(char *path, mode_t mode)
+{
+ extern int creat_bits;
+ return open64(path, creat_bits, mode);
+}
+#endif
+
+#ifdef HAVE_STAT64
+ int stat64(char *name, void *st64)
+{
+ if (smbw_path(name)) {
+ double xx[32];
+ int ret = stat(name, xx);
+ stat64_convert(xx, st64);
+ return ret;
+ }
+ return real_stat64(name, st64);
+}
+
+ int fstat64(int fd, void *st64)
+{
+ if (smbw_fd(fd)) {
+ double xx[32];
+ int ret = fstat(fd, xx);
+ stat64_convert(xx, st64);
+ return ret;
+ }
+ return real_fstat64(fd, st64);
+}
+
+ int lstat64(char *name, void *st64)
+{
+ if (smbw_path(name)) {
+ double xx[32];
+ int ret = lstat(name, xx);
+ stat64_convert(xx, st64);
+ return ret;
+ }
+ return real_lstat64(name, st64);
+}
+#endif
+
+#ifdef HAVE_LLSEEK
+ offset_t llseek(int fd, offset_t ofs, int whence)
+{
+ if (smbw_fd(fd)) {
+ return lseek(fd, ofs, whence);
+ }
+ return real_llseek(fd, ofs, whence);
+}
+#endif
+
+#ifdef HAVE_READDIR64
+ void *readdir64(void *dir)
+{
+ if (smbw_dirp(dir)) {
+ static double xx[70];
+ void *d;
+ d = (void *)readdir(dir);
+ if (!d) return NULL;
+ dirent64_convert(d, xx);
+ return xx;
+ }
+ return (void *)real_readdir64(dir);
+}
+#endif
+
+ int fork(void)
+{
+ return smbw_fork();
+}
+