[SCM] Samba Shared Repository - branch v3-2-test updated - release-3-2-0pre2-508-g34dd8f3

Günther Deschner gd at samba.org
Fri Mar 28 12:38:48 GMT 2008


The branch, v3-2-test has been updated
       via  34dd8f32e1b7fe256ab5dfde5ef5bb8abeec121a (commit)
       via  7fa53911054a39681df3f08d19aad92f60d59e28 (commit)
       via  f8835462f2b88daa687edc79378511ffcb30905d (commit)
       via  62c876080c1f3afdd143d1f7f66529827b0f2990 (commit)
      from  565a30ac3208d89de617b28f4553911484033253 (commit)

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


- Log -----------------------------------------------------------------
commit 34dd8f32e1b7fe256ab5dfde5ef5bb8abeec121a
Author: Günther Deschner <gd at samba.org>
Date:   Fri Mar 28 13:37:25 2008 +0100

    Remove unneeded pack_dsdcinfo/unpack_dsdcinfo.
    
    Guenther

commit 7fa53911054a39681df3f08d19aad92f60d59e28
Author: Günther Deschner <gd at samba.org>
Date:   Fri Mar 28 13:36:31 2008 +0100

    Use NDR for netr_DsRGetDCNameInfo un-/marshalling in dsgetdcname.
    
    Guenther

commit f8835462f2b88daa687edc79378511ffcb30905d
Author: Günther Deschner <gd at samba.org>
Date:   Fri Mar 28 13:31:40 2008 +0100

    Re-run make idl.
    
    Guenther

commit 62c876080c1f3afdd143d1f7f66529827b0f2990
Author: Günther Deschner <gd at samba.org>
Date:   Fri Mar 28 13:30:13 2008 +0100

    Make netr_DsRGetDCNameInfo public.
    
    Guenther

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

Summary of changes:
 source/librpc/gen_ndr/ndr_netlogon.c |    4 +-
 source/librpc/gen_ndr/ndr_netlogon.h |    2 +
 source/librpc/gen_ndr/netlogon.h     |    2 +-
 source/librpc/idl/netlogon.idl       |    2 +-
 source/libsmb/dsgetdcname.c          |  186 +++++-----------------------------
 5 files changed, 32 insertions(+), 164 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/librpc/gen_ndr/ndr_netlogon.c b/source/librpc/gen_ndr/ndr_netlogon.c
index 86535ca..7f340b6 100644
--- a/source/librpc/gen_ndr/ndr_netlogon.c
+++ b/source/librpc/gen_ndr/ndr_netlogon.c
@@ -6103,7 +6103,7 @@ _PUBLIC_ void ndr_print_netr_DsR_DcFlags(struct ndr_print *ndr, const char *name
 	ndr->depth--;
 }
 
