s3-lib: Fix util_cmdline which doesn't use popt.
[nivanova/samba-autobuild/.git] / source3 / lib / netapi / cm.c
index 0e08c6d183df6aebcff04582af3337c3a217dab2..4dfa6b50a255b5e3a4f1d9d615ceb8fbc5283bf9 100644 (file)
  */
 
 #include "includes.h"
-#include "popt_common.h"
+#include "auth_info.h"
 
 #include "lib/netapi/netapi.h"
 #include "lib/netapi/netapi_private.h"
+#include "libsmb/libsmb.h"
 #include "rpc_client/cli_pipe.h"
 
 /********************************************************************
@@ -47,7 +48,9 @@ static struct client_ipc_connection *ipc_cm_find(
        struct client_ipc_connection *p;
 
        for (p = priv_ctx->ipc_connections; p; p = p->next) {
-               if (strequal(p->cli->desthost, server_name)) {
+               const char *remote_name = cli_state_remote_name(p->cli);
+
+               if (strequal(remote_name, server_name)) {
                        return p;
                }
        }
@@ -62,16 +65,18 @@ static WERROR libnetapi_open_ipc_connection(struct libnetapi_ctx *ctx,
                                            const char *server_name,
                                            struct client_ipc_connection **pp)
 {
-       struct libnetapi_private_ctx *priv_ctx =
-               (struct libnetapi_private_ctx *)ctx->private_data;
+       struct libnetapi_private_ctx *priv_ctx;
        struct user_auth_info *auth_info = NULL;
        struct cli_state *cli_ipc = NULL;
        struct client_ipc_connection *p;
+       NTSTATUS status;
 
        if (!ctx || !pp || !server_name) {
                return WERR_INVALID_PARAM;
        }
 
+       priv_ctx = (struct libnetapi_private_ctx *)ctx->private_data;
+
        p = ipc_cm_find(priv_ctx, server_name);
        if (p) {
                *pp = p;
@@ -82,7 +87,7 @@ static WERROR libnetapi_open_ipc_connection(struct libnetapi_ctx *ctx,
        if (!auth_info) {
                return WERR_NOMEM;
        }
-       auth_info->signing_state = Undefined;
+       auth_info->signing_state = SMB_SIGNING_DEFAULT;
        set_cmdline_auth_info_use_kerberos(auth_info, ctx->use_kerberos);
        set_cmdline_auth_info_username(auth_info, ctx->username);
        if (ctx->password) {
@@ -101,16 +106,18 @@ static WERROR libnetapi_open_ipc_connection(struct libnetapi_ctx *ctx,
                set_cmdline_auth_info_use_ccache(auth_info, true);
        }
 
-       cli_ipc = cli_cm_open(ctx, NULL,
-                               server_name, "IPC$",
-                               auth_info,
-                               false, false,
-                               PROTOCOL_NT1,
-                               0, 0x20);
-       if (cli_ipc) {
+       status = cli_cm_open(ctx, NULL,
+                            server_name, "IPC$",
+                            auth_info,
+                            false, false,
+                            PROTOCOL_NT1,
+                            0, 0x20, &cli_ipc);
+       if (NT_STATUS_IS_OK(status)) {
                cli_set_username(cli_ipc, ctx->username);
                cli_set_password(cli_ipc, ctx->password);
                cli_set_domain(cli_ipc, ctx->workgroup);
+       } else {
+               cli_ipc = NULL;
        }
        TALLOC_FREE(auth_info);
 
@@ -120,7 +127,7 @@ static WERROR libnetapi_open_ipc_connection(struct libnetapi_ctx *ctx,
                return WERR_CAN_NOT_COMPLETE;
        }
 
-       p = TALLOC_ZERO_P(ctx, struct client_ipc_connection);
+       p = talloc_zero(ctx, struct client_ipc_connection);
        if (p == NULL) {
                return WERR_NOMEM;
        }
@@ -159,12 +166,15 @@ static NTSTATUS pipe_cm_find(struct client_ipc_connection *ipc,
        struct client_pipe_connection *p;
 
        for (p = ipc->pipe_connections; p; p = p->next) {
+               const char *ipc_remote_name;
 
                if (!rpc_pipe_np_smb_conn(p->pipe)) {
                        return NT_STATUS_PIPE_EMPTY;
                }
 
-               if (strequal(ipc->cli->desthost, p->pipe->desthost)
+               ipc_remote_name = cli_state_remote_name(ipc->cli);
+
+               if (strequal(ipc_remote_name, p->pipe->desthost)
                    && ndr_syntax_id_equal(&p->pipe->abstract_syntax,
                                           interface)) {
                        *presult = p->pipe;
@@ -186,7 +196,7 @@ static NTSTATUS pipe_cm_connect(TALLOC_CTX *mem_ctx,
        struct client_pipe_connection *p;
        NTSTATUS status;
 
-       p = TALLOC_ZERO_ARRAY(mem_ctx, struct client_pipe_connection, 1);
+       p = talloc_zero_array(mem_ctx, struct client_pipe_connection, 1);
        if (!p) {
                return NT_STATUS_NO_MEMORY;
        }
@@ -252,3 +262,26 @@ WERROR libnetapi_open_pipe(struct libnetapi_ctx *ctx,
 
        return WERR_OK;
 }
+
+/********************************************************************
+********************************************************************/
+
+WERROR libnetapi_get_binding_handle(struct libnetapi_ctx *ctx,
+                                   const char *server_name,
+                                   const struct ndr_syntax_id *interface,
+                                   struct dcerpc_binding_handle **binding_handle)
+{
+       struct rpc_pipe_client *pipe_cli;
+       WERROR result;
+
+       *binding_handle = NULL;
+
+       result = libnetapi_open_pipe(ctx, server_name, interface, &pipe_cli);
+       if (!W_ERROR_IS_OK(result)) {
+               return result;
+       }
+
+       *binding_handle = pipe_cli->binding_handle;
+
+       return WERR_OK;
+}