Mercurial > illumos > illumos-gate
diff usr/src/lib/smbsrv/libsmbns/common/smbns_browser.c @ 10717:fe0545fc3cdd
6612607 CIFS ADS client should use ldap_sasl_interactive_bind_s API
6877755 smbd should not route stderr, stdout to /dev/null
6882701 Wrong error message for attempt to map local user to Windows group, or vice versa
6885105 Potential for deadlock in smb_node_set_delete_on_close()
6881928 smbd core generated when running a script to join domain, set abe properties
6885538 Reduce dependencies on libsmbrdr
6820325 cifs service can't start on multi vlan+ipmp configuration
author | Alan Wright <amw@Sun.COM> |
---|---|
date | Mon, 05 Oct 2009 11:03:34 -0700 |
parents | 3569b6c7f56c |
children | 37e5dcdf36d3 |
line wrap: on
line diff
--- a/usr/src/lib/smbsrv/libsmbns/common/smbns_browser.c Mon Oct 05 13:48:48 2009 -0400 +++ b/usr/src/lib/smbsrv/libsmbns/common/smbns_browser.c Mon Oct 05 11:03:34 2009 -0700 @@ -23,6 +23,7 @@ * Use is subject to license terms. */ +#include <sys/tzfile.h> #include <errno.h> #include <stdlib.h> #include <stdio.h> @@ -38,10 +39,8 @@ #include <smbsrv/libsmb.h> #include <smbsrv/libsmbns.h> - #include <smbsrv/cifs.h> #include <smbsrv/mailslot.h> - #include <smbns_browser.h> #include <smbns_netbios.h> @@ -83,8 +82,6 @@ static void smb_browser_infofree(void); - - void smb_browser_reconfig(void) { @@ -653,7 +650,7 @@ struct name_entry *result) { uint32_t ipaddr, mask, saddr; - struct addr_entry *addr; + addr_entry_t *addr; if (name == NULL) return (-1); @@ -692,7 +689,7 @@ result->addr_list.sin.sin_family = AF_INET; result->addr_list.sinlen = sizeof (result->addr_list.sin); result->addr_list.sin.sin_addr.s_addr = bcast; - result->addr_list.sin.sin_port = htons(DGM_SRVC_UDP_PORT); + result->addr_list.sin.sin_port = htons(IPPORT_NETBIOS_DGM); result->addr_list.forw = result->addr_list.back = &result->addr_list; return (0); } @@ -772,7 +769,7 @@ static void smb_browser_send_HostAnnouncement(smb_hostinfo_t *hinfo, uint32_t next_announcement, boolean_t remove, - struct addr_entry *addr, char suffix) + addr_entry_t *addr, char suffix) { smb_msgbuf_t mb; int offset, announce_len, data_length; @@ -801,9 +798,9 @@ } /* give some extra room */ - buffer = (unsigned char *)malloc(MAX_DATAGRAM_LENGTH * 2); - if (buffer == 0) { - syslog(LOG_ERR, "HostAnnouncement: resource shortage"); + buffer = malloc(MAX_DATAGRAM_LENGTH * 2); + if (buffer == NULL) { + syslog(LOG_DEBUG, "smb browser: HostAnnouncement: %m"); return; } @@ -824,7 +821,7 @@ * specifying a type of 0 just prior to shutting down, to allow it to * quickly be removed from the list of available servers. */ - if (remove || (nb_status.state & NETBIOS_SHUTTING_DOWN)) + if (remove || (!smb_netbios_running())) type = 0; else type = hinfo->hi_type; @@ -860,11 +857,11 @@ boolean_t h_found = B_FALSE; if (strcmp(mailbox, MAILSLOT_LANMAN) != 0) { - syslog(LOG_DEBUG, "smb_browse: Wrong Mailbox (%s)", mailbox); + syslog(LOG_DEBUG, "smb browser: wrong mailbox (%s)", mailbox); return; } - (void) sleep(delay); + smb_netbios_sleep(delay); (void) rw_rdlock(&smb_binfo.bi_hlist_rwl); hinfo = list_head(&smb_binfo.bi_hlist); @@ -882,7 +879,7 @@ if (h_found) { next_announcement = hinfo->hi_nextannouce * 60 * 1000; smb_browser_send_HostAnnouncement(hinfo, next_announcement, - B_FALSE, &datagram->src.addr_list, 0x1D); + B_FALSE, &datagram->src.addr_list, NBT_MB); } (void) rw_unlock(&smb_binfo.bi_hlist_rwl); } @@ -915,7 +912,7 @@ unsigned char *data; int datalen; - syslog(LOG_DEBUG, "smb_browse: packet_received"); + syslog(LOG_DEBUG, "smb browser: packet received"); smb_msgbuf_init(&mb, datagram->data, datagram->data_length, 0); rc = smb_msgbuf_decode(&mb, "Mb27.bwwwwb.w6.wwwwb.wwwws", @@ -939,7 +936,7 @@ &mailbox); /* Mailbox address */ if (rc < 0) { - syslog(LOG_ERR, "smb_browser_dispatch: decode error"); + syslog(LOG_ERR, "smb browser: decode error"); smb_msgbuf_term(&mb); free(datagram); return (0); @@ -972,7 +969,7 @@ break; default: - syslog(LOG_DEBUG, "smb_browse: invalid message_type(%d, %x)", + syslog(LOG_DEBUG, "smb browser: invalid message type(%d, %x)", message_type, message_type); break; } @@ -1064,7 +1061,7 @@ (void) utf8_strupr(resource_domain); /* domain<00> */ - smb_init_name_struct((unsigned char *)resource_domain, 0x00, + smb_init_name_struct((unsigned char *)resource_domain, NBT_WKSTA, 0, 0, 0, 0, 0, &name); entry = smb_name_find_name(&name); smb_name_unlock_name(entry); @@ -1072,9 +1069,9 @@ (void) rw_rdlock(&smb_binfo.bi_hlist_rwl); hinfo = list_head(&smb_binfo.bi_hlist); while (hinfo) { - smb_init_name_struct((unsigned char *)resource_domain, 0x00, 0, - hinfo->hi_nic.nic_ip.a_ipv4, - htons(DGM_SRVC_UDP_PORT), NAME_ATTR_GROUP, + smb_init_name_struct((unsigned char *)resource_domain, + NBT_WKSTA, 0, hinfo->hi_nic.nic_ip.a_ipv4, + htons(IPPORT_NETBIOS_DGM), NAME_ATTR_GROUP, NAME_ATTR_LOCAL, &name); (void) smb_name_add_name(&name); @@ -1083,7 +1080,7 @@ (void) rw_unlock(&smb_binfo.bi_hlist_rwl); /* All our local master browsers */ - smb_init_name_struct((unsigned char *)resource_domain, 0x1D, + smb_init_name_struct((unsigned char *)resource_domain, NBT_MB, 0, 0, 0, 0, 0, &dest); entry = smb_name_find_name(&dest); @@ -1094,7 +1091,7 @@ rc = smb_browser_addr_of_subnet(entry, hinfo, &master); if (rc == 0) { syslog(LOG_DEBUG, - "smbd: Master browser found at %s", + "smb browser: master browser found at %s", inet_ntoa(master.addr_list.sin.sin_addr)); } hinfo = list_next(&smb_binfo.bi_hlist, hinfo); @@ -1106,10 +1103,11 @@ /* Domain master browser */ smb_init_name_struct((unsigned char *)resource_domain, - 0x1B, 0, 0, 0, 0, 0, &dest); + NBT_DMB, 0, 0, 0, 0, 0, &dest); if ((entry = smb_name_find_name(&dest)) != 0) { - syslog(LOG_DEBUG, "smbd: Domain Master browser for %s is %s", + syslog(LOG_DEBUG, + "smb browser: domain master browser for %s is %s", resource_domain, inet_ntoa(entry->addr_list.sin.sin_addr)); smb_name_unlock_name(entry); @@ -1161,8 +1159,9 @@ (void) utf8_strupr(hinfo->hi_nbname); /* 0x20: file server service */ smb_init_name_struct((unsigned char *)hinfo->hi_nbname, - 0x20, 0, hinfo->hi_nic.nic_ip.a_ipv4, - htons(DGM_SRVC_UDP_PORT), NAME_ATTR_UNIQUE, NAME_ATTR_LOCAL, + NBT_SERVER, 0, hinfo->hi_nic.nic_ip.a_ipv4, + htons(IPPORT_NETBIOS_DGM), + NAME_ATTR_UNIQUE, NAME_ATTR_LOCAL, &hinfo->hi_netname); list_insert_tail(&smb_binfo.bi_hlist, hinfo); @@ -1186,17 +1185,17 @@ { struct name_entry name; struct name_entry *dest; - struct addr_entry addr; + addr_entry_t addr; char resource_domain[SMB_PI_MAX_DOMAIN]; smb_browser_send_HostAnnouncement(hinfo, hinfo->hi_interval, - remove, 0, 0x1D); + remove, 0, NBT_MB); if (smb_getdomainname(resource_domain, SMB_PI_MAX_DOMAIN) != 0) return; (void) utf8_strupr(resource_domain); - smb_init_name_struct((unsigned char *)resource_domain, 0x1D, + smb_init_name_struct((unsigned char *)resource_domain, NBT_MB, 0, 0, 0, 0, 0, &name); if ((dest = smb_name_find_name(&name))) { @@ -1204,16 +1203,16 @@ addr.forw = addr.back = &addr; smb_name_unlock_name(dest); smb_browser_send_HostAnnouncement(hinfo, hinfo->hi_interval, - remove, &addr, 0x1D); + remove, &addr, NBT_MB); } else { - smb_init_name_struct((unsigned char *)resource_domain, 0x1B, - 0, 0, 0, 0, 0, &name); + smb_init_name_struct((unsigned char *)resource_domain, + NBT_DMB, 0, 0, 0, 0, 0, &name); if ((dest = smb_name_find_name(&name))) { addr = dest->addr_list; addr.forw = addr.back = &addr; smb_name_unlock_name(dest); smb_browser_send_HostAnnouncement(hinfo, - remove, hinfo->hi_interval, &addr, 0x1B); + remove, hinfo->hi_interval, &addr, NBT_DMB); } } @@ -1235,61 +1234,24 @@ /* - * smb_browser_sleep - * - * Put browser in 1 minute sleep if netbios services are not - * shutting down and both name and datagram services are still - * running. It'll wake up after 1 minute or if one of the above - * conditions go false. It checks the conditions again and return - * 1 if everything is ok or 0 if browser shouldn't continue - * running. - */ -static boolean_t -smb_browser_sleep(void) -{ - boolean_t slept = B_FALSE; - timestruc_t to; - - (void) mutex_lock(&nb_status.mtx); - while (((nb_status.state & NETBIOS_SHUTTING_DOWN) == 0) && - (nb_status.state & NETBIOS_NAME_SVC_RUNNING) && - (nb_status.state & NETBIOS_DATAGRAM_SVC_RUNNING)) { - - if (slept) { - (void) mutex_unlock(&nb_status.mtx); - return (B_TRUE); - } - - to.tv_sec = 60; /* 1 minute */ - to.tv_nsec = 0; - (void) cond_reltimedwait(&nb_status.cv, &nb_status.mtx, &to); - slept = B_TRUE; - } - (void) mutex_unlock(&nb_status.mtx); - - return (B_FALSE); -} - -/* - * smb_browser_daemon - * - * Smb Netbios browser daemon. + * SMB NetBIOS Browser Service */ /*ARGSUSED*/ void * -smb_browser_daemon(void *arg) +smb_browser_service(void *arg) { smb_hostinfo_t *hinfo; smb_browser_infoinit(); smb_browser_config(); - smb_netbios_chg_status(NETBIOS_BROWSER_RUNNING, 1); + smb_netbios_event(NETBIOS_EVENT_BROWSER_START); restart: do { (void) rw_rdlock(&smb_binfo.bi_hlist_rwl); hinfo = list_head(&smb_binfo.bi_hlist); + while (hinfo) { if (--hinfo->hi_nextannouce > 0 || hinfo->hi_nic.nic_bcast == 0) { @@ -1312,11 +1274,13 @@ hinfo = list_next(&smb_binfo.bi_hlist, hinfo); } + (void) rw_unlock(&smb_binfo.bi_hlist_rwl); - } while (smb_browser_sleep()); + smb_netbios_sleep(SECSPERMIN); /* 1 minute */ + } while (smb_netbios_running()); smb_browser_infoterm(); - smb_netbios_chg_status(NETBIOS_BROWSER_RUNNING, 0); + smb_netbios_event(NETBIOS_EVENT_BROWSER_STOP); return (0); } @@ -1367,8 +1331,8 @@ /* * smb_browser_infoinit * - * This function is called only once when browser daemon starts - * to initialize global smb_binfo structure + * This function is called only once when the browser starts + * to initialize the global smb_binfo structure. */ static void smb_browser_infoinit(void) @@ -1391,8 +1355,8 @@ /* * smb_browser_infoterm * - * This function is called only once when browser daemon stops - * to destruct smb_binfo structure + * This function is called only once when the browser stops + * to destroy the smb_binfo structure. */ static void smb_browser_infoterm(void)