diff options
author | Andrew Tridgell <tridge@samba.org> | 2004-11-06 07:58:45 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:05:33 -0500 |
commit | 439c1524fba3b58abe9e353f9ff2bd7f103f3d12 (patch) | |
tree | 0b824442f7c57ee4a2653fbcbb280987cb582e01 /source4/ntvfs/posix | |
parent | 4c06ac06a13eaff5b314ad97cce824d615c06f9a (diff) | |
download | samba-439c1524fba3b58abe9e353f9ff2bd7f103f3d12.tar.gz samba-439c1524fba3b58abe9e353f9ff2bd7f103f3d12.tar.bz2 samba-439c1524fba3b58abe9e353f9ff2bd7f103f3d12.zip |
r3573: added trans2open support to smbd and pvfs, and fine-tuned the open->generic ntvfs mapping code.
(This used to be commit ed844192d7f7ed487290f719df65f256a5b0b9bc)
Diffstat (limited to 'source4/ntvfs/posix')
-rw-r--r-- | source4/ntvfs/posix/pvfs_open.c | 37 | ||||
-rw-r--r-- | source4/ntvfs/posix/pvfs_setfileinfo.c | 8 |
2 files changed, 44 insertions, 1 deletions
diff --git a/source4/ntvfs/posix/pvfs_open.c b/source4/ntvfs/posix/pvfs_open.c index 2430f9becb..6f1fb1c87f 100644 --- a/source4/ntvfs/posix/pvfs_open.c +++ b/source4/ntvfs/posix/pvfs_open.c @@ -539,6 +539,39 @@ static NTSTATUS pvfs_open_setup_retry(struct ntvfs_module_context *ntvfs, } /* + special handling for t2open +*/ +static NTSTATUS pvfs_open_t2open(struct ntvfs_module_context *ntvfs, + struct smbsrv_request *req, union smb_open *io) +{ + struct pvfs_state *pvfs = ntvfs->private_data; + struct pvfs_filename *name; + NTSTATUS status; + + status = pvfs_resolve_name(pvfs, req, io->t2open.in.fname, + PVFS_RESOLVE_NO_WILDCARD, &name); + if (!NT_STATUS_IS_OK(status)) { + return status; + } + + if (io->t2open.in.open_func & OPENX_OPEN_FUNC_CREATE) { + if (!name->exists) return NT_STATUS_ACCESS_DENIED; + } + if (io->t2open.in.open_func & OPENX_OPEN_FUNC_TRUNC) { + if (name->exists) return NT_STATUS_ACCESS_DENIED; + return NT_STATUS_OBJECT_NAME_NOT_FOUND; + } + if ((io->t2open.in.open_func & 0xF) == OPENX_OPEN_FUNC_FAIL) { + if (!name->exists) return NT_STATUS_ACCESS_DENIED; + return NT_STATUS_OBJECT_NAME_COLLISION; + } + + talloc_free(name); + + return ntvfs_map_open(req, io, ntvfs); +} + +/* open a file */ NTSTATUS pvfs_open(struct ntvfs_module_context *ntvfs, @@ -555,6 +588,10 @@ NTSTATUS pvfs_open(struct ntvfs_module_context *ntvfs, uint32_t share_access; uint32_t access_mask; + if (io->generic.level == RAW_OPEN_T2OPEN) { + return pvfs_open_t2open(ntvfs, req, io); + } + /* use the generic mapping code to avoid implementing all the different open calls. This won't allow openx to work perfectly as the mapping code has no way of knowing if two diff --git a/source4/ntvfs/posix/pvfs_setfileinfo.c b/source4/ntvfs/posix/pvfs_setfileinfo.c index e570743aba..22997be94d 100644 --- a/source4/ntvfs/posix/pvfs_setfileinfo.c +++ b/source4/ntvfs/posix/pvfs_setfileinfo.c @@ -188,10 +188,16 @@ NTSTATUS pvfs_setfileinfo(struct ntvfs_module_context *ntvfs, /* possibly change the file size */ if (newstats.st.st_size != f->name->st.st_size) { + int ret; if (f->name->dos.attrib & FILE_ATTRIBUTE_DIRECTORY) { return NT_STATUS_FILE_IS_A_DIRECTORY; } - if (ftruncate(f->fd, newstats.st.st_size) == -1) { + if (f->access_mask & SA_RIGHT_FILE_WRITE_APPEND) { + ret = ftruncate(f->fd, newstats.st.st_size); + } else { + ret = truncate(f->name->full_name, newstats.st.st_size); + } + if (ret == -1) { return pvfs_map_errno(pvfs, errno); } } |