From 0abba575717750b461c0bb665f718389c5bda6e1 Mon Sep 17 00:00:00 2001 From: Frank Lahm Date: Wed, 31 Aug 2011 11:23:03 +0200 Subject: [PATCH 1/2] Make VFS op streaminfo stackable --- source3/smbd/close.c | 6 +++--- source3/smbd/filename.c | 4 ++-- source3/smbd/nttrans.c | 4 ++-- source3/smbd/open.c | 6 +++--- source3/smbd/proto.h | 6 ++++++ source3/smbd/trans2.c | 5 ++--- source3/smbd/vfs.c | 15 +++++++++++++++ 7 files changed, 33 insertions(+), 13 deletions(-) diff --git a/source3/smbd/close.c b/source3/smbd/close.c index aeed4e3..cc313c8 100644 --- a/source3/smbd/close.c +++ b/source3/smbd/close.c @@ -207,8 +207,8 @@ NTSTATUS delete_all_streams(connection_struct *conn, const char *fname) TALLOC_CTX *frame = talloc_stackframe(); NTSTATUS status; - status = SMB_VFS_STREAMINFO(conn, NULL, fname, talloc_tos(), - &num_streams, &stream_info); + status = vfs_streaminfo(conn, NULL, fname, talloc_tos(), + &num_streams, &stream_info); if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_IMPLEMENTED)) { DEBUG(10, ("no streams around\n")); @@ -217,7 +217,7 @@ NTSTATUS delete_all_streams(connection_struct *conn, const char *fname) } if (!NT_STATUS_IS_OK(status)) { - DEBUG(10, ("SMB_VFS_STREAMINFO failed: %s\n", + DEBUG(10, ("vfs_streaminfo failed: %s\n", nt_errstr(status))); goto fail; } diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c index 08bc79d..af0b40c 100644 --- a/source3/smbd/filename.c +++ b/source3/smbd/filename.c @@ -1185,8 +1185,8 @@ static NTSTATUS build_stream_path(TALLOC_CTX *mem_ctx, } /* Fall back to a case-insensitive scan of all streams on the file. */ - status = SMB_VFS_STREAMINFO(conn, NULL, smb_fname->base_name, mem_ctx, - &num_streams, &streams); + status = vfs_streaminfo(conn, NULL, smb_fname->base_name, mem_ctx, + &num_streams, &streams); if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) { SET_STAT_INVALID(smb_fname->st); diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c index 427e566..ae26228 100644 --- a/source3/smbd/nttrans.c +++ b/source3/smbd/nttrans.c @@ -702,7 +702,7 @@ void reply_ntcreate_and_X(struct smb_request *req) if (NT_STATUS_IS_OK(status) && num_names) { file_status &= ~NO_EAS; } - status = SMB_VFS_STREAMINFO(conn, NULL, smb_fname->base_name, ctx, + status = vfs_streaminfo(conn, NULL, smb_fname->base_name, ctx, &num_streams, &streams); /* There is always one stream, ::$DATA. */ if (NT_STATUS_IS_OK(status) && num_streams > 1) { @@ -1277,7 +1277,7 @@ static void call_nt_transact_create(connection_struct *conn, if (NT_STATUS_IS_OK(status) && num_names) { file_status &= ~NO_EAS; } - status = SMB_VFS_STREAMINFO(conn, NULL, smb_fname->base_name, ctx, + status = vfs_streaminfo(conn, NULL, smb_fname->base_name, ctx, &num_streams, &streams); /* There is always one stream, ::$DATA. */ if (NT_STATUS_IS_OK(status) && num_streams > 1) { diff --git a/source3/smbd/open.c b/source3/smbd/open.c index 1cab9ab..fe66b55 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -2974,8 +2974,8 @@ NTSTATUS open_streams_for_delete(connection_struct *conn, TALLOC_CTX *frame = talloc_stackframe(); NTSTATUS status; - status = SMB_VFS_STREAMINFO(conn, NULL, fname, talloc_tos(), - &num_streams, &stream_info); + status = vfs_streaminfo(conn, NULL, fname, talloc_tos(), + &num_streams, &stream_info); if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_IMPLEMENTED) || NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) { @@ -2985,7 +2985,7 @@ NTSTATUS open_streams_for_delete(connection_struct *conn, } if (!NT_STATUS_IS_OK(status)) { - DEBUG(10, ("SMB_VFS_STREAMINFO failed: %s\n", + DEBUG(10, ("vfs_streaminfo failed: %s\n", nt_errstr(status))); goto fail; } diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index b7bb063..1b3976c 100644 --- a/source3/smbd/proto.h +++ b/source3/smbd/proto.h @@ -1166,6 +1166,12 @@ int vfs_lstat_smb_fname(struct connection_struct *conn, const char *fname, SMB_STRUCT_STAT *psbuf); NTSTATUS vfs_stat_fsp(files_struct *fsp); NTSTATUS vfs_chown_fsp(files_struct *fsp, uid_t uid, gid_t gid); +NTSTATUS vfs_streaminfo(connection_struct *conn, + struct files_struct *fsp, + const char *fname, + TALLOC_CTX *mem_ctx, + unsigned int *num_streams, + struct stream_struct **streams); /* The following definitions come from smbd/avahi_register.c */ diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 114f688..4ddb586 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -4683,9 +4683,8 @@ NTSTATUS smbd_do_qfilepathinfo(connection_struct *conn, return NT_STATUS_INVALID_PARAMETER; } - status = SMB_VFS_STREAMINFO( - conn, fsp, smb_fname->base_name, talloc_tos(), - &num_streams, &streams); + status = vfs_streaminfo(conn, fsp, smb_fname->base_name, + talloc_tos(), &num_streams, &streams); if (!NT_STATUS_IS_OK(status)) { DEBUG(10, ("could not get stream info: %s\n", diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c index 35a8331..6c56964 100644 --- a/source3/smbd/vfs.c +++ b/source3/smbd/vfs.c @@ -1125,6 +1125,21 @@ NTSTATUS vfs_stat_fsp(files_struct *fsp) return NT_STATUS_OK; } +/** + * Initialize num_streams and streams, then call VFS op streaminfo + */ +NTSTATUS vfs_streaminfo(connection_struct *conn, + struct files_struct *fsp, + const char *fname, + TALLOC_CTX *mem_ctx, + unsigned int *num_streams, + struct stream_struct **streams) +{ + *num_streams = 0; + *streams = NULL; + return SMB_VFS_STREAMINFO(conn, fsp, fname, mem_ctx, num_streams, streams); +} + /* generate a file_id from a stat structure */ -- 1.7.0.5