From 1129c7808354dc04f7725be505fd23c0bf11a29d Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 18 Aug 2004 20:13:08 +0000 Subject: r1897: added a choose_called_name() function that allows us to more sanely handle connections using the IP as the server name, while not trying for NBT name resolution on names like "192" and "192.168.1.2". also removed the ip address argument to smbcli_socket_connect() as it isn't used and doesn't really make sense. (This used to be commit 2ce4028842556328da4da0de9bee942bed02cc62) --- source4/client/client.c | 40 ++++++++++------------------------------ source4/client/smbmount.c | 2 +- source4/libcli/cliconnect.c | 4 ++-- source4/libcli/nmblib.c | 29 +++++++++++++++++++++++++++++ source4/libcli/raw/clitree.c | 12 ++++++------ source4/torture/torture.c | 9 +++------ 6 files changed, 51 insertions(+), 45 deletions(-) (limited to 'source4') diff --git a/source4/client/client.c b/source4/client/client.c index 63363fc5c2..928a331b0c 100644 --- a/source4/client/client.c +++ b/source4/client/client.c @@ -58,8 +58,6 @@ static int archive_level = 0; static BOOL translation = False; -static BOOL have_ip; - /* clitar bits insert */ extern int blocksize; extern BOOL tar_inc; @@ -74,7 +72,7 @@ static int printmode = 1; static BOOL recurse = False; BOOL lowercase = False; -static struct in_addr dest_ip; +static const char *dest_ip; #define SEPARATORS " \t\n\r" @@ -2745,7 +2743,6 @@ static struct smbcli_state *do_connect(const char *server, const char *share) struct smbcli_state *c; struct nmb_name called, calling; const char *server_n; - struct in_addr ip; fstring servicename; char *sharename; NTSTATUS status; @@ -2763,19 +2760,14 @@ static struct smbcli_state *do_connect(const char *server, const char *share) asprintf(&sharename, "\\\\%s\\%s", server, sharename); - server_n = server; + server_n = dest_ip?dest_ip:server; - zero_ip(&ip); - make_nmb_name(&calling, lp_netbios_name(), 0x0); - make_nmb_name(&called , server, name_type); + choose_called_name(&called, server, name_type); again: - zero_ip(&ip); - if (have_ip) ip = dest_ip; - /* have to open a new connection */ - if (!(c=smbcli_state_init()) || !smbcli_socket_connect(c, server_n, &ip)) { + if (!(c=smbcli_state_init()) || !smbcli_socket_connect(c, server_n)) { d_printf("Connection to %s failed\n", server_n); return NULL; } @@ -2905,23 +2897,16 @@ handle a message operation ****************************************************************************/ static int do_message_op(void) { - struct in_addr ip; struct nmb_name called, calling; - fstring server_name; - char name_type_hex[10]; + const char *server_name; make_nmb_name(&calling, lp_netbios_name(), 0x0); - make_nmb_name(&called , desthost, name_type); + choose_called_name(&called, desthost, name_type); - fstrcpy(server_name, desthost); - snprintf(name_type_hex, sizeof(name_type_hex), "#%X", name_type); - fstrcat(server_name, name_type_hex); + server_name = dest_ip ? dest_ip : desthost; - zero_ip(&ip); - if (have_ip) ip = dest_ip; - - if (!(cli=smbcli_state_init()) || !smbcli_socket_connect(cli, server_name, &ip)) { - d_printf("Connection to %s failed\n", desthost); + if (!(cli=smbcli_state_init()) || !smbcli_socket_connect(cli, server_name)) { + d_printf("Connection to %s failed\n", server_name); return 1; } @@ -3035,12 +3020,7 @@ static void remember_query_host(const char *arg, message = True; break; case 'I': - { - dest_ip = *interpret_addr2(mem_ctx, poptGetOptArg(pc)); - if (is_zero_ip(dest_ip)) - exit(1); - have_ip = True; - } + dest_ip = poptGetOptArg(pc); break; case 'E': setup_logging("client", DEBUG_STDERR); diff --git a/source4/client/smbmount.c b/source4/client/smbmount.c index 235a45a3f1..795bd50812 100644 --- a/source4/client/smbmount.c +++ b/source4/client/smbmount.c @@ -139,7 +139,7 @@ static struct smbcli_state *do_connection(char *the_service) server_n = server; make_nmb_name(&calling, my_netbios_name, 0x0); - make_nmb_name(&called , server, 0x20); + choose_called_name(&called, server, 0x20); again: zero_ip(&ip); diff --git a/source4/libcli/cliconnect.c b/source4/libcli/cliconnect.c index 8753f26b5f..14f7d5a1b3 100644 --- a/source4/libcli/cliconnect.c +++ b/source4/libcli/cliconnect.c @@ -23,7 +23,7 @@ /* wrapper around smbcli_sock_connect() */ -BOOL smbcli_socket_connect(struct smbcli_state *cli, const char *server, struct in_addr *ip) +BOOL smbcli_socket_connect(struct smbcli_state *cli, const char *server) { struct smbcli_socket *sock; @@ -163,7 +163,7 @@ NTSTATUS smbcli_full_connection(struct smbcli_state **ret_cli, } status = smbcli_tree_full_connection(&tree, myname, host, 0, sharename, devtype, - username, domain, password); + username, domain, password); if (!NT_STATUS_IS_OK(status)) { goto done; } diff --git a/source4/libcli/nmblib.c b/source4/libcli/nmblib.c index e05eb7966e..5eeec48003 100644 --- a/source4/libcli/nmblib.c +++ b/source4/libcli/nmblib.c @@ -1285,3 +1285,32 @@ int name_len(char *s1) return(len); } /* name_len */ + + +/* + choose a name to use when calling a server in a NBT session request. + we use heuristics to see if the name we have been given is a IP + address, or a too-long name. If it is then use *SMBSERVER, or a + truncated name +*/ +void choose_called_name(struct nmb_name *n, const char *name, int type) +{ + if (is_ipaddress(name)) { + make_nmb_name(n, "*SMBSERVER", type); + return; + } + if (strlen(name) > 16) { + const char *p = strchr(name, '.'); + char name2[17]; + if (p - name > 16) { + make_nmb_name(n, "*SMBSERVER", type); + return; + } + strlcpy(name2, name, 1+(p-name)); + make_nmb_name(n, name2, type); + return; + } + + /* looks OK */ + make_nmb_name(n, name, type); +} diff --git a/source4/libcli/raw/clitree.c b/source4/libcli/raw/clitree.c index b9d572fd56..97c0910451 100644 --- a/source4/libcli/raw/clitree.c +++ b/source4/libcli/raw/clitree.c @@ -173,11 +173,11 @@ NTSTATUS smb_tree_disconnect(struct smbcli_tree *tree) parameters */ NTSTATUS smbcli_tree_full_connection(struct smbcli_tree **ret_tree, - const char *my_name, - const char *dest_host, int port, - const char *service, const char *service_type, - const char *user, const char *domain, - const char *password) + const char *my_name, + const char *dest_host, int port, + const char *service, const char *service_type, + const char *user, const char *domain, + const char *password) { struct smbcli_socket *sock; struct smbcli_transport *transport; @@ -212,7 +212,7 @@ NTSTATUS smbcli_tree_full_connection(struct smbcli_tree **ret_tree, /* send a NBT session request, if applicable */ make_nmb_name(&calling, my_name, 0x0); - make_nmb_name(&called, dest_host, 0x20); + choose_called_name(&called, dest_host, 0x20); if (!smbcli_transport_connect(transport, &calling, &called)) { smbcli_transport_close(transport); diff --git a/source4/torture/torture.c b/source4/torture/torture.c index c36ebde3cc..176475ff21 100644 --- a/source4/torture/torture.c +++ b/source4/torture/torture.c @@ -37,14 +37,11 @@ BOOL torture_showall = False; static struct smbcli_state *open_nbt_connection(void) { struct nmb_name called, calling; - struct in_addr ip; struct smbcli_state *cli; const char *host = lp_parm_string(-1, "torture", "host"); make_nmb_name(&calling, lp_netbios_name(), 0x0); - make_nmb_name(&called , host, 0x20); - - zero_ip(&ip); + choose_called_name(&called, host, 0x20); cli = smbcli_state_init(); if (!cli) { @@ -52,7 +49,7 @@ static struct smbcli_state *open_nbt_connection(void) return NULL; } - if (!smbcli_socket_connect(cli, host, &ip)) { + if (!smbcli_socket_connect(cli, host)) { printf("Failed to connect with %s\n", host); return cli; } @@ -64,7 +61,7 @@ static struct smbcli_state *open_nbt_connection(void) * Well, that failed, try *SMBSERVER ... * However, we must reconnect as well ... */ - if (!smbcli_socket_connect(cli, host, &ip)) { + if (!smbcli_socket_connect(cli, host)) { printf("Failed to connect with %s\n", host); return False; } -- cgit