mirror of
https://github.com/samba-team/samba.git
synced 2024-12-27 03:21:53 +03:00
16e4503cca
(This used to be commit 614fd4119c
)
707 lines
11 KiB
C
707 lines
11 KiB
C
/*
|
|
Unix SMB/Netbios implementation.
|
|
Version 2.0
|
|
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(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)
|
|
{
|
|
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();
|
|
}
|
|
|