diff options
Diffstat (limited to 'source3/utils/smbtree.c')
-rw-r--r-- | source3/utils/smbtree.c | 85 |
1 files changed, 70 insertions, 15 deletions
diff --git a/source3/utils/smbtree.c b/source3/utils/smbtree.c index bcb460ee0b..b80a27eb37 100644 --- a/source3/utils/smbtree.c +++ b/source3/utils/smbtree.c @@ -87,26 +87,81 @@ static void add_name(const char *machine_name, uint32 server_type, DLIST_ADD(*name_list, new_name); } -/* Return a cli_state pointing at the IPC$ share for the given server */ +/* Return a cli_state pointing at the IPC$ share for the given workgroup */ -static struct cli_state *get_ipc_connect(char *server, struct in_addr *server_ip, +static struct cli_state *get_ipc_connect(char *server, struct user_auth_info *user_info) { + struct nmb_name calling, called; + struct in_addr server_ip; struct cli_state *cli; pstring myname; - NTSTATUS nt_status; + + zero_ip(&server_ip); get_myname(myname); - - nt_status = cli_full_connection(&cli, myname, server, server_ip, 0, "IPC$", "IPC", - user_info->username, lp_workgroup(), user_info->password, - CLI_FULL_CONNECTION_ANNONYMOUS_FALLBACK); - - if (NT_STATUS_IS_OK(nt_status)) { - return cli; - } else { - return NULL; + + make_nmb_name(&called, myname, 0x0); + make_nmb_name(&calling, server, 0x20); + + if (is_ipaddress(server)) + if (!resolve_name(server, &server_ip, 0x20)) + return False; + + again: + if (!(cli = cli_initialise(NULL))) { + DEBUG(4, ("Unable to initialise cli structure\n")); + goto error; + } + + if (!cli_connect(cli, server, &server_ip)) { + DEBUG(4, ("Unable to connect to %s\n", server)); + goto error; + } + + if (!cli_session_request(cli, &calling, &called)) { + cli_shutdown(cli); + if (!strequal(called.name, "*SMBSERVER")) { + make_nmb_name(&called , "*SMBSERVER", 0x20); + goto again; + } + DEBUG(4, ("Session request failed to %s\n", called.name)); + goto error; + } + + if (!cli_negprot(cli)) { + DEBUG(4, ("Negprot failed\n")); + goto error; + } + + if (!cli_session_setup(cli, user_info->username, user_info->password, + strlen(user_info->password), + user_info->password, + strlen(user_info->password), server) && + /* try an anonymous login if it failed */ + !cli_session_setup(cli, "", "", 1,"", 0, server)) { + DEBUG(4, ("Session setup failed\n")); + goto error; + } + + DEBUG(4,(" session setup ok\n")); + + if (!cli_send_tconX(cli, "IPC$", "?????", + user_info->password, + strlen(user_info->password)+1)) { + DEBUG(4, ("Tconx failed\n")); + goto error; } + + return cli; + + /* Clean up after error */ + + error: + if (cli && cli->initialised) + cli_shutdown(cli); + + return NULL; } /* Return the IP address and workgroup of a master browser on the @@ -168,7 +223,7 @@ static BOOL get_workgroups(struct user_auth_info *user_info) } } - if (!(cli = get_ipc_connect(inet_ntoa(server_ip), &server_ip, user_info))) + if (!(cli = get_ipc_connect(inet_ntoa(server_ip), user_info))) return False; if (!cli_NetServerEnum(cli, master_workgroup, @@ -193,7 +248,7 @@ static BOOL get_servers(char *workgroup, struct user_auth_info *user_info) return False; } - if (!(cli = get_ipc_connect(inet_ntoa(server_ip), &server_ip, user_info))) + if (!(cli = get_ipc_connect(inet_ntoa(server_ip), user_info))) return False; if (!cli_NetServerEnum(cli, workgroup, SV_TYPE_ALL, add_name, @@ -207,7 +262,7 @@ static BOOL get_shares(char *server_name, struct user_auth_info *user_info) { struct cli_state *cli; - if (!(cli = get_ipc_connect(server_name, NULL, user_info))) + if (!(cli = get_ipc_connect(server_name, user_info))) return False; if (!cli_RNetShareEnum(cli, add_name, &shares)) |