summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrank Lahm <franklahm@googlemail.com>2011-10-13 15:41:53 -0700
committerJeremy Allison <jra@samba.org>2011-10-14 03:26:06 +0200
commit7a0b5d6fc51d5d212529e82e5ed8e21516bfbe27 (patch)
treefad7ac26c5589be626395bd9fd710b3440fd5f54
parent1b27efd9107eef290e2c7d4826953157bab2f3c4 (diff)
downloadsamba-7a0b5d6fc51d5d212529e82e5ed8e21516bfbe27.tar.gz
samba-7a0b5d6fc51d5d212529e82e5ed8e21516bfbe27.tar.bz2
samba-7a0b5d6fc51d5d212529e82e5ed8e21516bfbe27.zip
Add support for VFS op streaminfo chaining in all relevant VFS modules.
Autobuild-User: Jeremy Allison <jra@samba.org> Autobuild-Date: Fri Oct 14 03:26:06 CEST 2011 on sn-devel-104
-rw-r--r--source3/modules/onefs_streams.c17
-rw-r--r--source3/modules/vfs_default.c25
-rw-r--r--source3/modules/vfs_streams_depot.c18
-rw-r--r--source3/modules/vfs_streams_xattr.c18
-rw-r--r--source3/smbd/close.c4
-rw-r--r--source3/smbd/filename.c2
-rw-r--r--source3/smbd/nttrans.c4
-rw-r--r--source3/smbd/open.c6
-rw-r--r--source3/smbd/trans2.c4
9 files changed, 30 insertions, 68 deletions
diff --git a/source3/modules/onefs_streams.c b/source3/modules/onefs_streams.c
index 78230bcad6..a9b4066cc7 100644
--- a/source3/modules/onefs_streams.c
+++ b/source3/modules/onefs_streams.c
@@ -736,25 +736,14 @@ NTSTATUS onefs_streaminfo(vfs_handle_struct *handle,
return map_nt_error_from_unix(errno);
}
- state.streams = NULL;
- state.num_streams = 0;
+ state.streams = *pstreams;
+ state.num_streams = *pnum_streams;
if (lp_parm_bool(SNUM(handle->conn), PARM_ONEFS_TYPE,
PARM_IGNORE_STREAMS, PARM_IGNORE_STREAMS_DEFAULT)) {
goto out;
}
- /* Add the default stream. */
- if (S_ISREG(sbuf.st_ex_mode)) {
- if (!add_one_stream(mem_ctx,
- &state.num_streams, &state.streams,
- "", sbuf.st_ex_size,
- SMB_VFS_GET_ALLOC_SIZE(handle->conn, fsp,
- &sbuf))) {
- return NT_STATUS_NO_MEMORY;
- }
- }
-
state.mem_ctx = mem_ctx;
state.handle = handle;
state.status = NT_STATUS_OK;
@@ -778,5 +767,5 @@ NTSTATUS onefs_streaminfo(vfs_handle_struct *handle,
out:
*num_streams = state.num_streams;
*streams = state.streams;
- return NT_STATUS_OK;
+ return SMB_VFS_NEXT_STREAMINFO(handle, fsp, fname, mem_ctx, pnum_streams, pstreams);
}
diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c
index 17200696b3..4fd844a104 100644
--- a/source3/modules/vfs_default.c
+++ b/source3/modules/vfs_default.c
@@ -1692,8 +1692,7 @@ static NTSTATUS vfswrap_streaminfo(vfs_handle_struct *handle,
struct stream_struct **pstreams)
{
SMB_STRUCT_STAT sbuf;
- unsigned int num_streams = 0;
- struct stream_struct *streams = NULL;
+ struct stream_struct *tmp_streams = NULL;
int ret;
if ((fsp != NULL) && (fsp->is_directory)) {
@@ -1728,25 +1727,21 @@ static NTSTATUS vfswrap_streaminfo(vfs_handle_struct *handle,
goto done;
}
- streams = talloc(mem_ctx, struct stream_struct);
-
- if (streams == NULL) {
+ tmp_streams = talloc_realloc(mem_ctx, *pstreams, struct stream_struct,
+ (*pnum_streams) + 1);
+ if (tmp_streams == NULL) {
return NT_STATUS_NO_MEMORY;
}
-
- streams->size = sbuf.st_ex_size;
- streams->alloc_size = SMB_VFS_GET_ALLOC_SIZE(handle->conn, fsp, &sbuf);
-
- streams->name = talloc_strdup(streams, "::$DATA");
- if (streams->name == NULL) {
- TALLOC_FREE(streams);
+ tmp_streams[*pnum_streams].name = talloc_strdup(tmp_streams, "::$DATA");
+ if (tmp_streams[*pnum_streams].name == NULL) {
return NT_STATUS_NO_MEMORY;
}
+ tmp_streams[*pnum_streams].size = sbuf.st_ex_size;
+ tmp_streams[*pnum_streams].alloc_size = SMB_VFS_GET_ALLOC_SIZE(handle->conn, fsp, &sbuf);
- num_streams = 1;
+ *pnum_streams += 1;
+ *pstreams = tmp_streams;
done:
- *pnum_streams = num_streams;
- *pstreams = streams;
return NT_STATUS_OK;
}
diff --git a/source3/modules/vfs_streams_depot.c b/source3/modules/vfs_streams_depot.c
index 3569405da3..e1ba651005 100644
--- a/source3/modules/vfs_streams_depot.c
+++ b/source3/modules/vfs_streams_depot.c
@@ -827,20 +827,8 @@ static NTSTATUS streams_depot_streaminfo(vfs_handle_struct *handle,
goto out;
}
- state.streams = NULL;
- state.num_streams = 0;
-
- if (!S_ISDIR(smb_fname_base->st.st_ex_mode)) {
- if (!add_one_stream(mem_ctx,
- &state.num_streams, &state.streams,
- "::$DATA", smb_fname_base->st.st_ex_size,
- SMB_VFS_GET_ALLOC_SIZE(handle->conn, fsp,
- &smb_fname_base->st))) {
- status = NT_STATUS_NO_MEMORY;
- goto out;
- }
- }
-
+ state.streams = *pstreams;
+ state.num_streams = *pnum_streams;
state.mem_ctx = mem_ctx;
state.handle = handle;
state.status = NT_STATUS_OK;
@@ -861,7 +849,7 @@ static NTSTATUS streams_depot_streaminfo(vfs_handle_struct *handle,
*pnum_streams = state.num_streams;
*pstreams = state.streams;
- status = NT_STATUS_OK;
+ status = SMB_VFS_NEXT_STREAMINFO(handle, fsp, fname, mem_ctx, pnum_streams, pstreams);
out:
TALLOC_FREE(smb_fname_base);
diff --git a/source3/modules/vfs_streams_xattr.c b/source3/modules/vfs_streams_xattr.c
index 2772c96c4d..8564760353 100644
--- a/source3/modules/vfs_streams_xattr.c
+++ b/source3/modules/vfs_streams_xattr.c
@@ -810,19 +810,8 @@ static NTSTATUS streams_xattr_streaminfo(vfs_handle_struct *handle,
return map_nt_error_from_unix(errno);
}
- state.streams = NULL;
- state.num_streams = 0;
-
- if (!S_ISDIR(sbuf.st_ex_mode)) {
- if (!add_one_stream(mem_ctx,
- &state.num_streams, &state.streams,
- "::$DATA", sbuf.st_ex_size,
- SMB_VFS_GET_ALLOC_SIZE(handle->conn, fsp,
- &sbuf))) {
- return NT_STATUS_NO_MEMORY;
- }
- }
-
+ state.streams = *pstreams;
+ state.num_streams = *pnum_streams;
state.mem_ctx = mem_ctx;
state.handle = handle;
state.status = NT_STATUS_OK;
@@ -842,7 +831,8 @@ static NTSTATUS streams_xattr_streaminfo(vfs_handle_struct *handle,
*pnum_streams = state.num_streams;
*pstreams = state.streams;
- return NT_STATUS_OK;
+
+ return SMB_VFS_NEXT_STREAMINFO(handle, fsp, fname, mem_ctx, pnum_streams, pstreams);
}
static uint32_t streams_xattr_fs_capabilities(struct vfs_handle_struct *handle,
diff --git a/source3/smbd/close.c b/source3/smbd/close.c
index a1b6fd8f25..33e497c598 100644
--- a/source3/smbd/close.c
+++ b/source3/smbd/close.c
@@ -206,9 +206,9 @@ static void notify_deferred_opens(struct messaging_context *msg_ctx,
NTSTATUS delete_all_streams(connection_struct *conn, const char *fname)
{
- struct stream_struct *stream_info;
+ struct stream_struct *stream_info = NULL;
int i;
- unsigned int num_streams;
+ unsigned int num_streams = 0;
TALLOC_CTX *frame = talloc_stackframe();
NTSTATUS status;
diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c
index 610a4ce42a..7fe7cc8063 100644
--- a/source3/smbd/filename.c
+++ b/source3/smbd/filename.c
@@ -1169,7 +1169,7 @@ static NTSTATUS build_stream_path(TALLOC_CTX *mem_ctx,
struct smb_filename *smb_fname)
{
NTSTATUS status;
- unsigned int i, num_streams;
+ unsigned int i, num_streams = 0;
struct stream_struct *streams = NULL;
if (SMB_VFS_STAT(conn, smb_fname) == 0) {
diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c
index c69aa6ae2f..2d6fa264cc 100644
--- a/source3/smbd/nttrans.c
+++ b/source3/smbd/nttrans.c
@@ -693,7 +693,7 @@ void reply_ntcreate_and_X(struct smb_request *req)
if (flags & EXTENDED_RESPONSE_REQUIRED) {
uint16_t file_status = (NO_EAS|NO_SUBSTREAMS|NO_REPARSETAG);
size_t num_names = 0;
- unsigned int num_streams;
+ unsigned int num_streams = 0;
struct stream_struct *streams = NULL;
/* Do we have any EA's ? */
@@ -1274,7 +1274,7 @@ static void call_nt_transact_create(connection_struct *conn,
if (flags & EXTENDED_RESPONSE_REQUIRED) {
uint16_t file_status = (NO_EAS|NO_SUBSTREAMS|NO_REPARSETAG);
size_t num_names = 0;
- unsigned int num_streams;
+ unsigned int num_streams = 0;
struct stream_struct *streams = NULL;
/* Do we have any EA's ? */
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index a44f15f0cc..b897c8aa25 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -2965,10 +2965,10 @@ void msg_file_was_renamed(struct messaging_context *msg,
NTSTATUS open_streams_for_delete(connection_struct *conn,
const char *fname)
{
- struct stream_struct *stream_info;
- files_struct **streams;
+ struct stream_struct *stream_info = NULL;
+ files_struct **streams = NULL;
int i;
- unsigned int num_streams;
+ unsigned int num_streams = 0;
TALLOC_CTX *frame = talloc_stackframe();
NTSTATUS status;
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index fbb4504760..6ef7156c8e 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -4671,8 +4671,8 @@ NTSTATUS smbd_do_qfilepathinfo(connection_struct *conn,
*/
case SMB_QUERY_FILE_STREAM_INFO:
case SMB_FILE_STREAM_INFORMATION: {
- unsigned int num_streams;
- struct stream_struct *streams;
+ unsigned int num_streams = 0;
+ struct stream_struct *streams = NULL;
DEBUG(10,("smbd_do_qfilepathinfo: "
"SMB_FILE_STREAM_INFORMATION\n"));