diff options
-rw-r--r-- | source4/client/client.c | 40 | ||||
-rw-r--r-- | source4/client/smbmount.c | 2 | ||||
-rw-r--r-- | source4/libcli/cliconnect.c | 4 | ||||
-rw-r--r-- | source4/libcli/nmblib.c | 29 | ||||
-rw-r--r-- | source4/libcli/raw/clitree.c | 12 | ||||
-rw-r--r-- | source4/torture/torture.c | 9 |
6 files changed, 51 insertions, 45 deletions
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; } |