diff options
Diffstat (limited to 'source4/ntvfs/simple')
-rw-r--r-- | source4/ntvfs/simple/svfs.h | 2 | ||||
-rw-r--r-- | source4/ntvfs/simple/svfs_util.c | 2 | ||||
-rw-r--r-- | source4/ntvfs/simple/vfs_simple.c | 40 |
3 files changed, 23 insertions, 21 deletions
diff --git a/source4/ntvfs/simple/svfs.h b/source4/ntvfs/simple/svfs.h index 98ce6469a2..33b7cb7011 100644 --- a/source4/ntvfs/simple/svfs.h +++ b/source4/ntvfs/simple/svfs.h @@ -10,6 +10,8 @@ struct svfs_private { uint16_t next_search_handle; struct svfs_file *open_files; + + const struct ntvfs_ops *ops; }; struct svfs_dir { diff --git a/source4/ntvfs/simple/svfs_util.c b/source4/ntvfs/simple/svfs_util.c index 04165cadd9..2e64920fc8 100644 --- a/source4/ntvfs/simple/svfs_util.c +++ b/source4/ntvfs/simple/svfs_util.c @@ -31,7 +31,7 @@ */ char *svfs_unix_path(struct smbsrv_request *req, const char *name) { - struct svfs_private *private = req->tcon->ntvfs_private; + NTVFS_GET_PRIVATE(svfs_private, private, req); char *ret; if (*name != '\\') { diff --git a/source4/ntvfs/simple/vfs_simple.c b/source4/ntvfs/simple/vfs_simple.c index 34a9c27f34..5bdec64f2b 100644 --- a/source4/ntvfs/simple/vfs_simple.c +++ b/source4/ntvfs/simple/vfs_simple.c @@ -61,15 +61,13 @@ static ssize_t pwrite(int __fd, const void *__buf, size_t __nbytes, off_t __offs directory exists (tho it doesn't need to be accessible by the user, that comes later) */ -static NTSTATUS svfs_connect(struct smbsrv_request *req, const char *sharename) +static NTSTATUS svfs_connect(struct smbsrv_request *req, const char *sharename, int depth) { struct stat st; struct smbsrv_tcon *tcon = req->tcon; struct svfs_private *private; - tcon->ntvfs_private = talloc_p(tcon, struct svfs_private); - - private = tcon->ntvfs_private; + private = talloc_p(tcon, struct svfs_private); private->next_search_handle = 0; private->connectpath = talloc_strdup(tcon, lp_pathname(tcon->service)); @@ -85,6 +83,8 @@ static NTSTATUS svfs_connect(struct smbsrv_request *req, const char *sharename) tcon->fs_type = talloc_strdup(tcon, "NTFS"); tcon->dev_type = talloc_strdup(tcon, "A:"); + ntvfs_set_private(tcon, depth, private); + DEBUG(0,("WARNING: ntvfs simple: connect to share [%s] with ROOT privileges!!!\n",sharename)); return NT_STATUS_OK; @@ -93,7 +93,7 @@ static NTSTATUS svfs_connect(struct smbsrv_request *req, const char *sharename) /* disconnect from a share */ -static NTSTATUS svfs_disconnect(struct smbsrv_tcon *tcon) +static NTSTATUS svfs_disconnect(struct smbsrv_tcon *tcon, int depth) { return NT_STATUS_OK; } @@ -242,12 +242,13 @@ static NTSTATUS svfs_map_fileinfo(struct smbsrv_request *req, union smb_fileinfo */ static NTSTATUS svfs_qpathinfo(struct smbsrv_request *req, union smb_fileinfo *info) { + NTVFS_GET_PRIVATE(svfs_private, private, req); char *unix_path; struct stat st; DEBUG(19,("svfs_qpathinfo: file %s level 0x%x\n", info->generic.in.fname, info->generic.level)); if (info->generic.level != RAW_FILEINFO_GENERIC) { - return ntvfs_map_qpathinfo(req, info); + return ntvfs_map_qpathinfo(req, info, private->ops); } unix_path = svfs_unix_path(req, info->generic.in.fname); @@ -267,12 +268,12 @@ static NTSTATUS svfs_qpathinfo(struct smbsrv_request *req, union smb_fileinfo *i */ static NTSTATUS svfs_qfileinfo(struct smbsrv_request *req, union smb_fileinfo *info) { - struct svfs_private *private = req->tcon->ntvfs_private; + NTVFS_GET_PRIVATE(svfs_private, private, req); struct svfs_file *f; struct stat st; if (info->generic.level != RAW_FILEINFO_GENERIC) { - return ntvfs_map_qfileinfo(req, info); + return ntvfs_map_qfileinfo(req, info, private->ops); } f = find_fd(private, info->generic.in.fnum); @@ -295,7 +296,7 @@ static NTSTATUS svfs_qfileinfo(struct smbsrv_request *req, union smb_fileinfo *i */ static NTSTATUS svfs_open(struct smbsrv_request *req, union smb_open *io) { - struct svfs_private *private = req->tcon->ntvfs_private; + NTVFS_GET_PRIVATE(svfs_private, private, req); char *unix_path; struct stat st; int fd, flags; @@ -303,7 +304,7 @@ static NTSTATUS svfs_open(struct smbsrv_request *req, union smb_open *io) int create_flags, rdwr_flags; if (io->generic.level != RAW_OPEN_GENERIC) { - return ntvfs_map_open(req, io); + return ntvfs_map_open(req, io, private->ops); } if (lp_readonly(req->tcon->service)) { @@ -561,7 +562,7 @@ static NTSTATUS svfs_flush(struct smbsrv_request *req, struct smb_flush *io) */ static NTSTATUS svfs_close(struct smbsrv_request *req, union smb_close *io) { - struct svfs_private *private = req->tcon->ntvfs_private; + NTVFS_GET_PRIVATE(svfs_private, private, req); struct svfs_file *f; if (io->generic.level != RAW_CLOSE_CLOSE) { @@ -660,11 +661,11 @@ static NTSTATUS svfs_setfileinfo(struct smbsrv_request *req, */ static NTSTATUS svfs_fsinfo(struct smbsrv_request *req, union smb_fsinfo *fs) { - struct svfs_private *private = req->tcon->ntvfs_private; + NTVFS_GET_PRIVATE(svfs_private, private, req); struct stat st; if (fs->generic.level != RAW_QFS_GENERIC) { - return ntvfs_map_fsinfo(req, fs); + return ntvfs_map_fsinfo(req, fs, private->ops); } if (sys_fsusage(private->connectpath, @@ -702,7 +703,7 @@ static NTSTATUS svfs_fsinfo(struct smbsrv_request *req, union smb_fsinfo *fs) static NTSTATUS svfs_fsattr(struct smbsrv_request *req, union smb_fsattr *fs) { struct stat st; - struct svfs_private *private = req->tcon->ntvfs_private; + NTVFS_GET_PRIVATE(svfs_private, private, req); if (fs->generic.level != RAW_FSATTR_GENERIC) { return ntvfs_map_fsattr(req, fs); @@ -744,7 +745,7 @@ static NTSTATUS svfs_search_first(struct smbsrv_request *req, union smb_search_f { struct svfs_dir *dir; int i; - struct svfs_private *private = req->tcon->ntvfs_private; + NTVFS_GET_PRIVATE(svfs_private, private, req); struct search_state *search; union smb_search_data file; uint_t max_count; @@ -813,7 +814,7 @@ static NTSTATUS svfs_search_next(struct smbsrv_request *req, union smb_search_ne { struct svfs_dir *dir; int i; - struct svfs_private *private = req->tcon->ntvfs_private; + NTVFS_GET_PRIVATE(svfs_private, private, req); struct search_state *search; union smb_search_data file; uint_t max_count; @@ -896,7 +897,7 @@ found: /* close a search */ static NTSTATUS svfs_search_close(struct smbsrv_request *req, union smb_search_close *io) { - struct svfs_private *private = req->tcon->ntvfs_private; + NTVFS_GET_PRIVATE(svfs_private, private, req); struct search_state *search; for (search=private->search; search; search = search->next) { @@ -931,9 +932,6 @@ NTSTATUS ntvfs_simple_init(void) ZERO_STRUCT(ops); - /* fill in the name and type */ - ops.type = NTVFS_DISK; - /* fill in all the operations */ ops.connect = svfs_connect; ops.disconnect = svfs_disconnect; @@ -966,6 +964,8 @@ NTSTATUS ntvfs_simple_init(void) /* register ourselves with the NTVFS subsystem. We register under names 'simple' */ + + ops.type = NTVFS_DISK; ops.name = "simple"; ret = register_backend("ntvfs", &ops); |