From f88b7a076be74a29a3bf876b4e2705f4a1ecf42b Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 24 Oct 2007 14:16:54 -0700 Subject: This is a large patch (sorry). Migrate from struct in_addr to struct sockaddr_storage in most places that matter (ie. not the nmbd and NetBIOS lookups). This passes make test on an IPv4 box, but I'll have to do more work/testing on IPv6 enabled boxes. This should now give us a framework for testing and finishing the IPv6 migration. It's at the state where someone with a working IPv6 setup should (theorecically) be able to type : smbclient //ipv6-address/share and have it work. Jeremy. (This used to be commit 98e154c3125d5732c37a72d74b0eb5cd7b6155fd) --- source3/nmbd/nmbd.c | 65 ++++++++++++++++++++++++++-------------- source3/nmbd/nmbd_become_dmb.c | 2 +- source3/nmbd/nmbd_browsesync.c | 2 +- source3/nmbd/nmbd_lmhosts.c | 11 +++++-- source3/nmbd/nmbd_namelistdb.c | 4 +-- source3/nmbd/nmbd_nameregister.c | 2 +- source3/nmbd/nmbd_packets.c | 4 +-- source3/nmbd/nmbd_subnetdb.c | 8 +++-- source3/nmbd/nmbd_synclists.c | 4 ++- source3/nmbd/nmbd_winsserver.c | 24 +++++++-------- 10 files changed, 80 insertions(+), 46 deletions(-) (limited to 'source3/nmbd') diff --git a/source3/nmbd/nmbd.c b/source3/nmbd/nmbd.c index fe69587a4b..c6be4914da 100644 --- a/source3/nmbd/nmbd.c +++ b/source3/nmbd/nmbd.c @@ -210,21 +210,22 @@ static bool reload_interfaces(time_t t) if (is_loopback_addr(&iface->ip)) { DEBUG(2,("reload_interfaces: Ignoring loopback " "interface %s\n", - print_sockaddr(str, sizeof(str), - &iface->ip, sizeof(iface->ip)) )); + print_sockaddr(str, sizeof(str), &iface->ip) )); continue; } for (subrec=subnetlist; subrec; subrec=subrec->next) { - if (ip_equal(ip, subrec->myip) && - ip_equal(nmask, subrec->mask_ip)) break; + if (ip_equal_v4(ip, subrec->myip) && + ip_equal_v4(nmask, subrec->mask_ip)) { + break; + } } if (!subrec) { /* it wasn't found! add it */ - DEBUG(2,("Found new interface %s\n", - print_sockaddr(str, sizeof(str), - &iface->ip, sizeof(iface->ip)) )); + DEBUG(2,("Found new interface %s\n", + print_sockaddr(str, + sizeof(str), &iface->ip) )); subrec = make_normal_subnet(iface); if (subrec) register_my_workgroup_one_subnet(subrec); @@ -247,8 +248,10 @@ static bool reload_interfaces(time_t t) } ip = ((struct sockaddr_in *)&iface->ip)->sin_addr; nmask = ((struct sockaddr_in *)&iface->netmask)->sin_addr; - if (ip_equal(ip, subrec->myip) && - ip_equal(nmask, subrec->mask_ip)) break; + if (ip_equal_v4(ip, subrec->myip) && + ip_equal_v4(nmask, subrec->mask_ip)) { + break; + } } if (n == -1) { /* oops, an interface has disapeared. This is @@ -257,12 +260,12 @@ static bool reload_interfaces(time_t t) instead we just wear the memory leak and remove it from the list of interfaces without freeing it */ - DEBUG(2,("Deleting dead interface %s\n", + DEBUG(2,("Deleting dead interface %s\n", inet_ntoa(subrec->myip))); close_subnet(subrec); } } - + rescan_listen_set = True; /* We need to shutdown if there are no subnets... */ @@ -376,7 +379,7 @@ static void msg_nmbd_send_packet(struct messaging_context *msg, for (subrec = FIRST_SUBNET; subrec != NULL; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec)) { - if (ip_equal(*local_ip, subrec->myip)) { + if (ip_equal_v4(*local_ip, subrec->myip)) { p->fd = (p->packet_type == NMB_PACKET) ? subrec->nmb_sock : subrec->dgram_sock; break; @@ -642,6 +645,9 @@ static void process(void) static bool open_sockets(bool isdaemon, int port) { + struct sockaddr_storage ss; + const char *sock_addr = lp_socket_address(); + /* * The sockets opened here will be used to receive broadcast * packets *only*. Interface specific sockets are opened in @@ -650,19 +656,34 @@ static bool open_sockets(bool isdaemon, int port) * now deprecated. */ - if ( isdaemon ) + if (!interpret_string_addr(&ss, sock_addr, + AI_NUMERICHOST|AI_PASSIVE)) { + DEBUG(0,("open_sockets: unable to get socket address " + "from string %s", sock_addr)); + return false; + } + if (ss.ss_family != AF_INET) { + DEBUG(0,("open_sockets: unable to use IPv6 socket" + "%s in nmbd\n", + sock_addr)); + return false; + } + + if (isdaemon) { ClientNMB = open_socket_in(SOCK_DGRAM, port, - 0, interpret_addr(lp_socket_address()), - True); - else + 0, &ss, + true); + } else { ClientNMB = 0; - + } + ClientDGRAM = open_socket_in(SOCK_DGRAM, DGRAM_PORT, - 3, interpret_addr(lp_socket_address()), - True); + 3, &ss, + true); - if ( ClientNMB == -1 ) - return( False ); + if (ClientNMB == -1) { + return false; + } /* we are never interested in SIGPIPE */ BlockSignals(True,SIGPIPE); @@ -744,7 +765,7 @@ static bool open_sockets(bool isdaemon, int port) }; poptFreeContext(pc); - global_in_nmbd = True; + global_in_nmbd = true; StartupTime = time(NULL); diff --git a/source3/nmbd/nmbd_become_dmb.c b/source3/nmbd/nmbd_become_dmb.c index fb87927436..a0b2ef15f8 100644 --- a/source3/nmbd/nmbd_become_dmb.c +++ b/source3/nmbd/nmbd_become_dmb.c @@ -219,7 +219,7 @@ static void become_domain_master_query_success(struct subnet_record *subrec, allones_ip.s_addr = htonl(INADDR_BROADCAST); - if(ismyip_v4(ip) || ip_equal(allones_ip, ip) || is_zero_ip_v4(ip)) { + if(ismyip_v4(ip) || ip_equal_v4(allones_ip, ip) || is_zero_ip_v4(ip)) { if( DEBUGLVL( 3 ) ) { dbgtext( "become_domain_master_query_success():\n" ); dbgtext( "Our address (%s) ", inet_ntoa(ip) ); diff --git a/source3/nmbd/nmbd_browsesync.c b/source3/nmbd/nmbd_browsesync.c index e141b3e288..4effce0722 100644 --- a/source3/nmbd/nmbd_browsesync.c +++ b/source3/nmbd/nmbd_browsesync.c @@ -291,7 +291,7 @@ static void find_domain_master_name_query_success(struct subnet_record *subrec, /* First check if we already have a dmb for this workgroup. */ - if(!is_zero_ip_v4(work->dmb_addr) && ip_equal(work->dmb_addr, answer_ip)) { + if(!is_zero_ip_v4(work->dmb_addr) && ip_equal_v4(work->dmb_addr, answer_ip)) { /* Do the local master browser announcement to the domain master browser name and IP. */ announce_local_master_browser_to_domain_master_browser( work ); diff --git a/source3/nmbd/nmbd_lmhosts.c b/source3/nmbd/nmbd_lmhosts.c index 8dda58e352..51e4858f32 100644 --- a/source3/nmbd/nmbd_lmhosts.c +++ b/source3/nmbd/nmbd_lmhosts.c @@ -32,7 +32,7 @@ void load_lmhosts_file(const char *fname) { pstring name; int name_type; - struct in_addr ipaddr; + struct sockaddr_storage ss; XFILE *fp = startlmhosts( fname ); if (!fp) { @@ -41,10 +41,17 @@ void load_lmhosts_file(const char *fname) return; } - while (getlmhostsent(fp, name, &name_type, &ipaddr) ) { + while (getlmhostsent(fp, name, &name_type, &ss) ) { + struct in_addr ipaddr; struct subnet_record *subrec = NULL; enum name_source source = LMHOSTS_NAME; + if (ss.ss_family != AF_INET) { + continue; + } + + ipaddr = ((struct sockaddr_in *)&ss)->sin_addr; + /* We find a relevent subnet to put this entry on, then add it. */ /* Go through all the broadcast subnets and see if the mask matches. */ for (subrec = FIRST_SUBNET; subrec ; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec)) { diff --git a/source3/nmbd/nmbd_namelistdb.c b/source3/nmbd/nmbd_namelistdb.c index 46a9830b25..ae5f766e66 100644 --- a/source3/nmbd/nmbd_namelistdb.c +++ b/source3/nmbd/nmbd_namelistdb.c @@ -338,7 +338,7 @@ bool find_ip_in_name_record( struct name_record *namerec, struct in_addr ip ) int i; for(i = 0; i < namerec->data.num_ips; i++) { - if(ip_equal( namerec->data.ip[i], ip)) { + if(ip_equal_v4( namerec->data.ip[i], ip)) { return True; } } @@ -391,7 +391,7 @@ void remove_ip_from_name_record( struct name_record *namerec, int orig_num = namerec->data.num_ips; for(i = 0; i < orig_num; i++) { - if( ip_equal( remove_ip, namerec->data.ip[i]) ) { + if( ip_equal_v4( remove_ip, namerec->data.ip[i]) ) { remove_nth_ip_in_record( namerec, i); break; } diff --git a/source3/nmbd/nmbd_nameregister.c b/source3/nmbd/nmbd_nameregister.c index b7f5a3d45b..edcf258519 100644 --- a/source3/nmbd/nmbd_nameregister.c +++ b/source3/nmbd/nmbd_nameregister.c @@ -361,7 +361,7 @@ static void wins_next_registration(struct response_record *rrec) tag = (const char *)userdata->data; for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec)) { - if (ip_equal(last_ip, subrec->myip)) { + if (ip_equal_v4(last_ip, subrec->myip)) { subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec); break; } diff --git a/source3/nmbd/nmbd_packets.c b/source3/nmbd/nmbd_packets.c index b19b1d3599..d49c8bab79 100644 --- a/source3/nmbd/nmbd_packets.c +++ b/source3/nmbd/nmbd_packets.c @@ -50,7 +50,7 @@ static int find_subnet_fd_for_address( struct in_addr local_ip ) struct subnet_record *subrec; for( subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec)) - if(ip_equal(local_ip, subrec->myip)) + if(ip_equal_v4(local_ip, subrec->myip)) return subrec->nmb_sock; return ClientNMB; @@ -65,7 +65,7 @@ static int find_subnet_mailslot_fd_for_address( struct in_addr local_ip ) struct subnet_record *subrec; for( subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec)) - if(ip_equal(local_ip, subrec->myip)) + if(ip_equal_v4(local_ip, subrec->myip)) return subrec->dgram_sock; return ClientDGRAM; diff --git a/source3/nmbd/nmbd_subnetdb.c b/source3/nmbd/nmbd_subnetdb.c index 39aa4577bb..d100ad482a 100644 --- a/source3/nmbd/nmbd_subnetdb.c +++ b/source3/nmbd/nmbd_subnetdb.c @@ -85,13 +85,17 @@ static struct subnet_record *make_subnet(const char *name, enum subnet_type type nmb_sock = -1; dgram_sock = -1; } else { + struct sockaddr_storage ss; + + in_addr_to_sockaddr_storage(&ss, myip); + /* * Attempt to open the sockets on port 137/138 for this interface * and bind them. * Fail the subnet creation if this fails. */ - if((nmb_sock = open_socket_in(SOCK_DGRAM, global_nmb_port,0, myip.s_addr,True)) == -1) { + if((nmb_sock = open_socket_in(SOCK_DGRAM, global_nmb_port,0, &ss,true)) == -1) { if( DEBUGLVL( 0 ) ) { Debug1( "nmbd_subnetdb:make_subnet()\n" ); Debug1( " Failed to open nmb socket on interface %s ", inet_ntoa(myip) ); @@ -101,7 +105,7 @@ static struct subnet_record *make_subnet(const char *name, enum subnet_type type return NULL; } - if((dgram_sock = open_socket_in(SOCK_DGRAM,DGRAM_PORT,3, myip.s_addr,True)) == -1) { + if((dgram_sock = open_socket_in(SOCK_DGRAM,DGRAM_PORT,3, &ss, true)) == -1) { if( DEBUGLVL( 0 ) ) { Debug1( "nmbd_subnetdb:make_subnet()\n" ); Debug1( " Failed to open dgram socket on interface %s ", inet_ntoa(myip) ); diff --git a/source3/nmbd/nmbd_synclists.c b/source3/nmbd/nmbd_synclists.c index df71e6db43..aaa56f9216 100644 --- a/source3/nmbd/nmbd_synclists.c +++ b/source3/nmbd/nmbd_synclists.c @@ -70,6 +70,7 @@ static void sync_child(char *name, int nm_type, struct cli_state *cli; uint32 local_type = local ? SV_TYPE_LOCAL_LIST_ONLY : 0; struct nmb_name called, calling; + struct sockaddr_storage ss; NTSTATUS status; /* W2K DMB's return empty browse lists on port 445. Use 139. @@ -85,7 +86,8 @@ static void sync_child(char *name, int nm_type, return; } - status = cli_connect(cli, name, &ip); + in_addr_to_sockaddr_storage(&ss, ip); + status = cli_connect(cli, name, &ss); if (!NT_STATUS_IS_OK(status)) { return; } diff --git a/source3/nmbd/nmbd_winsserver.c b/source3/nmbd/nmbd_winsserver.c index 38962c2b39..70303af48b 100644 --- a/source3/nmbd/nmbd_winsserver.c +++ b/source3/nmbd/nmbd_winsserver.c @@ -914,7 +914,7 @@ void wins_process_name_refresh_request( struct subnet_record *subrec, * if the record is a replica: * we take ownership and update the version ID. */ - if (!ip_equal(namerec->data.wins_ip, our_fake_ip)) { + if (!ip_equal_v4(namerec->data.wins_ip, our_fake_ip)) { update_wins_owner(namerec, our_fake_ip); get_global_id_and_update(&namerec->data.id, True); } @@ -1030,7 +1030,7 @@ static void wins_register_query_fail(struct subnet_record *subrec, namerec = find_name_on_subnet(subrec, question_name, FIND_ANY_NAME); if ((namerec != NULL) && (namerec->data.source == REGISTER_NAME) && - ip_equal(rrec->packet->ip, *namerec->data.ip)) { + ip_equal_v4(rrec->packet->ip, *namerec->data.ip)) { remove_name_from_namelist( subrec, namerec); namerec = NULL; } @@ -1304,8 +1304,8 @@ is one of our (WINS server) names. Denying registration.\n", nmb_namestr(questio if( !registering_group_name && (namerec != NULL) && (namerec->data.num_ips == 1) - && ip_equal( namerec->data.ip[0], from_ip ) - && ip_equal(namerec->data.wins_ip, our_fake_ip) ) { + && ip_equal_v4( namerec->data.ip[0], from_ip ) + && ip_equal_v4(namerec->data.wins_ip, our_fake_ip) ) { update_name_ttl( namerec, ttl ); wins_hook("refresh", namerec, ttl); send_wins_name_registration_response( 0, ttl, p ); @@ -1633,7 +1633,7 @@ is one of our (WINS server) names. Denying registration.\n", nmb_namestr(questio * If it's a replica, we need to become the wins owner * to force the replication */ - if (!ip_equal(namerec->data.wins_ip, our_fake_ip)) { + if (!ip_equal_v4(namerec->data.wins_ip, our_fake_ip)) { get_global_id_and_update(&namerec->data.id, True); update_wins_owner(namerec, our_fake_ip); update_wins_flag(namerec, WINS_ACTIVE); @@ -2138,7 +2138,7 @@ static int wins_processing_traverse_fn(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA } /* handle records, samba is the wins owner */ - if (ip_equal(namerec->data.wins_ip, our_fake_ip)) { + if (ip_equal_v4(namerec->data.wins_ip, our_fake_ip)) { switch (namerec->data.wins_flags & WINS_STATE_MASK) { case WINS_ACTIVE: namerec->data.wins_flags&=~WINS_STATE_MASK; @@ -2424,16 +2424,16 @@ void nmbd_wins_new_entry(struct messaging_context *msg, if (namerec->data.wins_flags&WINS_UNIQUE && record->wins_flags&WINS_UNIQUE) { /* the database record is a replica */ - if (!ip_equal(namerec->data.wins_ip, our_fake_ip)) { + if (!ip_equal_v4(namerec->data.wins_ip, our_fake_ip)) { if (namerec->data.wins_flags&WINS_ACTIVE && record->wins_flags&WINS_TOMBSTONED) { - if (ip_equal(namerec->data.wins_ip, record->wins_ip)) + if (ip_equal_v4(namerec->data.wins_ip, record->wins_ip)) overwrite=True; } else overwrite=True; } else { /* we are the wins owner of the database record */ /* the 2 records have the same IP address */ - if (ip_equal(namerec->data.ip[0], record->ip[0])) { + if (ip_equal_v4(namerec->data.ip[0], record->ip[0])) { if (namerec->data.wins_flags&WINS_ACTIVE && record->wins_flags&WINS_TOMBSTONED) get_global_id_and_update(&namerec->data.id, True); else @@ -2485,10 +2485,10 @@ void nmbd_wins_new_entry(struct messaging_context *msg, overwrite=True; } else { - if (ip_equal(record->wins_ip, namerec->data.wins_ip)) + if (ip_equal_v4(record->wins_ip, namerec->data.wins_ip)) overwrite=True; - if (ip_equal(namerec->data.wins_ip, our_fake_ip)) + if (ip_equal_v4(namerec->data.wins_ip, our_fake_ip)) if (namerec->data.wins_flags&WINS_UNIQUE) get_global_id_and_update(&namerec->data.id, True); @@ -2497,7 +2497,7 @@ void nmbd_wins_new_entry(struct messaging_context *msg, if (record->wins_flags&WINS_ACTIVE && namerec->data.wins_flags&WINS_ACTIVE) if (namerec->data.wins_flags&WINS_UNIQUE || namerec->data.wins_flags&WINS_MHOMED) - if (ip_equal(record->wins_ip, namerec->data.wins_ip)) + if (ip_equal_v4(record->wins_ip, namerec->data.wins_ip)) overwrite=True; } -- cgit