ok. got ntlogin command working. argh, it maintains a connection to
authorLuke Leighton <lkcl@samba.org>
Mon, 29 Nov 1999 21:16:12 +0000 (21:16 +0000)
committerLuke Leighton <lkcl@samba.org>
Mon, 29 Nov 1999 21:16:12 +0000 (21:16 +0000)
the remote machine, because i don't know what to _do_ with it!!!!

argh!!!

source/include/proto.h
source/lib/util_array.c
source/rpc_client/cli_connect.c
source/rpcclient/cmd_netlogon.c
source/rpcclient/rpcclient.c

index 1ffe32f314eda0c8ffd8de94384746becd8a6bd7..8a0fb3d083d90c7803a1832995083c25498233c7 100644 (file)
@@ -486,10 +486,13 @@ BOOL become_user_permanently(uid_t uid, gid_t gid);
 
 void free_void_array(uint32 num_entries, void **entries,
                void(free_item)(void*));
-void* add_item_to_array(uint32 *len, void ***array, const void *item,
+void* add_copy_to_array(uint32 *len, void ***array, const void *item,
        void*(item_dup)(const void*), BOOL alloc_anyway);
+void* add_item_to_array(uint32 *len, void ***array, void *item);
 void free_char_array(uint32 num_entries, char **entries);
 char* add_chars_to_array(uint32 *len, char ***array, const char *name);
+void free_con_array(uint32 num_entries, struct cli_connection **entries);
+struct cli_connection* add_con_to_array(uint32 *len, struct cli_connection ***array, struct cli_connection *con);
 void free_uint32_array(uint32 num_entries, uint32 **entries);
 uint32* add_uint32s_to_array(uint32 *len, uint32 ***array, const uint32 *name);
 void free_unistr_array(uint32 num_entries, UNISTR2 **entries);
@@ -1785,6 +1788,8 @@ BOOL brs_query_info( const char *srv_name, uint32 switch_value,
 
 /*The following definitions come from  rpc_client/cli_connect.c  */
 
+void init_connections(void);
+void free_connections(void);
 void cli_connection_free(struct cli_connection *con);
 void cli_connection_unlink(struct cli_connection *con);
 BOOL cli_connection_init_list(char* servers, const char* pipe_name,
index 5edb6ebf3290a3dbadbeb8358252b45eba4bd196..71f7046d62387e85fa5ddc4225eb1b2cb596588c 100644 (file)
@@ -39,26 +39,40 @@ void free_void_array(uint32 num_entries, void **entries,
        }
 }
 
-void* add_item_to_array(uint32 *len, void ***array, const void *item,
+void* add_copy_to_array(uint32 *len, void ***array, const void *item,
        void*(item_dup)(const void*), BOOL alloc_anyway)
 {
-       if (len == NULL || array == NULL || item_dup == NULL)
+       if (len == NULL || array == NULL)
        {
                return NULL;
        }
 
-       (*array) = (void**)Realloc((*array), ((*len)+1)*sizeof((*array)[0]));
-
-       if ((*array) != NULL)
+       if (item != NULL || alloc_anyway)
        {
                void* copy = NULL;
                if (item != NULL || alloc_anyway)
                {
                        copy = item_dup(item);
                }
-               (*array)[(*len)] = copy;
+               add_item_to_array(len, array, copy);
+       }
+       return NULL;
+}
+
+void* add_item_to_array(uint32 *len, void ***array, void *item)
+{
+       if (len == NULL || array == NULL)
+       {
+               return NULL;
+       }
+
+       (*array) = (void**)Realloc((*array), ((*len)+1)*sizeof((*array)[0]));
+
+       if ((*array) != NULL)
+       {
+               (*array)[(*len)] = item;
                (*len)++;
-               return copy;
+               return item;
        }
        return NULL;
 }
@@ -72,11 +86,24 @@ void free_char_array(uint32 num_entries, char **entries)
 char* add_chars_to_array(uint32 *len, char ***array, const char *name)
 {
        void*(*fn)(const void*) = (void*(*)(const void*))&strdup;
-       return (char*)add_item_to_array(len,
+       return (char*)add_copy_to_array(len,
                             (void***)array, (const void*)name, *fn, False);
                                
 }
 
+void free_con_array(uint32 num_entries, struct cli_connection **entries)
+{
+       void(*fn)(void*) = (void(*)(void*))&cli_connection_free;
+       free_void_array(num_entries, (void**)entries, *fn);
+}
+
+struct cli_connection* add_con_to_array(uint32 *len, struct cli_connection ***array, struct cli_connection *con)
+{
+       return (struct cli_connection*)add_item_to_array(len,
+                            (void***)array, (void*)con);
+                               
+}
+
 static uint32 *uint32_dup(const uint32* from)
 {
        if (from != NULL)
@@ -100,7 +127,7 @@ void free_uint32_array(uint32 num_entries, uint32 **entries)
 uint32* add_uint32s_to_array(uint32 *len, uint32 ***array, const uint32 *name)
 {
        void*(*fn)(const void*) = (void*(*)(const void*))&uint32_dup;
-       return (uint32*)add_item_to_array(len,
+       return (uint32*)add_copy_to_array(len,
                             (void***)array, (const void*)name, *fn, False);
                                
 }
@@ -114,7 +141,7 @@ void free_unistr_array(uint32 num_entries, UNISTR2 **entries)
 UNISTR2* add_unistr_to_array(uint32 *len, UNISTR2 ***array, UNISTR2 *name)
 {
        void*(*fn)(const void*) = (void*(*)(const void*))&unistr2_dup;
-       return (UNISTR2*)add_item_to_array(len,
+       return (UNISTR2*)add_copy_to_array(len,
                           (void***)array, (const void*)name, *fn, False);
 }
 
@@ -127,7 +154,7 @@ void free_sid_array(uint32 num_entries, DOM_SID **entries)
 DOM_SID* add_sid_to_array(uint32 *len, DOM_SID ***array, const DOM_SID *sid)
 {
        void*(*fn)(const void*) = (void*(*)(const void*))&sid_dup;
-       return (DOM_SID*)add_item_to_array(len,
+       return (DOM_SID*)add_copy_to_array(len,
                          (void***)array, (const void*)sid, *fn, False);
 }
 
@@ -177,7 +204,7 @@ PRINTER_INFO_2 *add_print2_to_array(uint32 *len, PRINTER_INFO_2 ***array,
                                const PRINTER_INFO_2 *prt)
 {
        void*(*fn)(const void*) = (void*(*)(const void*))&prt2_dup;
-       return (PRINTER_INFO_2*)add_item_to_array(len,
+       return (PRINTER_INFO_2*)add_copy_to_array(len,
                   (void***)array, (const void*)prt, *fn, True);
 }
 
@@ -208,7 +235,7 @@ PRINTER_INFO_1 *add_print1_to_array(uint32 *len, PRINTER_INFO_1 ***array,
                                const PRINTER_INFO_1 *prt)
 {
        void*(*fn)(const void*) = (void*(*)(const void*))&prt1_dup;
-       return (PRINTER_INFO_1*)add_item_to_array(len,
+       return (PRINTER_INFO_1*)add_copy_to_array(len,
                           (void***)array, (const void*)prt, *fn, True);
 }
 
@@ -239,7 +266,7 @@ JOB_INFO_1 *add_job1_to_array(uint32 *len, JOB_INFO_1 ***array,
                                const JOB_INFO_1 *job)
 {
        void*(*fn)(const void*) = (void*(*)(const void*))&job1_dup;
-       return (JOB_INFO_1*)add_item_to_array(len,
+       return (JOB_INFO_1*)add_copy_to_array(len,
                           (void***)array, (const void*)job, *fn, True);
 }
 
@@ -270,7 +297,7 @@ JOB_INFO_2 *add_job2_to_array(uint32 *len, JOB_INFO_2 ***array,
                                const JOB_INFO_2 *job)
 {
        void*(*fn)(const void*) = (void*(*)(const void*))&job2_dup;
-       return (JOB_INFO_2*)add_item_to_array(len,
+       return (JOB_INFO_2*)add_copy_to_array(len,
                           (void***)array, (const void*)job, *fn, True);
 }
 
index bca539c39622cf66d39a885c980e47a3744fcfee..fc6f5c8c4431b6e8e5a56774dc2ac74d8ed75a7b 100644 (file)
@@ -33,10 +33,75 @@ extern pstring global_myname;
 
 struct cli_connection
 {
+       uint32 num_connections;
+       char *srv_name;
+       char *pipe_name;
+       struct user_credentials usr_creds;
        struct cli_state *cli;
        uint16 fnum;
 };
 
+static struct cli_connection **con_list = NULL;
+uint32 num_cons = 0;
+
+void init_connections(void)
+{
+       con_list = NULL;
+       num_cons = 0;
+}
+
+void free_connections(void)
+{
+       free_con_array(num_cons, con_list);
+}
+
+static struct cli_connection *cli_con_get(const char* srv_name,
+                               const char* pipe_name)
+{
+       struct cli_connection *con = NULL;
+
+       con = (struct cli_connection*)malloc(sizeof(*con));
+
+       if (con == NULL)
+       {
+               return NULL;
+       }
+
+       memset(con, 0, sizeof(*con));
+
+       if (srv_name != NULL)
+       {
+               con->srv_name = strdup(srv_name);
+       }
+       if (pipe_name != NULL)
+       {
+               con->pipe_name = strdup(pipe_name);
+       }
+
+       con->cli = cli_initialise(NULL);
+       con->fnum = 0xffff;
+
+       memcpy(&con->usr_creds, usr_creds, sizeof(*usr_creds));
+
+       if (con->cli == NULL)
+       {
+               cli_connection_free(con);
+               return NULL;
+       }
+
+       /*
+        * initialise
+        */
+
+       con->cli->capabilities |= CAP_NT_SMBS | CAP_STATUS32;
+       cli_init_creds(con->cli, usr_creds);
+
+       con->cli->use_ntlmv2 = lp_client_ntlmv2();
+
+       add_con_to_array(&num_cons, &con_list, con);
+
+       return con;
+}
 
 /****************************************************************************
 terminate client connection
@@ -46,6 +111,18 @@ void cli_connection_free(struct cli_connection *con)
        cli_nt_session_close(con->cli, con->fnum);
        cli_shutdown(con->cli);
        free(con->cli);
+
+       if (con->srv_name != NULL)
+       {
+               free(con->srv_name);
+       }
+       if (con->pipe_name != NULL)
+       {
+               free(con->pipe_name);
+       }
+
+       memset(&con->usr_creds, 0, sizeof(con->usr_creds));
+
        free(con);
 }
 
@@ -73,30 +150,13 @@ BOOL cli_connection_init_list(char* servers, const char* pipe_name,
         * allocate
         */
 
-       (*con) = (struct cli_connection*)malloc(sizeof(**con));
+       *con = cli_con_get(servers, pipe_name);
 
        if ((*con) == NULL)
        {
                return False;
        }
 
-       (*con)->cli = cli_initialise(NULL);
-       (*con)->fnum = 0xffff;
-
-       if ((*con)->cli == NULL)
-       {
-               return False;
-       }
-
-       /*
-        * initialise
-        */
-
-       (*con)->cli->capabilities |= CAP_NT_SMBS | CAP_STATUS32;
-       cli_init_creds((*con)->cli, usr_creds);
-
-       (*con)->cli->use_ntlmv2 = lp_client_ntlmv2();
-
        if (!cli_connect_serverlist((*con)->cli, servers))
        {
                DEBUG(0,("cli_state_init: connection failed\n"));
@@ -130,30 +190,13 @@ BOOL cli_connection_init(const char* server_name, const char* pipe_name,
         * allocate
         */
 
-       (*con) = (struct cli_connection*)malloc(sizeof(**con));
+       *con = cli_con_get(server_name, pipe_name);
 
        if ((*con) == NULL)
        {
                return False;
        }
 
-       (*con)->cli = cli_initialise(NULL);
-       (*con)->fnum = 0xffff;
-
-       if ((*con)->cli == NULL)
-       {
-               return False;
-       }
-
-       /*
-        * initialise
-        */
-
-       (*con)->cli->capabilities |= CAP_NT_SMBS | CAP_STATUS32;
-       cli_init_creds((*con)->cli, usr_creds);
-
-       (*con)->cli->use_ntlmv2 = lp_client_ntlmv2();
-
        if (resolve_srv_name(server_name, dest_host, &ip))
        {
                dest_ip = &ip;
@@ -195,6 +238,22 @@ obtain client state
 BOOL cli_connection_getsrv(const char* srv_name, const char* pipe_name,
                                struct cli_connection **con)
 {
+       int i;
+       if (con_list == NULL || num_cons == 0)
+       {
+               return False;
+       }
+
+       for (i = 0; i < num_cons; i++)
+       {
+               if (con_list[i] != NULL &&
+                   strequal(con_list[i]->srv_name , srv_name ) &&
+                   strequal(con_list[i]->pipe_name, pipe_name))
+               {
+                       (*con) = con_list[i];
+                       return True;
+               }
+       }
        return False;
 }
 
index 3010ed529707436ea3542f1fd1e9063c37b7fa2a..4933501b7a9dc801ce15067c59f3ad6a45bd601a 100644 (file)
@@ -87,7 +87,7 @@ void cmd_netlogon_login_test(struct client_info *info, int argc, char *argv[])
        argc--;
        argv++;
 
-       if (argc < 2)
+       if (argc > 0)
        {
                nt_password = argv[0];
        }
index 3951b8e56404f1cd361cddd588ee0122c03d8654..c55f99fcafdfeabc621c852bfbc6bd3d32ca3362 100644 (file)
@@ -579,6 +579,7 @@ static void cmd_quit(struct client_info *info, int argc, char *argv[])
                dbgflush();
        }
 #endif
+       free_connections();
        exit(0);
 }
 
@@ -1490,6 +1491,7 @@ static void cmd_set(struct client_info *info, int argc, char *argv[])
                                cli_info.dest_ip = *interpret_addr2(optarg);
                                if (zero_ip(cli_info.dest_ip))
                                {
+                                       free_connections();
                                        exit(1);
                                }
                                break;
@@ -1707,6 +1709,7 @@ void readline_init(void)
        readline_init();
        TimeInit();
        charset_initialise();
+       init_connections();
 
        myumask = umask(0);
        umask(myumask);
@@ -1719,6 +1722,7 @@ void readline_init(void)
        if (argc < 2)
        {
                usage(argv[0]);
+               free_connections();
                exit(1);
        }
 
@@ -1731,6 +1735,7 @@ void readline_init(void)
 
        if (IS_BITS_SET_ALL(cmd_set_options, CMD_HELP))
        {
+               free_connections();
                exit(0);
        }
 
@@ -1740,5 +1745,7 @@ void readline_init(void)
 
        process(&cli_info, NULL);
 
+       free_connections();
+
        return(0);
 }