mirror of
https://github.com/samba-team/samba.git
synced 2025-02-08 05:57:51 +03:00
ok. got ntlogin command working. argh, it maintains a connection to
the remote machine, because i don't know what to _do_ with it!!!! argh!!!
This commit is contained in:
parent
44dd3efa63
commit
85cc680736
@ -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,
|
||||
|
@ -39,10 +39,29 @@ 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;
|
||||
}
|
||||
|
||||
if (item != NULL || alloc_anyway)
|
||||
{
|
||||
void* copy = NULL;
|
||||
if (item != NULL || alloc_anyway)
|
||||
{
|
||||
copy = item_dup(item);
|
||||
}
|
||||
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;
|
||||
}
|
||||
@ -51,14 +70,9 @@ void* add_item_to_array(uint32 *len, void ***array, const void *item,
|
||||
|
||||
if ((*array) != NULL)
|
||||
{
|
||||
void* copy = NULL;
|
||||
if (item != NULL || alloc_anyway)
|
||||
{
|
||||
copy = item_dup(item);
|
||||
}
|
||||
(*array)[(*len)] = copy;
|
||||
(*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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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];
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user