summaryrefslogtreecommitdiffstats
path: root/source3/smbd
diff options
context:
space:
mode:
authorFrank Lahm <franklahm@googlemail.com>2011-10-17 11:10:29 -0700
committerJeremy Allison <jra@samba.org>2011-10-17 21:39:32 +0200
commitc3bdcab5161107be8155a7913d9cb325383a781d (patch)
tree94ef514f57d818e5550b585078e275718d3c5e82 /source3/smbd
parentb96a9e1c5b23271f42734a8045e4d95a42e8e33f (diff)
downloadsamba-c3bdcab5161107be8155a7913d9cb325383a781d.tar.gz
samba-c3bdcab5161107be8155a7913d9cb325383a781d.tar.xz
samba-c3bdcab5161107be8155a7913d9cb325383a781d.zip
First part of fix for bug #8419 - Make VFS op "streaminfo" stackable.
Autobuild-User: Jeremy Allison <jra@samba.org> Autobuild-Date: Mon Oct 17 21:39:32 CEST 2011 on sn-devel-104
Diffstat (limited to 'source3/smbd')
-rw-r--r--source3/smbd/close.c6
-rw-r--r--source3/smbd/filename.c4
-rw-r--r--source3/smbd/nttrans.c4
-rw-r--r--source3/smbd/open.c6
-rw-r--r--source3/smbd/proto.h6
-rw-r--r--source3/smbd/trans2.c5
-rw-r--r--source3/smbd/vfs.c15
7 files changed, 33 insertions, 13 deletions
diff --git a/source3/smbd/close.c b/source3/smbd/close.c
index 33e497c5985..b736432a82e 100644
--- a/source3/smbd/close.c
+++ b/source3/smbd/close.c
@@ -212,8 +212,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"));
@@ -222,7 +222,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 7fe7cc8063b..b7c78310080 100644
--- a/source3/smbd/filename.c
+++ b/source3/smbd/filename.c
@@ -1184,8 +1184,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 2d6fa264cc6..8e78d3cd9cc 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) {
@@ -1283,7 +1283,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 b897c8aa256..f3fccd01d23 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -2972,8 +2972,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)) {
@@ -2983,7 +2983,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 e2b02ecef4c..49bb911cbca 100644
--- a/source3/smbd/proto.h
+++ b/source3/smbd/proto.h
@@ -1179,6 +1179,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 6ef7156c8e0..8b6a15f9f83 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -4681,9 +4681,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 7f166701732..1424d502d69 100644
--- a/source3/smbd/vfs.c
+++ b/source3/smbd/vfs.c
@@ -1126,6 +1126,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
*/