diff options
Diffstat (limited to 'source3/smbwrapper/wrapped.c')
-rw-r--r-- | source3/smbwrapper/wrapped.c | 705 |
1 files changed, 705 insertions, 0 deletions
diff --git a/source3/smbwrapper/wrapped.c b/source3/smbwrapper/wrapped.c new file mode 100644 index 0000000000..338ee0d5b1 --- /dev/null +++ b/source3/smbwrapper/wrapped.c @@ -0,0 +1,705 @@ +/* + Unix SMB/CIFS implementation. + SMB wrapper functions + Copyright (C) Andrew Tridgell 1998 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* NOTE: This file WILL produce compiler warnings. They are unavoidable + + 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. + */ + +#include "config.h" +#include <sys/types.h> +#include <errno.h> +#include "realcalls.h" + +#ifndef NULL +# define NULL ((void *)0) +#endif + + 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 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 + +#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) +{ + if (smbw_fd(fd)) { + return smbw_pread(fd, buf, size, ofs); + } + + return real_pread(fd, buf, size, ofs); +} +#endif + +#if defined(HAVE_PREAD64) && defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) + 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 + +#ifdef HAVE_PWRITE + ssize_t pwrite(int fd, void *buf, size_t size, off_t ofs) +{ + if (smbw_fd(fd)) { + return smbw_pwrite(fd, buf, size, ofs); + } + + return real_pwrite(fd, buf, size, ofs); +} +#endif + +#if defined(HAVE_PWRITE64) && defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) + ssize_t pwrite64(int fd, void *buf, size_t size, off64_t ofs) +{ + if (smbw_fd(fd)) { + return smbw_pwrite(fd, buf, size, ofs); + } + + return real_pwrite64(fd, buf, size, ofs); +} +#endif + + + 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_close(fd); + } + if (smbw_local_fd(fd)) { + errno = EBADF; + return -1; + } + + 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 + + + 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)) { + return smbw_fcntl(fd, cmd, arg); + } + + return real_fcntl(fd, cmd, arg); +} + + +#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 + + + +#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 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 + + + 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 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 smbw_read(fd, buf, count); + } + + return real_read(fd, buf, count); +} + +#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 smbw_write(fd, buf, count); + } + + 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(char *name, int mode) +{ + if (smbw_path(name)) { + return smbw_access(name, mode); + } + + return real_access(name, mode); +} + + + + int chmod(char *name,mode_t mode) +{ + if (smbw_path(name)) { + return smbw_chmod(name, mode); + } + + return real_chmod(name, mode); +} + + + + 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); +} + + + char *getcwd(char *buf, size_t size) +{ + return (char *)smbw_getcwd(buf, size); +} + + + + + int mkdir(char *name, mode_t mode) +{ + if (smbw_path(name)) { + return smbw_mkdir(name, mode); + } + + return real_mkdir(name, mode); +} + + +#if HAVE___FXSTAT + int __fxstat(int vers, int fd, void *st) +{ + double xx[32]; + int ret; + + if (smbw_fd(fd)) { + return smbw_fstat(fd, st); + } + + ret = real_fstat(fd, xx); + xstat_convert(vers, st, xx); + return ret; +} +#endif + +#if HAVE___XSTAT + int __xstat(int vers, char *name, void *st) +{ + double xx[32]; + int ret; + + if (smbw_path(name)) { + return smbw_stat(name, st); + } + + ret = real_stat(name, xx); + xstat_convert(vers, st, xx); + return ret; +} +#endif + + +#if HAVE___LXSTAT + int __lxstat(int vers, char *name, void *st) +{ + double xx[32]; + int ret; + + if (smbw_path(name)) { + return smbw_stat(name, st); + } + + ret = real_lstat(name, xx); + xstat_convert(vers, st, xx); + return ret; +} +#endif + + + int stat(char *name, void *st) +{ +#if HAVE___XSTAT + return __xstat(0, name, st); +#else + if (smbw_path(name)) { + return smbw_stat(name, st); + } + return real_stat(name, st); +#endif +} + + int lstat(char *name, void *st) +{ +#if HAVE___LXSTAT + return __lxstat(0, name, st); +#else + if (smbw_path(name)) { + return smbw_stat(name, st); + } + return real_lstat(name, st); +#endif +} + + int fstat(int fd, void *st) +{ +#if HAVE___LXSTAT + return __fxstat(0, fd, st); +#else + if (smbw_fd(fd)) { + return smbw_fstat(fd, st); + } + return real_fstat(fd, st); +#endif +} + + + int unlink(char *name) +{ + if (smbw_path(name)) { + return smbw_unlink(name); + } + + return real_unlink(name); +} + + +#ifdef HAVE_UTIME + int utime(char *name,void *tvp) +{ + if (smbw_path(name)) { + return smbw_utime(name, tvp); + } + + return real_utime(name, tvp); +} +#endif + +#ifdef HAVE_UTIMES + int utimes(const char *name, const struct timeval *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) +{ + if (smbw_path(path)) { + return smbw_readlink(path, buf, bufsize); + } + + return real_readlink(path, buf, bufsize); +} + + + int rename(char *oldname,char *newname) +{ + int p1, p2; + p1 = smbw_path(oldname); + p2 = smbw_path(newname); + if (p1 ^ p2) { + /* can't cross filesystem boundaries */ + errno = EXDEV; + return -1; + } + if (p1 && p2) { + return smbw_rename(oldname, newname); + } + + return real_rename(oldname, newname); +} + + int rmdir(char *name) +{ + if (smbw_path(name)) { + return smbw_rmdir(name); + } + + return real_rmdir(name); +} + + + int symlink(char *topath,char *frompath) +{ + int p1, p2; + p1 = smbw_path(topath); + p2 = smbw_path(frompath); + if (p1 || p2) { + /* can't handle symlinks */ + errno = EPERM; + return -1; + } + + return real_symlink(topath, frompath); +} + + int dup(int fd) +{ + if (smbw_fd(fd)) { + return smbw_dup(fd); + } + + return real_dup(fd); +} + + int dup2(int oldfd, int newfd) +{ + if (smbw_fd(newfd)) { + close(newfd); + } + + if (smbw_fd(oldfd)) { + return smbw_dup2(oldfd, newfd); + } + + 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(); +} + |