Refactor our DsGetDcName call a bit (before it will move into libnetapi).
authorGünther Deschner <gd@samba.org>
Mon, 7 Jan 2008 22:05:58 +0000 (23:05 +0100)
committerGünther Deschner <gd@samba.org>
Mon, 7 Jan 2008 22:06:12 +0000 (23:06 +0100)
Guenther

source/libsmb/dsgetdcname.c

index f8089cbd6a579691d5c7207efd154972ec8a32b0..fa6cbe146f68df85a2576c0e537f6457bd89674a 100644 (file)
@@ -4,7 +4,7 @@
    DsGetDcname
 
    Copyright (C) Gerald Carter 2006
-   Copyright (C) Guenther Deschner 2007
+   Copyright (C) Guenther Deschner 2007-2008
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -891,28 +891,72 @@ static NTSTATUS DsGetDcName_rediscover(TALLOC_CTX *mem_ctx,
 }
 
 /********************************************************************
- DsGetDcName.
+********************************************************************/
 
- This will be the only public function here.
+NTSTATUS DsGetDcName_remote(TALLOC_CTX *mem_ctx,
+                           const char *computer_name,
+                           const char *domain_name,
+                           struct GUID *domain_guid,
+                           const char *site_name,
+                           uint32_t flags,
+                           struct DS_DOMAIN_CONTROLLER_INFO **info)
+{
+       WERROR werr;
+       NTSTATUS status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND;
+       struct cli_state *cli = NULL;
+       struct rpc_pipe_client *pipe_cli = NULL;
+
+       status = cli_full_connection(&cli, NULL, computer_name,
+                                    NULL, 0,
+                                    "IPC$", "IPC",
+                                    "",
+                                    "",
+                                    "",
+                                    0, Undefined, NULL);
+
+       if (!NT_STATUS_IS_OK(status)) {
+               goto done;
+       }
+
+       pipe_cli = cli_rpc_pipe_open_noauth(cli, PI_NETLOGON,
+                                           &status);
+       if (!pipe_cli) {
+               goto done;
+       }
+
+       werr = rpccli_netlogon_dsr_getdcname(pipe_cli,
+                                            mem_ctx,
+                                            computer_name,
+                                            domain_name,
+                                            domain_guid,
+                                            NULL,
+                                            flags,
+                                            info);
+       status = werror_to_ntstatus(werr);
+
+ done:
+       cli_rpc_pipe_close(pipe_cli);
+       if (cli) {
+               cli_shutdown(cli);
+       }
+
+       return status;
+}
+
+/********************************************************************
 ********************************************************************/
 
-NTSTATUS DsGetDcName(TALLOC_CTX *mem_ctx,
-                    const char *computer_name,
-                    const char *domain_name,
-                    struct GUID *domain_guid,
-                    const char *site_name,
-                    uint32_t flags,
-                    struct DS_DOMAIN_CONTROLLER_INFO **info)
+NTSTATUS DsGetDcName_local(TALLOC_CTX *mem_ctx,
+                          const char *computer_name,
+                          const char *domain_name,
+                          struct GUID *domain_guid,
+                          const char *site_name,
+                          uint32_t flags,
+                          struct DS_DOMAIN_CONTROLLER_INFO **info)
 {
        NTSTATUS status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND;
        struct DS_DOMAIN_CONTROLLER_INFO *myinfo = NULL;
 
-       DEBUG(10,("DsGetDcName: computer_name: %s, domain_name: %s, "
-                 "domain_guid: %s, site_name: %s, flags: 0x%08x\n",
-                 computer_name, domain_name,
-                 domain_guid ? GUID_string(mem_ctx, domain_guid) : "(null)",
-                 site_name, flags));
-
        *info = NULL;
 
        if (!check_allowed_required_flags(flags)) {
@@ -947,3 +991,44 @@ NTSTATUS DsGetDcName(TALLOC_CTX *mem_ctx,
 
        return status;
 }
+
+/********************************************************************
+ DsGetDcName.
+
+ This will be the only public function here.
+********************************************************************/
+
+NTSTATUS DsGetDcName(TALLOC_CTX *mem_ctx,
+                    const char *computer_name,
+                    const char *domain_name,
+                    struct GUID *domain_guid,
+                    const char *site_name,
+                    uint32_t flags,
+                    struct DS_DOMAIN_CONTROLLER_INFO **info)
+{
+       DEBUG(10,("DsGetDcName: computer_name: %s, domain_name: %s, "
+                 "domain_guid: %s, site_name: %s, flags: 0x%08x\n",
+                 computer_name, domain_name,
+                 domain_guid ? GUID_string(mem_ctx, domain_guid) : "(null)",
+                 site_name, flags));
+
+       *info = NULL;
+
+       if (computer_name) {
+               return DsGetDcName_remote(mem_ctx,
+                                         computer_name,
+                                         domain_name,
+                                         domain_guid,
+                                         site_name,
+                                         flags,
+                                         info);
+       }
+
+       return DsGetDcName_local(mem_ctx,
+                                computer_name,
+                                domain_name,
+                                domain_guid,
+                                site_name,
+                                flags,
+                                info);
+}