1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-24 02:04:21 +03:00

more smbw cleanups.

- cleaned up prototyping. Unfortunately we can't auto-prototype
  wrapped.c because it replaces system functions.
- split stat functions into smbw_stat.c
(This used to be commit 04e92e692e49234df6fbbfd07a33b315ed62f0de)
This commit is contained in:
Andrew Tridgell 1998-10-04 04:33:56 +00:00
parent 977d601556
commit 57a58f592b
9 changed files with 288 additions and 167 deletions

View File

@ -63,7 +63,7 @@ SMBRUN = $(BINDIR)/smbrun
PASSWD_FLAGS = -DSMB_PASSWD=\"$(SMB_PASSWD)\" -DSMB_PASSWD_FILE=\"$(SMB_PASSWD_FILE)\"
FLAGS1 = $(CFLAGS) -Iinclude -I$(srcdir)/include -I$(srcdir)/ubiqx -DSMBLOGFILE=\"$(SMBLOGFILE)\" -DNMBLOGFILE=\"$(NMBLOGFILE)\"
FLAGS1 = $(CFLAGS) -Iinclude -I$(srcdir)/include -I$(srcdir)/ubiqx -I$(srcdir)/smbwrapper -DSMBLOGFILE=\"$(SMBLOGFILE)\" -DNMBLOGFILE=\"$(NMBLOGFILE)\"
FLAGS2 = -DCONFIGFILE=\"$(CONFIGFILE)\" -DLMHOSTSFILE=\"$(LMHOSTSFILE)\"
FLAGS3 = -DSWATDIR=\"$(SWATDIR)\" -DSBINDIR=\"$(SBINDIR)\" -DLOCKDIR=\"$(LOCKDIR)\" -DSMBRUN=\"$(SMBRUN)\" -DCODEPAGEDIR=\"$(CODEPAGEDIR)\"
FLAGS4 = -DDRIVERFILE=\"$(DRIVERFILE)\"
@ -194,6 +194,7 @@ RPCCLIENT_OBJ = rpcclient/rpcclient.o \
# rpcclient/cmd_srvsvc.o
SMBWRAPPER_OBJ = smbwrapper/smbw.o smbwrapper/wrapped.o \
smbwrapper/smbw_dir.o smbwrapper/smbw_stat.o \
$(LIBSMB_OBJ) $(PARAM_OBJ) \
$(UBIQX_OBJ) $(LIB_OBJ)
@ -215,7 +216,8 @@ NMBLOOKUP_OBJ = utils/nmblookup.o $(PARAM_OBJ) $(UBIQX_OBJ) \
SMBTORTURE_OBJ = utils/torture.o $(LIBSMB_OBJ) $(PARAM_OBJ) \
$(UBIQX_OBJ) $(LIB_OBJ)
PROTO_OBJ = $(SMBD_OBJ) $(NMBD_OBJ) $(SWAT_OBJ) $(CLIENT_OBJ) $(RPCCLIENT_OBJ)
PROTO_OBJ = $(SMBD_OBJ) $(NMBD_OBJ) $(SWAT_OBJ) $(CLIENT_OBJ) \
$(RPCCLIENT_OBJ) $(SMBWRAPPER_OBJ)
PICOBJS = $(SMBWRAPPER_OBJ:%.o=%.p)
@ -396,9 +398,9 @@ uninstallcp:
clean:
-rm -f core */*~ *~ */*.o */*.p
proto:
proto:
@echo rebuilding include/proto.h
@cd $(srcdir) && $(AWK) -f script/mkproto.awk `echo $(PROTO_OBJ) | tr ' ' '\n' | sed -e 's/\.o/\.c/g' | sort -u | grep -v "ubiqx/"` > include/proto.h
@cd $(srcdir) && $(AWK) -f script/mkproto.awk `echo $(PROTO_OBJ) | tr ' ' '\n' | sed -e 's/\.o/\.c/g' | sort -u | egrep -v 'ubiqx/|wrapped'` > include/proto.h
etags:
etags `find . -name "*.[ch]"`

View File

@ -467,6 +467,7 @@ extern int errno;
#include "version.h"
#include "smb.h"
#include "smbw.h"
#include "nameserv.h"
#include "byteorder.h"

View File

@ -389,7 +389,7 @@ BOOL cli_getattrE(struct cli_state *cli, int fd,
BOOL cli_getatr(struct cli_state *cli, char *fname,
uint32 *attr, size_t *size, time_t *t);
BOOL cli_setatr(struct cli_state *cli, char *fname, int attr, time_t t);
BOOL cli_qpathinfo(struct cli_state *cli, char *fname,
BOOL cli_qpathinfo(struct cli_state *cli, const char *fname,
time_t *c_time, time_t *a_time, time_t *m_time,
size_t *size, uint32 *mode);
BOOL cli_qpathinfo2(struct cli_state *cli, char *fname,
@ -2269,6 +2269,60 @@ BOOL unbecome_user(void );
void become_root(BOOL save_dir) ;
void unbecome_root(BOOL restore_dir);
/*The following definitions come from smbwrapper/smbw.c */
void smbw_init(void);
int smbw_fd(int fd);
ino_t smbw_inode(const char *name);
void clean_fname(char *name);
char *smbw_parse_path(const char *fname, char *server, char *share, char *path);
int smbw_path(const char *path);
int smbw_errno(struct cli_state *c);
struct smbw_server *smbw_server(char *server, char *share);
struct smbw_file *smbw_file(int fd);
int smbw_open(const char *fname, int flags, mode_t mode);
ssize_t smbw_read(int fd, void *buf, size_t count);
ssize_t smbw_write(int fd, void *buf, size_t count);
int smbw_close(int fd);
int smbw_fcntl(int fd, int cmd, long arg);
int smbw_access(const char *name, int mode);
int smbw_readlink(const char *path, char *buf, size_t bufsize);
int smbw_unlink(const char *fname);
int smbw_rename(const char *oldname, const char *newname);
int smbw_utime(const char *fname, void *buf);
int smbw_chown(const char *fname, uid_t owner, gid_t group);
int smbw_chmod(const char *fname, mode_t newmode);
off_t smbw_lseek(int fd, off_t offset, int whence);
/*The following definitions come from smbwrapper/smbw_dir.c */
struct smbw_dir *smbw_dir(int fd);
int smbw_dirp(DIR *dirp);
int smbw_dir_open(const char *fname);
int smbw_dir_fstat(int fd, struct stat *st);
int smbw_dir_close(int fd);
int smbw_getdents(unsigned int fd, struct dirent *dirp, int count);
int smbw_chdir(const char *name);
off_t smbw_dir_lseek(int fd, off_t offset, int whence);
int smbw_mkdir(const char *fname, mode_t mode);
int smbw_rmdir(const char *fname);
char *smbw_getcwd(char *buf, size_t size);
int smbw_fchdir(unsigned int fd);
DIR *smbw_opendir(const char *fname);
struct dirent *smbw_readdir(DIR *dirp);
int smbw_closedir(DIR *dirp);
void smbw_seekdir(DIR *dirp, off_t offset);
off_t smbw_telldir(DIR *dirp);
/*The following definitions come from smbwrapper/smbw_stat.c */
void smbw_setup_stat(struct stat *st, char *fname, size_t size, int mode);
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);
int smbw_fstat(int fd, struct stat *st);
int smbw_stat(const char *fname, struct stat *st);
/*The following definitions come from web/cgi.c */
void cgi_load_variables(FILE *f1);

View File

@ -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;
}

View File

@ -55,3 +55,4 @@ struct smbw_dir {
struct file_info *list;
char *path;
};

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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);

View File

@ -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);