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)