summaryrefslogtreecommitdiff
path: root/source3/smbwrapper
diff options
context:
space:
mode:
Diffstat (limited to 'source3/smbwrapper')
-rw-r--r--source3/smbwrapper/smbw.c155
-rw-r--r--source3/smbwrapper/smbw.h1
-rw-r--r--source3/smbwrapper/smbw_dir.c13
-rw-r--r--source3/smbwrapper/smbw_stat.c179
-rw-r--r--source3/smbwrapper/wrapped.c4
-rw-r--r--source3/smbwrapper/wrapper.h36
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);
+