7b59d02d2a384be9a08087b14defadd214b3c1ddjb * CDDL HEADER START
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * The contents of this file are subject to the terms of the
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Common Development and Distribution License (the "License").
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * You may not use this file except in compliance with the License.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * See the License for the specific language governing permissions
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * and limitations under the License.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * When distributing Covered Code, include this CDDL HEADER in each
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * If applicable, add the following below this CDDL HEADER, with the
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * fields enclosed by brackets "[]" replaced with your own identifying
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * information: Portions Copyright [yyyy] [name of copyright owner]
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * CDDL HEADER END
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Use is subject to license terms.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb "CREATE TABLE db_info (" \
7b59d02d2a384be9a08087b14defadd214b3c1ddjb " ver_major INTEGER," \
7b59d02d2a384be9a08087b14defadd214b3c1ddjb " ver_minor INTEGER," \
7b59d02d2a384be9a08087b14defadd214b3c1ddjb " magic INTEGER" \
7b59d02d2a384be9a08087b14defadd214b3c1ddjb "CREATE TABLE hosts (" \
7b59d02d2a384be9a08087b14defadd214b3c1ddjb " hostname TEXT PRIMARY KEY," \
7b59d02d2a384be9a08087b14defadd214b3c1ddjb " comment TEXT," \
7b59d02d2a384be9a08087b14defadd214b3c1ddjb " ifnames TEXT" \
7b59d02d2a384be9a08087b14defadd214b3c1ddjbtypedef struct {
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic int smb_nic_list_create(void);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic void smb_nic_list_destroy(void);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesstatic smb_hostifs_t *smb_nic_iflist_decode(const char **, int *);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic int smb_nic_dbcreate(void);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic int smb_nic_dbaddhost(const char *, const char *, char *);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic int smb_nic_dbdelhost(const char *);
7f667e74610492ddbce8ce60f52ece95d2401949jose borregostatic int smb_nic_getinfo(char *, smb_nic_t *, int);
8d7e41661dc4633488e93b13363137523ce59977jose borregostatic boolean_t smb_nic_nbt_exclude(const smb_nic_t *, const char **, int);
8d7e41661dc4633488e93b13363137523ce59977jose borregostatic int smb_nic_nbt_get_exclude_list(char *, char **, int);
7f667e74610492ddbce8ce60f52ece95d2401949jose borregostatic void smb_close_sockets(int, int);
7f667e74610492ddbce8ce60f52ece95d2401949jose borregostatic boolean_t smb_duplicate_nic(smb_hostifs_t *iflist, struct lifreq *lifrp);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb/* This is the list we will monitor */
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_init
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Initializes the interface list.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (rc);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_fini
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Destroys the interface list.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_getnum
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Gets the number of interfaces for the specified host.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * if host is NULL then total number of interfaces
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * is returned. It's assumed that given name is a NetBIOS
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * encoded name.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb int n = 0, i;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb /* ignore the suffix */
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (n);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_getfirst
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Returns the first NIC in the interface list and
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * initializes the given iterator. To get the rest of
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * NICs smb_nic_getnext() must be called.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * Returns SMB_NIC_SUCCESS upon success or the following:
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * SMB_NIC_NOT_FOUND - there's no interface available
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * SMB_NIC_INVALID_ARG - 'ni' is NULL
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States int rc = SMB_NIC_SUCCESS;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_INVALID_ARG);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States rc = SMB_NIC_NOT_FOUND;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (rc);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_getnext
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Returns the next NIC information based on the passed
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * iterator (ni). The iterator must have previously been
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * initialized by calling smb_nic_getfirst().
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * Returns SMB_NIC_SUCCESS upon successfully finding the specified NIC
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * or the following:
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * SMB_NIC_INVALID_ARG - the specified iterator is invalid
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * SMB_NIC_NO_MORE - reaches the end of the NIC list
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * SMB_NIC_CHANGED - sequence number in the iterator is different from
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * the sequence number in the NIC list which means
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * the list has been changed between getfirst/getnext
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States int rc = SMB_NIC_SUCCESS;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_INVALID_ARG);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (smb_niclist.nl_seqnum != ni->ni_seqnum)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States rc = SMB_NIC_CHANGED;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States else
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States rc = SMB_NIC_NO_MORE;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (rc);
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright if (smb_inet_same_subnet(ipaddr, &cfg->nic_ip, cfg->nic_mask)) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_addhost
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Adds an association between the given host and the specified interface
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * list (if_names). This function can be called as many times as needed,
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * the associations will be stored in /var/smb/smbhosts.db, which is sqlite
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * database. If this file exists and it's not empty NIC list is generated
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * based on the information stored in this file.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * host: actual system's name (not Netbios name)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * cmnt: an optional description for the CIFS server running on
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * the specified host. Can be NULL.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * if_num: number of interface names in if_names arg
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * if_names: array of interface names in string format
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * Returns SMB_NIC_SUCCESS upon success, a nonzero value otherwise.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if ((host == NULL) || (if_num <= 0) || (if_names == NULL))
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_INVALID_ARG);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if ((rc = smb_nic_dbcreate()) != SMB_NIC_SUCCESS)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (rc);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright for (i = 0; i < if_num; i++) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_INVALID_ARG);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_NO_MEMORY);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (rc);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_delhost
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Removes the stored interface association for the specified host
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_INVALID_ARG);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_SUCCESS);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_SUCCESS);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (smb_nic_dbdelhost(host));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_list_create
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Creates a NIC list either based on /var/smb/smbhosts.db or
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * by getting the information from OS.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Note that the caller of this function should grab the
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * list lock.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States int i, rc;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if ((rc = smb_nic_hlist_create(&hlist)) != SMB_NIC_SUCCESS)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (rc);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_niclist.nl_nics = calloc(hlist.h_ifnum, sizeof (smb_nic_t));
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_NO_MEMORY);
8d7e41661dc4633488e93b13363137523ce59977jose borrego nexclude = smb_nic_nbt_get_exclude_list(excludestr,
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (smb_nic_getinfo(ifname, nc, AF_INET) !=
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States SMB_NIC_SUCCESS) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States AF_INET6) != SMB_NIC_SUCCESS) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb } while ((iflist = list_next(&hlist.h_list, iflist)) != NULL);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_SUCCESS);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic void
7f667e74610492ddbce8ce60f52ece95d2401949jose borregosmb_nic_getinfo(char *interface, smb_nic_t *nc, int family)
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if ((s = socket(family, SOCK_DGRAM, IPPROTO_IP)) < 0) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_SOCK);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) strlcpy(lifrr.lifr_name, interface, sizeof (lifrr.lifr_name));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) close(s);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_IOCTL);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego isv6 = (lifrr.lifr_addr.ss_family == AF_INET6);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego sin6 = (struct sockaddr_in6 *)(&lifrr.lifr_addr);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego sin = (struct sockaddr_in *)(&lifrr.lifr_addr);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego nc->nic_ip.a_ipv4 = (in_addr_t)(sin->sin_addr.s_addr);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) close(s);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_BAD_DATA);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego /* there is no broadcast or netmask for v6 */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_IOCTL);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego sin = (struct sockaddr_in *)&lifrr.lifr_broadaddr;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego nc->nic_bcast = (uint32_t)sin->sin_addr.s_addr;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_IOCTL);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) close(s);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_IOCTL);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) strlcpy(nc->nic_ifname, interface, sizeof (nc->nic_ifname));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) close(s);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_SUCCESS);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_hlist_create
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Creates a list of hosts and their associated interfaces.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * If host database exists the information is retrieved from
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * the database, otherwise it's retrieved from OS.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * The allocated memories for the returned list should be freed
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * by calling smb_nic_hlist_destroy()
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (rc != SMB_NIC_SUCCESS)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (rc);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic void
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_hlist_sysget
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Get the list of currently plumbed and up interface names. The loopback (lo0)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * port is ignored
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_NO_MEMORY);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (smb_gethostname(iflist->if_host, sizeof (iflist->if_host),
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States SMB_CASE_PRESERVE) < 0) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_NO_HOST);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) smb_config_getstr(SMB_CI_SYS_CMNT, iflist->if_cmnt,
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if ((s4 = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_SOCK);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if (ioctl(s4, SIOCGLIFNUM, (char *)&lifn) < 0) {
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego syslog(LOG_ERR, "hlist_sysget: SIOCGLIFNUM errno=%d", errno);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_IOCTL);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego lifc.lifc_len = lifn.lifn_count * sizeof (struct lifreq);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_NO_MEMORY);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if (ioctl(s4, SIOCGLIFCONF, (char *)&lifc) < 0) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_IOCTL);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego ifnum = lifc.lifc_len / sizeof (struct lifreq);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if ((iflist->if_num > 0) && smb_duplicate_nic(iflist, lifrp))
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Get the flags so that we can skip the loopback interface
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego (void) strlcpy(lifrl.lifr_name, lifrp->lifr_name,
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if (ioctl(s4, SIOCGLIFFLAGS, (caddr_t)&lifrl) < 0) {
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if ((s6 < 0) ||
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego (ioctl(s6, SIOCGLIFFLAGS, (caddr_t)&lifrl) < 0)) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_IOCTL);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_NO_MEMORY);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_SUCCESS);
7f667e74610492ddbce8ce60f52ece95d2401949jose borregosmb_duplicate_nic(smb_hostifs_t *iflist, struct lifreq *lifrp)
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego * throw out duplicate names
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States int err = SMB_NIC_SUCCESS;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_NO_MEMORY);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_DBOPEN_FAILED);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_ERR, "Failed to query hosts info from host " \
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States "database. Unable to create virtual machine (%s).",
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States NULL_MSGCHK(errmsg));
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_DB_ERROR);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States err = SMB_NIC_DB_ERROR;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if ((iflist = smb_nic_iflist_decode(values, &err)) ==
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States NULL) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (rc != SQLITE_DONE && err == SMB_NIC_SUCCESS) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States /* set this error if no previous error */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States err = SMB_LGRP_DBEXEC_FAILED;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States }
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_ERR, "Failed to query hosts info from host " \
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States "database. Unable to destroy virtual machine (%s).",
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States NULL_MSGCHK(errmsg));
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (err == SMB_NIC_SUCCESS) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States /* set this error if no previous error */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States err = SMB_NIC_DB_ERROR;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States }
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (err);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statessmb_nic_iflist_decode(const char **values, int *err)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if ((host == NULL) || (ifnames == NULL)) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States *err = SMB_NIC_INVALID_ARG;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States }
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (iflist == NULL) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States *err = SMB_NIC_NO_MEMORY;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) strlcpy(iflist->if_host, host, sizeof (iflist->if_host));
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if ((ifname = strtok_r(ifnames, ",", &lasts)) == NULL) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States *err = SMB_NIC_BAD_DATA;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States }
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States *err = SMB_NIC_NO_MEMORY;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States *err = SMB_NIC_SUCCESS;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_iflist_destroy
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Frees allocated memory for the given IF names lists.
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic void
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Functions to manage host/interface database
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Each entry in the hosts table associates a hostname with a
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * list of interface names. The host/interface association could
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * be added by calling smb_nic_addhost() and could be removed by
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * calling smb_nic_delhost(). If the database exists and it contains
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * valid information then the inteface list wouldn't be obtained
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * from system using ioctl.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_dbcreate
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Creates the host database based on the defined SQL statement.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * It also initializes db_info table.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States int rc, err = SMB_NIC_SUCCESS;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_ERR, "Failed to create host database (%s).",
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_DBOPEN_FAILED);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb rc = sqlite_exec(db, "BEGIN TRANSACTION", NULL, NULL, &errmsg);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_ERR, "Failed to create host database. Unable to " \
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States "begin database transaction (%s).", NULL_MSGCHK(errmsg));
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_DBEXEC_FAILED);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (sqlite_exec(db, SMB_NIC_DB_SQL, NULL, NULL, &errmsg) == SQLITE_OK) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States err = smb_nic_dbsetinfo(db);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (err != SMB_NIC_SUCCESS)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_ERR, "Failed to create host database. Unable to " \
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States "initialize host database (%s).", NULL_MSGCHK(errmsg));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb /* this is bad - database may be left in a locked state */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_ERR, "Failed to create host database. Unable to " \
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States "close a transaction (%s).", NULL_MSGCHK(errmsg));
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States err = SMB_NIC_DBINIT_FAILED;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (err);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_dbopen
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Opens host database with the given mode.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_ERR, "Failed to open host database: %s (%s).",
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States SMB_NIC_DB_NAME, NULL_MSGCHK(errmsg));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (db);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_dbclose
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Closes the given database handle
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic void
7b59d02d2a384be9a08087b14defadd214b3c1ddjb rc = sqlite_get_table(db, sql, &result, &nrow, &ncol, &errmsg);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_ERR, "Failed to validate host database. Unable " \
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States "to get database information (%s).", NULL_MSGCHK(errmsg));
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_ERR, "Failed to validate host database: bad " \
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States "db_info table.");
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_ERR, "Failed to validate host database: bad " \
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States "db_info content.");
7b59d02d2a384be9a08087b14defadd214b3c1ddjb rc = sqlite_get_table(db, sql, &result, &nrow, &ncol, &errmsg);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_ERR, "Failed to validate host database. Unable " \
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States "to query for host (%s).", NULL_MSGCHK(errmsg));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb /* No hosts in the database */
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_nic_dbaddhost(const char *host, const char *cmnt, char *if_list)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States int rc, err = SMB_NIC_SUCCESS;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sql = sqlite_mprintf("REPLACE INTO hosts (hostname, comment, ifnames)"
7b59d02d2a384be9a08087b14defadd214b3c1ddjb "VALUES ('%s', '%q', '%s')", host, (cmnt) ? cmnt : "", if_list);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_NO_MEMORY);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_DBOPEN_FAILED);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_ERR, "Failed to add host %s to host database (%s).",
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States err = SMB_NIC_INSERT_FAILED;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (err);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States int rc, err = SMB_NIC_SUCCESS;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sql = sqlite_mprintf("DELETE FROM hosts WHERE hostname = '%s'", host);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_NO_MEMORY);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_DBOPEN_FAILED);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_ERR, "Failed to delete host %s from host " \
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States "database (%s).", host, NULL_MSGCHK(errmsg));
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States err = SMB_NIC_DELETE_FAILED;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (err);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_dbsetinfo
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Initializes the db_info table upon database creation.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States int rc, err = SMB_NIC_SUCCESS;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sql = sqlite_mprintf("INSERT INTO db_info (ver_major, ver_minor,"
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_NO_MEMORY);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_ERR, "Failed to add database information to " \
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States "host database (%s).", NULL_MSGCHK(errmsg));
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States err = SMB_NIC_DBINIT_ERROR;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (err);
8d7e41661dc4633488e93b13363137523ce59977jose borrego * smb_nic_nbt_get_exclude_list
8d7e41661dc4633488e93b13363137523ce59977jose borrego * Construct an array containing list of i/f names on which NetBIOS traffic is
8d7e41661dc4633488e93b13363137523ce59977jose borrego * to be disabled, from a string containing a list of comma separated i/f names.
8d7e41661dc4633488e93b13363137523ce59977jose borrego * Returns the number of i/f on which NetBIOS traffic is to be disabled.
8d7e41661dc4633488e93b13363137523ce59977jose borregosmb_nic_nbt_get_exclude_list(char *excludestr, char **iflist, int max_nifs)
8d7e41661dc4633488e93b13363137523ce59977jose borrego bzero(iflist, SMB_PI_MAX_NETWORKS * sizeof (char *));
8d7e41661dc4633488e93b13363137523ce59977jose borrego while (((iflist[n] = strsep(&excludestr, ",")) != NULL) &&
8d7e41661dc4633488e93b13363137523ce59977jose borrego * smb_nic_nbt_exclude
8d7e41661dc4633488e93b13363137523ce59977jose borrego * Check to see if the given interface name should send NetBIOS traffic or not.
8d7e41661dc4633488e93b13363137523ce59977jose borrego * Returns TRUE if NetBIOS traffic is disabled on an interface name.
8d7e41661dc4633488e93b13363137523ce59977jose borrego * Returns FALSE otherwise.
8d7e41661dc4633488e93b13363137523ce59977jose borregosmb_nic_nbt_exclude(const smb_nic_t *nc, const char **exclude_list,
8d7e41661dc4633488e93b13363137523ce59977jose borrego if (inet_ntop(AF_INET, &nc->nic_ip, buf, INET6_ADDRSTRLEN) == NULL)
8d7e41661dc4633488e93b13363137523ce59977jose borrego for (i = 0; i < nexclude; i++) {
8d7e41661dc4633488e93b13363137523ce59977jose borrego if ((buf[0] != '\0') && (strcmp(buf, exclude_list[i]) == 0))