[SCM] Samba Shared Repository - branch v3-2-test updated - initial-v3-2-test-2042-gf429153

Günther Deschner gd at samba.org
Fri Feb 8 22:03:25 GMT 2008


The branch, v3-2-test has been updated
       via  f429153de299a1144bdf4fc4f9753fff0140c3bf (commit)
       via  10ce833cf0413811db13d9849b9c23fcc27f4526 (commit)
       via  911b5f1feb08840198f57f361bcd2b19d9f3bf0d (commit)
      from  bdda909777dac08977a1d484d4e6e15e5dbfbba6 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-test


- Log -----------------------------------------------------------------
commit f429153de299a1144bdf4fc4f9753fff0140c3bf
Author: Günther Deschner <gd at samba.org>
Date:   Wed Feb 6 20:26:54 2008 +0100

    Add cmd_samr_enum_domains command to rpcclient.
    
    Guenther

commit 10ce833cf0413811db13d9849b9c23fcc27f4526
Author: Günther Deschner <gd at samba.org>
Date:   Fri Feb 8 23:01:09 2008 +0100

    Re-run make idl.
    
    Guenther

commit 911b5f1feb08840198f57f361bcd2b19d9f3bf0d
Author: Günther Deschner <gd at samba.org>
Date:   Fri Feb 8 22:26:42 2008 +0100

    Fix IDL for samr_EnumDomains.
    
    Guenther

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

Summary of changes:
 source/librpc/gen_ndr/cli_samr.c |    2 +-
 source/librpc/gen_ndr/cli_samr.h |    2 +-
 source/librpc/gen_ndr/ndr_samr.c |   27 +++++++++++++--
 source/librpc/gen_ndr/samr.h     |    2 +-
 source/librpc/gen_ndr/srv_samr.c |    2 +-
 source/librpc/idl/samr.idl       |    4 +-
 source/rpcclient/cmd_samr.c      |   67 ++++++++++++++++++++++++++++++++++++++
 7 files changed, 97 insertions(+), 9 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/librpc/gen_ndr/cli_samr.c b/source/librpc/gen_ndr/cli_samr.c
