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 <[EMAIL PROTECTED]>
Date:   Fri Mar 28 13:37:25 2008 +0100

    Remove unneeded pack_dsdcinfo/unpack_dsdcinfo.
    
    Guenther

commit 7fa53911054a39681df3f08d19aad92f60d59e28
Author: Günther Deschner <[EMAIL PROTECTED]>
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 <[EMAIL PROTECTED]>
Date:   Fri Mar 28 13:31:40 2008 +0100

    Re-run make idl.
    
    Guenther

commit 62c876080c1f3afdd143d1f7f66529827b0f2990
Author: Günther Deschner <[EMAIL PROTECTED]>
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

Reply via email to