7b59d02d2a384be9a08087b14defadd214b3c1ddjb/*
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * CDDL HEADER START
7b59d02d2a384be9a08087b14defadd214b3c1ddjb *
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 *
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * or http://www.opensolaris.org/os/licensing.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * See the License for the specific language governing permissions
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * and limitations under the License.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb *
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 *
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * CDDL HEADER END
7b59d02d2a384be9a08087b14defadd214b3c1ddjb */
7b59d02d2a384be9a08087b14defadd214b3c1ddjb/*
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 *
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb */
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#include <stdio.h>
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#include <stdlib.h>
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#include <syslog.h>
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#include <libintl.h>
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#include <strings.h>
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#include <string.h>
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#include <unistd.h>
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#include <synch.h>
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#include <stropts.h>
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#include <errno.h>
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#include <pthread.h>
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#include <inet/ip.h>
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#include <net/if.h>
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#include <netinet/in.h>
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#include <netdb.h>
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#include <net/route.h>
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#include <arpa/inet.h>
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#include <sys/socket.h>
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#include <sys/sockio.h>
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#include <sys/systeminfo.h>
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#include <smbsrv/libsmb.h>
91d7f85e02991954d1e1bd44673df567ad8dcc87Gordon Ross#include <sqlite-sys/sqlite.h>
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#define SMB_NIC_DB_NAME "/var/smb/smbhosts.db"
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#define SMB_NIC_DB_TIMEOUT 3000 /* in millisecond */
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#define SMB_NIC_DB_VERMAJOR 1
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#define SMB_NIC_DB_VERMINOR 0
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#define SMB_NIC_DB_MAGIC 0x484F5354 /* HOST */
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#define SMB_NIC_DB_ORD 1 /* open read-only */
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#define SMB_NIC_DB_ORW 2 /* open read/write */
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#define SMB_NIC_DB_SQL \
7b59d02d2a384be9a08087b14defadd214b3c1ddjb "CREATE TABLE db_info (" \
7b59d02d2a384be9a08087b14defadd214b3c1ddjb " ver_major INTEGER," \
7b59d02d2a384be9a08087b14defadd214b3c1ddjb " ver_minor INTEGER," \
7b59d02d2a384be9a08087b14defadd214b3c1ddjb " magic INTEGER" \
7b59d02d2a384be9a08087b14defadd214b3c1ddjb ");" \
7b59d02d2a384be9a08087b14defadd214b3c1ddjb "" \
7b59d02d2a384be9a08087b14defadd214b3c1ddjb "CREATE TABLE hosts (" \
7b59d02d2a384be9a08087b14defadd214b3c1ddjb " hostname TEXT PRIMARY KEY," \
7b59d02d2a384be9a08087b14defadd214b3c1ddjb " comment TEXT," \
7b59d02d2a384be9a08087b14defadd214b3c1ddjb " ifnames TEXT" \
7b59d02d2a384be9a08087b14defadd214b3c1ddjb ");"
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#define SMB_NIC_HTBL_NCOL 3
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#define SMB_NIC_HTBL_HOST 0
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#define SMB_NIC_HTBL_CMNT 1
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#define SMB_NIC_HTBL_IFS 2
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#define NULL_MSGCHK(msg) ((msg) ? (msg) : "NULL")
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#define SMB_NIC_MAXIFS 256
8d7e41661dc4633488e93b13363137523ce59977jose borrego#define SMB_NIC_MAXEXCLLIST_LEN 512
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjbtypedef struct smb_hostifs {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb list_node_t if_lnd;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char if_host[MAXHOSTNAMELEN];
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char if_cmnt[SMB_PI_MAX_COMMENT];
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char *if_names[SMB_NIC_MAXIFS];
7b59d02d2a384be9a08087b14defadd214b3c1ddjb int if_num;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb} smb_hostifs_t;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjbtypedef struct smb_hosts {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb list_t h_list;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb int h_num;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb int h_ifnum;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb} smb_hosts_t;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjbtypedef struct {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_nic_t *nl_nics;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb int nl_cnt; /* number of smb_nic_t structures */
7b59d02d2a384be9a08087b14defadd214b3c1ddjb int nl_hcnt; /* number of host names */
7b59d02d2a384be9a08087b14defadd214b3c1ddjb long nl_seqnum; /* a random sequence number */
7b59d02d2a384be9a08087b14defadd214b3c1ddjb rwlock_t nl_rwl;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb} smb_niclist_t;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic int smb_nic_list_create(void);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic void smb_nic_list_destroy(void);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic int smb_nic_hlist_create(smb_hosts_t *);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic void smb_nic_hlist_destroy(smb_hosts_t *);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic int smb_nic_hlist_dbget(smb_hosts_t *);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic int smb_nic_hlist_sysget(smb_hosts_t *);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic void smb_nic_iflist_destroy(smb_hostifs_t *);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesstatic smb_hostifs_t *smb_nic_iflist_decode(const char **, int *);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic int smb_nic_dbcreate(void);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic sqlite *smb_nic_dbopen(int);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic void smb_nic_dbclose(sqlite *);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic boolean_t smb_nic_dbexists(void);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic boolean_t smb_nic_dbvalidate(void);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic int smb_nic_dbaddhost(const char *, const char *, char *);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic int smb_nic_dbdelhost(const char *);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic int smb_nic_dbsetinfo(sqlite *);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
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);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7f667e74610492ddbce8ce60f52ece95d2401949jose borregostatic void smb_close_sockets(int, int);
7f667e74610492ddbce8ce60f52ece95d2401949jose borregostatic boolean_t smb_duplicate_nic(smb_hostifs_t *iflist, struct lifreq *lifrp);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
7b59d02d2a384be9a08087b14defadd214b3c1ddjb/* This is the list we will monitor */
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic smb_niclist_t smb_niclist;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb/*
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_init
7b59d02d2a384be9a08087b14defadd214b3c1ddjb *
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Initializes the interface list.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb */
7b59d02d2a384be9a08087b14defadd214b3c1ddjbint
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_nic_init(void)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
7b59d02d2a384be9a08087b14defadd214b3c1ddjb int rc;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) rw_wrlock(&smb_niclist.nl_rwl);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_nic_list_destroy();
7b59d02d2a384be9a08087b14defadd214b3c1ddjb rc = smb_nic_list_create();
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) rw_unlock(&smb_niclist.nl_rwl);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (rc);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb/*
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_fini
7b59d02d2a384be9a08087b14defadd214b3c1ddjb *
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Destroys the interface list.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb */
7b59d02d2a384be9a08087b14defadd214b3c1ddjbvoid
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_nic_fini(void)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) rw_wrlock(&smb_niclist.nl_rwl);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_nic_list_destroy();
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) rw_unlock(&smb_niclist.nl_rwl);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb/*
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_getnum
7b59d02d2a384be9a08087b14defadd214b3c1ddjb *
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 */
7b59d02d2a384be9a08087b14defadd214b3c1ddjbint
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_nic_getnum(char *nb_hostname)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
7b59d02d2a384be9a08087b14defadd214b3c1ddjb int n = 0, i;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) rw_rdlock(&smb_niclist.nl_rwl);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (nb_hostname != NULL) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb for (i = 0; i < smb_niclist.nl_cnt; i++) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb /* ignore the suffix */
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (strncasecmp(smb_niclist.nl_nics[i].nic_nbname,
7b59d02d2a384be9a08087b14defadd214b3c1ddjb nb_hostname, NETBIOS_NAME_SZ - 1) == 0)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb n++;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb } else {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb n = smb_niclist.nl_cnt;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) rw_unlock(&smb_niclist.nl_rwl);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (n);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb/*
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_getfirst
7b59d02d2a384be9a08087b14defadd214b3c1ddjb *
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.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb *
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
7b59d02d2a384be9a08087b14defadd214b3c1ddjb */
7b59d02d2a384be9a08087b14defadd214b3c1ddjbint
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_nic_getfirst(smb_niciter_t *ni)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States int rc = SMB_NIC_SUCCESS;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (ni == NULL)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_INVALID_ARG);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) rw_rdlock(&smb_niclist.nl_rwl);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (smb_niclist.nl_cnt > 0) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb ni->ni_nic = smb_niclist.nl_nics[0];
7b59d02d2a384be9a08087b14defadd214b3c1ddjb ni->ni_cookie = 1;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb ni->ni_seqnum = smb_niclist.nl_seqnum;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb } else {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States rc = SMB_NIC_NOT_FOUND;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) rw_unlock(&smb_niclist.nl_rwl);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (rc);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb/*
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_getnext
7b59d02d2a384be9a08087b14defadd214b3c1ddjb *
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().
7b59d02d2a384be9a08087b14defadd214b3c1ddjb *
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
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * calls.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb */
7b59d02d2a384be9a08087b14defadd214b3c1ddjbint
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_nic_getnext(smb_niciter_t *ni)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States int rc = SMB_NIC_SUCCESS;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if ((ni == NULL) || (ni->ni_cookie < 1))
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_INVALID_ARG);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) rw_rdlock(&smb_niclist.nl_rwl);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if ((smb_niclist.nl_cnt > ni->ni_cookie) &&
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (smb_niclist.nl_seqnum == ni->ni_seqnum)) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb ni->ni_nic = smb_niclist.nl_nics[ni->ni_cookie];
7b59d02d2a384be9a08087b14defadd214b3c1ddjb ni->ni_cookie++;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb } else {
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 }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) rw_unlock(&smb_niclist.nl_rwl);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (rc);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjbboolean_t
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wrightsmb_nic_is_local(smb_inaddr_t *ipaddr)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_nic_t *cfg;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb int i;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) rw_rdlock(&smb_niclist.nl_rwl);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb for (i = 0; i < smb_niclist.nl_cnt; i++) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb cfg = &smb_niclist.nl_nics[i];
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright if (smb_inet_equal(ipaddr, &cfg->nic_ip)) {
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright (void) rw_unlock(&smb_niclist.nl_rwl);
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright return (B_TRUE);
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright }
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright }
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright (void) rw_unlock(&smb_niclist.nl_rwl);
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright return (B_FALSE);
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright}
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wrightboolean_t
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wrightsmb_nic_is_same_subnet(smb_inaddr_t *ipaddr)
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright{
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright smb_nic_t *cfg;
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright int i;
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright (void) rw_rdlock(&smb_niclist.nl_rwl);
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright for (i = 0; i < smb_niclist.nl_cnt; i++) {
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright cfg = &smb_niclist.nl_nics[i];
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright if (smb_inet_same_subnet(ipaddr, &cfg->nic_ip, cfg->nic_mask)) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) rw_unlock(&smb_niclist.nl_rwl);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (B_TRUE);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) rw_unlock(&smb_niclist.nl_rwl);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (B_FALSE);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb/*
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_addhost
7b59d02d2a384be9a08087b14defadd214b3c1ddjb *
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 *
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
7b59d02d2a384be9a08087b14defadd214b3c1ddjb *
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * Returns SMB_NIC_SUCCESS upon success, a nonzero value otherwise.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb */
7b59d02d2a384be9a08087b14defadd214b3c1ddjbint
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_nic_addhost(const char *host, const char *cmnt,
7b59d02d2a384be9a08087b14defadd214b3c1ddjb int if_num, const char **if_names)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char *if_list;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char *ifname;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb int buflen = 0;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb int rc, i;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if ((host == NULL) || (if_num <= 0) || (if_names == NULL))
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_INVALID_ARG);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (!smb_nic_dbexists() || !smb_nic_dbvalidate()) {
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);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright for (i = 0; i < if_num; i++) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright ifname = (char *)if_names[i];
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if ((ifname == NULL) || (*ifname == '\0'))
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_INVALID_ARG);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb buflen += strlen(ifname) + 1;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if ((if_list = malloc(buflen)) == NULL)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_NO_MEMORY);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb ifname = if_list;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb for (i = 0; i < if_num - 1; i++)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb ifname += snprintf(ifname, buflen, "%s,", if_names[i]);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) snprintf(ifname, buflen, "%s", if_names[i]);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb rc = smb_nic_dbaddhost(host, cmnt, if_list);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb free(if_list);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (rc);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb/*
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_delhost
7b59d02d2a384be9a08087b14defadd214b3c1ddjb *
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Removes the stored interface association for the specified host
7b59d02d2a384be9a08087b14defadd214b3c1ddjb */
7b59d02d2a384be9a08087b14defadd214b3c1ddjbint
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_nic_delhost(const char *host)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if ((host == NULL) || (*host == '\0'))
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_INVALID_ARG);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (!smb_nic_dbexists())
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_SUCCESS);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (!smb_nic_dbvalidate()) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) unlink(SMB_NIC_DB_NAME);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_SUCCESS);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (smb_nic_dbdelhost(host));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb/*
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_list_create
7b59d02d2a384be9a08087b14defadd214b3c1ddjb *
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Creates a NIC list either based on /var/smb/smbhosts.db or
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * by getting the information from OS.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb *
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Note that the caller of this function should grab the
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * list lock.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb */
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic int
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_nic_list_create(void)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_hosts_t hlist;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_hostifs_t *iflist;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_nic_t *nc;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char *ifname;
8d7e41661dc4633488e93b13363137523ce59977jose borrego char excludestr[SMB_NIC_MAXEXCLLIST_LEN];
8d7e41661dc4633488e93b13363137523ce59977jose borrego char *exclude[SMB_PI_MAX_NETWORKS];
8d7e41661dc4633488e93b13363137523ce59977jose borrego int nexclude = 0;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States int i, rc;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
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
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_niclist.nl_cnt = 0;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_niclist.nl_seqnum = random();
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_niclist.nl_hcnt = hlist.h_num;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_niclist.nl_nics = calloc(hlist.h_ifnum, sizeof (smb_nic_t));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (smb_niclist.nl_nics == NULL) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_nic_hlist_destroy(&hlist);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_NO_MEMORY);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
8d7e41661dc4633488e93b13363137523ce59977jose borrego *excludestr = '\0';
8d7e41661dc4633488e93b13363137523ce59977jose borrego (void) smb_config_getstr(SMB_CI_WINS_EXCL,
8d7e41661dc4633488e93b13363137523ce59977jose borrego excludestr, sizeof (excludestr));
8d7e41661dc4633488e93b13363137523ce59977jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego nexclude = smb_nic_nbt_get_exclude_list(excludestr,
8d7e41661dc4633488e93b13363137523ce59977jose borrego exclude, SMB_PI_MAX_NETWORKS);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb nc = smb_niclist.nl_nics;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb iflist = list_head(&hlist.h_list);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb do {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb for (i = 0; i < iflist->if_num; i++) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb ifname = iflist->if_names[i];
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) {
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if (smb_nic_getinfo(ifname, nc,
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States AF_INET6) != SMB_NIC_SUCCESS) {
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego continue;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego }
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) strlcpy(nc->nic_host, iflist->if_host,
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sizeof (nc->nic_host));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) strlcpy(nc->nic_cmnt, iflist->if_cmnt,
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sizeof (nc->nic_cmnt));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_tonetbiosname(nc->nic_host, nc->nic_nbname, 0x00);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (strchr(ifname, ':'))
7b59d02d2a384be9a08087b14defadd214b3c1ddjb nc->nic_smbflags |= SMB_NICF_ALIAS;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
8d7e41661dc4633488e93b13363137523ce59977jose borrego if (smb_nic_nbt_exclude(nc,
8d7e41661dc4633488e93b13363137523ce59977jose borrego (const char **)exclude, nexclude))
7b59d02d2a384be9a08087b14defadd214b3c1ddjb nc->nic_smbflags |= SMB_NICF_NBEXCL;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_niclist.nl_cnt++;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb nc++;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb } while ((iflist = list_next(&hlist.h_list, iflist)) != NULL);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_nic_hlist_destroy(&hlist);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_SUCCESS);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic void
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_nic_list_destroy(void)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
7b59d02d2a384be9a08087b14defadd214b3c1ddjb free(smb_niclist.nl_nics);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_niclist.nl_nics = NULL;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_niclist.nl_cnt = 0;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic int
7f667e74610492ddbce8ce60f52ece95d2401949jose borregosmb_nic_getinfo(char *interface, smb_nic_t *nc, int family)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
7b59d02d2a384be9a08087b14defadd214b3c1ddjb struct lifreq lifrr;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb int s;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego boolean_t isv6;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego struct sockaddr_in6 *sin6;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego struct sockaddr_in *sin;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if ((s = socket(family, SOCK_DGRAM, IPPROTO_IP)) < 0) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_SOCK);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) strlcpy(lifrr.lifr_name, interface, sizeof (lifrr.lifr_name));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (ioctl(s, SIOCGLIFADDR, &lifrr) < 0) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) close(s);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_IOCTL);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego isv6 = (lifrr.lifr_addr.ss_family == AF_INET6);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if (isv6) {
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego sin6 = (struct sockaddr_in6 *)(&lifrr.lifr_addr);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego nc->nic_ip.a_ipv6 = sin6->sin6_addr;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego nc->nic_ip.a_family = AF_INET6;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego } else {
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego sin = (struct sockaddr_in *)(&lifrr.lifr_addr);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego nc->nic_ip.a_ipv4 = (in_addr_t)(sin->sin_addr.s_addr);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego nc->nic_ip.a_family = AF_INET;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if (smb_inet_iszero(&nc->nic_ip)) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) close(s);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_BAD_DATA);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego /* there is no broadcast or netmask for v6 */
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if (!isv6) {
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if (ioctl(s, SIOCGLIFBRDADDR, &lifrr) < 0) {
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego (void) close(s);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_IOCTL);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego }
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego sin = (struct sockaddr_in *)&lifrr.lifr_broadaddr;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego nc->nic_bcast = (uint32_t)sin->sin_addr.s_addr;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if (ioctl(s, SIOCGLIFNETMASK, &lifrr) < 0) {
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego (void) close(s);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_IOCTL);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego }
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego sin = (struct sockaddr_in *)&lifrr.lifr_addr;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego nc->nic_mask = (uint32_t)sin->sin_addr.s_addr;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (ioctl(s, SIOCGLIFFLAGS, &lifrr) < 0) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) close(s);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_IOCTL);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb nc->nic_sysflags = lifrr.lifr_flags;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) strlcpy(nc->nic_ifname, interface, sizeof (nc->nic_ifname));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) close(s);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_SUCCESS);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb/*
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_hlist_create
7b59d02d2a384be9a08087b14defadd214b3c1ddjb *
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 *
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * The allocated memories for the returned list should be freed
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * by calling smb_nic_hlist_destroy()
7b59d02d2a384be9a08087b14defadd214b3c1ddjb */
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic int
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_nic_hlist_create(smb_hosts_t *hlist)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
7b59d02d2a384be9a08087b14defadd214b3c1ddjb int rc;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb list_create(&hlist->h_list, sizeof (smb_hostifs_t),
7b59d02d2a384be9a08087b14defadd214b3c1ddjb offsetof(smb_hostifs_t, if_lnd));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb hlist->h_num = 0;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb hlist->h_ifnum = 0;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (smb_nic_dbexists() && smb_nic_dbvalidate()) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb rc = smb_nic_hlist_dbget(hlist);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb errno = EBADF;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb } else {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb rc = smb_nic_hlist_sysget(hlist);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (rc != SMB_NIC_SUCCESS)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_nic_hlist_destroy(hlist);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (rc);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic void
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_nic_hlist_destroy(smb_hosts_t *hlist)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_hostifs_t *iflist;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (hlist == NULL)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb while ((iflist = list_head(&hlist->h_list)) != NULL) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb list_remove(&hlist->h_list, iflist);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_nic_iflist_destroy(iflist);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb list_destroy(&hlist->h_list);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7f667e74610492ddbce8ce60f52ece95d2401949jose borregostatic void
7f667e74610492ddbce8ce60f52ece95d2401949jose borregosmb_close_sockets(int s4, int s6)
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego{
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if (s4)
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego (void) close(s4);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if (s6)
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego (void) close(s6);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego}
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
7b59d02d2a384be9a08087b14defadd214b3c1ddjb/*
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_hlist_sysget
7b59d02d2a384be9a08087b14defadd214b3c1ddjb *
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Get the list of currently plumbed and up interface names. The loopback (lo0)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * port is ignored
7b59d02d2a384be9a08087b14defadd214b3c1ddjb */
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic int
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_nic_hlist_sysget(smb_hosts_t *hlist)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_hostifs_t *iflist;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego struct lifconf lifc;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego struct lifreq lifrl;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego struct lifreq *lifrp;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char *ifname;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb int ifnum;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb int i;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego int s4, s6;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego struct lifnum lifn;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb iflist = malloc(sizeof (smb_hostifs_t));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (iflist == NULL)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_NO_MEMORY);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb bzero(iflist, sizeof (smb_hostifs_t));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
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) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb free(iflist);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_NO_HOST);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) smb_config_getstr(SMB_CI_SYS_CMNT, iflist->if_cmnt,
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sizeof (iflist->if_cmnt));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if ((s4 = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb free(iflist);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_SOCK);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego s6 = socket(AF_INET6, SOCK_DGRAM, 0);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego lifn.lifn_family = AF_UNSPEC;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego lifn.lifn_flags = 0;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if (ioctl(s4, SIOCGLIFNUM, (char *)&lifn) < 0) {
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego smb_close_sockets(s4, s6);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb free(iflist);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego syslog(LOG_ERR, "hlist_sysget: SIOCGLIFNUM errno=%d", errno);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_IOCTL);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego lifc.lifc_len = lifn.lifn_count * sizeof (struct lifreq);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego lifc.lifc_buf = malloc(lifc.lifc_len);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if (lifc.lifc_buf == NULL) {
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego smb_close_sockets(s4, s6);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb free(iflist);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_NO_MEMORY);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego bzero(lifc.lifc_buf, lifc.lifc_len);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego lifc.lifc_family = AF_UNSPEC;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego lifc.lifc_flags = 0;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if (ioctl(s4, SIOCGLIFCONF, (char *)&lifc) < 0) {
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego smb_close_sockets(s4, s6);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb free(iflist);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego free(lifc.lifc_buf);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_IOCTL);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego lifrp = lifc.lifc_req;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego ifnum = lifc.lifc_len / sizeof (struct lifreq);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego hlist->h_num = 0;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego for (i = 0; i < ifnum; i++, lifrp++) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if ((iflist->if_num > 0) && smb_duplicate_nic(iflist, lifrp))
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego continue;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb /*
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Get the flags so that we can skip the loopback interface
7b59d02d2a384be9a08087b14defadd214b3c1ddjb */
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego (void) memset(&lifrl, 0, sizeof (lifrl));
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego (void) strlcpy(lifrl.lifr_name, lifrp->lifr_name,
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego sizeof (lifrl.lifr_name));
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if (ioctl(s4, SIOCGLIFFLAGS, (caddr_t)&lifrl) < 0) {
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if ((s6 < 0) ||
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego (ioctl(s6, SIOCGLIFFLAGS, (caddr_t)&lifrl) < 0)) {
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego smb_close_sockets(s4, s6);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego free(lifc.lifc_buf);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego smb_nic_iflist_destroy(iflist);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_IOCTL);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if (lifrl.lifr_flags & IFF_LOOPBACK) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb continue;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if ((lifrl.lifr_flags & IFF_UP) == 0) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb continue;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego }
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego ifname = strdup(lifrp->lifr_name);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (ifname == NULL) {
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego smb_close_sockets(s4, s6);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego free(lifc.lifc_buf);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_nic_iflist_destroy(iflist);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_NO_MEMORY);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb iflist->if_names[iflist->if_num++] = ifname;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb hlist->h_ifnum = iflist->if_num;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego hlist->h_num = 1;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego smb_close_sockets(s4, s6);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego free(lifc.lifc_buf);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb list_insert_tail(&hlist->h_list, iflist);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_SUCCESS);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7f667e74610492ddbce8ce60f52ece95d2401949jose borregostatic boolean_t
7f667e74610492ddbce8ce60f52ece95d2401949jose borregosmb_duplicate_nic(smb_hostifs_t *iflist, struct lifreq *lifrp)
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego{
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego int j;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego /*
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego * throw out duplicate names
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego */
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego for (j = 0; j < iflist->if_num; j++) {
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego if (strcmp(iflist->if_names[j],
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego lifrp->lifr_name) == 0)
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego return (B_TRUE);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego }
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego return (B_FALSE);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego}
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic int
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_nic_hlist_dbget(smb_hosts_t *hlist)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_hostifs_t *iflist;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite *db;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_vm *vm;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States int err = SMB_NIC_SUCCESS;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb const char **values;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char *sql;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char *errmsg = NULL;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb int ncol, rc;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sql = sqlite_mprintf("SELECT * FROM hosts");
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (sql == NULL)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_NO_MEMORY);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb db = smb_nic_dbopen(SMB_NIC_DB_ORD);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (db == NULL) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_freemem(sql);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_DBOPEN_FAILED);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb rc = sqlite_compile(db, sql, NULL, &vm, &errmsg);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_freemem(sql);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (rc != SQLITE_OK) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_nic_dbclose(db);
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);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb do {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb rc = sqlite_step(vm, &ncol, &values, NULL);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (rc == SQLITE_ROW) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (ncol != SMB_NIC_HTBL_NCOL) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States err = SMB_NIC_DB_ERROR;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb break;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
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) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb break;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb list_insert_tail(&hlist->h_list, iflist);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb hlist->h_num++;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb hlist->h_ifnum += iflist->if_num;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb } while (rc == SQLITE_ROW);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
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 }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb rc = sqlite_finalize(vm, &errmsg);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (rc != SQLITE_OK) {
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 }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_nic_dbclose(db);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (err);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic smb_hostifs_t *
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statessmb_nic_iflist_decode(const char **values, int *err)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_hostifs_t *iflist;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char *host;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char *cmnt;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char *ifnames;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char *lasts;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char *ifname;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb int if_num = 0;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb host = (char *)values[SMB_NIC_HTBL_HOST];
7b59d02d2a384be9a08087b14defadd214b3c1ddjb cmnt = (char *)values[SMB_NIC_HTBL_CMNT];
7b59d02d2a384be9a08087b14defadd214b3c1ddjb ifnames = (char *)values[SMB_NIC_HTBL_IFS];
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
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;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (NULL);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb iflist = malloc(sizeof (smb_hostifs_t));
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (iflist == NULL) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States *err = SMB_NIC_NO_MEMORY;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (NULL);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb bzero(iflist, sizeof (smb_hostifs_t));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) strlcpy(iflist->if_host, host, sizeof (iflist->if_host));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) strlcpy(iflist->if_cmnt, (cmnt) ? cmnt : "",
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sizeof (iflist->if_cmnt));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
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;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (NULL);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb iflist->if_names[if_num++] = strdup(ifname);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb while ((ifname = strtok_r(NULL, ",", &lasts)) != NULL)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb iflist->if_names[if_num++] = strdup(ifname);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb iflist->if_num = if_num;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb for (if_num = 0; if_num < iflist->if_num; if_num++) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (iflist->if_names[if_num] == NULL) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_nic_iflist_destroy(iflist);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States *err = SMB_NIC_NO_MEMORY;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (NULL);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States *err = SMB_NIC_SUCCESS;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (iflist);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb/*
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_iflist_destroy
7b59d02d2a384be9a08087b14defadd214b3c1ddjb *
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Frees allocated memory for the given IF names lists.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb */
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic void
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_nic_iflist_destroy(smb_hostifs_t *iflist)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
7b59d02d2a384be9a08087b14defadd214b3c1ddjb int i;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (iflist == NULL)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb for (i = 0; i < iflist->if_num; i++)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb free(iflist->if_names[i]);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb free(iflist);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb/*
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Functions to manage host/interface database
7b59d02d2a384be9a08087b14defadd214b3c1ddjb *
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 */
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb/*
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_dbcreate
7b59d02d2a384be9a08087b14defadd214b3c1ddjb *
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Creates the host database based on the defined SQL statement.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * It also initializes db_info table.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb */
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic int
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_nic_dbcreate(void)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite *db = NULL;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char *errmsg = NULL;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States int rc, err = SMB_NIC_SUCCESS;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) unlink(SMB_NIC_DB_NAME);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb db = sqlite_open(SMB_NIC_DB_NAME, 0600, &errmsg);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (db == NULL) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_ERR, "Failed to create host database (%s).",
7b59d02d2a384be9a08087b14defadd214b3c1ddjb NULL_MSGCHK(errmsg));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_freemem(errmsg);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_DBOPEN_FAILED);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_busy_timeout(db, SMB_NIC_DB_TIMEOUT);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb rc = sqlite_exec(db, "BEGIN TRANSACTION", NULL, NULL, &errmsg);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (rc != SQLITE_OK) {
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));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_freemem(errmsg);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_close(db);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_DBEXEC_FAILED);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (sqlite_exec(db, SMB_NIC_DB_SQL, NULL, NULL, &errmsg) == SQLITE_OK) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb rc = sqlite_exec(db, "COMMIT TRANSACTION", NULL, NULL,
7b59d02d2a384be9a08087b14defadd214b3c1ddjb &errmsg);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (rc == 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)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb rc = sqlite_exec(db, "ROLLBACK TRANSACTION", NULL, NULL,
7b59d02d2a384be9a08087b14defadd214b3c1ddjb &errmsg);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb } else {
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 sqlite_freemem(errmsg);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb rc = sqlite_exec(db, "ROLLBACK TRANSACTION", NULL, NULL,
7b59d02d2a384be9a08087b14defadd214b3c1ddjb &errmsg);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (rc != SQLITE_OK) {
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));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_freemem(errmsg);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States err = SMB_NIC_DBINIT_FAILED;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (void) sqlite_close(db);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (err);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb/*
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_dbopen
7b59d02d2a384be9a08087b14defadd214b3c1ddjb *
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Opens host database with the given mode.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb */
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic sqlite *
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_nic_dbopen(int mode)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite *db;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char *errmsg = NULL;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb db = sqlite_open(SMB_NIC_DB_NAME, mode, &errmsg);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (db == NULL) {
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 sqlite_freemem(errmsg);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (db);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb/*
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_dbclose
7b59d02d2a384be9a08087b14defadd214b3c1ddjb *
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Closes the given database handle
7b59d02d2a384be9a08087b14defadd214b3c1ddjb */
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic void
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_nic_dbclose(sqlite *db)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (db) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_close(db);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic boolean_t
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_nic_dbexists(void)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (access(SMB_NIC_DB_NAME, F_OK) == 0);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic boolean_t
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_nic_dbvalidate(void)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite *db;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char *errmsg = NULL;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char *sql;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char **result;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb int nrow, ncol;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb boolean_t check = B_TRUE;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb int rc;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sql = sqlite_mprintf("SELECT * FROM db_info");
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (sql == NULL)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (B_FALSE);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb db = smb_nic_dbopen(SMB_NIC_DB_ORW);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (db == NULL) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_freemem(sql);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (B_FALSE);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb rc = sqlite_get_table(db, sql, &result, &nrow, &ncol, &errmsg);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_freemem(sql);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (rc != SQLITE_OK) {
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));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_freemem(errmsg);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_nic_dbclose(db);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (B_FALSE);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (nrow != 1 || ncol != 3) {
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.");
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_free_table(result);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_nic_dbclose(db);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (B_FALSE);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if ((atoi(result[3]) != SMB_NIC_DB_VERMAJOR) ||
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (atoi(result[4]) != SMB_NIC_DB_VERMINOR) ||
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (atoi(result[5]) != SMB_NIC_DB_MAGIC)) {
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 sqlite_free_table(result);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_nic_dbclose(db);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (B_FALSE);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_free_table(result);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sql = sqlite_mprintf("SELECT hostname FROM hosts");
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (sql == NULL) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_nic_dbclose(db);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (B_FALSE);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb rc = sqlite_get_table(db, sql, &result, &nrow, &ncol, &errmsg);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_freemem(sql);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (rc != SQLITE_OK) {
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 sqlite_freemem(errmsg);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_nic_dbclose(db);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (B_FALSE);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_free_table(result);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (nrow == 0)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb /* No hosts in the database */
7b59d02d2a384be9a08087b14defadd214b3c1ddjb check = B_FALSE;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_nic_dbclose(db);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (check);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic int
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_nic_dbaddhost(const char *host, const char *cmnt, char *if_list)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite *db;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char *sql;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char *errmsg;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States int rc, err = SMB_NIC_SUCCESS;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sql = sqlite_mprintf("REPLACE INTO hosts (hostname, comment, ifnames)"
7b59d02d2a384be9a08087b14defadd214b3c1ddjb "VALUES ('%s', '%q', '%s')", host, (cmnt) ? cmnt : "", if_list);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (sql == NULL)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_NO_MEMORY);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb db = smb_nic_dbopen(SMB_NIC_DB_ORW);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (db == NULL) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_freemem(sql);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_DBOPEN_FAILED);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb rc = sqlite_exec(db, sql, NULL, NULL, &errmsg);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_freemem(sql);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_nic_dbclose(db);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (rc != SQLITE_OK) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States syslog(LOG_ERR, "Failed to add host %s to host database (%s).",
7b59d02d2a384be9a08087b14defadd214b3c1ddjb host, NULL_MSGCHK(errmsg));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_freemem(errmsg);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States err = SMB_NIC_INSERT_FAILED;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (err);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic int
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_nic_dbdelhost(const char *host)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite *db;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char *sql;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char *errmsg;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States int rc, err = SMB_NIC_SUCCESS;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sql = sqlite_mprintf("DELETE FROM hosts WHERE hostname = '%s'", host);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (sql == NULL)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_NO_MEMORY);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb db = smb_nic_dbopen(SMB_NIC_DB_ORW);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (db == NULL) {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_freemem(sql);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_DBOPEN_FAILED);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb rc = sqlite_exec(db, sql, NULL, NULL, &errmsg);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_freemem(sql);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb smb_nic_dbclose(db);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (rc != SQLITE_OK) {
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));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_freemem(errmsg);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States err = SMB_NIC_DELETE_FAILED;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (err);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb/*
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * smb_nic_dbsetinfo
7b59d02d2a384be9a08087b14defadd214b3c1ddjb *
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * Initializes the db_info table upon database creation.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb */
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstatic int
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_nic_dbsetinfo(sqlite *db)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb{
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char *errmsg = NULL;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb char *sql;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States int rc, err = SMB_NIC_SUCCESS;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sql = sqlite_mprintf("INSERT INTO db_info (ver_major, ver_minor,"
7b59d02d2a384be9a08087b14defadd214b3c1ddjb " magic) VALUES (%d, %d, %d)", SMB_NIC_DB_VERMAJOR,
7b59d02d2a384be9a08087b14defadd214b3c1ddjb SMB_NIC_DB_VERMINOR, SMB_NIC_DB_MAGIC);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (sql == NULL)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SMB_NIC_NO_MEMORY);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb rc = sqlite_exec(db, sql, NULL, NULL, &errmsg);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_freemem(sql);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (rc != SQLITE_OK) {
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));
7b59d02d2a384be9a08087b14defadd214b3c1ddjb sqlite_freemem(errmsg);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States err = SMB_NIC_DBINIT_ERROR;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (err);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb}
8d7e41661dc4633488e93b13363137523ce59977jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego/*
8d7e41661dc4633488e93b13363137523ce59977jose borrego * smb_nic_nbt_get_exclude_list
8d7e41661dc4633488e93b13363137523ce59977jose borrego *
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 *
8d7e41661dc4633488e93b13363137523ce59977jose borrego * Returns the number of i/f on which NetBIOS traffic is to be disabled.
8d7e41661dc4633488e93b13363137523ce59977jose borrego */
8d7e41661dc4633488e93b13363137523ce59977jose borregostatic int
8d7e41661dc4633488e93b13363137523ce59977jose borregosmb_nic_nbt_get_exclude_list(char *excludestr, char **iflist, int max_nifs)
8d7e41661dc4633488e93b13363137523ce59977jose borrego{
8d7e41661dc4633488e93b13363137523ce59977jose borrego int n = 0;
8d7e41661dc4633488e93b13363137523ce59977jose borrego char *entry;
8d7e41661dc4633488e93b13363137523ce59977jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego bzero(iflist, SMB_PI_MAX_NETWORKS * sizeof (char *));
8d7e41661dc4633488e93b13363137523ce59977jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego (void) trim_whitespace(excludestr);
8d7e41661dc4633488e93b13363137523ce59977jose borrego (void) strcanon(excludestr, ",");
8d7e41661dc4633488e93b13363137523ce59977jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego if (*excludestr == '\0')
8d7e41661dc4633488e93b13363137523ce59977jose borrego return (0);
8d7e41661dc4633488e93b13363137523ce59977jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego while (((iflist[n] = strsep(&excludestr, ",")) != NULL) &&
8d7e41661dc4633488e93b13363137523ce59977jose borrego (n < max_nifs)) {
8d7e41661dc4633488e93b13363137523ce59977jose borrego entry = iflist[n];
8d7e41661dc4633488e93b13363137523ce59977jose borrego if (*entry == '\0')
8d7e41661dc4633488e93b13363137523ce59977jose borrego continue;
8d7e41661dc4633488e93b13363137523ce59977jose borrego n++;
8d7e41661dc4633488e93b13363137523ce59977jose borrego }
8d7e41661dc4633488e93b13363137523ce59977jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego return (n);
8d7e41661dc4633488e93b13363137523ce59977jose borrego}
8d7e41661dc4633488e93b13363137523ce59977jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego/*
8d7e41661dc4633488e93b13363137523ce59977jose borrego * smb_nic_nbt_exclude
8d7e41661dc4633488e93b13363137523ce59977jose borrego *
8d7e41661dc4633488e93b13363137523ce59977jose borrego * Check to see if the given interface name should send NetBIOS traffic or not.
8d7e41661dc4633488e93b13363137523ce59977jose borrego *
8d7e41661dc4633488e93b13363137523ce59977jose borrego * Returns TRUE if NetBIOS traffic is disabled on an interface name.
8d7e41661dc4633488e93b13363137523ce59977jose borrego * Returns FALSE otherwise.
8d7e41661dc4633488e93b13363137523ce59977jose borrego */
8d7e41661dc4633488e93b13363137523ce59977jose borregostatic boolean_t
8d7e41661dc4633488e93b13363137523ce59977jose borregosmb_nic_nbt_exclude(const smb_nic_t *nc, const char **exclude_list,
8d7e41661dc4633488e93b13363137523ce59977jose borrego int nexclude)
8d7e41661dc4633488e93b13363137523ce59977jose borrego{
8d7e41661dc4633488e93b13363137523ce59977jose borrego char buf[INET6_ADDRSTRLEN];
8d7e41661dc4633488e93b13363137523ce59977jose borrego const char *ifname = nc->nic_ifname;
8d7e41661dc4633488e93b13363137523ce59977jose borrego int i;
8d7e41661dc4633488e93b13363137523ce59977jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego if (inet_ntop(AF_INET, &nc->nic_ip, buf, INET6_ADDRSTRLEN) == NULL)
8d7e41661dc4633488e93b13363137523ce59977jose borrego buf[0] = '\0';
8d7e41661dc4633488e93b13363137523ce59977jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego for (i = 0; i < nexclude; i++) {
8d7e41661dc4633488e93b13363137523ce59977jose borrego if (strcmp(ifname, exclude_list[i]) == 0)
8d7e41661dc4633488e93b13363137523ce59977jose borrego return (B_TRUE);
8d7e41661dc4633488e93b13363137523ce59977jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego if ((buf[0] != '\0') && (strcmp(buf, exclude_list[i]) == 0))
8d7e41661dc4633488e93b13363137523ce59977jose borrego return (B_TRUE);
8d7e41661dc4633488e93b13363137523ce59977jose borrego }
8d7e41661dc4633488e93b13363137523ce59977jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego return (B_FALSE);
8d7e41661dc4633488e93b13363137523ce59977jose borrego}