index c3cb5ad..efedb00 100644
--- a/source/librpc/gen_ndr/cli_samr.c
+++ b/source/librpc/gen_ndr/cli_samr.c
@@ -261,8 +261,8 @@ NTSTATUS rpccli_samr_EnumDomains(struct rpc_pipe_client *cli,
 				 TALLOC_CTX *mem_ctx,
 				 struct policy_handle *connect_handle,
 				 uint32_t *resume_handle,
+				 struct samr_SamArray **sam,
 				 uint32_t buf_size,
-				 struct samr_SamArray *sam,
 				 uint32_t *num_entries)
 {
 	struct samr_EnumDomains r;
diff --git a/source/librpc/gen_ndr/cli_samr.h b/source/librpc/gen_ndr/cli_samr.h
index 5df5e3a..9eac177 100644
--- a/source/librpc/gen_ndr/cli_samr.h
+++ b/source/librpc/gen_ndr/cli_samr.h
@@ -31,8 +31,8 @@ NTSTATUS rpccli_samr_EnumDomains(struct rpc_pipe_client *cli,
 				 TALLOC_CTX *mem_ctx,
 				 struct policy_handle *connect_handle,
 				 uint32_t *resume_handle,
+				 struct samr_SamArray **sam,
 				 uint32_t buf_size,
-				 struct samr_SamArray *sam,
 				 uint32_t *num_entries);
 NTSTATUS rpccli_samr_OpenDomain(struct rpc_pipe_client *cli,
 				TALLOC_CTX *mem_ctx,
diff --git a/source/librpc/gen_ndr/ndr_samr.c b/source/librpc/gen_ndr/ndr_samr.c
index f257c17..8c97ea1 100644
--- a/source/librpc/gen_ndr/ndr_samr.c
+++ b/source/librpc/gen_ndr/ndr_samr.c
@@ -5788,7 +5788,10 @@ static enum ndr_err_code ndr_push_samr_EnumDomains(struct ndr_push *ndr, int fla
 		if (r->out.sam == NULL) {
 			return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
 		}
-		NDR_CHECK(ndr_push_samr_SamArray(ndr, NDR_SCALARS|NDR_BUFFERS, r->out.sam));
+		NDR_CHECK(ndr_push_unique_ptr(ndr, *r->out.sam));
+		if (*r->out.sam) {
+			NDR_CHECK(ndr_push_samr_SamArray(ndr, NDR_SCALARS|NDR_BUFFERS, *r->out.sam));
+		}
 		if (r->out.num_entries == NULL) {
 			return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
 		}
@@ -5800,9 +5803,11 @@ static enum ndr_err_code ndr_push_samr_EnumDomains(struct ndr_push *ndr, int fla
 
 static enum ndr_err_code ndr_pull_samr_EnumDomains(struct ndr_pull *ndr, int flags, struct samr_EnumDomains *r)
 {
+	uint32_t _ptr_sam;
 	TALLOC_CTX *_mem_save_connect_handle_0;
 	TALLOC_CTX *_mem_save_resume_handle_0;
 	TALLOC_CTX *_mem_save_sam_0;
+	TALLOC_CTX *_mem_save_sam_1;
 	TALLOC_CTX *_mem_save_num_entries_0;
 	if (flags & NDR_IN) {
 		ZERO_STRUCT(r->out);
@@ -5842,7 +5847,18 @@ static enum ndr_err_code ndr_pull_samr_EnumDomains(struct ndr_pull *ndr, int fla
 		}
 		_mem_save_sam_0 = NDR_PULL_GET_MEM_CTX(ndr);
 		NDR_PULL_SET_MEM_CTX(ndr, r->out.sam, LIBNDR_FLAG_REF_ALLOC);
-		NDR_CHECK(ndr_pull_samr_SamArray(ndr, NDR_SCALARS|NDR_BUFFERS, r->out.sam));
+		NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_sam));
+		if (_ptr_sam) {
+			NDR_PULL_ALLOC(ndr, *r->out.sam);
+		} else {
+			*r->out.sam = NULL;
+		}
+		if (*r->out.sam) {
+			_mem_save_sam_1 = NDR_PULL_GET_MEM_CTX(ndr);
+			NDR_PULL_SET_MEM_CTX(ndr, *r->out.sam, 0);
+			NDR_CHECK(ndr_pull_samr_SamArray(ndr, NDR_SCALARS|NDR_BUFFERS, *r->out.sam));
+			NDR_PULL_SET_MEM_CTX(ndr, _mem_save_sam_1, 0);
+		}
 		NDR_PULL_SET_MEM_CTX(ndr, _mem_save_sam_0, LIBNDR_FLAG_REF_ALLOC);
 		if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
 			NDR_PULL_ALLOC(ndr, r->out.num_entries);
@@ -5886,7 +5902,12 @@ _PUBLIC_ void ndr_print_samr_EnumDomains(struct ndr_print *ndr, const char *name
 		ndr->depth--;
 		ndr_print_ptr(ndr, "sam", r->out.sam);
 		ndr->depth++;
-		ndr_print_samr_SamArray(ndr, "sam", r->out.sam);
+		ndr_print_ptr(ndr, "sam", *r->out.sam);
+		ndr->depth++;
+		if (*r->out.sam) {
+			ndr_print_samr_SamArray(ndr, "sam", *r->out.sam);
+		}
+		ndr->depth--;
 		ndr->depth--;
 		ndr_print_ptr(ndr, "num_entries", r->out.num_entries);
 		ndr->depth++;
diff --git a/source/librpc/gen_ndr/samr.h b/source/librpc/gen_ndr/samr.h
index 376feae..2d6126a 100644
--- a/source/librpc/gen_ndr/samr.h
+++ b/source/librpc/gen_ndr/samr.h
@@ -837,7 +837,7 @@ struct samr_EnumDomains {
 	} in;
 
 	struct {
-		struct samr_SamArray *sam;/* [ref] */
+		struct samr_SamArray **sam;/* [ref] */
 		uint32_t *num_entries;/* [ref] */
 		uint32_t *resume_handle;/* [ref] */
 		NTSTATUS result;
diff --git a/source/librpc/gen_ndr/srv_samr.c b/source/librpc/gen_ndr/srv_samr.c
index 374df34..3312964 100644
--- a/source/librpc/gen_ndr/srv_samr.c
+++ b/source/librpc/gen_ndr/srv_samr.c
@@ -507,7 +507,7 @@ static bool api_samr_EnumDomains(pipes_struct *p)
 
 	ZERO_STRUCT(r->out);
 	r->out.resume_handle = r->in.resume_handle;
-	r->out.sam = talloc_zero(r, struct samr_SamArray);
+	r->out.sam = talloc_zero(r, struct samr_SamArray *);
 	if (r->out.sam == NULL) {
 		talloc_free(r);
 		return false;
diff --git a/source/librpc/idl/samr.idl b/source/librpc/idl/samr.idl
index 1c18b26..6841420 100644
--- a/source/librpc/idl/samr.idl
+++ b/source/librpc/idl/samr.idl
@@ -160,10 +160,10 @@ import "misc.idl", "lsa.idl", "security.idl";
 	} samr_SamArray;
 
 	NTSTATUS samr_EnumDomains (
-		[in,ref]      policy_handle *connect_handle,
+		[in]          policy_handle *connect_handle,
 		[in,out,ref]  uint32 *resume_handle,
+		[out,ref]     samr_SamArray **sam,
 		[in]          uint32 buf_size,
-		[out,ref]     samr_SamArray *sam,
 		[out,ref]     uint32 *num_entries
 		);
 
diff --git a/source/rpcclient/cmd_samr.c b/source/rpcclient/cmd_samr.c
index edc3c9d..5170fb3 100644
--- a/source/rpcclient/cmd_samr.c
+++ b/source/rpcclient/cmd_samr.c
@@ -1046,6 +1046,72 @@ static NTSTATUS cmd_samr_enum_als_groups(struct rpc_pipe_client *cli,
 	return result;
 }
 
+/* Enumerate domains */
+
+static NTSTATUS cmd_samr_enum_domains(struct rpc_pipe_client *cli,
+				      TALLOC_CTX *mem_ctx,
+				      int argc, const char **argv)
+{
+	POLICY_HND connect_pol;
+	NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
+	uint32 start_idx, size, num_entries, i;
+	uint32 access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
+	bool got_connect_pol = false;
+	struct samr_SamArray *sam = NULL;
+
+	if ((argc < 1) || (argc > 2)) {
+		printf("Usage: %s [access mask]\n", argv[0]);
+		return NT_STATUS_OK;
+	}
+
+	if (argc > 2) {
+		sscanf(argv[2], "%x", &access_mask);
+	}
+
+	/* Get sam policy handle */
+
+	result = try_samr_connects(cli, mem_ctx,
+				   access_mask,
+				   &connect_pol);
+
+	if (!NT_STATUS_IS_OK(result)) {
+		goto done;
+	}
+
+	got_connect_pol = true;
+
+	/* Enumerate alias groups */
+
+	start_idx = 0;
+	size = 0xffff;
+
+	do {
+		result = rpccli_samr_EnumDomains(cli, mem_ctx,
+						 &connect_pol,
+						 &start_idx,
+						 &sam,
+						 size,
+						 &num_entries);
+
+		if (NT_STATUS_IS_OK(result) ||
+		    NT_STATUS_V(result) == NT_STATUS_V(STATUS_MORE_ENTRIES)) {
+
+			for (i = 0; i < num_entries; i++)
+				printf("name:[%s] idx:[0x%x]\n",
+				       sam->entries[i].name.string,
+				       sam->entries[i].idx);
+		}
+	} while (NT_STATUS_V(result) == NT_STATUS_V(STATUS_MORE_ENTRIES));
+
+ done:
+	if (got_connect_pol) {
+		rpccli_samr_Close(cli, mem_ctx, &connect_pol);
+	}
+
+	return result;
+}
+
+
 /* Query alias membership */
 
 static NTSTATUS cmd_samr_query_aliasmem(struct rpc_pipe_client *cli,
@@ -2485,6 +2551,7 @@ struct cmd_set samr_commands[] = {
 	{ "enumdomusers",      RPC_RTYPE_NTSTATUS, cmd_samr_enum_dom_users,       NULL, PI_SAMR, NULL,	"Enumerate domain users", "" },
 	{ "enumdomgroups",      RPC_RTYPE_NTSTATUS, cmd_samr_enum_dom_groups,       NULL, PI_SAMR, NULL,	"Enumerate domain groups", "" },
 	{ "enumalsgroups",      RPC_RTYPE_NTSTATUS, cmd_samr_enum_als_groups,       NULL, PI_SAMR, NULL,	"Enumerate alias groups",  "" },
+	{ "enumdomains",        RPC_RTYPE_NTSTATUS, cmd_samr_enum_domains,          NULL, PI_SAMR, NULL,	"Enumerate domains",  "" },
 
 	{ "createdomuser",      RPC_RTYPE_NTSTATUS, cmd_samr_create_dom_user,       NULL, PI_SAMR, NULL,	"Create domain user",      "" },
 	{ "createdomgroup",     RPC_RTYPE_NTSTATUS, cmd_samr_create_dom_group,      NULL, PI_SAMR, NULL,	"Create domain group",     "" },


-- 
Samba Shared Repository


More information about the samba-cvs mailing list