diff options
author | Volker Lendecke <vl@samba.org> | 2008-01-19 20:41:15 +0100 |
---|---|---|
committer | Volker Lendecke <vl@samba.org> | 2008-01-19 22:58:17 +0100 |
commit | 1b976d51928dd6fa923272d277e13e5267188869 (patch) | |
tree | fe08817ed1b0dc317918e28990077d9b7eb00449 /source3/modules | |
parent | 07e07f696ad10f3a5d7a0d9de656ff13600ac97d (diff) | |
download | samba-1b976d51928dd6fa923272d277e13e5267188869.tar.gz samba-1b976d51928dd6fa923272d277e13e5267188869.tar.bz2 samba-1b976d51928dd6fa923272d277e13e5267188869.zip |
Add the STREAMINFO vfs call
Based on jpeach's work, modified the streaminfo prototype
Make use of it in trans2.c together with marshall_stream_info()
(This used to be commit c34d729c7c0600a8f11bf7e489a634a4e37fe88e)
Diffstat (limited to 'source3/modules')
-rw-r--r-- | source3/modules/vfs_default.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index 31234f23ec..2e620d04cc 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -942,6 +942,63 @@ static struct file_id vfswrap_file_id_create(struct vfs_handle_struct *handle, S return file_id_create_dev(dev, inode); } +static NTSTATUS vfswrap_streaminfo(vfs_handle_struct *handle, + struct files_struct *fsp, + const char *fname, + TALLOC_CTX *mem_ctx, + unsigned int *pnum_streams, + struct stream_struct **pstreams) +{ + SMB_STRUCT_STAT sbuf; + NTSTATUS status; + unsigned int num_streams = 0; + struct stream_struct *streams = NULL; + int ret; + + if ((fsp != NULL) && (fsp->is_directory)) { + /* + * No default streams on directories + */ + goto done; + } + + if ((fsp != NULL) && (fsp->fh->fd != -1)) { + ret = SMB_VFS_FSTAT(fsp, &sbuf); + } + else { + ret = SMB_VFS_STAT(handle->conn, fname, &sbuf); + } + + if (ret == -1) { + return map_nt_error_from_unix(errno); + } + + if (S_ISDIR(sbuf.st_mode)) { + goto done; + } + + streams = talloc(mem_ctx, struct stream_struct); + + if (streams == NULL) { + return NT_STATUS_NO_MEMORY; + } + + streams->size = sbuf.st_size; + streams->alloc_size = get_allocation_size(handle->conn, fsp, &sbuf); + + streams->name = talloc_strdup(streams, "::$DATA"); + if (streams->name == NULL) { + TALLOC_FREE(streams); + return NT_STATUS_NO_MEMORY; + } + + num_streams = 1; + done: + *pnum_streams = num_streams; + *pstreams = streams; + return NT_STATUS_OK; +} + static NTSTATUS vfswrap_fget_nt_acl(vfs_handle_struct *handle, files_struct *fsp, uint32 security_info, SEC_DESC **ppdesc) @@ -1367,6 +1424,8 @@ static vfs_op_tuple vfs_default_ops[] = { SMB_VFS_LAYER_OPAQUE}, {SMB_VFS_OP(vfswrap_file_id_create), SMB_VFS_OP_FILE_ID_CREATE, SMB_VFS_LAYER_OPAQUE}, + {SMB_VFS_OP(vfswrap_streaminfo), SMB_VFS_OP_STREAMINFO, + SMB_VFS_LAYER_OPAQUE}, /* NT ACL operations. */ |