1 Index: samba-2.2.3a+IPv6/source/acconfig.h
2 ===================================================================
3 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/acconfig.h,v
4 retrieving revision 1.1.1.1
5 retrieving revision 1.2
6 diff -u -r1.1.1.1 -r1.2
7 --- samba-2.2.3a+IPv6/source/acconfig.h 16 Apr 2002 03:34:34 -0000 1.1.1.1
8 +++ samba-2.2.3a+IPv6/source/acconfig.h 18 Apr 2002 04:53:04 -0000 1.2
17 Index: samba-2.2.3a+IPv6/source/configure.in
18 ===================================================================
19 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/configure.in,v
20 retrieving revision 1.1.1.1
21 retrieving revision 1.2
22 diff -u -r1.1.1.1 -r1.2
23 --- samba-2.2.3a+IPv6/source/configure.in 16 Apr 2002 03:34:34 -0000 1.1.1.1
24 +++ samba-2.2.3a+IPv6/source/configure.in 18 Apr 2002 04:53:04 -0000 1.2
25 @@ -2100,6 +2100,53 @@
28 #################################################
29 +# check for IPv6 support
30 +AC_MSG_CHECKING(whether to use IPv6)
32 +[ --with-ipv6 Include IPv6 support (default=no)],
36 + AC_DEFINE(HAVE_INET6)
38 + AC_CACHE_CHECK(for struct sockaddr_in6,samba_cv_struct_sockaddr_in6,
40 + [#include <sys/types.h>
41 + #include <sys/socket.h>
42 + #include <netinet/in.h>],
43 + [struct sockaddr_in6 sin6;
44 + sin6.sin6_port = 0;],
45 + [samba_cv_struct_sockaddr_in6=yes],
46 + [samba_cv_struct_sockaddr_in6=no]))
47 + if test "$samba_cv_struct_sockaddr_in6" != yes ; then
48 + AC_MSG_ERROR([This system does not have IPv6 support. Reconfigure without the --with-ipv6 flag.])
51 + AC_CHECK_FUNC(getaddrinfo,,
52 + AC_MSG_ERROR([IPv6 functionality requires getaddrinfo. Reconfigure without the --with-ipv6 flag.]))
54 + dnl This can't check for member names because we're not sure what they
55 + dnl might be. Doesn't matter - we only need it defined for sizeof.
56 + AC_CACHE_CHECK(for struct sockaddr_storage,samba_cv_struct_sockaddr_storage,
58 + [#include <sys/types.h>
59 + #include <sys/socket.h>
60 + #include <netinet/in.h>],
61 + [struct sockaddr_storage ss;],
62 + [samba_cv_struct_sockaddr_storage=yes],
63 + [samba_cv_struct_sockaddr_storage=no]))
64 + if test "$samba_cv_struct_sockaddr_storage" != yes ; then
65 + AC_MSG_ERROR([IPv6 functionality requires the sockaddr_storage structure. Reconfigure without the --with-ipv6 flag.])
75 +#################################################
76 # check for syslog logging
77 AC_MSG_CHECKING(whether to use syslog logging)
79 Index: samba-2.2.3a+IPv6/source/client/client.c
80 ===================================================================
81 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/client/client.c,v
82 retrieving revision 1.1.1.1
83 retrieving revision 1.2
84 diff -u -r1.1.1.1 -r1.2
85 --- samba-2.2.3a+IPv6/source/client/client.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
86 +++ samba-2.2.3a+IPv6/source/client/client.c 18 Apr 2002 04:53:04 -0000 1.2
88 struct cli_state *cli;
89 extern BOOL in_client;
90 extern BOOL AllowDebugChange;
91 -static int port = SMB_PORT;
93 pstring cur_dir = "\\";
95 static pstring service;
97 static BOOL recurse = False;
98 BOOL lowercase = False;
100 -struct in_addr dest_ip;
103 #define SEPARATORS " \t\n\r"
105 @@ -2146,8 +2146,7 @@
107 struct nmb_name called, calling;
110 - extern struct in_addr ipzero;
111 + struct sockaddr_list *salist;
115 @@ -2164,19 +2163,16 @@
121 make_nmb_name(&calling, global_myname, 0x0);
122 make_nmb_name(&called , server, name_type);
126 - if (have_ip) ip = dest_ip;
127 + salist = resolve_name_smb(have_ip ? dest_ip : server_n, port);
129 /* have to open a new connection */
130 - if (!(c=cli_initialise(NULL)) || (cli_set_port(c, port) == 0) ||
131 - !cli_connect(c, server_n, &ip)) {
132 + if (!(c=cli_initialise(NULL)) || !cli_connect(c, server_n, salist)) {
133 DEBUG(0,("Connection to %s failed\n", server_n));
134 + free_sockaddr_list(salist);
138 @@ -2416,19 +2412,17 @@
139 ****************************************************************************/
140 static int do_message_op(void)
143 struct nmb_name called, calling;
146 + struct sockaddr_list *salist;
148 make_nmb_name(&calling, global_myname, 0x0);
149 make_nmb_name(&called , desthost, name_type);
152 - if (have_ip) ip = dest_ip;
153 + salist = resolve_name_smb(have_ip ? dest_ip : desthost, port);
155 - if (!(cli=cli_initialise(NULL)) || (cli_set_port(cli, port) == 0) || !cli_connect(cli, desthost, &ip)) {
156 + if (!(cli=cli_initialise(NULL)) || !cli_connect(cli, desthost, salist)) {
157 DEBUG(0,("Connection to %s failed\n", desthost));
158 + free_sockaddr_list(salist);
162 @@ -2660,9 +2654,7 @@
166 - dest_ip = *interpret_addr2(optarg);
167 - if (zero_ip(dest_ip))
169 + strncpy(dest_ip, optarg, sizeof(dest_ip));
173 Index: samba-2.2.3a+IPv6/source/client/smbmount.c
174 ===================================================================
175 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/client/smbmount.c,v
176 retrieving revision 1.1.1.1
177 retrieving revision 1.3
178 diff -u -r1.1.1.1 -r1.3
179 --- samba-2.2.3a+IPv6/source/client/smbmount.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
180 +++ samba-2.2.3a+IPv6/source/client/smbmount.c 19 Apr 2002 14:50:33 -0000 1.3
182 static pstring service;
183 static pstring options;
185 -static struct in_addr dest_ip;
186 +static char dest_ip[512];
188 -static int smb_port = 139;
189 +static int smb_port = 0;
190 static BOOL got_pass;
191 static uid_t mount_uid;
192 static gid_t mount_gid;
196 struct nmb_name called, calling;
197 + struct sockaddr_list *salist;
200 - extern struct in_addr ipzero;
204 @@ -144,13 +143,12 @@
205 make_nmb_name(&called , server, 0x20);
209 - if (have_ip) ip = dest_ip;
210 + salist = resolve_name_smb(have_ip ? dest_ip : server_n, smb_port);
212 /* have to open a new connection */
213 - if (!(c=cli_initialise(NULL)) || (cli_set_port(c, smb_port) == 0) ||
214 - !cli_connect(c, server_n, &ip)) {
215 + if (!(c=cli_initialise(NULL)) || !cli_connect(c, server_n, salist)) {
216 DEBUG(0,("%d: Connection to %s failed\n", getpid(), server_n));
217 + free_sockaddr_list(salist);
222 } else if(!strcmp(opts, "debug")) {
224 } else if(!strcmp(opts, "ip")) {
225 - dest_ip = *interpret_addr2(opteq+1);
226 - if (zero_ip(dest_ip)) {
227 - fprintf(stderr,"Can't resolve address %s\n", opteq+1);
230 + strncpy(dest_ip, optarg, sizeof(dest_ip));
232 } else if(!strcmp(opts, "workgroup")) {
233 pstrcpy(workgroup,opteq+1);
234 Index: samba-2.2.3a+IPv6/source/client/smbspool.c
235 ===================================================================
236 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/client/smbspool.c,v
237 retrieving revision 1.1.1.1
238 retrieving revision 1.2
239 diff -u -r1.1.1.1 -r1.2
240 --- samba-2.2.3a+IPv6/source/client/smbspool.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
241 +++ samba-2.2.3a+IPv6/source/client/smbspool.c 18 Apr 2002 04:53:04 -0000 1.2
245 extern BOOL in_client; /* Boolean for client library */
246 -extern struct in_addr ipzero; /* Any address */
251 struct cli_state *c; /* New connection */
252 struct nmb_name called, /* NMB name of server */
253 calling; /* NMB name of client */
254 - struct in_addr ip; /* IP address of server */
255 pstring myname; /* Client name */
264 make_nmb_name(&calling, myname, 0x0);
265 make_nmb_name(&called, server, 0x20);
271 - if (!cli_set_port(c, SMB_PORT))
273 - fputs("ERROR: cli_set_port() failed...\n", stderr);
277 - if (!cli_connect(c, server, &ip))
278 + if (!cli_connect(c, server, NULL))
280 fputs("ERROR: cli_connect() failed...\n", stderr);
282 Index: samba-2.2.3a+IPv6/source/include/client.h
283 ===================================================================
284 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/include/client.h,v
285 retrieving revision 1.1.1.1
286 retrieving revision 1.2
287 diff -u -r1.1.1.1 -r1.2
288 --- samba-2.2.3a+IPv6/source/include/client.h 16 Apr 2002 03:34:39 -0000 1.1.1.1
289 +++ samba-2.2.3a+IPv6/source/include/client.h 18 Apr 2002 04:53:04 -0000 1.2
300 struct nmb_name called;
301 struct nmb_name calling;
302 fstring full_dest_host_name;
303 - struct in_addr dest_ip;
304 + struct sockaddr_list *dest_addrs;
305 + struct sockaddr_list *connected_addr;
308 unsigned char cryptkey[8];
309 Index: samba-2.2.3a+IPv6/source/include/config.h.in
310 ===================================================================
311 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/include/config.h.in,v
312 retrieving revision 1.1.1.1
313 retrieving revision 1.2
314 diff -u -r1.1.1.1 -r1.2
315 --- samba-2.2.3a+IPv6/source/include/config.h.in 16 Apr 2002 03:34:39 -0000 1.1.1.1
316 +++ samba-2.2.3a+IPv6/source/include/config.h.in 18 Apr 2002 04:53:04 -0000 1.2
325 Index: samba-2.2.3a+IPv6/source/include/nameserv.h
326 ===================================================================
327 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/include/nameserv.h,v
328 retrieving revision 1.1.1.1
329 retrieving revision 1.2
330 diff -u -r1.1.1.1 -r1.2
331 --- samba-2.2.3a+IPv6/source/include/nameserv.h 16 Apr 2002 03:34:39 -0000 1.1.1.1
332 +++ samba-2.2.3a+IPv6/source/include/nameserv.h 18 Apr 2002 04:53:04 -0000 1.2
334 #define FIND_SELF_NAME 1
337 + * Linked-list structure for storing resolved IP addresses.
340 +struct sockaddr_list {
341 + struct sockaddr_list *next;
344 + struct sockaddr *addr;
348 * The different name types that can be in namelists.
350 * SELF_NAME should only be on the broadcast and unicast subnets.
351 Index: samba-2.2.3a+IPv6/source/include/proto.h
352 ===================================================================
353 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/include/proto.h,v
354 retrieving revision 1.1.1.1
355 retrieving revision 1.2
356 diff -u -r1.1.1.1 -r1.2
357 --- samba-2.2.3a+IPv6/source/include/proto.h 16 Apr 2002 03:34:39 -0000 1.1.1.1
358 +++ samba-2.2.3a+IPv6/source/include/proto.h 18 Apr 2002 04:53:04 -0000 1.2
359 @@ -181,14 +181,15 @@
360 BOOL cli_negprot(struct cli_state *cli);
361 BOOL cli_session_request(struct cli_state *cli,
362 struct nmb_name *calling, struct nmb_name *called);
363 -BOOL cli_connect(struct cli_state *cli, const char *host, struct in_addr *ip);
364 +BOOL cli_connect(struct cli_state *cli, const char *host,
365 + struct sockaddr_list *salist);
366 BOOL cli_establish_connection(struct cli_state *cli,
367 - char *dest_host, struct in_addr *dest_ip,
368 + char *dest_host, struct sockaddr_list *salist,
369 struct nmb_name *calling, struct nmb_name *called,
370 char *service, char *service_type,
371 BOOL do_shutdown, BOOL do_tcon);
372 -BOOL attempt_netbios_session_request(struct cli_state *cli, char *srchost, char *desthost,
373 - struct in_addr *pdest_ip);
374 +BOOL attempt_netbios_session_request(struct cli_state *cli, char *srchost,
377 /*The following definitions come from libsmb/cli_dfs.c */
379 @@ -660,11 +661,14 @@
380 BOOL getlmhostsent( FILE *fp, pstring name, int *name_type, struct in_addr *ipaddr);
381 void endlmhosts(FILE *fp);
382 BOOL name_register_wins(const char *name, int name_type);
383 -BOOL name_resolve_bcast(const char *name, int name_type,
384 - struct in_addr **return_ip_list, int *return_count);
385 -BOOL resolve_name(const char *name, struct in_addr *return_ip, int name_type);
386 -BOOL resolve_srv_name(const char* srv_name, fstring dest_host,
387 - struct in_addr *ip);
388 +struct sockaddr_list *name_resolve_bcast(const char *name, int name_type);
389 +BOOL resolve_name_netbios(const char *name, struct in_addr *return_ip,
391 +struct sockaddr_list *resolve_name_smb(const char *name, int port);
392 +struct sockaddr_list *resolve_srv_name(const char* srv_name,
393 + fstring dest_host, int port);
394 +//BOOL resolve_srv_name(const char* srv_name, fstring dest_host,
395 +// struct in_addr *ip);
396 BOOL find_master_ip(char *group, struct in_addr *master_ip);
397 BOOL lookup_dc_name(const char *srcname, const char *domain,
398 struct in_addr *dc_ip, char *ret_name);
399 @@ -1076,9 +1080,23 @@
400 void safe_free(void *p);
401 BOOL get_myname(char *my_name);
402 int interpret_protocol(char *str,int def);
403 +BOOL is_ipv4address(const char *str);
404 BOOL is_ipaddress(const char *str);
405 uint32 interpret_addr(const char *str);
406 struct in_addr *interpret_addr2(const char *str);
407 +struct sockaddr *get_numeric_addr(const char *str);
408 +int get_sockaddr_port(struct sockaddr *sa);
409 +void set_sockaddr_port(struct sockaddr *sa, int port);
410 +struct sockaddr_list *set_default_ports(struct sockaddr_list *salist);
411 +BOOL is_directsmb(struct sockaddr *sa);
412 +char *print_sockaddr(struct sockaddr *sa);
413 +void make_sockaddr_in(struct sockaddr *sa, struct in_addr *addr);
414 +void free_sockaddr_list(struct sockaddr_list *salist);
415 +struct sockaddr_list *make_sin_list(struct in_addr *addr, int count);
416 +struct sockaddr_list *make_singlet_list(struct in_addr *addr, int port);
418 +struct sockaddr_list *make_sa_list(struct addrinfo *ai);
420 BOOL zero_ip(struct in_addr ip);
421 char *automount_lookup(char *user_name);
422 char *automount_lookup(char *user_name);
423 @@ -1212,7 +1230,8 @@
424 BOOL send_smb(int fd,char *buffer);
425 BOOL send_one_packet(char *buf,int len,struct in_addr ip,int port,int type);
426 int open_socket_in( int type, int port, int dlevel, uint32 socket_addr, BOOL rebind );
427 -int open_socket_out(int type, struct in_addr *addr, int port ,int timeout);
428 +int open_socket_out(struct sockaddr_list *addrs,
429 + struct sockaddr_list **connected_addr, int timeout);
430 void client_setfd(int fd);
431 char *client_name(void);
432 char *client_addr(void);
433 Index: samba-2.2.3a+IPv6/source/include/smb.h
434 ===================================================================
435 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/include/smb.h,v
436 retrieving revision 1.1.1.1
437 retrieving revision 1.2
438 diff -u -r1.1.1.1 -r1.2
439 --- samba-2.2.3a+IPv6/source/include/smb.h 16 Apr 2002 03:34:38 -0000 1.1.1.1
440 +++ samba-2.2.3a+IPv6/source/include/smb.h 18 Apr 2002 04:53:04 -0000 1.2
442 char *user; /* name of user who *opened* this connection */
443 uid_t uid; /* uid of user who *opened* this connection */
444 gid_t gid; /* gid of user who *opened* this connection */
445 - char client_address[18]; /* String version of client IP address. */
446 + char client_address[50]; /* String version of client IP address.
447 + * Nice and long for IPv6 addresses... */
449 uint16 vuid; /* vuid of user who *opened* this connection, or UID_FIELD_INVALID */
451 Index: samba-2.2.3a+IPv6/source/lib/access.c
452 ===================================================================
453 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/lib/access.c,v
454 retrieving revision 1.1.1.1
455 retrieving revision 1.2
456 diff -u -r1.1.1.1 -r1.2
457 --- samba-2.2.3a+IPv6/source/lib/access.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
458 +++ samba-2.2.3a+IPv6/source/lib/access.c 18 Apr 2002 04:53:05 -0000 1.2
462 /* masked_match - match address against netnumber/netmask */
463 -static int masked_match(char *tok, char *slash, char *s)
464 +static BOOL masked_match_ipv4(char *tok, char *slash, char *s)
469 return ((addr & mask) == net);
473 +static BOOL masked_match_ipv6(char *tok, char *slash, char *s)
475 + struct in6_addr net, addr;
476 + unsigned char *n = (unsigned char *)&net;
477 + unsigned char *a = (unsigned char *)&addr;
478 + int ret, len, i, mask;
480 + if(inet_pton(AF_INET6, s, &addr) <= 0)
482 + DEBUG(0,("access: unable to parse remote address: %s\n", s));
486 + ret = inet_pton(AF_INET6, tok, &net);
488 + len = atoi(slash + 1);
489 + if(ret <= 0 || len < 0 || len > 128
490 + || (len == 0 && strcmp(slash + 1, "0")))
492 + DEBUG(0,("access: bad net/mask access control: %s\n", tok));
495 + for(i = 0; i < len; i += 8)
499 + mask = ~((1 << (8 - (len - i))) - 1);
502 + DEBUG(3,("len=%d i=%d mask=%02x *n=%02x *a=%02x *a&mask=%02x\n",
503 + len, i, mask, *n, *a, *a & mask));
504 + if(*(n++) != (*(a++) & mask)) return False;
510 +static BOOL masked_match(char *tok, char *slash, char *s)
512 + if(is_ipv4address(s)) return masked_match_ipv4(tok, slash, s);
514 + return masked_match_ipv6(tok, slash, s);
520 /* string_match - match string against token */
521 static int string_match(char *tok,char *s, char *invalid_char)
524 } else if (tok[(tok_len = strlen(tok)) - 1] == '.') { /* network */
525 if (strncmp(tok, s, tok_len) == 0)
528 + } else if (tok[(tok_len = strlen(tok)) - 1] == ':') { /* IPv6 network */
529 + if (strncasecmp(tok, s, tok_len) == 0)
532 } else if ((cut = strchr(tok, '/')) != 0) { /* netnumber/netmask */
533 - if (isdigit((int)s[0]) && masked_match(tok, cut, s))
534 + if (isxdigit((int)s[0]) && masked_match(tok, cut, s))
536 } else if (strchr(tok, '*') != 0) {
541 /* if it is loopback then always allow unless specifically denied */
543 + if (strcmp(caddr, "127.0.0.1") == 0 || strcmp(caddr, "::1") == 0) {
545 if (strcmp(caddr, "127.0.0.1") == 0) {
548 - * If 127.0.0.1 matches both allow and deny then allow.
549 + * If 127.0.0.1 or ::1 matches both allow and deny then allow.
550 * Patch from Steve Langasek vorlon@netexpress.net.
553 Index: samba-2.2.3a+IPv6/source/lib/util.c
554 ===================================================================
555 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/lib/util.c,v
556 retrieving revision 1.1.1.1
557 retrieving revision 1.2
558 diff -u -r1.1.1.1 -r1.2
559 --- samba-2.2.3a+IPv6/source/lib/util.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
560 +++ samba-2.2.3a+IPv6/source/lib/util.c 18 Apr 2002 04:53:05 -0000 1.2
561 @@ -732,11 +732,11 @@
562 Return true if a string could be a pure IP address.
563 ****************************************************************************/
565 -BOOL is_ipaddress(const char *str)
566 +BOOL is_ipv4address(const char *str)
568 BOOL pure_address = True;
572 for (i=0; pure_address && str[i]; i++)
573 if (!(isdigit((int)str[i]) || str[i] == '.'))
574 pure_address = False;
579 +BOOL is_ipaddress(const char *str)
582 + /* First we see if the address is an IPv6 address */
583 + if (strchr(str, ':'))
587 + /* It contains a colon; it probably is */
588 + for (i=0; str[i]; i++)
589 + if (!(isxdigit((int)str[i]) || str[i] == '.' || str[i] == ':'))
596 + return is_ipv4address(str);
599 /****************************************************************************
600 interpret an internet address or name into an IP address in 4 byte form
601 ****************************************************************************/
602 @@ -792,6 +812,186 @@
606 +struct sockaddr *get_numeric_addr(const char *str)
609 + struct sockaddr *sa;
610 + struct addrinfo *ai, hints;
612 + memset(&hints, 0, sizeof(hints));
613 + hints.ai_socktype = SOCK_STREAM;
614 + hints.ai_flags = AI_NUMERICHOST;
615 + if(getaddrinfo(str, NULL, &hints, &ai) || ! ai) return NULL;
616 + sa = (struct sockaddr *)malloc(ai->ai_addrlen);
617 + memcpy(sa, ai->ai_addr, ai->ai_addrlen);
621 + struct sockaddr *sa;
622 + struct in_addr addr;
624 + if(inet_aton(str, &addr))
626 + sa = (struct sockaddr *)malloc(sizeof(struct sockaddr_in));
627 + make_sockaddr_in(sa, &addr);
634 +int get_sockaddr_port(struct sockaddr *sa)
637 + if(sa->sa_family==AF_INET6)
638 + return ntohs(((struct sockaddr_in6 *)sa)->sin6_port);
641 + if(sa->sa_family==AF_INET)
642 + return ntohs(((struct sockaddr_in *)sa)->sin_port);
647 +void set_sockaddr_port(struct sockaddr *sa, int port)
650 + if(sa->sa_family==AF_INET6)
651 + ((struct sockaddr_in6 *)sa)->sin6_port = htons(port);
654 + if(sa->sa_family==AF_INET)
655 + ((struct sockaddr_in *)sa)->sin_port = htons(port);
658 +struct sockaddr_list *set_default_ports(struct sockaddr_list *salist)
660 + struct sockaddr_list *cur;
662 + for(cur = salist; cur; cur = cur->next)
664 + set_sockaddr_port(cur->addr, 445);
665 + if(cur->addr->sa_family == AF_INET)
667 + struct sockaddr_list *sc;
669 + sc = (struct sockaddr_list *)
670 + malloc(sizeof(struct sockaddr_list));
671 + sc->next = cur->next;
673 + sc->pfamily = cur->pfamily;
674 + sc->len = cur->len;
675 + sc->addr = (struct sockaddr *)malloc(sc->len);
676 + memcpy(sc->addr, cur->addr, cur->len);
677 + set_sockaddr_port(sc->addr, 139);
685 +BOOL is_directsmb(struct sockaddr *sa)
687 + BOOL ret = sa->sa_family != AF_INET
688 + || ((struct sockaddr_in *)sa)->sin_port == htons(445);
689 + DEBUG(4,("connection is%s direct SMB\n", ret ? "" : " not"));
693 +char *print_sockaddr(struct sockaddr *sa)
696 + static char addr[64];
698 + if(sa->sa_family == AF_INET6)
700 + inet_ntop(AF_INET6, &((struct sockaddr_in6 *)sa)->sin6_addr,
701 + addr, sizeof(addr));
705 + if(sa->sa_family == AF_INET)
706 + return inet_ntoa(((struct sockaddr_in *)sa)->sin_addr);
710 +void make_sockaddr_in(struct sockaddr *sa, struct in_addr *addr)
712 + memset(sa, 0, sizeof(struct sockaddr_in));
713 + ((struct sockaddr_in *)sa)->sin_family = AF_INET;
714 + ((struct sockaddr_in *)sa)->sin_port = 0;
715 + memcpy(&((struct sockaddr_in *)sa)->sin_addr, addr,
716 + sizeof(struct in_addr));
719 +void free_sockaddr_list(struct sockaddr_list *salist)
721 + struct sockaddr_list *next;
725 + next = salist->next;
726 + SAFE_FREE(salist->addr);
732 +struct sockaddr_list *make_sin_list(struct in_addr *addr, int count)
735 + struct sockaddr_list *top = NULL, *last = NULL, *sc;
737 + for(i = 0; i<count; ++i)
739 + sc = (struct sockaddr_list *)
740 + malloc(sizeof(struct sockaddr_list));
742 + else last->next = sc;
745 + sc->pfamily = PF_INET;
746 + sc->len = sizeof(struct sockaddr_in);
747 + sc->addr = (struct sockaddr *)
748 + malloc(sizeof(struct sockaddr_in));
749 + make_sockaddr_in(sc->addr, &addr[i]);
754 +struct sockaddr_list *make_singlet_list(struct in_addr *addr, int port)
756 + struct sockaddr_list *salist;
758 + salist = make_sin_list(addr, 1);
759 + if(port) set_sockaddr_port(salist->addr, port);
760 + else salist = set_default_ports(salist);
765 +struct sockaddr_list *make_sa_list(struct addrinfo *ai)
767 + struct sockaddr_list *top = NULL, *last = NULL, *sc;
769 + for(; ai; ai = ai->ai_next)
771 + sc = (struct sockaddr_list *)
772 + malloc(sizeof(struct sockaddr_list));
773 + if(top==NULL) top = sc;
774 + else last->next = sc;
777 + sc->pfamily = ai->ai_family;
778 + sc->len = ai->ai_addrlen;
779 + sc->addr = (struct sockaddr *)malloc(ai->ai_addrlen);
780 + memcpy(sc->addr, ai->ai_addr, ai->ai_addrlen);
786 /*******************************************************************
787 check if an IP is the 0.0.0.0
788 ******************************************************************/
789 @@ -1343,7 +1543,7 @@
792 /* maybe its an IP address? */
793 - if (is_ipaddress(s))
794 + if (is_ipv4address(s))
796 struct iface_struct nics[MAX_INTERFACES];
798 Index: samba-2.2.3a+IPv6/source/lib/util_sock.c
799 ===================================================================
800 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/lib/util_sock.c,v
801 retrieving revision 1.1.1.1
802 retrieving revision 1.2
803 diff -u -r1.1.1.1 -r1.2
804 --- samba-2.2.3a+IPv6/source/lib/util_sock.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
805 +++ samba-2.2.3a+IPv6/source/lib/util_sock.c 18 Apr 2002 04:53:05 -0000 1.2
806 @@ -804,67 +804,94 @@
807 create an outgoing socket. timeout is in milliseconds.
808 **************************************************************************/
810 -int open_socket_out(int type, struct in_addr *addr, int port ,int timeout)
811 +int open_socket_out(struct sockaddr_list *addrs,
812 + struct sockaddr_list **connected_addr, int timeout)
814 - struct sockaddr_in sock_out;
816 - int connect_loop = 250; /* 250 milliseconds */
817 - int loops = (timeout) / connect_loop;
819 - /* create a socket to write to */
820 - res = socket(PF_INET, type, 0);
822 - { DEBUG(0,("socket error\n")); return -1; }
824 - if (type != SOCK_STREAM) return(res);
826 - memset((char *)&sock_out,'\0',sizeof(sock_out));
827 - putip((char *)&sock_out.sin_addr,(char *)addr);
829 - sock_out.sin_port = htons( port );
830 - sock_out.sin_family = PF_INET;
832 - /* set it non-blocking */
833 - set_blocking(res,False);
835 - DEBUG(3,("Connecting to %s at port %d\n",inet_ntoa(*addr),port));
837 - /* and connect it to the destination */
839 - ret = connect(res,(struct sockaddr *)&sock_out,sizeof(sock_out));
841 - /* Some systems return EAGAIN when they mean EINPROGRESS */
842 - if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
843 - errno == EAGAIN) && loops--) {
844 - msleep(connect_loop);
845 - goto connect_again;
848 - if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
849 - errno == EAGAIN)) {
850 - DEBUG(1,("timeout connecting to %s:%d\n",inet_ntoa(*addr),port));
854 + struct sockaddr_list *sl;
856 + int connect_loop = 250; /* 250 milliseconds */
857 + int loops = (timeout) / connect_loop;
859 + if(connected_addr) *connected_addr = NULL;
861 + for(sl = addrs; sl; sl = sl->next)
863 + /* create a socket to write to */
864 + res = socket(sl->pfamily, SOCK_STREAM, 0);
867 + /* If there are more addresses available, then we
868 + * are probably running on a platform without IPv6
869 + * support in the kernel, and we just tried
870 + * connecting to an IPv6 address. Don't complain
871 + * until we're out of addresses. */
873 + if(!sl->next) DEBUG(0,("socket error\n"));
877 + /* set it non-blocking */
878 + set_blocking(res,False);
880 + DEBUG(3,("Connecting to %s at port %d\n",
881 + print_sockaddr(sl->addr), get_sockaddr_port(sl->addr)));
883 + /* and connect it to the destination */
885 + ret = connect(res,sl->addr,sl->len);
887 + /* Some systems return EAGAIN when they mean EINPROGRESS */
888 + if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
889 + errno == EAGAIN) && loops--) {
890 + msleep(connect_loop);
891 + goto connect_again;
894 + if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
895 + errno == EAGAIN)) {
896 + DEBUG(1,("timeout connecting to [%s]:%d\n",
897 + print_sockaddr(sl->addr),
898 + get_sockaddr_port(sl->addr)));
901 + DEBUG(1,("attempting next address...\n"));
907 - if (ret < 0 && errno == EISCONN) {
914 - DEBUG(2,("error connecting to %s:%d (%s)\n",
915 - inet_ntoa(*addr),port,strerror(errno)));
919 + if (ret < 0 && errno == EISCONN) {
925 - /* set it blocking again */
926 - set_blocking(res,True);
928 + /* If we got connection refused or host unreachable,
929 + * we may be trying to connect to an IPv6 host but
930 + * this system isn't configured for IPv6. If we have
931 + * more addresses, don't complain about this one --
932 + * just try the next ones. */
934 + BOOL can_ignore = sl->next &&
935 + (errno == ECONNREFUSED || errno == ENETUNREACH);
936 + DEBUG(can_ignore ? 3 : 2,
937 + ("error connecting to [%s]:%d (%s)\n",
938 + print_sockaddr(sl->addr),
939 + get_sockaddr_port(sl->addr),
946 + /* set it blocking again */
947 + set_blocking(res,True);
949 + if(connected_addr) *connected_addr = sl;
956 /* the following 3 client_*() functions are nasty ways of allowing
958 matchname - determine if host name matches IP address. Used to
959 confirm a hostname lookup to prevent spoof attacks
960 ******************************************************************/
961 -static BOOL matchname(char *remotehost,struct in_addr addr)
963 +static BOOL addr_equal(struct sockaddr *a, struct sockaddr *b)
965 + if(a->sa_family == AF_INET6 && b->sa_family == AF_INET6)
967 + struct sockaddr_in6 *a6 = (struct sockaddr_in6 *)a;
968 + struct sockaddr_in6 *b6 = (struct sockaddr_in6 *)b;
970 + return !memcmp(&a6->sin6_addr, &b6->sin6_addr, 16);
972 + if(a->sa_family == AF_INET && b->sa_family == AF_INET)
974 + struct sockaddr_in *a4 = (struct sockaddr_in *)a;
975 + struct sockaddr_in *b4 = (struct sockaddr_in *)b;
977 + return a4->sin_addr.s_addr == b4->sin_addr.s_addr;
983 +/*******************************************************************
984 + matchname - determine if host name matches IP address. Used to
985 + confirm a hostname lookup to prevent spoof attacks
986 + ******************************************************************/
987 +static BOOL matchname(char *remotehost, struct sockaddr *can)
990 + struct addrinfo *ai, hints, *cur;
992 + memset(&hints, 0, sizeof(hints));
993 + hints.ai_socktype = SOCK_STREAM;
994 + if(getaddrinfo(remotehost, NULL, &hints, &ai)){
995 + DEBUG(0,("getaddrinfo(%s): lookup failure.\n", remotehost));
998 + for( cur = ai; cur; cur = cur->ai_next )
999 + if(addr_equal(cur->ai_addr, can))
1006 + * The host name does not map to the original host address. Perhaps
1007 + * someone has compromised a name server. More likely someone botched
1008 + * it, but that could be dangerous, too.
1011 + DEBUG(0,("host name/address mismatch: %s != %s\n",
1012 + print_sockaddr(can), remotehost));
1018 + struct in_addr addr = ((struct sockaddr_in *)can)->sin_addr;
1021 if ((hp = sys_gethostbyname(remotehost)) == 0) {
1022 @@ -931,6 +1012,56 @@
1023 DEBUG(0,("host name/address mismatch: %s != %s\n",
1024 inet_ntoa(addr), hp->h_name));
1029 +/*******************************************************************
1030 + return a sockaddr describing the remote endpoint
1031 + ******************************************************************/
1032 +static BOOL get_socket_sa(int fd, struct sockaddr **sa, int *len)
1039 + *len = sizeof(struct sockaddr_storage);
1041 + *len = sizeof(struct sockaddr);
1044 + *sa = (struct sockaddr *)malloc(*len);
1046 + if (getpeername(fd, *sa, len) < 0) {
1047 + DEBUG(0,("getpeername failed. Error was %s\n", strerror(errno) ));
1054 + if((*sa)->sa_family == AF_INET6 && IN6_IS_ADDR_V4MAPPED(
1055 + &((struct sockaddr_in6 *)(*sa))->sin6_addr))
1057 + struct sockaddr_in *newsin;
1058 + struct in_addr addr;
1059 + int port = ((struct sockaddr_in6 *)(*sa))->sin6_port;
1061 + DEBUG(5,("converting IPv6-mapped address %s\n",
1062 + print_sockaddr(*sa)));
1063 + memcpy(&addr, &((struct sockaddr_in6 *)
1064 + (*sa))->sin6_addr + 12, 4);
1066 + *len = sizeof(struct sockaddr_in);
1067 + *sa = (struct sockaddr *)malloc(*len);
1068 + newsin = (struct sockaddr_in *)(*sa);
1069 + newsin->sin_family = AF_INET;
1070 + newsin->sin_port = port;
1071 + newsin->sin_addr = addr;
1079 @@ -940,34 +1071,60 @@
1080 char *get_socket_name(int fd)
1082 static pstring name_buf;
1083 - static fstring addr_buf;
1084 - struct hostent *hp;
1085 - struct in_addr addr;
1086 + struct sockaddr *sa;
1090 - p = get_socket_addr(fd);
1092 - /* it might be the same as the last one - save some DNS work */
1093 - if (strcmp(p, addr_buf) == 0) return name_buf;
1095 pstrcpy(name_buf,"UNKNOWN");
1096 if (fd == -1) return name_buf;
1098 - fstrcpy(addr_buf, p);
1099 + if(!get_socket_sa(fd, &sa, &len)) return name_buf;
1100 + p = print_sockaddr(sa);
1102 - addr = *interpret_addr2(p);
1104 - /* Look up the remote host name. */
1105 - if ((hp = gethostbyaddr((char *)&addr.s_addr, sizeof(addr.s_addr), AF_INET)) == 0) {
1106 - DEBUG(1,("Gethostbyaddr failed for %s\n",p));
1107 - pstrcpy(name_buf, p);
1109 - pstrcpy(name_buf,(char *)hp->h_name);
1110 - if (!matchname(name_buf, addr)) {
1111 - DEBUG(0,("Matchname failed on %s %s\n",name_buf,p));
1112 - pstrcpy(name_buf,"UNKNOWN");
1115 + char hostbuf[NI_MAXHOST];
1117 + if(getnameinfo(sa, len, hostbuf, NI_MAXHOST, NULL, 0, 0)) {
1118 + DEBUG(1,("Getnameinfo failed for %s\n",p));
1119 + pstrcpy(name_buf, p);
1121 + if (matchname(hostbuf, sa))
1122 + pstrcpy(name_buf, hostbuf);
1124 + DEBUG(0,("Matchname failed on %s %s\n",
1126 + pstrcpy(name_buf,p);
1132 + struct hostent *hp;
1133 + struct sockaddr_in *nsin = (struct sockaddr_in *)sa;
1135 + if(sa->sa_family != AF_INET)
1141 + /* Look up the remote host name. */
1142 + if ((hp = gethostbyaddr((char *)&nsin->sin_addr.s_addr,
1143 + sizeof(nsin->sin_addr.s_addr), AF_INET)) == 0) {
1144 + DEBUG(1,("Gethostbyaddr failed for %s\n",p));
1145 + pstrcpy(name_buf, p);
1147 + pstrcpy(name_buf,(char *)hp->h_name);
1148 + if (!matchname(name_buf, sa)) {
1149 + DEBUG(0,("Matchname failed on %s %s\n",
1151 + pstrcpy(name_buf,p);
1158 alpha_strcpy(name_buf, name_buf, "_-.", sizeof(name_buf));
1159 if (strstr(name_buf,"..")) {
1160 @@ -982,23 +1139,17 @@
1161 ******************************************************************/
1162 char *get_socket_addr(int fd)
1164 - struct sockaddr sa;
1165 - struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa);
1166 - int length = sizeof(sa);
1167 static fstring addr_buf;
1168 + struct sockaddr *sa;
1171 fstrcpy(addr_buf,"0.0.0.0");
1175 + if(get_socket_sa(fd, &sa, &len))
1177 + fstrcpy(addr_buf,print_sockaddr(sa));
1181 - if (getpeername(fd, &sa, &length) < 0) {
1182 - DEBUG(0,("getpeername failed. Error was %s\n", strerror(errno) ));
1186 - fstrcpy(addr_buf,(char *)inet_ntoa(sockin->sin_addr));
1190 Index: samba-2.2.3a+IPv6/source/lib/wins_srv.c
1191 ===================================================================
1192 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/lib/wins_srv.c,v
1193 retrieving revision 1.1.1.1
1194 retrieving revision 1.2
1195 diff -u -r1.1.1.1 -r1.2
1196 --- samba-2.2.3a+IPv6/source/lib/wins_srv.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
1197 +++ samba-2.2.3a+IPv6/source/lib/wins_srv.c 18 Apr 2002 04:53:05 -0000 1.2
1201 /* Add server to list. */
1202 - if( is_ipaddress( wins_id_bufr ) )
1203 + if( is_ipv4address( wins_id_bufr ) )
1204 entry->ip_addr = *interpret_addr2( wins_id_bufr );
1206 entry->ip_addr = *interpret_addr2( "0.0.0.0" );
1207 Index: samba-2.2.3a+IPv6/source/libsmb/cli_lsarpc.c
1208 ===================================================================
1209 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/libsmb/cli_lsarpc.c,v
1210 retrieving revision 1.1.1.1
1211 retrieving revision 1.3
1212 diff -u -r1.1.1.1 -r1.3
1213 --- samba-2.2.3a+IPv6/source/libsmb/cli_lsarpc.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
1214 +++ samba-2.2.3a+IPv6/source/libsmb/cli_lsarpc.c 19 Apr 2002 14:50:33 -0000 1.3
1217 extern pstring global_myname;
1218 struct cli_state cli;
1219 + struct sockaddr_list *dest_addrs;
1223 @@ -827,20 +828,22 @@
1227 - if(!resolve_name( remote_machine, &cli.dest_ip, 0x20)) {
1228 + if(!(dest_addrs = resolve_name_smb(remote_machine, 0))) {
1229 DEBUG(0,("fetch_domain_sid: Can't resolve address for %s\n", remote_machine));
1233 - if (!cli_connect(&cli, remote_machine, &cli.dest_ip)) {
1234 + if (!cli_connect(&cli, remote_machine, dest_addrs)) {
1235 DEBUG(0,("fetch_domain_sid: unable to connect to SMB server on \
1236 machine %s. Error was : %s.\n", remote_machine, cli_errstr(&cli) ));
1240 - if (!attempt_netbios_session_request(&cli, global_myname, remote_machine, &cli.dest_ip)) {
1241 + if (!attempt_netbios_session_request(&cli, global_myname,
1242 + remote_machine)) {
1243 DEBUG(0,("fetch_domain_sid: machine %s rejected the NetBIOS \
1244 session request. Error was %s\n", remote_machine, cli_errstr(&cli) ));
1245 + free_sockaddr_list(dest_addrs);
1249 Index: samba-2.2.3a+IPv6/source/libsmb/cli_pipe_util.c
1250 ===================================================================
1251 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/libsmb/cli_pipe_util.c,v
1252 retrieving revision 1.1.1.1
1253 retrieving revision 1.3
1254 diff -u -r1.1.1.1 -r1.3
1255 --- samba-2.2.3a+IPv6/source/libsmb/cli_pipe_util.c 16 Apr 2002 03:34:36 -0000 1.1.1.1
1256 +++ samba-2.2.3a+IPv6/source/libsmb/cli_pipe_util.c 19 Apr 2002 14:50:33 -0000 1.3
1259 struct ntuser_creds *creds)
1261 - struct in_addr dest_ip;
1262 + struct sockaddr_list *dest_addrs;
1263 struct nmb_name calling, called;
1265 extern pstring global_myname;
1268 /* Establish a SMB connection */
1270 - if (!resolve_srv_name(system_name, dest_host, &dest_ip)) {
1271 + if (!(dest_addrs = resolve_srv_name(system_name, dest_host,
1272 + cli->default_port))) {
1276 make_nmb_name(&called, dns_to_netbios_name(dest_host), 0x20);
1277 make_nmb_name(&calling, dns_to_netbios_name(global_myname), 0);
1279 - if (!cli_establish_connection(cli, dest_host, &dest_ip, &calling,
1280 + if (!cli_establish_connection(cli, dest_host, dest_addrs, &calling,
1281 &called, "IPC$", "IPC", False, True)) {
1282 + cli_shutdown(cli);
1283 + free_sockaddr_list(dest_addrs);
1287 Index: samba-2.2.3a+IPv6/source/libsmb/cliconnect.c
1288 ===================================================================
1289 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/libsmb/cliconnect.c,v
1290 retrieving revision 1.1.1.1
1291 retrieving revision 1.2
1292 diff -u -r1.1.1.1 -r1.2
1293 --- samba-2.2.3a+IPv6/source/libsmb/cliconnect.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
1294 +++ samba-2.2.3a+IPv6/source/libsmb/cliconnect.c 18 Apr 2002 04:53:05 -0000 1.2
1299 - if (cli->port == 445) {
1300 + if (is_directsmb(cli->connected_addr->addr)) {
1301 slprintf(fullshare, sizeof(fullshare)-1,
1306 extern pstring user_socket_options;
1308 - /* 445 doesn't have session request */
1309 - if (cli->port == 445) return True;
1310 + /* Direct SMB doesn't have session request */
1311 + if (is_directsmb(cli->connected_addr->addr)) return True;
1313 /* send a session request (RFC 1002) */
1314 memcpy(&(cli->calling), calling, sizeof(*calling));
1315 @@ -683,9 +683,12 @@
1317 int port = (CVAL(cli->inbuf,8)<<8)+CVAL(cli->inbuf,9);
1318 /* SESSION RETARGET */
1319 - putip((char *)&cli->dest_ip,cli->inbuf+4);
1321 - cli->fd = open_socket_out(SOCK_STREAM, &cli->dest_ip, port, LONG_CONNECT_TIMEOUT);
1322 + struct in_addr addr;
1323 + putip((char *)&addr,cli->inbuf+4);
1324 + if(cli->dest_addrs) free_sockaddr_list(cli->dest_addrs);
1325 + cli->dest_addrs = make_singlet_list(&addr, port);
1326 + cli->fd = open_socket_out(cli->dest_addrs,
1327 + &cli->connected_addr, LONG_CONNECT_TIMEOUT);
1331 @@ -728,11 +731,11 @@
1332 /****************************************************************************
1333 open the client sockets
1334 ****************************************************************************/
1335 -BOOL cli_connect(struct cli_state *cli, const char *host, struct in_addr *ip)
1336 +BOOL cli_connect(struct cli_state *cli, const char *host,
1337 + struct sockaddr_list *salist)
1339 - extern struct in_addr ipzero;
1340 extern pstring user_socket_options;
1341 - int name_type = 0x20;
1342 + BOOL free_on_error = False;
1345 /* reasonable default hostname */
1346 @@ -740,45 +743,44 @@
1347 host = "*SMBSERVER";
1349 fstrcpy(cli->desthost, host);
1351 - /* allow hostnames of the form NAME#xx and do a netbios lookup */
1352 - if ((p = strchr(cli->desthost, '#'))) {
1353 - name_type = strtol(p+1, NULL, 16);
1357 - if (!ip || ip_equal(*ip, ipzero)) {
1358 - if (!resolve_name(cli->desthost, &cli->dest_ip, name_type)) {
1361 + /* At this point, cli->dest_addrs should be empty */
1362 + if(cli->dest_addrs) free_sockaddr_list(cli->dest_addrs);
1365 + free_on_error = True;
1366 + if ((p = strchr(cli->desthost, '#'))) {
1367 + struct in_addr ip;
1368 + int name_type = strtol(p+1, NULL, 16);
1371 + if(!resolve_name_netbios(cli->desthost, &ip, name_type))
1373 + salist = make_singlet_list(&ip, 139);
1375 + if(!(salist = resolve_name_smb(cli->desthost,
1376 + cli->default_port)))
1380 - *ip = cli->dest_ip;
1382 - cli->dest_ip = *ip;
1385 if (getenv("LIBSMB_PROG")) {
1386 cli->fd = sock_exec(getenv("LIBSMB_PROG"));
1388 - /* try 445 first, then 139 */
1389 - int port = cli->port?cli->port:445;
1390 - cli->fd = open_socket_out(SOCK_STREAM, &cli->dest_ip,
1391 - port, cli->timeout);
1392 - if (cli->fd == -1 && cli->port == 0) {
1394 - cli->fd = open_socket_out(SOCK_STREAM, &cli->dest_ip,
1395 - port, cli->timeout);
1397 - if (cli->fd != -1) cli->port = port;
1398 + cli->fd = open_socket_out(salist, &cli->connected_addr,
1401 if (cli->fd == -1) {
1402 DEBUG(1,("Error connecting to %s (%s)\n",
1403 - inet_ntoa(*ip),strerror(errno)));
1404 + print_sockaddr(salist->addr),strerror(errno)));
1405 + if(free_on_error) free_sockaddr_list(salist);
1409 set_socket_options(cli->fd,user_socket_options);
1411 + cli->dest_addrs = salist;
1416 @@ -786,13 +788,14 @@
1417 establishes a connection right up to doing tconX, reading in a password.
1418 ****************************************************************************/
1419 BOOL cli_establish_connection(struct cli_state *cli,
1420 - char *dest_host, struct in_addr *dest_ip,
1421 + char *dest_host, struct sockaddr_list *salist,
1422 struct nmb_name *calling, struct nmb_name *called,
1423 char *service, char *service_type,
1424 BOOL do_shutdown, BOOL do_tcon)
1426 DEBUG(5,("cli_establish_connection: %s connecting to %s (%s) - %s [%s]\n",
1427 - nmb_namestr(calling), nmb_namestr(called), inet_ntoa(*dest_ip),
1428 + nmb_namestr(calling), nmb_namestr(called),
1429 + salist ? print_sockaddr(salist->addr) : "unspecified",
1430 cli->user_name, cli->domain));
1432 /* establish connection */
1433 @@ -804,10 +807,12 @@
1437 - if (!cli_connect(cli, dest_host, dest_ip))
1438 + if (!cli_connect(cli, dest_host, salist))
1440 DEBUG(1,("cli_establish_connection: failed to connect to %s (%s)\n",
1441 - nmb_namestr(called), inet_ntoa(*dest_ip)));
1442 + nmb_namestr(called),
1443 + salist ? print_sockaddr(salist->addr)
1448 @@ -929,9 +934,10 @@
1449 Attempt a NetBIOS session request, falling back to *SMBSERVER if needed.
1450 ****************************************************************************/
1452 -BOOL attempt_netbios_session_request(struct cli_state *cli, char *srchost, char *desthost,
1453 - struct in_addr *pdest_ip)
1454 +BOOL attempt_netbios_session_request(struct cli_state *cli, char *srchost,
1457 + struct sockaddr_list *dest_addrs_cache = cli->dest_addrs;
1458 struct nmb_name calling, called;
1460 make_nmb_name(&calling, srchost, 0x0);
1461 @@ -968,10 +974,11 @@
1465 + cli->dest_addrs = NULL; /* we cached it, so it shouldn't get freed */
1468 if (!cli_initialise(cli) ||
1469 - !cli_connect(cli, desthost, pdest_ip) ||
1470 + !cli_connect(cli, desthost, dest_addrs_cache) ||
1471 !cli_session_request(cli, &calling, &smbservername)) {
1472 DEBUG(0,("attempt_netbios_session_request: %s rejected the session for \
1473 name *SMBSERVER with error %s\n", desthost, cli_errstr(cli) ));
1474 Index: samba-2.2.3a+IPv6/source/libsmb/clidgram.c
1475 ===================================================================
1476 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/libsmb/clidgram.c,v
1477 retrieving revision 1.1.1.1
1478 retrieving revision 1.2
1479 diff -u -r1.1.1.1 -r1.2
1480 --- samba-2.2.3a+IPv6/source/libsmb/clidgram.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
1481 +++ samba-2.2.3a+IPv6/source/libsmb/clidgram.c 18 Apr 2002 04:53:05 -0000 1.2
1483 struct sockaddr_in sock_out;
1484 socklen_t name_size;
1486 - if (!resolve_name(send_to_name, &sendto_ip, 0x1d)) {
1487 + if (!resolve_name_netbios(send_to_name, &sendto_ip, 0x1d)) {
1489 DEBUG(0, ("Could not resolve name: %s<1D>\n", send_to_name));
1491 @@ -156,17 +156,15 @@
1493 my_ip.s_addr = inet_addr("0.0.0.0");
1495 - if (!resolve_name(myname, &my_ip, 0x00)) { /* FIXME: Call others here */
1496 + if (!resolve_name_netbios(myname, &my_ip, 0x00)) { /* FIXME: Call others here */
1498 DEBUG(0, ("Could not resolve name: %s<00>\n", myname));
1502 - if ((dgram_sock = open_socket_out(SOCK_DGRAM, &sendto_ip, 138, LONG_CONNECT_TIMEOUT)) < 0) {
1504 - DEBUG(4, ("open_sock_out failed ..."));
1505 + if ((dgram_sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
1506 + DEBUG(0, ("socket failed (%s)", strerror(errno)));
1511 /* Make it a broadcast socket ... */
1512 Index: samba-2.2.3a+IPv6/source/libsmb/clientgen.c
1513 ===================================================================
1514 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/libsmb/clientgen.c,v
1515 retrieving revision 1.1.1.1
1516 retrieving revision 1.2
1517 diff -u -r1.1.1.1 -r1.2
1518 --- samba-2.2.3a+IPv6/source/libsmb/clientgen.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
1519 +++ samba-2.2.3a+IPv6/source/libsmb/clientgen.c 18 Apr 2002 04:53:05 -0000 1.2
1521 #include "includes.h"
1524 - * Change the port number used to call on
1525 + * Change the default port number used to call on.
1527 + * This should only truly be used if we're operating on a non-standard
1528 + * port. The default behavior is to first try port 445, then 139.
1530 int cli_set_port(struct cli_state *cli, int port)
1533 + cli->default_port = port;
1542 + cli->default_port = 0;
1543 + cli->dest_addrs = NULL;
1544 + cli->connected_addr = NULL;
1547 cli->pid = (uint16)sys_getpid();
1550 SAFE_FREE(cli->outbuf);
1551 SAFE_FREE(cli->inbuf);
1553 + if (cli->dest_addrs)
1554 + free_sockaddr_list(cli->dest_addrs);
1557 talloc_destroy(cli->mem_ctx);
1558 Index: samba-2.2.3a+IPv6/source/libsmb/domain_client_validate.c
1559 ===================================================================
1560 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/libsmb/domain_client_validate.c,v
1561 retrieving revision 1.1.1.1
1562 retrieving revision 1.3
1563 diff -u -r1.1.1.1 -r1.3
1564 --- samba-2.2.3a+IPv6/source/libsmb/domain_client_validate.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
1565 +++ samba-2.2.3a+IPv6/source/libsmb/domain_client_validate.c 19 Apr 2002 14:50:33 -0000 1.3
1567 static BOOL connect_to_domain_password_server(struct cli_state *pcli,
1568 char *server, unsigned char *trust_passwd)
1570 - struct in_addr dest_ip;
1571 + struct sockaddr_list *dest_addrs;
1572 fstring remote_machine;
1579 - if (is_ipaddress(server)) {
1580 + if (is_ipv4address(server)) {
1581 struct in_addr to_ip;
1583 /* we shouldn't have 255.255.255.255 forthe IP address of
1585 standard_sub_basic(remote_machine);
1586 strupper(remote_machine);
1588 - if(!resolve_name( remote_machine, &dest_ip, 0x20)) {
1589 + if(!(dest_addrs = resolve_name_smb(remote_machine, pcli->default_port))) {
1590 DEBUG(1,("connect_to_domain_password_server: Can't resolve address for %s\n", remote_machine));
1596 if (ismyip(dest_ip)) {
1597 DEBUG(1,("connect_to_domain_password_server: Password server loop - not using password server %s\n",
1604 - if (!cli_connect(pcli, remote_machine, &dest_ip)) {
1605 + if (!cli_connect(pcli, remote_machine, dest_addrs)) {
1606 DEBUG(0,("connect_to_domain_password_server: unable to connect to SMB server on \
1607 machine %s. Error was : %s.\n", remote_machine, cli_errstr(pcli) ));
1608 + free_sockaddr_list(dest_addrs);
1613 - if (!attempt_netbios_session_request(pcli, global_myname, remote_machine, &dest_ip)) {
1614 + if (!attempt_netbios_session_request(pcli, global_myname,
1615 + remote_machine)) {
1616 DEBUG(0,("connect_to_password_server: machine %s rejected the NetBIOS \
1617 session request. Error was : %s.\n", remote_machine, cli_errstr(pcli) ));
1619 Index: samba-2.2.3a+IPv6/source/libsmb/libsmbclient.c
1620 ===================================================================
1621 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/libsmb/libsmbclient.c,v
1622 retrieving revision 1.1.1.1
1623 retrieving revision 1.2
1624 diff -u -r1.1.1.1 -r1.2
1625 --- samba-2.2.3a+IPv6/source/libsmb/libsmbclient.c 16 Apr 2002 03:34:36 -0000 1.1.1.1
1626 +++ samba-2.2.3a+IPv6/source/libsmb/libsmbclient.c 18 Apr 2002 04:53:05 -0000 1.2
1627 @@ -244,10 +244,7 @@
1628 char *p, *server_n = server;
1631 - struct in_addr ip;
1632 - extern struct in_addr ipzero;
1637 /* try to use an existing connection */
1638 @@ -305,10 +302,8 @@
1640 slprintf(ipenv,sizeof(ipenv)-1,"HOST_%s", server_n);
1644 /* have to open a new connection */
1645 - if (!cli_initialise(&c) || !cli_connect(&c, server_n, &ip)) {
1646 + if (!cli_initialise(&c) || !cli_connect(&c, server_n, NULL)) {
1647 if (c.initialised) cli_shutdown(&c);
1650 @@ -1591,7 +1586,7 @@
1652 /* We have server and share and path empty ... so list the workgroups */
1654 - if (!resolve_name(lp_workgroup(), &rem_ip, 0x1d)) {
1655 + if (!resolve_name_netbios(lp_workgroup(), &rem_ip, 0x1d)) {
1657 errno = EINVAL; /* Something wrong with smb.conf? */
1659 @@ -1662,8 +1657,8 @@
1660 /* Check to see if <server><1D> translates, or <server><20> translates */
1661 /* However, we check to see if <server> is an IP address first */
1663 - if (!is_ipaddress(server) && /* Not an IP addr so check next */
1664 - resolve_name(server, &rem_ip, 0x1d)) { /* Found LMB */
1665 + if (!is_ipv4address(server) && /* Not an IP addr so check next */
1666 + resolve_name_netbios(server, &rem_ip, 0x1d)) { /* Found LMB */
1669 smbc_file_table[slot]->dir_type = SMBC_SERVER;
1670 @@ -1715,8 +1710,7 @@
1675 - if (resolve_name(server, &rem_ip, 0x20)) {
1676 + if (resolve_name_netbios(server, &rem_ip, 0x20)) {
1678 /* Now, list the shares ... */
1680 Index: samba-2.2.3a+IPv6/source/libsmb/namequery.c
1681 ===================================================================
1682 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/libsmb/namequery.c,v
1683 retrieving revision 1.1.1.1
1684 retrieving revision 1.2
1685 diff -u -r1.1.1.1 -r1.2
1686 --- samba-2.2.3a+IPv6/source/libsmb/namequery.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
1687 +++ samba-2.2.3a+IPv6/source/libsmb/namequery.c 18 Apr 2002 04:53:05 -0000 1.2
1688 @@ -628,15 +628,11 @@
1689 Resolve via "bcast" method.
1690 *********************************************************/
1692 -BOOL name_resolve_bcast(const char *name, int name_type,
1693 - struct in_addr **return_ip_list, int *return_count)
1694 +struct sockaddr_list *name_resolve_bcast(const char *name, int name_type)
1697 int num_interfaces = iface_count();
1699 - *return_ip_list = NULL;
1700 - *return_count = 0;
1703 * "bcast" means do a broadcast lookup on all the local interfaces.
1706 sock = open_socket_in( SOCK_DGRAM, 0, 3,
1707 interpret_addr(lp_socket_address()), True );
1709 - if (sock == -1) return False;
1710 + if (sock == -1) return NULL;
1712 set_socket_options(sock,"SO_BROADCAST");
1714 @@ -655,33 +651,36 @@
1716 for( i = num_interfaces-1; i >= 0; i--) {
1717 struct in_addr sendto_ip;
1718 + struct in_addr *addr;
1721 /* Done this way to fix compiler error on IRIX 5.x */
1722 sendto_ip = *iface_bcast(*iface_n_ip(i));
1723 - *return_ip_list = name_query(sock, name, name_type, True,
1724 - True, sendto_ip, return_count);
1725 - if(*return_ip_list != NULL) {
1726 + addr = name_query(sock, name, name_type, True,
1727 + True, sendto_ip, &return_count);
1728 + if(addr != NULL) {
1729 + struct sockaddr_list *salist;
1733 + salist = make_sin_list(addr, return_count);
1744 /********************************************************
1745 Resolve via "wins" method.
1746 *********************************************************/
1748 -static BOOL resolve_wins(const char *name, int name_type,
1749 - struct in_addr **return_iplist, int *return_count)
1750 +static struct sockaddr_list *resolve_wins(const char *name, int name_type)
1753 struct in_addr wins_ip;
1756 - *return_iplist = NULL;
1757 - *return_count = 0;
1760 * "wins" means do a unicast lookup to the WINS server.
1763 } else if( wins_srv_count() < 1 ) {
1764 DEBUG(3,("resolve_wins: WINS server resolution selected and no WINS servers listed.\n"));
1768 wins_ip = wins_srv_ip();
1769 wins_ismyip = ismyip(wins_ip);
1770 @@ -715,27 +714,32 @@
1771 interpret_addr(lp_socket_address()),
1774 - *return_iplist = name_query( sock, name,
1778 - if(*return_iplist != NULL) {
1782 + struct in_addr *addr;
1785 + addr = name_query(sock, name,
1790 + if(addr != NULL) {
1791 + struct sockaddr_list *salist;
1793 + salist = make_sin_list(addr, return_count);
1804 /********************************************************
1805 Resolve via "lmhosts" method.
1806 *********************************************************/
1808 -static BOOL resolve_lmhosts(const char *name, int name_type,
1809 - struct in_addr **return_iplist, int *return_count)
1810 +static struct sockaddr_list *resolve_lmhosts(const char *name, int name_type)
1813 * "lmhosts" means parse the local lmhosts file.
1816 struct in_addr return_ip;
1818 - *return_iplist = NULL;
1819 - *return_count = 0;
1821 DEBUG(3,("resolve_lmhosts: Attempting lmhosts lookup for name %s<0x%x>\n", name, name_type));
1823 fp = startlmhosts( LMHOSTSFILE );
1824 @@ -758,19 +759,12 @@
1825 ((name_type2 == -1) || (name_type == name_type2))
1828 - *return_iplist = (struct in_addr *)malloc(sizeof(struct in_addr));
1829 - if(*return_iplist == NULL) {
1830 - DEBUG(3,("resolve_lmhosts: malloc fail !\n"));
1833 - **return_iplist = return_ip;
1834 - *return_count = 1;
1836 + return make_sin_list(&return_ip, 1);
1846 @@ -778,32 +772,35 @@
1847 Resolve via "hosts" method.
1848 *********************************************************/
1850 -static BOOL resolve_hosts(const char *name,
1851 - struct in_addr **return_iplist, int *return_count)
1852 +static struct sockaddr_list *resolve_hosts(const char *name)
1855 * "host" means do a localhost, or dns lookup.
1858 + struct addrinfo *ai, hints;
1859 + struct sockaddr_list *ret;
1861 + DEBUG(3,("resolve_hosts: Attempting getaddrinfo for name %s<0x20>\n", name));
1862 + memset(&hints, 0, sizeof(hints));
1863 + hints.ai_socktype = SOCK_STREAM;
1864 + if(getaddrinfo(name, NULL, &hints, &ai)) return NULL;
1865 + ret = make_sa_list(ai);
1871 - *return_iplist = NULL;
1872 - *return_count = 0;
1874 DEBUG(3,("resolve_hosts: Attempting host lookup for name %s<0x20>\n", name));
1876 if (((hp = sys_gethostbyname(name)) != NULL) && (hp->h_addr != NULL)) {
1877 - struct in_addr return_ip;
1878 - putip((char *)&return_ip,(char *)hp->h_addr);
1879 - *return_iplist = (struct in_addr *)malloc(sizeof(struct in_addr));
1880 - if(*return_iplist == NULL) {
1881 - DEBUG(3,("resolve_hosts: malloc fail !\n"));
1884 - **return_iplist = return_ip;
1885 - *return_count = 1;
1887 + struct in_addr addr;
1889 + memcpy(&addr.s_addr, hp->h_addr, sizeof(addr.s_addr));
1890 + return make_sin_list(&addr, 1);
1897 /********************************************************
1898 @@ -811,34 +808,44 @@
1899 Use this function if the string is either an IP address, DNS
1900 or host name or NetBIOS name. This uses the name switch in the
1901 smb.conf to determine the order of name resolution.
1903 + WARNING: This function returns sockaddrs without the port set!
1904 + Don't try to connect to these without first setting
1906 *********************************************************/
1908 -static BOOL internal_resolve_name(const char *name, int name_type,
1909 - struct in_addr **return_iplist, int *return_count)
1910 +static struct sockaddr_list *internal_resolve_name(const char *name, int name_type)
1912 pstring name_resolve_list;
1915 - BOOL allones = (strcmp(name,"255.255.255.255") == 0);
1916 - BOOL allzeros = (strcmp(name,"0.0.0.0") == 0);
1917 - BOOL is_address = is_ipaddress(name);
1918 - *return_iplist = NULL;
1919 - *return_count = 0;
1921 - if (allzeros || allones || is_address) {
1922 - *return_iplist = (struct in_addr *)malloc(sizeof(struct in_addr));
1923 - if(*return_iplist == NULL) {
1924 - DEBUG(3,("internal_resolve_name: malloc fail !\n"));
1928 - /* if it's in the form of an IP address then get the lib to interpret it */
1929 - (*return_iplist)->s_addr = inet_addr(name);
1931 - (*return_iplist)->s_addr = allones ? 0xFFFFFFFF : 0;
1932 - *return_count = 1;
1933 + struct sockaddr_list *salist = NULL;
1935 + if (is_ipaddress(name)) {
1936 + /* if it's in the form of an IP address then get
1937 + * the lib to interpret it */
1938 + struct sockaddr *sa;
1940 + if(!(sa = get_numeric_addr(name))) return NULL;
1941 + salist = (struct sockaddr_list *)malloc(sizeof(struct sockaddr_list));
1942 + salist->next = NULL;
1943 + salist->addr = sa;
1945 + /* This isn't kosher, but it would take a lot to make Samba
1946 + * be truly AF-independent. */
1948 + if( sa->sa_family == AF_INET6 )
1950 + salist->pfamily = PF_INET6;
1951 + salist->len = sizeof(struct sockaddr_in6);
1955 + salist->pfamily = PF_INET;
1956 + salist->len = sizeof(struct sockaddr_in);
1963 pstrcpy(name_resolve_list, lp_name_resolve_order());
1964 @@ -848,78 +855,151 @@
1966 while (next_token(&ptr, tok, LIST_SEP, sizeof(tok))) {
1967 if((strequal(tok, "host") || strequal(tok, "hosts"))) {
1968 - if (name_type == 0x20 && resolve_hosts(name, return_iplist, return_count)) {
1970 + if (name_type == 0x20 && (salist = resolve_hosts(name)))
1974 } else if(strequal( tok, "lmhosts")) {
1975 - if (resolve_lmhosts(name, name_type, return_iplist, return_count)) {
1977 + if ((salist=resolve_lmhosts(name, name_type))) {
1980 } else if(strequal( tok, "wins")) {
1981 /* don't resolve 1D via WINS */
1982 if (name_type != 0x1D &&
1983 - resolve_wins(name, name_type, return_iplist, return_count)) {
1985 + (salist=resolve_wins(name, name_type))) {
1988 } else if(strequal( tok, "bcast")) {
1989 - if (name_resolve_bcast(name, name_type, return_iplist, return_count)) {
1991 + if ((salist=name_resolve_bcast(name, name_type))) {
1995 DEBUG(0,("resolve_name: unknown name switch type %s\n", tok));
1999 - SAFE_FREE(*return_iplist);
2004 +static BOOL internal_resolve_name_netbios(const char *name, int name_type,
2005 + struct in_addr **return_iplist, int *return_count)
2007 + struct sockaddr_list *salist, *sl;
2010 + *return_iplist = NULL;
2011 + *return_count = 0;
2013 + salist = internal_resolve_name(name, name_type);
2014 + if(!salist) return False;
2016 + for(sl = salist; sl; sl = sl->next)
2017 + if(sl->addr->sa_family == AF_INET) ++*return_count;
2019 + *return_iplist = (struct in_addr *)
2020 + malloc(*return_count * sizeof(struct in_addr));
2022 + for(i = 0, sl = salist; i < *return_count; ++i)
2023 + if(sl->addr->sa_family == AF_INET)
2024 + *return_iplist[i] =
2025 + ((struct sockaddr_in *)(sl->addr))->sin_addr;
2027 + free_sockaddr_list(salist);
2032 /********************************************************
2033 - Internal interface to resolve a name into one IP address.
2034 + Internal interface to resolve a name into one IP address for NetBIOS.
2035 Use this function if the string is either an IP address, DNS
2036 or host name or NetBIOS name. This uses the name switch in the
2037 smb.conf to determine the order of name resolution.
2038 *********************************************************/
2040 -BOOL resolve_name(const char *name, struct in_addr *return_ip, int name_type)
2041 +BOOL resolve_name_netbios(const char *name, struct in_addr *return_ip,
2044 - struct in_addr *ip_list = NULL;
2046 + struct sockaddr_list *salist;
2048 if (is_ipaddress(name)) {
2049 *return_ip = *interpret_addr2(name);
2053 - if(internal_resolve_name(name, name_type, &ip_list, &count)) {
2055 + if((salist=internal_resolve_name(name, name_type))) {
2056 + struct sockaddr_list *sl;
2059 /* only return valid addresses for TCP connections */
2060 - for (i=0; i<count; i++) {
2061 - char *ip_str = inet_ntoa(ip_list[i]);
2063 + for(sl = salist; sl; sl = sl->next)
2065 + if ( sl->addr->sa_family == AF_INET &&
2066 + (ip_str = inet_ntoa(((struct sockaddr_in *)
2067 + (sl->addr))->sin_addr)) &&
2068 strcmp(ip_str, "255.255.255.255") != 0 &&
2069 strcmp(ip_str, "0.0.0.0") != 0) {
2070 - *return_ip = ip_list[i];
2071 - SAFE_FREE(ip_list);
2072 + *return_ip = ((struct sockaddr_in *)
2073 + (sl->addr))->sin_addr;
2074 + free_sockaddr_list(salist);
2078 + free_sockaddr_list(salist);
2080 - SAFE_FREE(ip_list);
2084 +/********************************************************
2085 + Function to resolve a name into a list of addresses for
2086 + use with SMB. This uses the name switch in the smb.conf
2087 + to determine the order of name resolution.
2088 +*********************************************************/
2090 +struct sockaddr_list *resolve_name_smb(const char *name, int port)
2092 + struct sockaddr_list *salist;
2094 + if((salist=internal_resolve_name(name, 0x20))) {
2095 + struct sockaddr_list *sl = salist, *old = NULL;
2098 + /* only return valid addresses for TCP connections */
2101 + if ( sl->addr->sa_family == AF_INET &&
2102 + (ip_str = inet_ntoa(((struct sockaddr_in *)
2103 + (sl->addr))->sin_addr)) &&
2104 + ( strcmp(ip_str, "255.255.255.255") == 0 ||
2105 + strcmp(ip_str, "0.0.0.0") == 0 ) )
2107 + struct sockaddr_list *next = sl->next;
2109 + SAFE_FREE(sl->addr);
2111 + if(old == NULL) salist = next;
2112 + else old->next = next;
2115 + if(port) set_sockaddr_port(sl->addr, port);
2121 + return port ? salist : set_default_ports(salist);
2124 /********************************************************
2125 resolve a name of format \\server_name or \\ipaddress
2126 into a name. also, cut the \\ from the front for us.
2127 *********************************************************/
2129 -BOOL resolve_srv_name(const char* srv_name, fstring dest_host,
2130 - struct in_addr *ip)
2131 +struct sockaddr_list *resolve_srv_name(const char* srv_name,
2132 + fstring dest_host, int port)
2135 const char *sv_name = srv_name;
2136 + struct in_addr ip;
2137 + struct sockaddr_list *salist;
2139 DEBUG(10,("resolve_srv_name: %s\n", srv_name));
2141 @@ -927,8 +1007,11 @@
2143 extern pstring global_myname;
2144 fstrcpy(dest_host, global_myname);
2145 - ip = interpret_addr2("127.0.0.1");
2147 + inet_aton("127.0.0.1", &ip);
2148 + salist = make_sin_list(&ip, 1);
2149 + if(port) set_sockaddr_port(salist->addr, port);
2150 + else salist = set_default_ports(salist);
2154 if (strnequal("\\\\", srv_name, 2))
2155 @@ -940,18 +1023,27 @@
2156 /* treat the '*' name specially - it is a magic name for the PDC */
2157 if (strcmp(dest_host,"*") == 0) {
2158 extern pstring global_myname;
2159 - ret = resolve_name(lp_workgroup(), ip, 0x1B);
2160 - lookup_dc_name(global_myname, lp_workgroup(), ip, dest_host);
2162 - ret = resolve_name(dest_host, ip, 0x20);
2164 + if(resolve_name_netbios(lp_workgroup(), &ip, 0x1B))
2166 + lookup_dc_name(global_myname, lp_workgroup(),
2168 + salist = make_sin_list(&ip, 1);
2169 + if(port) set_sockaddr_port(salist->addr, port);
2170 + else salist = set_default_ports(salist);
2176 + salist = resolve_name_smb(dest_host, port);
2178 if (is_ipaddress(dest_host))
2180 fstrcpy(dest_host, "*SMBSERVER");
2188 @@ -964,12 +1056,12 @@
2189 struct in_addr *ip_list = NULL;
2192 - if (internal_resolve_name(group, 0x1D, &ip_list, &count)) {
2193 + if (internal_resolve_name_netbios(group, 0x1D, &ip_list, &count)) {
2194 *master_ip = ip_list[0];
2198 - if(internal_resolve_name(group, 0x1B, &ip_list, &count)) {
2199 + if(internal_resolve_name_netbios(group, 0x1B, &ip_list, &count)) {
2200 *master_ip = ip_list[0];
2203 @@ -1207,16 +1299,16 @@
2204 struct in_addr *return_iplist = NULL;
2207 - return internal_resolve_name(group, name_type, ip_list, count);
2208 + return internal_resolve_name_netbios(group, name_type, ip_list, count);
2211 while (next_token(&p,name,LIST_SEP,sizeof(name))) {
2212 if (strequal(name, "*"))
2213 - return internal_resolve_name(group, name_type, ip_list, count);
2214 + return internal_resolve_name_netbios(group, name_type, ip_list, count);
2217 if (num_adresses == 0)
2218 - return internal_resolve_name(group, name_type, ip_list, count);
2219 + return internal_resolve_name_netbios(group, name_type, ip_list, count);
2221 return_iplist = (struct in_addr *)malloc(num_adresses * sizeof(struct in_addr));
2222 if(return_iplist == NULL) {
2223 @@ -1227,14 +1319,14 @@
2225 while (next_token(&p,name,LIST_SEP,sizeof(name))) {
2226 struct in_addr name_ip;
2227 - if (resolve_name( name, &name_ip, 0x20) == False)
2228 + if (resolve_name_netbios(name, &name_ip, 0x20) == False)
2230 return_iplist[(*count)++] = name_ip;
2232 *ip_list = return_iplist;
2233 return (*count != 0);
2235 - return internal_resolve_name(group, name_type, ip_list, count);
2236 + return internal_resolve_name_netbios(group, name_type, ip_list, count);
2239 /********************************************************
2240 @@ -1242,5 +1334,5 @@
2241 ********************************************************/
2242 BOOL get_lmb_list(struct in_addr **ip_list, int *count)
2244 - return internal_resolve_name( MSBROWSE, 0x1, ip_list, count);
2245 + return internal_resolve_name_netbios( MSBROWSE, 0x1, ip_list, count);
2247 Index: samba-2.2.3a+IPv6/source/libsmb/passchange.c
2248 ===================================================================
2249 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/libsmb/passchange.c,v
2250 retrieving revision 1.1.1.1
2251 retrieving revision 1.2
2252 diff -u -r1.1.1.1 -r1.2
2253 --- samba-2.2.3a+IPv6/source/libsmb/passchange.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
2254 +++ samba-2.2.3a+IPv6/source/libsmb/passchange.c 18 Apr 2002 04:53:05 -0000 1.2
2257 struct nmb_name calling, called;
2258 struct cli_state cli;
2259 - struct in_addr ip;
2260 + struct sockaddr_list *dest_addrs;
2264 - if(!resolve_name( remote_machine, &ip, 0x20)) {
2265 + if(!(dest_addrs = resolve_name_smb(remote_machine, 0))) {
2266 slprintf(err_str, err_str_len-1, "unable to find an IP address for machine %s.\n",
2273 - if (!cli_initialise(&cli) || !cli_connect(&cli, remote_machine, &ip)) {
2274 + if (!cli_initialise(&cli) ||
2275 + !cli_connect(&cli, remote_machine, dest_addrs)) {
2276 slprintf(err_str, err_str_len-1, "unable to connect to SMB server on machine %s. Error was : %s.\n",
2277 remote_machine, cli_errstr(&cli) );
2278 + free_sockaddr_list(dest_addrs);
2282 Index: samba-2.2.3a+IPv6/source/nmbd/nmbd_synclists.c
2283 ===================================================================
2284 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/nmbd/nmbd_synclists.c,v
2285 retrieving revision 1.1.1.1
2286 retrieving revision 1.2
2287 diff -u -r1.1.1.1 -r1.2
2288 --- samba-2.2.3a+IPv6/source/nmbd/nmbd_synclists.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
2289 +++ samba-2.2.3a+IPv6/source/nmbd/nmbd_synclists.c 18 Apr 2002 04:53:05 -0000 1.2
2291 extern fstring local_machine;
2292 fstring unix_workgroup;
2293 static struct cli_state cli;
2294 + struct sockaddr_list *dest_addrs;
2295 uint32 local_type = local ? SV_TYPE_LOCAL_LIST_ONLY : 0;
2296 struct nmb_name called, calling;
2298 - if (!cli_initialise(&cli) || !cli_connect(&cli, name, &ip)) {
2299 + dest_addrs = make_singlet_list(&ip, 0);
2300 + if (!cli_initialise(&cli) || !cli_connect(&cli, name, dest_addrs)) {
2301 + free_sockaddr_list(dest_addrs);
2305 Index: samba-2.2.3a+IPv6/source/nsswitch/winbindd_cm.c
2306 ===================================================================
2307 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/nsswitch/winbindd_cm.c,v
2308 retrieving revision 1.1.1.1
2309 retrieving revision 1.3
2310 diff -u -r1.1.1.1 -r1.3
2311 --- samba-2.2.3a+IPv6/source/nsswitch/winbindd_cm.c 16 Apr 2002 03:34:36 -0000 1.1.1.1
2312 +++ samba-2.2.3a+IPv6/source/nsswitch/winbindd_cm.c 19 Apr 2002 14:50:33 -0000 1.3
2314 struct nmb_name calling, called;
2315 extern pstring global_myname;
2317 - struct in_addr dest_ip;
2318 + struct sockaddr_list *dest_addrs;
2319 BOOL result = False;
2320 struct ntuser_creds creds;
2323 if (!(new_conn->cli = cli_initialise(NULL)))
2326 - if (!resolve_srv_name(new_conn->controller, dest_host, &dest_ip))
2327 + if (!(dest_addrs = resolve_srv_name(new_conn->controller, dest_host,
2328 + new_conn->cli->default_port)))
2331 make_nmb_name(&called, dns_to_netbios_name(new_conn->controller), 0x20);
2332 @@ -291,9 +292,12 @@
2333 cli_init_creds(new_conn->cli, &creds);
2335 if (!cli_establish_connection(new_conn->cli, new_conn->controller,
2336 - &dest_ip, &calling, &called, "IPC$",
2337 + dest_addrs, &calling, &called, "IPC$",
2338 "IPC", False, True))
2340 + free_sockaddr_list(dest_addrs);
2344 if (!cli_nt_session_open (new_conn->cli, pipe_name))
2346 Index: samba-2.2.3a+IPv6/source/rpc_client/cli_spoolss_notify.c
2347 ===================================================================
2348 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/rpc_client/cli_spoolss_notify.c,v
2349 retrieving revision 1.1.1.1
2350 retrieving revision 1.3
2351 diff -u -r1.1.1.1 -r1.3
2352 --- samba-2.2.3a+IPv6/source/rpc_client/cli_spoolss_notify.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
2353 +++ samba-2.2.3a+IPv6/source/rpc_client/cli_spoolss_notify.c 19 Apr 2002 14:50:33 -0000 1.3
2356 BOOL spoolss_connect_to_client( struct cli_state *cli, char *remote_machine)
2358 + struct sockaddr_list *dest_addrs;
2361 if(cli_initialise(cli) == NULL) {
2362 DEBUG(0,("connect_to_client: unable to initialize client connection.\n"));
2366 - if(!resolve_name( remote_machine, &cli->dest_ip, 0x20)) {
2367 + if(!(dest_addrs = resolve_name_smb(remote_machine, cli->default_port))) {
2368 DEBUG(0,("connect_to_client: Can't resolve address for %s\n", remote_machine));
2374 if (ismyip(cli->dest_ip)) {
2375 DEBUG(0,("connect_to_client: Machine %s is one of our addresses. Cannot add to ourselves.\n", remote_machine));
2381 - if (!cli_connect(cli, remote_machine, &cli->dest_ip)) {
2382 + if (!cli_connect(cli, remote_machine, dest_addrs)) {
2383 DEBUG(0,("connect_to_client: unable to connect to SMB server on machine %s. Error was : %s.\n", remote_machine, cli_errstr(cli) ));
2384 + free_sockaddr_list(dest_addrs);
2389 - if (!attempt_netbios_session_request(cli, global_myname, remote_machine, &cli->dest_ip)) {
2390 + if (!attempt_netbios_session_request(cli, global_myname,
2391 + remote_machine)) {
2392 DEBUG(0,("connect_to_client: machine %s rejected the NetBIOS session request. Error was %s\n", remote_machine, cli_errstr(cli) ));
2395 Index: samba-2.2.3a+IPv6/source/rpc_client/cli_trust.c
2396 ===================================================================
2397 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/rpc_client/cli_trust.c,v
2398 retrieving revision 1.1.1.1
2399 retrieving revision 1.3
2400 diff -u -r1.1.1.1 -r1.3
2401 --- samba-2.2.3a+IPv6/source/rpc_client/cli_trust.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
2402 +++ samba-2.2.3a+IPv6/source/rpc_client/cli_trust.c 19 Apr 2002 14:50:33 -0000 1.3
2404 unsigned char new_trust_passwd_hash[16])
2406 struct cli_state cli;
2407 + struct sockaddr_list *dest_addrs;
2415 - if(!resolve_name( remote_machine, &cli.dest_ip, 0x20)) {
2416 + if(!(dest_addrs = resolve_name_smb(remote_machine, 0))) {
2417 DEBUG(0,("modify_trust_password: Can't resolve address for %s\n", remote_machine));
2423 if (ismyip(cli.dest_ip)) {
2424 DEBUG(0,("modify_trust_password: Machine %s is one of our addresses. Cannot add \
2425 to ourselves.\n", remote_machine));
2431 - if (!cli_connect(&cli, remote_machine, &cli.dest_ip)) {
2432 + if (!cli_connect(&cli, remote_machine, dest_addrs)) {
2433 DEBUG(0,("modify_trust_password: unable to connect to SMB server on \
2434 machine %s. Error was : %s.\n", remote_machine, cli_errstr(&cli) ));
2435 + free_sockaddr_list(dest_addrs);
2440 - if (!attempt_netbios_session_request(&cli, global_myname, remote_machine, &cli.dest_ip)) {
2441 + if (!attempt_netbios_session_request(&cli, global_myname, remote_machine)) {
2442 DEBUG(0,("modify_trust_password: machine %s rejected the NetBIOS \
2443 session request. Error was %s\n", remote_machine, cli_errstr(&cli) ));
2445 Index: samba-2.2.3a+IPv6/source/rpcclient/rpcclient.c
2446 ===================================================================
2447 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/rpcclient/rpcclient.c,v
2448 retrieving revision 1.1.1.1
2449 retrieving revision 1.3
2450 diff -u -r1.1.1.1 -r1.3
2451 --- samba-2.2.3a+IPv6/source/rpcclient/rpcclient.c 16 Apr 2002 03:34:39 -0000 1.1.1.1
2452 +++ samba-2.2.3a+IPv6/source/rpcclient/rpcclient.c 19 Apr 2002 14:50:33 -0000 1.3
2454 struct cli_state *setup_connection(struct cli_state *cli, char *system_name,
2455 struct ntuser_creds *creds)
2457 - struct in_addr dest_ip;
2458 + struct sockaddr_list *dest_addrs;
2459 struct nmb_name calling, called;
2461 extern pstring global_myname;
2463 cli_init_creds(cli, creds);
2465 /* Establish a SMB connection */
2466 - if (!resolve_srv_name(system_name, dest_host, &dest_ip)) {
2467 + if (!(dest_addrs = resolve_srv_name(system_name, dest_host,
2468 + cli->default_port))) {
2469 fprintf(stderr, "Could not resolve %s\n", dest_host);
2472 @@ -588,9 +589,11 @@
2473 make_nmb_name(&called, dns_to_netbios_name(dest_host), 0x20);
2474 make_nmb_name(&calling, dns_to_netbios_name(global_myname), 0);
2476 - if (!cli_establish_connection(cli, dest_host, &dest_ip, &calling,
2477 + if (!cli_establish_connection(cli, dest_host, dest_addrs, &calling,
2478 &called, "IPC$", "IPC", False, True)) {
2479 fprintf(stderr, "Error establishing IPC$ connection\n");
2480 + cli_shutdown(cli);
2481 + free_sockaddr_list(dest_addrs);
2485 Index: samba-2.2.3a+IPv6/source/smbd/password.c
2486 ===================================================================
2487 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/smbd/password.c,v
2488 retrieving revision 1.1.1.1
2489 retrieving revision 1.3
2490 diff -u -r1.1.1.1 -r1.3
2491 --- samba-2.2.3a+IPv6/source/smbd/password.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
2492 +++ samba-2.2.3a+IPv6/source/smbd/password.c 19 Apr 2002 14:50:33 -0000 1.3
2493 @@ -1033,7 +1033,7 @@
2495 struct cli_state *cli;
2497 - struct in_addr dest_ip;
2498 + struct sockaddr_list *dest_addrs;
2500 BOOL connected_ok = False;
2502 @@ -1049,21 +1049,23 @@
2503 standard_sub_basic(desthost);
2506 - if(!resolve_name( desthost, &dest_ip, 0x20)) {
2507 + if(!(dest_addrs = resolve_name_smb(desthost, 0))) {
2508 DEBUG(1,("server_cryptkey: Can't resolve address for %s\n",desthost));
2513 if (ismyip(dest_ip)) {
2514 DEBUG(1,("Password server loop - disabling password server %s\n",desthost));
2519 - if (cli_connect(cli, desthost, &dest_ip)) {
2520 + if (cli_connect(cli, desthost, dest_addrs)) {
2521 DEBUG(3,("connected to password server %s\n",desthost));
2522 connected_ok = True;
2525 + } else free_sockaddr_list(dest_addrs);
2529 @@ -1074,7 +1076,7 @@
2533 - if (!attempt_netbios_session_request(cli, global_myname, desthost, &dest_ip))
2534 + if (!attempt_netbios_session_request(cli, global_myname, desthost))
2537 DEBUG(3,("got session\n"));
2538 @@ -1212,7 +1214,7 @@
2539 static BOOL connect_to_domain_password_server(struct cli_state *pcli,
2540 char *server, unsigned char *trust_passwd)
2542 - struct in_addr dest_ip;
2543 + struct sockaddr_list *dest_addrs;
2544 fstring remote_machine;
2546 if(!cli_initialise(pcli)) {
2547 @@ -1220,7 +1222,7 @@
2551 - if (is_ipaddress(server)) {
2552 + if (is_ipv4address(server)) {
2553 struct in_addr to_ip;
2555 /* we shouldn't have 255.255.255.255 forthe IP address of
2556 @@ -1242,27 +1244,30 @@
2557 standard_sub_basic(remote_machine);
2558 strupper(remote_machine);
2560 - if(!resolve_name( remote_machine, &dest_ip, 0x20)) {
2561 + if(!(dest_addrs = resolve_name_smb(remote_machine, 0))) {
2562 DEBUG(1,("connect_to_domain_password_server: Can't resolve address for %s\n", remote_machine));
2568 if (ismyip(dest_ip)) {
2569 DEBUG(1,("connect_to_domain_password_server: Password server loop - not using password server %s\n",
2576 - if (!cli_connect(pcli, remote_machine, &dest_ip)) {
2577 + if (!cli_connect(pcli, remote_machine, dest_addrs)) {
2578 DEBUG(0,("connect_to_domain_password_server: unable to connect to SMB server on \
2579 machine %s. Error was : %s.\n", remote_machine, cli_errstr(pcli) ));
2580 + free_sockaddr_list(dest_addrs);
2585 - if (!attempt_netbios_session_request(pcli, global_myname, remote_machine, &dest_ip)) {
2586 + if (!attempt_netbios_session_request(pcli, global_myname, remote_machine)) {
2587 DEBUG(0,("connect_to_password_server: machine %s rejected the NetBIOS \
2588 session request. Error was : %s.\n", remote_machine, cli_errstr(pcli) ));
2590 Index: samba-2.2.3a+IPv6/source/smbwrapper/smbw.c
2591 ===================================================================
2592 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/smbwrapper/smbw.c,v
2593 retrieving revision 1.1.1.1
2594 retrieving revision 1.2
2595 diff -u -r1.1.1.1 -r1.2
2596 --- samba-2.2.3a+IPv6/source/smbwrapper/smbw.c 16 Apr 2002 03:34:37 -0000 1.1.1.1
2597 +++ samba-2.2.3a+IPv6/source/smbwrapper/smbw.c 18 Apr 2002 04:53:05 -0000 1.2
2602 - struct in_addr *ip_list = NULL;
2605 + struct sockaddr_list *wglist, *wg;
2607 /* first off see if an existing workgroup name exists */
2608 p = smbw_getshared("WORKGROUP");
2609 @@ -273,24 +271,29 @@
2610 if (smbw_server(server, "IPC$")) return p;
2612 /* go looking for workgroups */
2613 - if (!name_resolve_bcast(MSBROWSE, 1, &ip_list, &count)) {
2614 + if (!(wglist = name_resolve_bcast(MSBROWSE, 1))) {
2615 DEBUG(1,("No workgroups found!"));
2619 - for (i=0;i<count;i++) {
2620 + for(wg = wglist; wg; wg = wg->next)
2622 static fstring name;
2623 - if (name_status_find("*", 0, 0x1d, ip_list[i], name)) {
2625 + if(wg->addr->sa_family != AF_INET) continue;
2626 + if (name_status_find("*", 0, 0x1d, ((struct sockaddr_in *)
2627 + (wg->addr))->sin_addr, name))
2629 slprintf(server, sizeof(server), "%s#1D", name);
2630 if (smbw_server(server, "IPC$")) {
2631 smbw_setshared("WORKGROUP", name);
2632 - SAFE_FREE(ip_list);
2633 + free_sockaddr_list(wglist);
2639 - SAFE_FREE(ip_list);
2640 + free_sockaddr_list(wglist);
2644 @@ -448,10 +451,8 @@
2645 char *p, *server_n = server;
2648 - struct in_addr ip;
2649 - extern struct in_addr ipzero;
2650 + struct sockaddr_list *salist;
2655 get_auth_data_fn(server, share, &workgroup, &username, &password);
2656 @@ -502,13 +503,11 @@
2658 slprintf(ipenv,sizeof(ipenv)-1,"HOST_%s", server_n);
2661 - if ((p=smbw_getshared(ipenv))) {
2662 - ip = *(interpret_addr2(p));
2664 + salist = resolve_name_smb((p=smbw_getshared(ipenv)) ? p : server_n, 0);
2666 /* have to open a new connection */
2667 - if (!cli_initialise(&c) || !cli_connect(&c, server_n, &ip)) {
2668 + if (!cli_initialise(&c) || !cli_connect(&c, server_n, salist)) {
2669 + free_sockaddr_list(salist);
2677 - smbw_setshared(ipenv,inet_ntoa(ip));
2678 + smbw_setshared(ipenv,print_sockaddr(c.connected_addr->addr));
2680 DEBUG(4,(" tconx ok\n"));
2682 Index: samba-2.2.3a+IPv6/source/utils/locktest.c
2683 ===================================================================
2684 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/utils/locktest.c,v
2685 retrieving revision 1.1.1.1
2686 retrieving revision 1.2
2687 diff -u -r1.1.1.1 -r1.2
2688 --- samba-2.2.3a+IPv6/source/utils/locktest.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
2689 +++ samba-2.2.3a+IPv6/source/utils/locktest.c 18 Apr 2002 04:53:05 -0000 1.2
2691 struct nmb_name called, calling;
2694 - struct in_addr ip;
2695 - extern struct in_addr ipzero;
2699 @@ -125,19 +123,14 @@
2705 slprintf(myname,sizeof(myname), "lock-%u-%u", getpid(), count++);
2707 make_nmb_name(&calling, myname, 0x0);
2708 make_nmb_name(&called , server, 0x20);
2713 /* have to open a new connection */
2714 - if (!(c=cli_initialise(NULL)) || (cli_set_port(c, 139) == 0) ||
2715 - !cli_connect(c, server_n, &ip)) {
2716 + if (!(c=cli_initialise(NULL)) || !cli_connect(c, server_n, NULL)) {
2717 DEBUG(0,("Connection to %s failed\n", server_n));
2720 Index: samba-2.2.3a+IPv6/source/utils/locktest2.c
2721 ===================================================================
2722 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/utils/locktest2.c,v
2723 retrieving revision 1.1.1.1
2724 retrieving revision 1.2
2725 diff -u -r1.1.1.1 -r1.2
2726 --- samba-2.2.3a+IPv6/source/utils/locktest2.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
2727 +++ samba-2.2.3a+IPv6/source/utils/locktest2.c 18 Apr 2002 04:53:05 -0000 1.2
2729 struct nmb_name called, calling;
2732 - struct in_addr ip;
2733 - extern struct in_addr ipzero;
2737 @@ -169,19 +167,14 @@
2743 slprintf(myname,sizeof(myname), "lock-%u-%u", getpid(), count++);
2745 make_nmb_name(&calling, myname, 0x0);
2746 make_nmb_name(&called , server, 0x20);
2751 /* have to open a new connection */
2752 - if (!(c=cli_initialise(NULL)) || (cli_set_port(c, 139) == 0) ||
2753 - !cli_connect(c, server_n, &ip)) {
2754 + if (!(c=cli_initialise(NULL)) || !cli_connect(c, server_n, NULL)) {
2755 DEBUG(0,("Connection to %s failed\n", server_n));
2758 Index: samba-2.2.3a+IPv6/source/utils/masktest.c
2759 ===================================================================
2760 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/utils/masktest.c,v
2761 retrieving revision 1.1.1.1
2762 retrieving revision 1.2
2763 diff -u -r1.1.1.1 -r1.2
2764 --- samba-2.2.3a+IPv6/source/utils/masktest.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
2765 +++ samba-2.2.3a+IPv6/source/utils/masktest.c 18 Apr 2002 04:53:05 -0000 1.2
2767 struct nmb_name called, calling;
2770 - struct in_addr ip;
2771 - extern struct in_addr ipzero;
2774 share = strchr(server,'\\');
2775 @@ -175,17 +173,12 @@
2781 make_nmb_name(&calling, "masktest", 0x0);
2782 make_nmb_name(&called , server, 0x20);
2787 /* have to open a new connection */
2788 - if (!(c=cli_initialise(NULL)) || (cli_set_port(c, 139) == 0) ||
2789 - !cli_connect(c, server_n, &ip)) {
2790 + if (!(c=cli_initialise(NULL)) || !cli_connect(c, server_n, NULL)) {
2791 DEBUG(0,("Connection to %s failed\n", server_n));
2794 Index: samba-2.2.3a+IPv6/source/utils/smbcacls.c
2795 ===================================================================
2796 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/utils/smbcacls.c,v
2797 retrieving revision 1.1.1.1
2798 retrieving revision 1.2
2799 diff -u -r1.1.1.1 -r1.2
2800 --- samba-2.2.3a+IPv6/source/utils/smbcacls.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
2801 +++ samba-2.2.3a+IPv6/source/utils/smbcacls.c 18 Apr 2002 04:53:05 -0000 1.2
2803 struct cli_state *c;
2804 struct nmb_name called, calling;
2806 - struct in_addr ip;
2807 - extern struct in_addr ipzero;
2808 extern pstring global_myname;
2810 fstrcpy(server,share+2);
2811 @@ -702,19 +700,13 @@
2817 make_nmb_name(&calling, global_myname, 0x0);
2818 make_nmb_name(&called , server, 0x20);
2823 /* have to open a new connection */
2824 - if (!(c=cli_initialise(NULL)) || (cli_set_port(c, 139) == 0) ||
2825 - !cli_connect(c, server_n, &ip)) {
2826 + if (!(c=cli_initialise(NULL)) || !cli_connect(c, server_n, NULL)) {
2827 DEBUG(0,("Connection to %s failed\n", server_n));
2832 Index: samba-2.2.3a+IPv6/source/utils/smbfilter.c
2833 ===================================================================
2834 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/utils/smbfilter.c,v
2835 retrieving revision 1.1.1.1
2836 retrieving revision 1.3
2837 diff -u -r1.1.1.1 -r1.3
2838 --- samba-2.2.3a+IPv6/source/utils/smbfilter.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
2839 +++ samba-2.2.3a+IPv6/source/utils/smbfilter.c 19 Apr 2002 14:50:33 -0000 1.3
2844 -static void filter_child(int c, struct in_addr dest_ip)
2845 +static void filter_child(int c, struct sockaddr_list *dest_addrs)
2849 /* we have a connection from a new client, now connect to the server */
2850 - s = open_socket_out(SOCK_STREAM, &dest_ip, 139, LONG_CONNECT_TIMEOUT);
2851 + s = open_socket_out(dest_addrs, NULL, LONG_CONNECT_TIMEOUT);
2852 + free_sockaddr_list(dest_addrs);
2855 - DEBUG(0,("Unable to connect to %s\n", inet_ntoa(dest_ip)));
2856 + DEBUG(0,("Unable to connect to %s\n",
2857 + print_sockaddr(dest_addrs->addr)));
2862 static void start_filter(char *desthost)
2865 - struct in_addr dest_ip;
2866 + struct sockaddr_list *dest_addrs;
2871 DEBUG(0,("listen failed\n"));
2874 - if (!resolve_name(desthost, &dest_ip, 0x20)) {
2875 + if (!(dest_addrs = resolve_name_smb(desthost, 0))) {
2876 DEBUG(0,("Unable to resolve host %s\n", desthost));
2883 - filter_child(c, dest_ip);
2884 + filter_child(c, dest_addrs);
2888 Index: samba-2.2.3a+IPv6/source/utils/smbpasswd.c
2889 ===================================================================
2890 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/utils/smbpasswd.c,v
2891 retrieving revision 1.1.1.1
2892 retrieving revision 1.3
2893 diff -u -r1.1.1.1 -r1.3
2894 --- samba-2.2.3a+IPv6/source/utils/smbpasswd.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
2895 +++ samba-2.2.3a+IPv6/source/utils/smbpasswd.c 19 Apr 2002 14:50:34 -0000 1.3
2897 struct ntuser_creds creds;
2898 struct cli_state cli;
2899 fstring dest_host, acct_name;
2900 - struct in_addr dest_ip;
2901 + struct sockaddr_list *dest_addrs;
2902 TALLOC_CTX *mem_ctx;
2906 init_rpcclient_creds(&creds, username, domain, password);
2907 cli_init_creds(&cli, &creds);
2909 - if (!resolve_srv_name(remote_machine, dest_host, &dest_ip)) {
2910 + if (!(dest_addrs = resolve_srv_name(remote_machine, dest_host, 0))) {
2911 DEBUG(0, ("Could not resolve name %s\n", remote_machine));
2914 @@ -175,9 +175,10 @@
2915 make_nmb_name(&called, dns_to_netbios_name(dest_host), 0x20);
2916 make_nmb_name(&calling, dns_to_netbios_name(global_myname), 0);
2918 - if (!cli_establish_connection(&cli, dest_host, &dest_ip, &calling,
2919 + if (!cli_establish_connection(&cli, dest_host, dest_addrs, &calling,
2920 &called, "IPC$", "IPC", False, True)) {
2921 DEBUG(0, ("Error connecting to %s\n", dest_host));
2922 + free_sockaddr_list(dest_addrs);
2928 if (cli.nt_pipe_fnum)
2929 cli_nt_session_close(&cli);
2931 + if (cli.dest_addrs)
2932 + free_sockaddr_list(cli.dest_addrs);
2934 /* Display success or failure */
2936 Index: samba-2.2.3a+IPv6/source/utils/torture.c
2937 ===================================================================
2938 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/utils/torture.c,v
2939 retrieving revision 1.1.1.1
2940 retrieving revision 1.2
2941 diff -u -r1.1.1.1 -r1.2
2942 --- samba-2.2.3a+IPv6/source/utils/torture.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
2943 +++ samba-2.2.3a+IPv6/source/utils/torture.c 18 Apr 2002 04:53:05 -0000 1.2
2944 @@ -134,17 +134,13 @@
2945 static BOOL open_nbt_connection(struct cli_state *c)
2947 struct nmb_name called, calling;
2948 - struct in_addr ip;
2949 - extern struct in_addr ipzero;
2953 make_nmb_name(&calling, myname, 0x0);
2954 make_nmb_name(&called , host, 0x20);
2958 - if (!cli_initialise(c) || !cli_connect(c, host, &ip)) {
2959 + if (!cli_initialise(c) || !cli_connect(c, host, NULL)) {
2960 printf("Failed to connect with %s\n", host);
2963 Index: samba-2.2.3a+IPv6/source/web/diagnose.c
2964 ===================================================================
2965 RCS file: /home/lutchann/cvsroot/samba-2.2.3a+IPv6/source/web/diagnose.c,v
2966 retrieving revision 1.1.1.1
2967 retrieving revision 1.2
2968 diff -u -r1.1.1.1 -r1.2
2969 --- samba-2.2.3a+IPv6/source/web/diagnose.c 16 Apr 2002 03:34:35 -0000 1.1.1.1
2970 +++ samba-2.2.3a+IPv6/source/web/diagnose.c 18 Apr 2002 04:53:06 -0000 1.2
2972 BOOL smbd_running(void)
2974 static struct cli_state cli;
2975 + struct sockaddr_list *localaddrs;
2976 extern struct in_addr loopback_ip;
2978 if (!cli_initialise(&cli))
2981 - if (!cli_connect(&cli, "localhost", &loopback_ip)) {
2982 + localaddrs = make_singlet_list(&loopback_ip, 0);
2983 + if (!cli_connect(&cli, "localhost", localaddrs))
2985 + free_sockaddr_list(localaddrs);