diff options
Diffstat (limited to 'source3/smbwrapper')
-rw-r--r-- | source3/smbwrapper/smbw.c | 155 | ||||
-rw-r--r-- | source3/smbwrapper/smbw.h | 1 | ||||
-rw-r--r-- | source3/smbwrapper/smbw_dir.c | 13 | ||||
-rw-r--r-- | source3/smbwrapper/smbw_stat.c | 179 | ||||
-rw-r--r-- | source3/smbwrapper/wrapped.c | 4 | ||||
-rw-r--r-- | source3/smbwrapper/wrapper.h | 36 |
6 files changed, 226 insertions, 162 deletions
diff --git a/source3/smbwrapper/smbw.c b/source3/smbwrapper/smbw.c index 5a954d2fed..d79131a8ea 100644 --- a/source3/smbwrapper/smbw.c +++ b/source3/smbwrapper/smbw.c @@ -20,7 +20,6 @@ */ #include "includes.h" -#include "smbw.h" #include "wrapper.h" pstring smb_cwd; @@ -461,54 +460,6 @@ struct smbw_file *smbw_file(int fd) return NULL; } - -/***************************************************** -setup basic info in a stat structure -*******************************************************/ -void smbw_setup_stat(struct stat *st, char *fname, size_t size, int mode) -{ - ZERO_STRUCTP(st); - - if (IS_DOS_DIR(mode)) { - st->st_mode = SMBW_DIR_MODE; - } else { - st->st_mode = SMBW_FILE_MODE; - } - - st->st_size = size; - st->st_blksize = 512; - st->st_blocks = (size+511)/512; - st->st_uid = getuid(); - st->st_gid = getgid(); - st->st_ino = smbw_inode(fname); -} - - -/***************************************************** -try to do a QPATHINFO and if that fails then do a getatr -this is needed because win95 sometimes refuses the qpathinfo -*******************************************************/ -BOOL smbw_getatr(struct smbw_server *srv, char *path, - uint32 *mode, size_t *size, - time_t *c_time, time_t *a_time, time_t *m_time) -{ - DEBUG(5,("sending qpathinfo\n")); - - if (cli_qpathinfo(&srv->cli, path, c_time, a_time, m_time, - size, mode)) return True; - - DEBUG(5,("qpathinfo OK\n")); - - /* if this is NT then don't bother with the getatr */ - if (srv->cli.capabilities & CAP_NT_SMBS) return False; - - if (cli_getatr(&srv->cli, path, mode, size, m_time)) { - a_time = c_time = m_time; - return True; - } - return False; -} - /***************************************************** a wrapper for open() *******************************************************/ @@ -604,107 +555,6 @@ int smbw_open(const char *fname, int flags, mode_t mode) return -1; } -/***************************************************** -a wrapper for fstat() -*******************************************************/ -int smbw_fstat(int fd, struct stat *st) -{ - struct smbw_file *file; - time_t c_time, a_time, m_time; - uint32 size; - int mode; - - DEBUG(4,("%s\n", __FUNCTION__)); - - smbw_busy++; - - file = smbw_file(fd); - if (!file) { - int ret = smbw_dir_fstat(fd, st); - smbw_busy--; - return ret; - } - - if (!cli_qfileinfo(&file->srv->cli, file->cli_fd, - &mode, &size, &c_time, &a_time, &m_time) && - !cli_getattrE(&file->srv->cli, file->cli_fd, - &mode, &size, &c_time, &a_time, &m_time)) { - errno = EINVAL; - smbw_busy--; - return -1; - } - - smbw_setup_stat(st, file->fname, size, mode); - - st->st_atime = a_time; - st->st_ctime = c_time; - st->st_mtime = m_time; - st->st_dev = file->srv->dev; - - DEBUG(4,("%s - OK\n", __FUNCTION__)); - - smbw_busy--; - return 0; -} - - -/***************************************************** -a wrapper for stat() -*******************************************************/ -int smbw_stat(const char *fname, struct stat *st) -{ - struct smbw_server *srv; - fstring server, share; - pstring path; - time_t m_time=0, a_time=0, c_time=0; - size_t size=0; - uint32 mode=0; - - DEBUG(4,("%s (%s)\n", __FUNCTION__, fname)); - - if (!fname) { - errno = EINVAL; - return -1; - } - - smbw_init(); - - smbw_busy++; - - /* work out what server they are after */ - smbw_parse_path(fname, server, share, path); - - /* get a connection to the server */ - srv = smbw_server(server, share); - if (!srv) { - /* smbw_server sets errno */ - goto failed; - } - - if (strcmp(share,"IPC$") == 0) { - mode = aDIR | aRONLY; - } else { - if (!smbw_getatr(srv, path, - &mode, &size, &c_time, &a_time, &m_time)) { - errno = smbw_errno(&srv->cli); - goto failed; - } - } - - smbw_setup_stat(st, path, size, mode); - - st->st_atime = time(NULL); - st->st_ctime = m_time; - st->st_mtime = m_time; - st->st_dev = srv->dev; - - smbw_busy--; - return 0; - - failed: - smbw_busy--; - return -1; -} /***************************************************** a wrapper for read() @@ -954,8 +804,9 @@ int smbw_rename(const char *oldname, const char *newname) /***************************************************** a wrapper for utime() *******************************************************/ -int smbw_utime(const char *fname, struct utimbuf *buf) +int smbw_utime(const char *fname, void *buf) { + struct utimbuf *tbuf = (struct utimbuf *)buf; struct smbw_server *srv; fstring server, share; pstring path; @@ -987,7 +838,7 @@ int smbw_utime(const char *fname, struct utimbuf *buf) goto failed; } - if (!cli_setatr(&srv->cli, path, mode, buf->modtime)) { + if (!cli_setatr(&srv->cli, path, mode, tbuf->modtime)) { errno = smbw_errno(&srv->cli); goto failed; } diff --git a/source3/smbwrapper/smbw.h b/source3/smbwrapper/smbw.h index 61bf9de75a..716205c1fc 100644 --- a/source3/smbwrapper/smbw.h +++ b/source3/smbwrapper/smbw.h @@ -55,3 +55,4 @@ struct smbw_dir { struct file_info *list; char *path; }; + diff --git a/source3/smbwrapper/smbw_dir.c b/source3/smbwrapper/smbw_dir.c index db10204b10..22da76eb17 100644 --- a/source3/smbwrapper/smbw_dir.c +++ b/source3/smbwrapper/smbw_dir.c @@ -20,7 +20,6 @@ */ #include "includes.h" -#include "smbw.h" #include "wrapper.h" extern pstring smb_cwd; @@ -576,8 +575,9 @@ DIR *smbw_opendir(const char *fname) /***************************************************** read one entry from a directory *******************************************************/ -struct dirent *smbw_readdir(struct smbw_dir *d) +struct dirent *smbw_readdir(DIR *dirp) { + struct smbw_dir *d = (struct smbw_dir *)dirp; static struct dirent de; if (smbw_getdents(d->fd, &de, sizeof(struct dirent)) > 0) @@ -589,23 +589,26 @@ struct dirent *smbw_readdir(struct smbw_dir *d) /***************************************************** close a DIR* *******************************************************/ -int smbw_closedir(struct smbw_dir *d) +int smbw_closedir(DIR *dirp) { + struct smbw_dir *d = (struct smbw_dir *)dirp; return smbw_close(d->fd); } /***************************************************** seek in a directory *******************************************************/ -void smbw_seekdir(struct smbw_dir *d, off_t offset) +void smbw_seekdir(DIR *dirp, off_t offset) { + struct smbw_dir *d = (struct smbw_dir *)dirp; smbw_dir_lseek(d->fd,offset, SEEK_SET); } /***************************************************** current loc in a directory *******************************************************/ -off_t smbw_telldir(struct smbw_dir *d) +off_t smbw_telldir(DIR *dirp) { + struct smbw_dir *d = (struct smbw_dir *)dirp; return smbw_dir_lseek(d->fd,0,SEEK_CUR); } diff --git a/source3/smbwrapper/smbw_stat.c b/source3/smbwrapper/smbw_stat.c new file mode 100644 index 0000000000..5ca71ee2ef --- /dev/null +++ b/source3/smbwrapper/smbw_stat.c @@ -0,0 +1,179 @@ +/* + Unix SMB/Netbios implementation. + Version 2.0 + SMB wrapper stat 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. +*/ + +#include "includes.h" +#include "wrapper.h" + +extern int DEBUGLEVEL; + +extern int smbw_busy; + + +/***************************************************** +setup basic info in a stat structure +*******************************************************/ +void smbw_setup_stat(struct stat *st, char *fname, size_t size, int mode) +{ + ZERO_STRUCTP(st); + + if (IS_DOS_DIR(mode)) { + st->st_mode = SMBW_DIR_MODE; + } else { + st->st_mode = SMBW_FILE_MODE; + } + + st->st_size = size; + st->st_blksize = 512; + st->st_blocks = (size+511)/512; + st->st_uid = getuid(); + st->st_gid = getgid(); + st->st_ino = smbw_inode(fname); +} + + +/***************************************************** +try to do a QPATHINFO and if that fails then do a getatr +this is needed because win95 sometimes refuses the qpathinfo +*******************************************************/ +BOOL smbw_getatr(struct smbw_server *srv, char *path, + uint32 *mode, size_t *size, + time_t *c_time, time_t *a_time, time_t *m_time) +{ + DEBUG(5,("sending qpathinfo\n")); + + if (cli_qpathinfo(&srv->cli, path, c_time, a_time, m_time, + size, mode)) return True; + + DEBUG(5,("qpathinfo OK\n")); + + /* if this is NT then don't bother with the getatr */ + if (srv->cli.capabilities & CAP_NT_SMBS) return False; + + if (cli_getatr(&srv->cli, path, mode, size, m_time)) { + a_time = c_time = m_time; + return True; + } + return False; +} + +/***************************************************** +a wrapper for fstat() +*******************************************************/ +int smbw_fstat(int fd, struct stat *st) +{ + struct smbw_file *file; + time_t c_time, a_time, m_time; + uint32 size; + int mode; + + DEBUG(4,("%s\n", __FUNCTION__)); + + smbw_busy++; + + file = smbw_file(fd); + if (!file) { + int ret = smbw_dir_fstat(fd, st); + smbw_busy--; + return ret; + } + + if (!cli_qfileinfo(&file->srv->cli, file->cli_fd, + &mode, &size, &c_time, &a_time, &m_time) && + !cli_getattrE(&file->srv->cli, file->cli_fd, + &mode, &size, &c_time, &a_time, &m_time)) { + errno = EINVAL; + smbw_busy--; + return -1; + } + + smbw_setup_stat(st, file->fname, size, mode); + + st->st_atime = a_time; + st->st_ctime = c_time; + st->st_mtime = m_time; + st->st_dev = file->srv->dev; + + DEBUG(4,("%s - OK\n", __FUNCTION__)); + + smbw_busy--; + return 0; +} + + +/***************************************************** +a wrapper for stat() +*******************************************************/ +int smbw_stat(const char *fname, struct stat *st) +{ + struct smbw_server *srv; + fstring server, share; + pstring path; + time_t m_time=0, a_time=0, c_time=0; + size_t size=0; + uint32 mode=0; + + DEBUG(4,("%s (%s)\n", __FUNCTION__, fname)); + + if (!fname) { + errno = EINVAL; + return -1; + } + + smbw_init(); + + smbw_busy++; + + /* work out what server they are after */ + smbw_parse_path(fname, server, share, path); + + /* get a connection to the server */ + srv = smbw_server(server, share); + if (!srv) { + /* smbw_server sets errno */ + goto failed; + } + + if (strcmp(share,"IPC$") == 0) { + mode = aDIR | aRONLY; + } else { + if (!smbw_getatr(srv, path, + &mode, &size, &c_time, &a_time, &m_time)) { + errno = smbw_errno(&srv->cli); + goto failed; + } + } + + smbw_setup_stat(st, path, size, mode); + + st->st_atime = time(NULL); + st->st_ctime = m_time; + st->st_mtime = m_time; + st->st_dev = srv->dev; + + smbw_busy--; + return 0; + + failed: + smbw_busy--; + return -1; +} + + diff --git a/source3/smbwrapper/wrapped.c b/source3/smbwrapper/wrapped.c index 71bcb76ee9..30676ca3d0 100644 --- a/source3/smbwrapper/wrapped.c +++ b/source3/smbwrapper/wrapped.c @@ -82,7 +82,7 @@ __asm__(".globl __fcntl; __fcntl = fcntl"); int fcntl(int fd, int cmd, long arg) { if (smbw_fd(fd)) { - return smbw_fcntl(fd); + return smbw_fcntl(fd, cmd, arg); } return real_fcntl(fd, cmd, arg); @@ -431,7 +431,7 @@ __asm__(".globl __write; __write = write"); } - int utime(const char *name,struct timeval *tvp) + int utime(const char *name,void *tvp) { if (smbw_path(name)) { return smbw_utime(name, tvp); diff --git a/source3/smbwrapper/wrapper.h b/source3/smbwrapper/wrapper.h index d38aa4227e..5339f652f8 100644 --- a/source3/smbwrapper/wrapper.h +++ b/source3/smbwrapper/wrapper.h @@ -31,7 +31,37 @@ #include "kernel_stat.h" #include "realcalls.h" - -int smbw_path(const char *path); +int smbw_dirp(DIR *dirp); int smbw_fd(int fd); -int smbw_dirp(DIR *); +int smbw_dir_open(const char *fname); +int smbw_dir_close(int fd); +int smbw_stat(const char *fname, struct stat *st); +off_t smbw_dir_lseek(int fd, off_t offset, int whence); +int smbw_path(const char *path); +int smbw_open(const char *fname, int flags, mode_t mode); +int smbw_chdir(const char *name); +int smbw_close(int fd); +int smbw_fchdir(unsigned int fd); +int smbw_fcntl(int fd, int cmd, long arg); +int smbw_getdents(unsigned int fd, struct dirent *dirp, int count); +off_t smbw_lseek(int fd, off_t offset, int whence); +ssize_t smbw_read(int fd, void *buf, size_t count); +ssize_t smbw_write(int fd, void *buf, size_t count); +int smbw_access(const char *name, int mode); +int smbw_chmod(const char *fname, mode_t newmode); +int smbw_chown(const char *fname, uid_t owner, gid_t group); +int smbw_closedir(DIR *d); +int smbw_fstat(int fd, struct stat *st); +char *smbw_getcwd(char *buf, size_t size); +int smbw_stat(const char *fname, struct stat *st); +int smbw_mkdir(const char *fname, mode_t mode); +void smbw_seekdir(DIR *d, off_t offset); +off_t smbw_telldir(DIR *d); +int smbw_unlink(const char *fname); +int smbw_utime(const char *fname,void *buf); +DIR *smbw_opendir(const char *fname); +struct dirent *smbw_readdir(DIR *d); +int smbw_readlink(const char *path, char *buf, size_t bufsize); +int smbw_rename(const char *oldname, const char *newname); +int smbw_rmdir(const char *fname); + |