[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Tue Aug 22 17:44:02 UTC 2023


The branch, master has been updated
       via  81226b5179e vfs_aio_pthread: use SMB_VFS_NEXT_OPENAT() in aio_pthread_openat_fn()
       via  2c6a01c8925 libcli: Add required #includes to smbXcli_base.h
       via  939aa0e69ef clifuse: Use direct FSCC info level
       via  dd801b69c60 libsmb: Use tevent_req_nterror() properly
       via  edc6e69e254 libsmb: Remove a duplicate TALLOC_FREE()
       via  107beacfc02 libsmb: Use tevent_req_oom() where appropriate
       via  a6a5ce7b426 libsmb: Move cli_raw_ioctl() to torture3
       via  087cddc90c1 libsmb: Move cli_qpathinfo1() to torture3
       via  c0db32b457d torture3: Avoid unused variables
       via  914e0cf6f81 smbclient: Don't give up in allinfo if getting advanced info fails
       via  47509eb7f03 libsmb: Use cli_smb2_qpathinfo_basic() in cli_getatr()
       via  f2d535dbe31 libsmb: Use cli_smb2_qpathinfo() in cli_qpathinfo2()
       via  50edb0266f9 libsmb: Use cli_smb2_qpathinfo() for streams
       via  55539629b20 libsmb: Add cli_smb2_qpathinfo_send/recv()
      from  aba7eb094b9 selftest: Report time at which testsuite starts

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 81226b5179e6ba806a0a690806ca2f9004f7c9f9
Author: MikeLiu <mikeliu at qnap.com>
Date:   Tue Aug 22 10:01:14 2023 +0800

    vfs_aio_pthread: use SMB_VFS_NEXT_OPENAT() in aio_pthread_openat_fn()
    
    1. Set 'aio_allow_open' to false if fsp->fsp_flags.is_pathref
    2. Move !(how->flags & O_CREAT) and !(how->flags & O_EXCL) up and set 'aio_allow_open' to false
    3. Use SMB_VFS_NEXT_OPENAT() instead of openat() for disable async opens case.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15453
    
    Signed-off-by: MikeLiu <mikeliu at qnap.com>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Tue Aug 22 17:44:00 UTC 2023 on atb-devel-224

commit 2c6a01c8925d0cf8ee9d700e4e95379285e52f45
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Aug 21 21:41:06 2023 +0200

    libcli: Add required #includes to smbXcli_base.h
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 939aa0e69ef8f9d6c583703ef74da73a3e125a9b
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Aug 21 21:34:31 2023 +0200

    clifuse: Use direct FSCC info level
    
    Avoid the magic -1000
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit dd801b69c60dc5d5793b46fbc5181f868a6db02a
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Aug 16 11:59:03 2023 +0200

    libsmb: Use tevent_req_nterror() properly
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit edc6e69e25449a7162938cf7ddfd4b6b7d787023
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Aug 16 15:45:32 2023 +0200

    libsmb: Remove a duplicate TALLOC_FREE()
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 107beacfc0212a7117c7b9ae2fbcb7d6224d434c
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Aug 16 15:39:55 2023 +0200

    libsmb: Use tevent_req_oom() where appropriate
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit a6a5ce7b4261480ef79da965b43fcb5caa604e3d
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Aug 16 11:04:14 2023 +0200

    libsmb: Move cli_raw_ioctl() to torture3
    
    Only used there.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 087cddc90c1b126baabc8088588c07113d919b16
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Aug 21 12:59:10 2023 +0200

    libsmb: Move cli_qpathinfo1() to torture3
    
    It's only used there, and it clutters general code. Re-adding the
    async flavor is trivial should it ever be required.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit c0db32b457d10aa894e0b6aeb6e682ccaff7737a
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Aug 21 12:45:52 2023 +0200

    torture3: Avoid unused variables
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 914e0cf6f81ffef95354b4f8f8429909eb6c32c5
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Aug 21 10:01:24 2023 +0200

    smbclient: Don't give up in allinfo if getting advanced info fails
    
    Getting streams might fail, but further down getting reparse info
    might succeed.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 47509eb7f033c07f2f0aa13cba0e37b3dc1757bd
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Aug 18 16:15:19 2023 +0200

    libsmb: Use cli_smb2_qpathinfo_basic() in cli_getatr()
    
    cli_smb2_qpathinfo_basic() uses the smb_create_returns and avoids a
    round-trip.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit f2d535dbe3107c5781e3f0b468780aacd17d9785
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Aug 18 16:07:56 2023 +0200

    libsmb: Use cli_smb2_qpathinfo() in cli_qpathinfo2()
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 50edb0266f92cf2f00bbd9f242bb7ee1fd6d9024
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Aug 18 15:47:20 2023 +0200

    libsmb: Use cli_smb2_qpathinfo() for streams
    
    Remove sync cli_smb2_qpathinfo_streams() wrapper.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 55539629b20a67884d520ad1639ae7ac3c9e736a
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Jun 30 22:43:43 2023 +0200

    libsmb: Add cli_smb2_qpathinfo_send/recv()
    
    Wrap the create/qfileinfo/close, to be used in next patches
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 examples/fuse/clifuse.c           |  20 +--
 libcli/smb/smbXcli_base.h         |   7 +
 source3/client/client.c           |  27 ++--
 source3/libsmb/cli_smb2_fnum.c    | 280 +++++++++-----------------------------
 source3/libsmb/cli_smb2_fnum.h    |  33 ++---
 source3/libsmb/cliconnect.c       |  21 +--
 source3/libsmb/clifile.c          |  46 +++----
 source3/libsmb/clifsinfo.c        |   6 +-
 source3/libsmb/climessage.c       |  19 +--
 source3/libsmb/clioplock.c        |   2 +-
 source3/libsmb/clirap.c           | 211 ++++++++--------------------
 source3/libsmb/clirap.h           |  17 ---
 source3/libsmb/proto.h            |   1 -
 source3/libsmb/smbsock_connect.c  |   3 +-
 source3/modules/vfs_aio_pthread.c |  28 ++--
 source3/torture/proto.h           |   8 ++
 source3/torture/torture.c         |  90 +++++++++++-
 17 files changed, 309 insertions(+), 510 deletions(-)


Changeset truncated at 500 lines:

diff --git a/examples/fuse/clifuse.c b/examples/fuse/clifuse.c
index 94ec3911ef6..890dae16307 100644
--- a/examples/fuse/clifuse.c
+++ b/examples/fuse/clifuse.c
@@ -284,14 +284,18 @@ static void cli_get_unixattr_opened(struct tevent_req *subreq)
 	}
 
 	subreq = smb2cli_query_info_send(
-		state, state->ev, cli->conn, 0,
-		cli->smb2.session, cli->smb2.tcon,
-		1, /* in_info_type */
-		(SMB_FILE_ALL_INFORMATION - 1000), /* in_file_info_class */
-		0xFFFF, /* in_max_output_length */
-		NULL, /* in_input_buffer */
-		0, /* in_additional_info */
-		0, /* in_flags */
+		state,
+		state->ev,
+		cli->conn,
+		0,
+		cli->smb2.session,
+		cli->smb2.tcon,
+		1,			   /* in_info_type */
+		FSCC_FILE_ALL_INFORMATION, /* in_file_info_class */
+		0xFFFF,			   /* in_max_output_length */
+		NULL,			   /* in_input_buffer */
+		0,			   /* in_additional_info */
+		0,			   /* in_flags */
 		state->fid_persistent,
 		state->fid_volatile);
 	if (tevent_req_nomem(subreq, req)) {
diff --git a/libcli/smb/smbXcli_base.h b/libcli/smb/smbXcli_base.h
index bf8638711ba..fef68b6b38d 100644
--- a/libcli/smb/smbXcli_base.h
+++ b/libcli/smb/smbXcli_base.h
@@ -23,6 +23,13 @@
 
 #define SMB_SUICIDE_PACKET 0x74697865
 
+#include "replace.h"
+#include <tevent.h>
+#include "libcli/smb/smb_constants.h"
+#include "libcli/util/ntstatus.h"
+#include "lib/util/time.h"
+#include "lib/util/data_blob.h"
+
 struct smbXcli_conn;
 struct smbXcli_session;
 struct smbXcli_tcon;
diff --git a/source3/client/client.c b/source3/client/client.c
index 19ff37248c3..1fb3918272b 100644
--- a/source3/client/client.c
+++ b/source3/client/client.c
@@ -1697,9 +1697,11 @@ static int do_allinfo(const char *name)
 	status = cli_qpathinfo_streams(cli, name, talloc_tos(), &num_streams,
 				       &streams);
 	if (!NT_STATUS_IS_OK(status)) {
-		d_printf("%s getting streams for %s\n", nt_errstr(status),
-			 name);
-		return false;
+		d_fprintf(stderr,
+			  "%s getting streams for %s\n",
+			  nt_errstr(status),
+			  name);
+		num_streams = 0;
 	}
 
 	for (i=0; i<num_streams; i++) {
@@ -1765,15 +1767,20 @@ static int do_allinfo(const char *name)
 
 	status = cli_shadow_copy_data(talloc_tos(), cli, fnum,
 				      false, &snapshots, &num_snapshots);
-	if (!NT_STATUS_IS_OK(status)) {
-		cli_close(cli, fnum);
-		return 0;
+	if (NT_STATUS_IS_OK(status)) {
+		status = cli_shadow_copy_data(talloc_tos(),
+					      cli,
+					      fnum,
+					      true,
+					      &snapshots,
+					      &num_snapshots);
 	}
-	status = cli_shadow_copy_data(talloc_tos(), cli, fnum,
-				      true, &snapshots, &num_snapshots);
 	if (!NT_STATUS_IS_OK(status)) {
-		cli_close(cli, fnum);
-		return 0;
+		d_fprintf(stderr,
+			  "%s getting shadow copy data for %s\n",
+			  nt_errstr(status),
+			  name);
+		num_snapshots = 0;
 	}
 
 	for (j=0; j<num_snapshots; j++) {
diff --git a/source3/libsmb/cli_smb2_fnum.c b/source3/libsmb/cli_smb2_fnum.c
index 59fdcccc98e..35593312283 100644
--- a/source3/libsmb/cli_smb2_fnum.c
+++ b/source3/libsmb/cli_smb2_fnum.c
@@ -1462,7 +1462,7 @@ struct tevent_req *cli_smb2_list_send(
 
 		status = smb2_create_blob_add(in_cblobs, in_cblobs,
 					      SMB2_CREATE_TAG_POSIX, blob);
-		if (!NT_STATUS_IS_OK(status)) {
+		if (tevent_req_nterror(req, status)) {
 			tevent_req_nterror(req, status);
 			return tevent_req_post(req, ev);
 		}
@@ -2243,105 +2243,47 @@ NTSTATUS cli_smb2_qpathinfo_alt_name(struct cli_state *cli,
 	return status;
 }
 
-/***************************************************************
- Wrapper that allows SMB2 to get pathname attributes.
- Synchronous only.
-***************************************************************/
-
-NTSTATUS cli_smb2_getatr(struct cli_state *cli,
-			const char *name,
-			uint32_t *pattr,
-			off_t *size,
-			time_t *write_time)
-{
-	NTSTATUS status;
-	uint16_t fnum = 0xffff;
-	struct timespec write_time_ts;
-	TALLOC_CTX *frame = talloc_stackframe();
-
-	if (smbXcli_conn_has_async_calls(cli->conn)) {
-		/*
-		 * Can't use sync call while an async call is in flight
-		 */
-		status = NT_STATUS_INVALID_PARAMETER;
-		goto fail;
-	}
-
-	status = get_fnum_from_path(cli,
-				name,
-				FILE_READ_ATTRIBUTES,
-				&fnum);
-
-	if (!NT_STATUS_IS_OK(status)) {
-		goto fail;
-	}
-
-	status = cli_qfileinfo_basic(
-		cli,
-		fnum,
-		pattr,
-		size,
-		NULL,		/* create_time */
-		NULL,		/* access_time */
-		&write_time_ts,
-		NULL,		/* change_time */
-		NULL);		/* ino */
-	if (!NT_STATUS_IS_OK(status)) {
-		goto fail;
-	}
-	if (write_time != NULL) {
-		*write_time = write_time_ts.tv_sec;
-	}
-
-  fail:
-
-	if (fnum != 0xffff) {
-		cli_smb2_close_fnum(cli, fnum);
-	}
-
-	cli->raw_status = status;
-
-	TALLOC_FREE(frame);
-	return status;
-}
-
-struct cli_smb2_qpathinfo2_state {
+struct cli_smb2_qpathinfo_state {
 	struct tevent_context *ev;
 	struct cli_state *cli;
+	const char *fname;
 	uint16_t fnum;
+	uint16_t level;
+	uint32_t min_rdata;
+	uint32_t max_rdata;
 
-	NTSTATUS queryinfo_status;
-	struct timespec create_time;
-	struct timespec access_time;
-	struct timespec write_time;
-	struct timespec change_time;
-	off_t size;
-	uint32_t attr;
-	SMB_INO_T ino;
+	NTSTATUS status;
+	DATA_BLOB out;
 };
 
-static void cli_smb2_qpathinfo2_opened(struct tevent_req *subreq);
-static void cli_smb2_qpathinfo2_done(struct tevent_req *subreq);
-static void cli_smb2_qpathinfo2_closed(struct tevent_req *subreq);
-
-struct tevent_req *cli_smb2_qpathinfo2_send(TALLOC_CTX *mem_ctx,
-					    struct tevent_context *ev,
-					    struct cli_state *cli,
-					    const char *fname)
+static void cli_smb2_qpathinfo_opened(struct tevent_req *subreq);
+static void cli_smb2_qpathinfo_done(struct tevent_req *subreq);
+static void cli_smb2_qpathinfo_closed(struct tevent_req *subreq);
+
+struct tevent_req *cli_smb2_qpathinfo_send(TALLOC_CTX *mem_ctx,
+					   struct tevent_context *ev,
+					   struct cli_state *cli,
+					   const char *fname,
+					   uint16_t level,
+					   uint32_t min_rdata,
+					   uint32_t max_rdata)
 {
 	struct tevent_req *req = NULL, *subreq = NULL;
-	struct cli_smb2_qpathinfo2_state *state = NULL;
+	struct cli_smb2_qpathinfo_state *state = NULL;
 
 	req = tevent_req_create(mem_ctx,
 				&state,
-				struct cli_smb2_qpathinfo2_state);
+				struct cli_smb2_qpathinfo_state);
 	if (req == NULL) {
 		return NULL;
 	}
 	state->ev = ev;
 	state->cli = cli;
+	state->level = level;
+	state->min_rdata = min_rdata;
+	state->max_rdata = max_rdata;
 
-	subreq = get_fnum_from_path_send(mem_ctx,
+	subreq = get_fnum_from_path_send(state,
 					 ev,
 					 cli,
 					 fname,
@@ -2349,16 +2291,16 @@ struct tevent_req *cli_smb2_qpathinfo2_send(TALLOC_CTX *mem_ctx,
 	if (tevent_req_nomem(subreq, req)) {
 		return tevent_req_post(req, ev);
 	}
-	tevent_req_set_callback(subreq, cli_smb2_qpathinfo2_opened, req);
+	tevent_req_set_callback(subreq, cli_smb2_qpathinfo_opened, req);
 	return req;
 }
 
-static void cli_smb2_qpathinfo2_opened(struct tevent_req *subreq)
+static void cli_smb2_qpathinfo_opened(struct tevent_req *subreq)
 {
 	struct tevent_req *req =
 		tevent_req_callback_data(subreq, struct tevent_req);
-	struct cli_smb2_qpathinfo2_state *state =
-		tevent_req_data(req, struct cli_smb2_qpathinfo2_state);
+	struct cli_smb2_qpathinfo_state *state =
+		tevent_req_data(req, struct cli_smb2_qpathinfo_state);
 	NTSTATUS status;
 
 	status = get_fnum_from_path_recv(subreq, &state->fnum);
@@ -2367,33 +2309,38 @@ static void cli_smb2_qpathinfo2_opened(struct tevent_req *subreq)
 		return;
 	}
 
-	subreq = cli_qfileinfo_basic_send(state,
-					  state->ev,
-					  state->cli,
-					  state->fnum);
+	subreq = cli_smb2_query_info_fnum_send(state,
+					       state->ev,
+					       state->cli,
+					       state->fnum,
+					       1, /* in_info_type */
+					       state->level,
+					       state->max_rdata,
+					       NULL, /* in_input_buffer */
+					       0,    /* in_additional_info */
+					       0);   /* in_flags */
 	if (tevent_req_nomem(subreq, req)) {
 		return;
 	}
-	tevent_req_set_callback(subreq, cli_smb2_qpathinfo2_done, req);
+	tevent_req_set_callback(subreq, cli_smb2_qpathinfo_done, req);
 }
 
-static void cli_smb2_qpathinfo2_done(struct tevent_req *subreq)
+static void cli_smb2_qpathinfo_done(struct tevent_req *subreq)
 {
 	struct tevent_req *req =
 		tevent_req_callback_data(subreq, struct tevent_req);
-	struct cli_smb2_qpathinfo2_state *state =
-		tevent_req_data(req, struct cli_smb2_qpathinfo2_state);
-
-	state->queryinfo_status = cli_qfileinfo_basic_recv(subreq,
-							   &state->attr,
-							   &state->size,
-							   &state->create_time,
-							   &state->access_time,
-							   &state->write_time,
-							   &state->change_time,
-							   &state->ino);
+	struct cli_smb2_qpathinfo_state *state =
+		tevent_req_data(req, struct cli_smb2_qpathinfo_state);
+
+	state->status =
+		cli_smb2_query_info_fnum_recv(subreq, state, &state->out);
 	TALLOC_FREE(subreq);
 
+	if (NT_STATUS_IS_OK(state->status) &&
+	    (state->out.length < state->min_rdata)) {
+		state->status = NT_STATUS_INVALID_NETWORK_RESPONSE;
+	}
+
 	subreq = cli_smb2_close_fnum_send(state,
 					  state->ev,
 					  state->cli,
@@ -2401,15 +2348,15 @@ static void cli_smb2_qpathinfo2_done(struct tevent_req *subreq)
 	if (tevent_req_nomem(subreq, req)) {
 		return;
 	}
-	tevent_req_set_callback(subreq, cli_smb2_qpathinfo2_closed, req);
+	tevent_req_set_callback(subreq, cli_smb2_qpathinfo_closed, req);
 }
 
-static void cli_smb2_qpathinfo2_closed(struct tevent_req *subreq)
+static void cli_smb2_qpathinfo_closed(struct tevent_req *subreq)
 {
 	struct tevent_req *req =
 		tevent_req_callback_data(subreq, struct tevent_req);
-	struct cli_smb2_qpathinfo2_state *state =
-		tevent_req_data(req, struct cli_smb2_qpathinfo2_state);
+	struct cli_smb2_qpathinfo_state *state =
+		tevent_req_data(req, struct cli_smb2_qpathinfo_state);
 	NTSTATUS status;
 
 	status = cli_smb2_close_fnum_recv(subreq);
@@ -2417,128 +2364,31 @@ static void cli_smb2_qpathinfo2_closed(struct tevent_req *subreq)
 	if (tevent_req_nterror(req, status)) {
 		return;
 	}
-	if (tevent_req_nterror(req, state->queryinfo_status)) {
+	if (tevent_req_nterror(req, state->status)) {
 		return;
 	}
 	tevent_req_done(req);
 }
 
-NTSTATUS cli_smb2_qpathinfo2_recv(struct tevent_req *req,
-				  struct timespec *create_time,
-				  struct timespec *access_time,
-				  struct timespec *write_time,
-				  struct timespec *change_time,
-				  off_t *size,
-				  uint32_t *attr,
-				  SMB_INO_T *ino)
+NTSTATUS cli_smb2_qpathinfo_recv(struct tevent_req *req,
+				 TALLOC_CTX *mem_ctx,
+				 uint8_t **rdata,
+				 uint32_t *num_rdata)
 {
-	struct cli_smb2_qpathinfo2_state *state =
-		tevent_req_data(req, struct cli_smb2_qpathinfo2_state);
+	struct cli_smb2_qpathinfo_state *state =
+		tevent_req_data(req, struct cli_smb2_qpathinfo_state);
 	NTSTATUS status;
 
 	if (tevent_req_is_nterror(req, &status)) {
 		return status;
 	}
 
-	if (create_time != NULL) {
-		*create_time = state->create_time;
-	}
-	if (access_time != NULL) {
-		*access_time = state->access_time;
-	}
-	if (write_time != NULL) {
-		*write_time = state->write_time;
-	}
-	if (change_time != NULL) {
-		*change_time = state->change_time;
-	}
-	if (attr != NULL) {
-		*attr = state->attr;
-	}
-	if (size != NULL) {
-		*size = state->size;
-	}
-	if (ino) {
-		*ino = state->ino;
-	}
-
+	*rdata = talloc_move(mem_ctx, &state->out.data);
+	*num_rdata = state->out.length;
+	tevent_req_received(req);
 	return NT_STATUS_OK;
 }
 
-/***************************************************************
- Wrapper that allows SMB2 to query pathname streams.
- Synchronous only.
-***************************************************************/
-
-NTSTATUS cli_smb2_qpathinfo_streams(struct cli_state *cli,
-				const char *name,
-				TALLOC_CTX *mem_ctx,
-				unsigned int *pnum_streams,
-				struct stream_struct **pstreams)
-{
-	NTSTATUS status;
-	uint16_t fnum = 0xffff;
-	DATA_BLOB outbuf = data_blob_null;
-	TALLOC_CTX *frame = talloc_stackframe();
-
-	if (smbXcli_conn_has_async_calls(cli->conn)) {
-		/*
-		 * Can't use sync call while an async call is in flight
-		 */
-		status = NT_STATUS_INVALID_PARAMETER;
-		goto fail;
-	}
-
-	status = get_fnum_from_path(cli,
-				name,
-				FILE_READ_ATTRIBUTES,
-				&fnum);
-
-	if (!NT_STATUS_IS_OK(status)) {
-		goto fail;
-	}
-
-	/* getinfo on the handle with info_type SMB2_GETINFO_FILE (1),
-	   level 22 (SMB2_FILE_STREAM_INFORMATION). */
-
-	status = cli_smb2_query_info_fnum(
-		cli,
-		fnum,
-		1, /* in_info_type */
-		(SMB_FILE_STREAM_INFORMATION - 1000), /* in_file_info_class */
-		0xFFFF, /* in_max_output_length */
-		NULL, /* in_input_buffer */
-		0, /* in_additional_info */
-		0, /* in_flags */
-		frame,
-		&outbuf);
-
-	if (!NT_STATUS_IS_OK(status)) {
-		goto fail;
-	}
-
-	/* Parse the reply. */
-	if (!parse_streams_blob(mem_ctx,
-				outbuf.data,
-				outbuf.length,
-				pnum_streams,
-				pstreams)) {
-		status = NT_STATUS_INVALID_NETWORK_RESPONSE;
-		goto fail;
-	}
-
-  fail:
-
-	if (fnum != 0xffff) {
-		cli_smb2_close_fnum(cli, fnum);
-	}
-
-	cli->raw_status = status;
-
-	TALLOC_FREE(frame);
-	return status;
-}
-
 /***************************************************************
  Wrapper that allows SMB2 to set SMB_FILE_BASIC_INFORMATION on
  a pathname.
diff --git a/source3/libsmb/cli_smb2_fnum.h b/source3/libsmb/cli_smb2_fnum.h
index 986db2c1b0f..0eb2a026527 100644
--- a/source3/libsmb/cli_smb2_fnum.h
+++ b/source3/libsmb/cli_smb2_fnum.h
@@ -118,6 +118,17 @@ NTSTATUS cli_smb2_qpathinfo_basic(struct cli_state *cli,
 NTSTATUS cli_smb2_qpathinfo_alt_name(struct cli_state *cli,
 			const char *name,
 			fstring alt_name);
+struct tevent_req *cli_smb2_qpathinfo_send(TALLOC_CTX *mem_ctx,
+					   struct tevent_context *ev,
+					   struct cli_state *cli,
+					   const char *fname,
+					   uint16_t level,
+					   uint32_t min_rdata,
+					   uint32_t max_rdata);
+NTSTATUS cli_smb2_qpathinfo_recv(struct tevent_req *req,
+				 TALLOC_CTX *mem_ctx,
+				 uint8_t **rdata,
+				 uint32_t *num_rdata);
 struct tevent_req *cli_smb2_query_info_fnum_send(
 	TALLOC_CTX *mem_ctx,
 	struct tevent_context *ev,
@@ -159,28 +170,6 @@ NTSTATUS cli_smb2_query_info_fnum(
 	uint32_t in_flags,
 	TALLOC_CTX *mem_ctx,


-- 
Samba Shared Repository



More information about the samba-cvs mailing list