-static enum ndr_err_code ndr_push_netr_DsRGetDCNameInfo(struct ndr_push *ndr, int ndr_flags, const struct netr_DsRGetDCNameInfo *r)
+_PUBLIC_ enum ndr_err_code ndr_push_netr_DsRGetDCNameInfo(struct ndr_push *ndr, int ndr_flags, const struct netr_DsRGetDCNameInfo *r)
 {
 	if (ndr_flags & NDR_SCALARS) {
 		NDR_CHECK(ndr_push_align(ndr, 4));
@@ -6159,7 +6159,7 @@ static enum ndr_err_code ndr_push_netr_DsRGetDCNameInfo(struct ndr_push *ndr, in
 	return NDR_ERR_SUCCESS;
 }
 
-static enum ndr_err_code ndr_pull_netr_DsRGetDCNameInfo(struct ndr_pull *ndr, int ndr_flags, struct netr_DsRGetDCNameInfo *r)
+_PUBLIC_ enum ndr_err_code ndr_pull_netr_DsRGetDCNameInfo(struct ndr_pull *ndr, int ndr_flags, struct netr_DsRGetDCNameInfo *r)
 {
 	uint32_t _ptr_dc_unc;
 	TALLOC_CTX *_mem_save_dc_unc_0;
diff --git a/source/librpc/gen_ndr/ndr_netlogon.h b/source/librpc/gen_ndr/ndr_netlogon.h
index dd9466b..3615e07 100644
--- a/source/librpc/gen_ndr/ndr_netlogon.h
+++ b/source/librpc/gen_ndr/ndr_netlogon.h
@@ -191,6 +191,8 @@ void ndr_print_netr_Blob(struct ndr_print *ndr, const char *name, const struct n
 void ndr_print_netr_DsRGetDCName_flags(struct ndr_print *ndr, const char *name, uint32_t r);
 void ndr_print_netr_DsRGetDCNameInfo_AddressType(struct ndr_print *ndr, const char *name, enum netr_DsRGetDCNameInfo_AddressType r);
 void ndr_print_netr_DsR_DcFlags(struct ndr_print *ndr, const char *name, uint32_t r);
+enum ndr_err_code ndr_push_netr_DsRGetDCNameInfo(struct ndr_push *ndr, int ndr_flags, const struct netr_DsRGetDCNameInfo *r);
+enum ndr_err_code ndr_pull_netr_DsRGetDCNameInfo(struct ndr_pull *ndr, int ndr_flags, struct netr_DsRGetDCNameInfo *r);
 void ndr_print_netr_DsRGetDCNameInfo(struct ndr_print *ndr, const char *name, const struct netr_DsRGetDCNameInfo *r);
 void ndr_print_netr_BinaryString(struct ndr_print *ndr, const char *name, const struct netr_BinaryString *r);
 void ndr_print_netr_DomainQuery1(struct ndr_print *ndr, const char *name, const struct netr_DomainQuery1 *r);
diff --git a/source/librpc/gen_ndr/netlogon.h b/source/librpc/gen_ndr/netlogon.h
index b51c7cb..bcd9f4d 100644
--- a/source/librpc/gen_ndr/netlogon.h
+++ b/source/librpc/gen_ndr/netlogon.h
@@ -710,7 +710,7 @@ struct netr_DsRGetDCNameInfo {
 	uint32_t dc_flags;
 	const char *dc_site_name;/* [unique,charset(UTF16)] */
 	const char *client_site_name;/* [unique,charset(UTF16)] */
-};
+}/* [public] */;
 
 struct netr_BinaryString {
 	uint16_t length;
diff --git a/source/librpc/idl/netlogon.idl b/source/librpc/idl/netlogon.idl
index 8f07112..cbf78c7 100644
--- a/source/librpc/idl/netlogon.idl
+++ b/source/librpc/idl/netlogon.idl
@@ -1009,7 +1009,7 @@ interface netlogon
 		DS_DNS_FOREST			 = 0x80000000
 	} netr_DsR_DcFlags;
 
-	typedef struct {
+	typedef [public] struct {
 		[string,charset(UTF16)] uint16 *dc_unc;
 		[string,charset(UTF16)] uint16 *dc_address;
 		netr_DsRGetDCNameInfo_AddressType dc_address_type;
diff --git a/source/libsmb/dsgetdcname.c b/source/libsmb/dsgetdcname.c
index bc9f4b9..7af4364 100644
--- a/source/libsmb/dsgetdcname.c
+++ b/source/libsmb/dsgetdcname.c
@@ -107,150 +107,6 @@ void debug_dsdcinfo_flags(int lvl, uint32_t flags)
 		DEBUGADD(lvl,("\n"));
 }
 
-/*********************************************************************
- ********************************************************************/
-
-static int pack_dsdcinfo(struct netr_DsRGetDCNameInfo *info,
-			 unsigned char **buf)
-{
-	unsigned char *buffer = NULL;
-	int len = 0;
-	int buflen = 0;
-	UUID_FLAT guid_flat;
-
-	DEBUG(10,("pack_dsdcinfo: Packing dsdcinfo\n"));
-
-	ZERO_STRUCT(guid_flat);
-
-	if (!GUID_all_zero(&info->domain_guid)) {
-		smb_uuid_pack(info->domain_guid, &guid_flat);
-	}
-
- again:
-	len = 0;
-
-	if (buflen > 0) {
-		DEBUG(10,("pack_dsdcinfo: Packing domain %s (%s)\n",
-			  info->domain_name, info->dc_unc));
-	}
-
-	len += tdb_pack(buffer+len, buflen-len, "ffdBffdff",
-			info->dc_unc,
-			info->dc_address,
-			info->dc_address_type,
-			UUID_FLAT_SIZE, guid_flat.info,
-			info->domain_name,
-			info->forest_name,
-			info->dc_flags,
-			info->dc_site_name,
-			info->client_site_name);
-
-	if (buflen < len) {
-		SAFE_FREE(buffer);
-		if ((buffer = SMB_MALLOC_ARRAY(unsigned char, len)) == NULL ) {
-			DEBUG(0,("pack_dsdcinfo: failed to alloc buffer!\n"));
-			buflen = -1;
-			goto done;
-		}
-		buflen = len;
-		goto again;
-	}
-
-	*buf = buffer;
-
- done:
-	return buflen;
-}
-
-/*********************************************************************
- ********************************************************************/
-
-static NTSTATUS unpack_dsdcinfo(TALLOC_CTX *mem_ctx,
-				unsigned char *buf,
-				int buflen,
-				struct netr_DsRGetDCNameInfo **info_ret)
-{
-	int len = 0;
-	struct netr_DsRGetDCNameInfo *info = NULL;
-	uint32_t guid_len = 0;
-	unsigned char *guid_buf = NULL;
-	UUID_FLAT guid_flat;
-
-	/* forgive me 6 times */
-	fstring dc_unc;
-	fstring dc_address;
-	fstring domain_name;
-	fstring forest_name;
-	fstring dc_site_name;
-	fstring client_site_name;
-
-	info = TALLOC_ZERO_P(mem_ctx, struct netr_DsRGetDCNameInfo);
-	NT_STATUS_HAVE_NO_MEMORY(info);
-
-	len += tdb_unpack(buf+len, buflen-len, "ffdBffdff",
-			  &dc_unc,
-			  &dc_address,
-			  &info->dc_address_type,
-			  &guid_len, &guid_buf,
-			  &domain_name,
-			  &forest_name,
-			  &info->dc_flags,
-			  &dc_site_name,
-			  &client_site_name);
-	if (len == -1) {
-		DEBUG(5,("unpack_dsdcinfo: Failed to unpack domain\n"));
-		goto failed;
-	}
-
-	info->dc_unc =
-		talloc_strdup(mem_ctx, dc_unc);
-	info->dc_address =
-		talloc_strdup(mem_ctx, dc_address);
-	info->domain_name =
-		talloc_strdup(mem_ctx, domain_name);
-	info->forest_name =
-		talloc_strdup(mem_ctx, forest_name);
-	info->dc_site_name =
-		talloc_strdup(mem_ctx, dc_site_name);
-	info->client_site_name =
-		talloc_strdup(mem_ctx, client_site_name);
-
-	if (!info->dc_unc ||
-	    !info->dc_address ||
-	    !info->domain_name ||
-	    !info->forest_name ||
-	    !info->dc_site_name ||
-	    !info->client_site_name) {
-		goto failed;
-	}
-
-	if (guid_len > 0) {
-		struct GUID guid;
-
-		if (guid_len != UUID_FLAT_SIZE) {
-			goto failed;
-		}
-
-		memcpy(&guid_flat.info, guid_buf, guid_len);
-		smb_uuid_unpack(guid_flat, &guid);
-
-		info->domain_guid = guid;
-		SAFE_FREE(guid_buf);
-	}
-
-	DEBUG(10,("unpack_dcscinfo: Unpacked domain %s (%s)\n",
-		  info->domain_name, info->dc_unc));
-
-	*info_ret = info;
-
-	return NT_STATUS_OK;
-
- failed:
- 	TALLOC_FREE(info);
-	SAFE_FREE(guid_buf);
-	return NT_STATUS_NO_MEMORY;
-}
-
 /****************************************************************
 ****************************************************************/
 
@@ -298,8 +154,7 @@ static NTSTATUS dsgetdcname_cache_store(TALLOC_CTX *mem_ctx,
 	char *key;
 	bool ret = false;
 	DATA_BLOB blob;
-	unsigned char *buf = NULL;
-	int len = 0;
+	enum ndr_err_code ndr_err;
 
 	if (!gencache_init()) {
 		return NT_STATUS_INTERNAL_DB_ERROR;
@@ -312,14 +167,12 @@ static NTSTATUS dsgetdcname_cache_store(TALLOC_CTX *mem_ctx,
 
 	expire_time = time(NULL) + DSGETDCNAME_CACHE_TTL;
 
-	len = pack_dsdcinfo(info, &buf);
-	if (len == -1) {
-		return NT_STATUS_UNSUCCESSFUL;
+	ndr_err = ndr_push_struct_blob(&blob, mem_ctx, info,
+		       (ndr_push_flags_fn_t)ndr_push_netr_DsRGetDCNameInfo);
+	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+		return ndr_map_error2ntstatus(ndr_err);
 	}
 
-	blob = data_blob(buf, len);
-	SAFE_FREE(buf);
-
 	if (gencache_lock_entry(key) != 0) {
 		data_blob_free(&blob);
 		return NT_STATUS_LOCK_NOT_GRANTED;
@@ -404,12 +257,13 @@ static NTSTATUS dsgetdcname_cache_fetch(TALLOC_CTX *mem_ctx,
 					struct GUID *domain_guid,
 					uint32_t flags,
 					const char *site_name,
-					struct netr_DsRGetDCNameInfo **info,
+					struct netr_DsRGetDCNameInfo **info_p,
 					bool *expired)
 {
 	char *key;
 	DATA_BLOB blob;
-	NTSTATUS status;
+	enum ndr_err_code ndr_err;
+	struct netr_DsRGetDCNameInfo *info;
 
 	if (!gencache_init()) {
 		return NT_STATUS_INTERNAL_DB_ERROR;
@@ -424,25 +278,37 @@ static NTSTATUS dsgetdcname_cache_fetch(TALLOC_CTX *mem_ctx,
 		return NT_STATUS_OBJECT_NAME_NOT_FOUND;
 	}
 
-	status = unpack_dsdcinfo(mem_ctx, blob.data, blob.length, info);
-	if (!NT_STATUS_IS_OK(status)) {
-		data_blob_free(&blob);
-		return status;
+	info = TALLOC_ZERO_P(mem_ctx, struct netr_DsRGetDCNameInfo);
+	if (!info) {
+		return NT_STATUS_NO_MEMORY;
 	}
 
+	ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, info,
+		      (ndr_pull_flags_fn_t)ndr_pull_netr_DsRGetDCNameInfo);
+
 	data_blob_free(&blob);
+	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+		dsgetdcname_cache_delete(mem_ctx, domain_name);
+		return ndr_map_error2ntstatus(ndr_err);
+	}
+
+	if (DEBUGLEVEL >= 10) {
+		NDR_PRINT_DEBUG(netr_DsRGetDCNameInfo, info);
+	}
 
 	/* check flags */
-	if (!check_cldap_reply_required_flags((*info)->dc_flags, flags)) {
+	if (!check_cldap_reply_required_flags(info->dc_flags, flags)) {
 		DEBUG(10,("invalid flags\n"));
 		return NT_STATUS_INVALID_PARAMETER;
 	}
 
 	if ((flags & DS_IP_REQUIRED) &&
-	    ((*info)->dc_address_type != DS_ADDRESS_TYPE_INET)) {
+	    (info->dc_address_type != DS_ADDRESS_TYPE_INET)) {
 	    	return NT_STATUS_INVALID_PARAMETER_MIX;
 	}
 
+	*info_p = info;
+
 	return NT_STATUS_OK;
 }
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list