xref: /onnv-gate/usr/src/lib/smbsrv/libsmb/common/smb_cfg.c (revision 13082:81ec56bf6147)
15331Samw /*
25331Samw  * CDDL HEADER START
35331Samw  *
45331Samw  * The contents of this file are subject to the terms of the
55331Samw  * Common Development and Distribution License (the "License").
65331Samw  * You may not use this file except in compliance with the License.
75331Samw  *
85331Samw  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95331Samw  * or http://www.opensolaris.org/os/licensing.
105331Samw  * See the License for the specific language governing permissions
115331Samw  * and limitations under the License.
125331Samw  *
135331Samw  * When distributing Covered Code, include this CDDL HEADER in each
145331Samw  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155331Samw  * If applicable, add the following below this CDDL HEADER, with the
165331Samw  * fields enclosed by brackets "[]" replaced with your own identifying
175331Samw  * information: Portions Copyright [yyyy] [name of copyright owner]
185331Samw  *
195331Samw  * CDDL HEADER END
205331Samw  */
215331Samw /*
2212508Samw@Sun.COM  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
235331Samw  */
245331Samw 
255331Samw /*
265331Samw  * CIFS configuration management library
275331Samw  */
285331Samw 
295331Samw #include <stdio.h>
305331Samw #include <stdlib.h>
315331Samw #include <unistd.h>
325331Samw #include <synch.h>
335331Samw #include <string.h>
345331Samw #include <strings.h>
355331Samw #include <syslog.h>
365331Samw #include <netdb.h>
375331Samw #include <ctype.h>
385331Samw #include <sys/types.h>
395331Samw #include <libscf.h>
405772Sas200622 #include <assert.h>
418334SJose.Borrego@Sun.COM #include <uuid/uuid.h>
425331Samw #include <smbsrv/libsmb.h>
435331Samw 
445331Samw typedef struct smb_cfg_param {
455772Sas200622 	smb_cfg_id_t sc_id;
465331Samw 	char *sc_name;
475331Samw 	int sc_type;
485331Samw 	uint32_t sc_flags;
495331Samw } smb_cfg_param_t;
505331Samw 
515331Samw /*
525331Samw  * config parameter flags
535331Samw  */
545772Sas200622 #define	SMB_CF_PROTECTED	0x01
559832Samw@Sun.COM #define	SMB_CF_EXEC		0x02
565331Samw 
575331Samw /* idmap SMF fmri and Property Group */
585331Samw #define	IDMAP_FMRI_PREFIX		"system/idmap"
595331Samw #define	MACHINE_SID			"machine_sid"
605521Sas200622 #define	IDMAP_DOMAIN			"domain_name"
615331Samw #define	IDMAP_PG_NAME			"config"
625331Samw 
635331Samw #define	SMB_SECMODE_WORKGRP_STR 	"workgroup"
645331Samw #define	SMB_SECMODE_DOMAIN_STR  	"domain"
655331Samw 
665331Samw #define	SMB_ENC_LEN	1024
675331Samw #define	SMB_DEC_LEN	256
685331Samw 
695331Samw static char *b64_data =
705331Samw 	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
715331Samw 
725331Samw static smb_cfg_param_t smb_cfg_table[] =
735331Samw {
7411963SAfshin.Ardakani@Sun.COM 	{SMB_CI_VERSION, "sv_version", SCF_TYPE_ASTRING, 0},
7511963SAfshin.Ardakani@Sun.COM 
765331Samw 	/* Oplock configuration, Kernel Only */
775772Sas200622 	{SMB_CI_OPLOCK_ENABLE, "oplock_enable", SCF_TYPE_BOOLEAN, 0},
785331Samw 
795331Samw 	/* Autohome configuration */
805772Sas200622 	{SMB_CI_AUTOHOME_MAP, "autohome_map", SCF_TYPE_ASTRING, 0},
815331Samw 
825331Samw 	/* Domain/PDC configuration */
835772Sas200622 	{SMB_CI_DOMAIN_SID, "domain_sid", SCF_TYPE_ASTRING, 0},
845772Sas200622 	{SMB_CI_DOMAIN_MEMB, "domain_member", SCF_TYPE_BOOLEAN, 0},
855772Sas200622 	{SMB_CI_DOMAIN_NAME, "domain_name", SCF_TYPE_ASTRING, 0},
868334SJose.Borrego@Sun.COM 	{SMB_CI_DOMAIN_FQDN, "fqdn", SCF_TYPE_ASTRING, 0},
878334SJose.Borrego@Sun.COM 	{SMB_CI_DOMAIN_FOREST, "forest", SCF_TYPE_ASTRING, 0},
888334SJose.Borrego@Sun.COM 	{SMB_CI_DOMAIN_GUID, "domain_guid", SCF_TYPE_ASTRING, 0},
895772Sas200622 	{SMB_CI_DOMAIN_SRV, "pdc", SCF_TYPE_ASTRING, 0},
905331Samw 
915331Samw 	/* WINS configuration */
925772Sas200622 	{SMB_CI_WINS_SRV1, "wins_server_1", SCF_TYPE_ASTRING, 0},
935772Sas200622 	{SMB_CI_WINS_SRV2, "wins_server_2", SCF_TYPE_ASTRING, 0},
945772Sas200622 	{SMB_CI_WINS_EXCL, "wins_exclude", SCF_TYPE_ASTRING, 0},
955331Samw 
965331Samw 	/* Kmod specific configuration */
975772Sas200622 	{SMB_CI_MAX_WORKERS, "max_workers", SCF_TYPE_INTEGER, 0},
985772Sas200622 	{SMB_CI_MAX_CONNECTIONS, "max_connections", SCF_TYPE_INTEGER, 0},
995772Sas200622 	{SMB_CI_KEEPALIVE, "keep_alive", SCF_TYPE_INTEGER, 0},
1005772Sas200622 	{SMB_CI_RESTRICT_ANON, "restrict_anonymous", SCF_TYPE_BOOLEAN, 0},
1015331Samw 
1025772Sas200622 	{SMB_CI_SIGNING_ENABLE, "signing_enabled", SCF_TYPE_BOOLEAN, 0},
1035772Sas200622 	{SMB_CI_SIGNING_REQD, "signing_required", SCF_TYPE_BOOLEAN, 0},
1045331Samw 
1055331Samw 	/* Kmod tuning configuration */
1065772Sas200622 	{SMB_CI_SYNC_ENABLE, "sync_enable", SCF_TYPE_BOOLEAN, 0},
1075331Samw 
1085331Samw 	/* SMBd configuration */
1095772Sas200622 	{SMB_CI_SECURITY, "security", SCF_TYPE_ASTRING, 0},
1105772Sas200622 	{SMB_CI_NBSCOPE, "netbios_scope", SCF_TYPE_ASTRING, 0},
1115772Sas200622 	{SMB_CI_SYS_CMNT, "system_comment", SCF_TYPE_ASTRING, 0},
1125772Sas200622 	{SMB_CI_LM_LEVEL, "lmauth_level", SCF_TYPE_INTEGER, 0},
1135331Samw 
1145331Samw 	/* ADS Configuration */
1155772Sas200622 	{SMB_CI_ADS_SITE, "ads_site", SCF_TYPE_ASTRING, 0},
1165331Samw 
1175331Samw 	/* Dynamic DNS */
1185772Sas200622 	{SMB_CI_DYNDNS_ENABLE, "ddns_enable", SCF_TYPE_BOOLEAN, 0},
1195331Samw 
1205772Sas200622 	{SMB_CI_MACHINE_PASSWD, "machine_passwd", SCF_TYPE_ASTRING,
1216139Sjb150015 	    SMB_CF_PROTECTED},
1226139Sjb150015 	{SMB_CI_KPASSWD_SRV, "kpasswd_server", SCF_TYPE_ASTRING,
1236139Sjb150015 	    0},
1246139Sjb150015 	{SMB_CI_KPASSWD_DOMAIN, "kpasswd_domain", SCF_TYPE_ASTRING,
1256139Sjb150015 	    0},
1266139Sjb150015 	{SMB_CI_KPASSWD_SEQNUM, "kpasswd_seqnum", SCF_TYPE_INTEGER,
1276139Sjb150015 	    0},
1286139Sjb150015 	{SMB_CI_NETLOGON_SEQNUM, "netlogon_seqnum", SCF_TYPE_INTEGER,
1298670SJose.Borrego@Sun.COM 	    0},
1309832Samw@Sun.COM 	{SMB_CI_IPV6_ENABLE, "ipv6_enable", SCF_TYPE_BOOLEAN, 0},
13112890SJoyce.McIntosh@Sun.COM 	{SMB_CI_PRINT_ENABLE, "print_enable", SCF_TYPE_BOOLEAN, 0},
1329832Samw@Sun.COM 	{SMB_CI_MAP, "map", SCF_TYPE_ASTRING, SMB_CF_EXEC},
1339832Samw@Sun.COM 	{SMB_CI_UNMAP, "unmap", SCF_TYPE_ASTRING, SMB_CF_EXEC},
13412508Samw@Sun.COM 	{SMB_CI_DISPOSITION, "disposition", SCF_TYPE_ASTRING, SMB_CF_EXEC},
13512508Samw@Sun.COM 
13612508Samw@Sun.COM 	{SMB_CI_DFS_STDROOT_NUM, "dfs_stdroot_num", SCF_TYPE_INTEGER, 0}
1376139Sjb150015 
1385331Samw 	/* SMB_CI_MAX */
1395331Samw };
1405331Samw 
1415772Sas200622 static smb_cfg_param_t *smb_config_getent(smb_cfg_id_t);
1425772Sas200622 
1435331Samw static boolean_t smb_is_base64(unsigned char c);
1445331Samw static char *smb_base64_encode(char *str_to_encode);
1455331Samw static char *smb_base64_decode(char *encoded_str);
1465772Sas200622 
1475772Sas200622 char *
smb_config_getname(smb_cfg_id_t id)1485772Sas200622 smb_config_getname(smb_cfg_id_t id)
1495772Sas200622 {
1505772Sas200622 	smb_cfg_param_t *cfg;
1515772Sas200622 	cfg = smb_config_getent(id);
1525772Sas200622 	return (cfg->sc_name);
1535772Sas200622 }
1545331Samw 
1555331Samw static boolean_t
smb_is_base64(unsigned char c)1565331Samw smb_is_base64(unsigned char c)
1575331Samw {
1585331Samw 	return (isalnum(c) || (c == '+') || (c == '/'));
1595331Samw }
1605331Samw 
1615331Samw /*
1625331Samw  * smb_base64_encode
1635331Samw  *
1645331Samw  * Encode a string using base64 algorithm.
1655331Samw  * Caller should free the returned buffer when done.
1665331Samw  */
1675331Samw static char *
smb_base64_encode(char * str_to_encode)1685331Samw smb_base64_encode(char *str_to_encode)
1695331Samw {
1705331Samw 	int ret_cnt = 0;
1715331Samw 	int i = 0, j = 0;
1725331Samw 	char arr_3[3], arr_4[4];
1735331Samw 	int len = strlen(str_to_encode);
1745331Samw 	char *ret = malloc(SMB_ENC_LEN);
1755331Samw 
1765331Samw 	if (ret == NULL) {
1775331Samw 		return (NULL);
1785331Samw 	}
1795331Samw 
1805331Samw 	while (len--) {
1815331Samw 		arr_3[i++] = *(str_to_encode++);
1825331Samw 		if (i == 3) {
1835331Samw 			arr_4[0] = (arr_3[0] & 0xfc) >> 2;
1845331Samw 			arr_4[1] = ((arr_3[0] & 0x03) << 4) +
1855331Samw 			    ((arr_3[1] & 0xf0) >> 4);
1865331Samw 			arr_4[2] = ((arr_3[1] & 0x0f) << 2) +
1875331Samw 			    ((arr_3[2] & 0xc0) >> 6);
1885331Samw 			arr_4[3] = arr_3[2] & 0x3f;
1895331Samw 
1905331Samw 			for (i = 0; i < 4; i++)
1915331Samw 				ret[ret_cnt++] = b64_data[arr_4[i]];
1925331Samw 			i = 0;
1935331Samw 		}
1945331Samw 	}
1955331Samw 
1965331Samw 	if (i) {
1975331Samw 		for (j = i; j < 3; j++)
1985331Samw 			arr_3[j] = '\0';
1995331Samw 
2005331Samw 		arr_4[0] = (arr_3[0] & 0xfc) >> 2;
2015331Samw 		arr_4[1] = ((arr_3[0] & 0x03) << 4) +
2025331Samw 		    ((arr_3[1] & 0xf0) >> 4);
2035331Samw 		arr_4[2] = ((arr_3[1] & 0x0f) << 2) +
2045331Samw 		    ((arr_3[2] & 0xc0) >> 6);
2055331Samw 		arr_4[3] = arr_3[2] & 0x3f;
2065331Samw 
2075331Samw 		for (j = 0; j < (i + 1); j++)
2085331Samw 			ret[ret_cnt++] = b64_data[arr_4[j]];
2095331Samw 
2105331Samw 		while (i++ < 3)
2115331Samw 			ret[ret_cnt++] = '=';
2125331Samw 	}
2135331Samw 
2145331Samw 	ret[ret_cnt++] = '\0';
2155331Samw 	return (ret);
2165331Samw }
2175331Samw 
2185331Samw /*
2195331Samw  * smb_base64_decode
2205331Samw  *
2215331Samw  * Decode using base64 algorithm.
2225331Samw  * Caller should free the returned buffer when done.
2235331Samw  */
2245331Samw static char *
smb_base64_decode(char * encoded_str)2255331Samw smb_base64_decode(char *encoded_str)
2265331Samw {
2275331Samw 	int len = strlen(encoded_str);
2285331Samw 	int i = 0, j = 0;
2295331Samw 	int en_ind = 0;
2305331Samw 	char arr_4[4], arr_3[3];
2315331Samw 	int ret_cnt = 0;
2325331Samw 	char *ret = malloc(SMB_DEC_LEN);
2335331Samw 	char *p;
2345331Samw 
2355331Samw 	if (ret == NULL) {
2365331Samw 		return (NULL);
2375331Samw 	}
2385331Samw 
2395331Samw 	while (len-- && (encoded_str[en_ind] != '=') &&
2405331Samw 	    smb_is_base64(encoded_str[en_ind])) {
2415331Samw 		arr_4[i++] = encoded_str[en_ind];
2425331Samw 		en_ind++;
2435331Samw 		if (i == 4) {
2445331Samw 			for (i = 0; i < 4; i++) {
2455331Samw 				if ((p = strchr(b64_data, arr_4[i])) == NULL)
2465331Samw 					return (NULL);
2475331Samw 
2485331Samw 				arr_4[i] = (int)(p - b64_data);
2495331Samw 			}
2505331Samw 
2515331Samw 			arr_3[0] = (arr_4[0] << 2) +
2525331Samw 			    ((arr_4[1] & 0x30) >> 4);
2535331Samw 			arr_3[1] = ((arr_4[1] & 0xf) << 4) +
2545331Samw 			    ((arr_4[2] & 0x3c) >> 2);
2555331Samw 			arr_3[2] = ((arr_4[2] & 0x3) << 6) +
2565331Samw 			    arr_4[3];
2575331Samw 
2585331Samw 			for (i = 0; i < 3; i++)
2595331Samw 				ret[ret_cnt++] = arr_3[i];
2605331Samw 
2615331Samw 			i = 0;
2625331Samw 		}
2635331Samw 	}
2645331Samw 
2655331Samw 	if (i) {
2665331Samw 		for (j = i; j < 4; j++)
2675331Samw 			arr_4[j] = 0;
2685331Samw 
2695331Samw 		for (j = 0; j < 4; j++) {
2705331Samw 			if ((p = strchr(b64_data, arr_4[j])) == NULL)
2715331Samw 				return (NULL);
2725331Samw 
2735331Samw 			arr_4[j] = (int)(p - b64_data);
2745331Samw 		}
2755331Samw 		arr_3[0] = (arr_4[0] << 2) +
2765331Samw 		    ((arr_4[1] & 0x30) >> 4);
2775331Samw 		arr_3[1] = ((arr_4[1] & 0xf) << 4) +
2785331Samw 		    ((arr_4[2] & 0x3c) >> 2);
2795331Samw 		arr_3[2] = ((arr_4[2] & 0x3) << 6) +
2805331Samw 		    arr_4[3];
2815331Samw 		for (j = 0; j < (i - 1); j++)
2825331Samw 			ret[ret_cnt++] = arr_3[j];
2835331Samw 	}
2845331Samw 
2855331Samw 	ret[ret_cnt++] = '\0';
2865331Samw 	return (ret);
2875331Samw }
2885331Samw 
2895331Samw static char *
smb_config_getenv_generic(char * name,char * svc_fmri_prefix,char * svc_propgrp)2905331Samw smb_config_getenv_generic(char *name, char *svc_fmri_prefix, char *svc_propgrp)
2915331Samw {
2925331Samw 	smb_scfhandle_t *handle;
2935331Samw 	char *value;
2945331Samw 
2955331Samw 	if ((value = malloc(MAX_VALUE_BUFLEN * sizeof (char))) == NULL)
2965331Samw 		return (NULL);
2975331Samw 
2985331Samw 	handle = smb_smf_scf_init(svc_fmri_prefix);
2995331Samw 	if (handle == NULL) {
3005331Samw 		free(value);
3015331Samw 		return (NULL);
3025331Samw 	}
3035331Samw 
3045331Samw 	(void) smb_smf_create_service_pgroup(handle, svc_propgrp);
3055331Samw 
3065331Samw 	if (smb_smf_get_string_property(handle, name, value,
3075331Samw 	    sizeof (char) * MAX_VALUE_BUFLEN) != 0) {
3085331Samw 		smb_smf_scf_fini(handle);
3095331Samw 		free(value);
3105331Samw 		return (NULL);
3115331Samw 	}
3125331Samw 
3135331Samw 	smb_smf_scf_fini(handle);
3145331Samw 	return (value);
3155331Samw 
3165331Samw }
3175331Samw 
3185772Sas200622 static int
smb_config_setenv_generic(char * svc_fmri_prefix,char * svc_propgrp,char * name,char * value)3195331Samw smb_config_setenv_generic(char *svc_fmri_prefix, char *svc_propgrp,
3205331Samw     char *name, char *value)
3215331Samw {
3225331Samw 	smb_scfhandle_t *handle = NULL;
3235331Samw 	int rc = 0;
3245331Samw 
3255331Samw 
3265331Samw 	handle = smb_smf_scf_init(svc_fmri_prefix);
3275331Samw 	if (handle == NULL) {
3285331Samw 		return (1);
3295331Samw 	}
3305331Samw 
3315331Samw 	(void) smb_smf_create_service_pgroup(handle, svc_propgrp);
3325331Samw 
3335331Samw 	if (smb_smf_start_transaction(handle) != SMBD_SMF_OK) {
3345331Samw 		smb_smf_scf_fini(handle);
3355331Samw 		return (1);
3365331Samw 	}
3375331Samw 
3385331Samw 	if (smb_smf_set_string_property(handle, name, value) != SMBD_SMF_OK)
3395331Samw 		rc = 1;
3405331Samw 
3415331Samw 	if (smb_smf_end_transaction(handle) != SMBD_SMF_OK)
3425331Samw 		rc = 1;
3435331Samw 
3445331Samw 	smb_smf_scf_fini(handle);
3455331Samw 	return (rc);
3465331Samw }
3475331Samw 
3485331Samw /*
3495772Sas200622  * smb_config_getstr
3505331Samw  *
3515772Sas200622  * Fetch the specified string configuration item from SMF
3525331Samw  */
3535331Samw int
smb_config_getstr(smb_cfg_id_t id,char * cbuf,int bufsz)3545772Sas200622 smb_config_getstr(smb_cfg_id_t id, char *cbuf, int bufsz)
3555331Samw {
3565772Sas200622 	smb_scfhandle_t *handle;
3575772Sas200622 	smb_cfg_param_t *cfg;
3585772Sas200622 	int rc = SMBD_SMF_OK;
3599832Samw@Sun.COM 	char *pg;
36011633SJoyce.McIntosh@Sun.COM 	char protbuf[SMB_ENC_LEN];
36111633SJoyce.McIntosh@Sun.COM 	char *tmp;
3625331Samw 
3635772Sas200622 	*cbuf = '\0';
3645772Sas200622 	cfg = smb_config_getent(id);
3655772Sas200622 	assert(cfg->sc_type == SCF_TYPE_ASTRING);
3665331Samw 
3675331Samw 	handle = smb_smf_scf_init(SMBD_FMRI_PREFIX);
3685772Sas200622 	if (handle == NULL)
3695772Sas200622 		return (SMBD_SMF_SYSTEM_ERR);
3705331Samw 
3715772Sas200622 	if (cfg->sc_flags & SMB_CF_PROTECTED) {
3725772Sas200622 		if ((rc = smb_smf_create_service_pgroup(handle,
3735772Sas200622 		    SMBD_PROTECTED_PG_NAME)) != SMBD_SMF_OK)
3745772Sas200622 			goto error;
3755331Samw 
3765772Sas200622 		if ((rc = smb_smf_get_string_property(handle, cfg->sc_name,
3775772Sas200622 		    protbuf, sizeof (protbuf))) != SMBD_SMF_OK)
3785772Sas200622 			goto error;
3795331Samw 
3805772Sas200622 		if (*protbuf != '\0') {
3815772Sas200622 			tmp = smb_base64_decode(protbuf);
3825772Sas200622 			(void) strlcpy(cbuf, tmp, bufsz);
3835772Sas200622 			free(tmp);
3845772Sas200622 		}
3855772Sas200622 	} else {
3869832Samw@Sun.COM 		pg = (cfg->sc_flags & SMB_CF_EXEC) ? SMBD_EXEC_PG_NAME :
3879832Samw@Sun.COM 		    SMBD_PG_NAME;
3889832Samw@Sun.COM 		rc = smb_smf_create_service_pgroup(handle, pg);
3895772Sas200622 		if (rc == SMBD_SMF_OK)
3905772Sas200622 			rc = smb_smf_get_string_property(handle, cfg->sc_name,
3915772Sas200622 			    cbuf, bufsz);
3925331Samw 	}
3935331Samw 
3945772Sas200622 error:
3955331Samw 	smb_smf_scf_fini(handle);
3965772Sas200622 	return (rc);
3975331Samw }
3985331Samw 
39911633SJoyce.McIntosh@Sun.COM /*
40011633SJoyce.McIntosh@Sun.COM  * Translate the value of an astring SMF property into a binary
40111633SJoyce.McIntosh@Sun.COM  * IP address. If the value is neither a valid IPv4 nor IPv6
40211633SJoyce.McIntosh@Sun.COM  * address, attempt to look it up as a hostname using the
40311633SJoyce.McIntosh@Sun.COM  * configured address type.
40411633SJoyce.McIntosh@Sun.COM  */
4058670SJose.Borrego@Sun.COM int
smb_config_getip(smb_cfg_id_t sc_id,smb_inaddr_t * ipaddr)4068670SJose.Borrego@Sun.COM smb_config_getip(smb_cfg_id_t sc_id, smb_inaddr_t *ipaddr)
4078670SJose.Borrego@Sun.COM {
40811633SJoyce.McIntosh@Sun.COM 	int rc, error;
40911633SJoyce.McIntosh@Sun.COM 	int a_family;
41011633SJoyce.McIntosh@Sun.COM 	char ipstr[MAXHOSTNAMELEN];
41111633SJoyce.McIntosh@Sun.COM 	struct hostent *h;
41211633SJoyce.McIntosh@Sun.COM 	smb_cfg_param_t *cfg;
4138670SJose.Borrego@Sun.COM 
4149832Samw@Sun.COM 	if (ipaddr == NULL)
4159832Samw@Sun.COM 		return (SMBD_SMF_INVALID_ARG);
4169832Samw@Sun.COM 
4179832Samw@Sun.COM 	bzero(ipaddr, sizeof (smb_inaddr_t));
4188670SJose.Borrego@Sun.COM 	rc = smb_config_getstr(sc_id, ipstr, sizeof (ipstr));
4198670SJose.Borrego@Sun.COM 	if (rc == SMBD_SMF_OK) {
42011633SJoyce.McIntosh@Sun.COM 		if (*ipstr == '\0')
42111633SJoyce.McIntosh@Sun.COM 			return (SMBD_SMF_INVALID_ARG);
42211633SJoyce.McIntosh@Sun.COM 
4239832Samw@Sun.COM 		if (inet_pton(AF_INET, ipstr, &ipaddr->a_ipv4) == 1) {
4249832Samw@Sun.COM 			ipaddr->a_family = AF_INET;
4259832Samw@Sun.COM 			return (SMBD_SMF_OK);
4269832Samw@Sun.COM 		}
4279832Samw@Sun.COM 
4289832Samw@Sun.COM 		if (inet_pton(AF_INET6, ipstr, &ipaddr->a_ipv6) == 1) {
4299832Samw@Sun.COM 			ipaddr->a_family = AF_INET6;
43011633SJoyce.McIntosh@Sun.COM 			return (SMBD_SMF_OK);
43111633SJoyce.McIntosh@Sun.COM 		}
43211633SJoyce.McIntosh@Sun.COM 
43311633SJoyce.McIntosh@Sun.COM 		/*
43411633SJoyce.McIntosh@Sun.COM 		 * The value is neither an IPv4 nor IPv6 address;
43511633SJoyce.McIntosh@Sun.COM 		 * so check if it's a hostname.
43611633SJoyce.McIntosh@Sun.COM 		 */
43711633SJoyce.McIntosh@Sun.COM 		a_family = smb_config_getbool(SMB_CI_IPV6_ENABLE) ?
43811633SJoyce.McIntosh@Sun.COM 		    AF_INET6 : AF_INET;
43911633SJoyce.McIntosh@Sun.COM 		h = getipnodebyname(ipstr, a_family, AI_DEFAULT,
44011633SJoyce.McIntosh@Sun.COM 		    &error);
44111633SJoyce.McIntosh@Sun.COM 		if (h != NULL) {
44211633SJoyce.McIntosh@Sun.COM 			bcopy(*(h->h_addr_list), &ipaddr->a_ip,
44311633SJoyce.McIntosh@Sun.COM 			    h->h_length);
44411633SJoyce.McIntosh@Sun.COM 			ipaddr->a_family = a_family;
44511633SJoyce.McIntosh@Sun.COM 			freehostent(h);
4469832Samw@Sun.COM 			rc = SMBD_SMF_OK;
4479832Samw@Sun.COM 		} else {
44811633SJoyce.McIntosh@Sun.COM 			cfg = smb_config_getent(sc_id);
44911633SJoyce.McIntosh@Sun.COM 			syslog(LOG_ERR, "smbd/%s: %s unable to get %s "
45011633SJoyce.McIntosh@Sun.COM 			    "address: %d", cfg->sc_name, ipstr,
45111633SJoyce.McIntosh@Sun.COM 			    a_family == AF_INET ?  "IPv4" : "IPv6", error);
4529832Samw@Sun.COM 			rc = SMBD_SMF_INVALID_ARG;
4538670SJose.Borrego@Sun.COM 		}
4548670SJose.Borrego@Sun.COM 	}
4559832Samw@Sun.COM 
4568670SJose.Borrego@Sun.COM 	return (rc);
4578670SJose.Borrego@Sun.COM }
4588670SJose.Borrego@Sun.COM 
4595331Samw /*
4605331Samw  * smb_config_getnum
4615331Samw  *
4625331Samw  * Returns the value of a numeric config param.
4635331Samw  */
4645772Sas200622 int
smb_config_getnum(smb_cfg_id_t id,int64_t * cint)4655772Sas200622 smb_config_getnum(smb_cfg_id_t id, int64_t *cint)
4665331Samw {
4675772Sas200622 	smb_scfhandle_t *handle;
4685331Samw 	smb_cfg_param_t *cfg;
4695772Sas200622 	int rc = SMBD_SMF_OK;
4705772Sas200622 
4715772Sas200622 	*cint = 0;
4725772Sas200622 	cfg = smb_config_getent(id);
4735772Sas200622 	assert(cfg->sc_type == SCF_TYPE_INTEGER);
4745772Sas200622 
4755772Sas200622 	handle = smb_smf_scf_init(SMBD_FMRI_PREFIX);
4765772Sas200622 	if (handle == NULL)
4775772Sas200622 		return (SMBD_SMF_SYSTEM_ERR);
4785772Sas200622 
4795772Sas200622 	rc = smb_smf_create_service_pgroup(handle, SMBD_PG_NAME);
4805772Sas200622 	if (rc == SMBD_SMF_OK)
4815772Sas200622 		rc = smb_smf_get_integer_property(handle, cfg->sc_name, cint);
4825772Sas200622 	smb_smf_scf_fini(handle);
4835772Sas200622 
4845772Sas200622 	return (rc);
4855772Sas200622 }
4865331Samw 
4875772Sas200622 /*
4885772Sas200622  * smb_config_getbool
4895772Sas200622  *
4905772Sas200622  * Returns the value of a boolean config param.
4915772Sas200622  */
4925772Sas200622 boolean_t
smb_config_getbool(smb_cfg_id_t id)4935772Sas200622 smb_config_getbool(smb_cfg_id_t id)
4945772Sas200622 {
4955772Sas200622 	smb_scfhandle_t *handle;
4965772Sas200622 	smb_cfg_param_t *cfg;
4975772Sas200622 	int rc = SMBD_SMF_OK;
4985772Sas200622 	uint8_t vbool;
4995331Samw 
5005772Sas200622 	cfg = smb_config_getent(id);
5015772Sas200622 	assert(cfg->sc_type == SCF_TYPE_BOOLEAN);
5025772Sas200622 
5035772Sas200622 	handle = smb_smf_scf_init(SMBD_FMRI_PREFIX);
5045772Sas200622 	if (handle == NULL)
5055772Sas200622 		return (B_FALSE);
5065331Samw 
5075772Sas200622 	rc = smb_smf_create_service_pgroup(handle, SMBD_PG_NAME);
5085772Sas200622 	if (rc == SMBD_SMF_OK)
5095772Sas200622 		rc = smb_smf_get_boolean_property(handle, cfg->sc_name, &vbool);
5105772Sas200622 	smb_smf_scf_fini(handle);
5115772Sas200622 
5125772Sas200622 	return ((rc == SMBD_SMF_OK) ? (vbool == 1) : B_FALSE);
5135331Samw }
5145331Samw 
5155331Samw /*
5165772Sas200622  * smb_config_get
5175331Samw  *
5185772Sas200622  * This function returns the value of the requested config
5195772Sas200622  * iterm regardless of its type in string format. This should
5205772Sas200622  * be used when the config item type is not known by the caller.
5215331Samw  */
5225331Samw int
smb_config_get(smb_cfg_id_t id,char * cbuf,int bufsz)5235772Sas200622 smb_config_get(smb_cfg_id_t id, char *cbuf, int bufsz)
5245331Samw {
5255772Sas200622 	smb_cfg_param_t *cfg;
5265772Sas200622 	int64_t cint;
5275772Sas200622 	int rc;
5285772Sas200622 
5295772Sas200622 	cfg = smb_config_getent(id);
5305772Sas200622 	switch (cfg->sc_type) {
5315772Sas200622 	case SCF_TYPE_ASTRING:
5325772Sas200622 		return (smb_config_getstr(id, cbuf, bufsz));
5335331Samw 
5345772Sas200622 	case SCF_TYPE_INTEGER:
5355772Sas200622 		rc = smb_config_getnum(id, &cint);
5365772Sas200622 		if (rc == SMBD_SMF_OK)
5375772Sas200622 			(void) snprintf(cbuf, bufsz, "%lld", cint);
5385772Sas200622 		return (rc);
5395772Sas200622 
5405772Sas200622 	case SCF_TYPE_BOOLEAN:
5415772Sas200622 		if (smb_config_getbool(id))
5425772Sas200622 			(void) strlcpy(cbuf, "true", bufsz);
5435772Sas200622 		else
5445772Sas200622 			(void) strlcpy(cbuf, "false", bufsz);
5455772Sas200622 		return (SMBD_SMF_OK);
5465331Samw 	}
5475331Samw 
5485772Sas200622 	return (SMBD_SMF_INVALID_ARG);
5495331Samw }
5505331Samw 
5515331Samw /*
5525772Sas200622  * smb_config_setstr
5535331Samw  *
5545772Sas200622  * Set the specified config param with the given
5555772Sas200622  * value.
5565331Samw  */
5575331Samw int
smb_config_setstr(smb_cfg_id_t id,char * value)5585772Sas200622 smb_config_setstr(smb_cfg_id_t id, char *value)
5595331Samw {
5605772Sas200622 	smb_scfhandle_t *handle;
5615331Samw 	smb_cfg_param_t *cfg;
5625772Sas200622 	int rc = SMBD_SMF_OK;
5635772Sas200622 	boolean_t protected;
5645772Sas200622 	char *tmp = NULL;
5655772Sas200622 	char *pg;
5665772Sas200622 
5675772Sas200622 	cfg = smb_config_getent(id);
5685772Sas200622 	assert(cfg->sc_type == SCF_TYPE_ASTRING);
5695331Samw 
5709832Samw@Sun.COM 	protected = B_FALSE;
5719832Samw@Sun.COM 
5729832Samw@Sun.COM 	switch (cfg->sc_flags) {
5739832Samw@Sun.COM 	case SMB_CF_PROTECTED:
5745772Sas200622 		protected = B_TRUE;
5759832Samw@Sun.COM 		pg = SMBD_PROTECTED_PG_NAME;
5769832Samw@Sun.COM 		break;
5779832Samw@Sun.COM 	case SMB_CF_EXEC:
5789832Samw@Sun.COM 		pg = SMBD_EXEC_PG_NAME;
5799832Samw@Sun.COM 		break;
5809832Samw@Sun.COM 	default:
5815772Sas200622 		pg = SMBD_PG_NAME;
5829832Samw@Sun.COM 		break;
5835772Sas200622 	}
5845772Sas200622 
5855772Sas200622 	handle = smb_smf_scf_init(SMBD_FMRI_PREFIX);
5865772Sas200622 	if (handle == NULL)
5875772Sas200622 		return (SMBD_SMF_SYSTEM_ERR);
5885772Sas200622 
5895772Sas200622 	rc = smb_smf_create_service_pgroup(handle, pg);
5905772Sas200622 	if (rc == SMBD_SMF_OK)
5915772Sas200622 		rc = smb_smf_start_transaction(handle);
5925772Sas200622 
5935772Sas200622 	if (rc != SMBD_SMF_OK) {
5945772Sas200622 		smb_smf_scf_fini(handle);
5955331Samw 		return (rc);
5965331Samw 	}
5975331Samw 
5985772Sas200622 	if (protected && value && (*value != '\0')) {
5995772Sas200622 		if ((tmp = smb_base64_encode(value)) == NULL) {
6005772Sas200622 			(void) smb_smf_end_transaction(handle);
6015772Sas200622 			smb_smf_scf_fini(handle);
6025772Sas200622 			return (SMBD_SMF_NO_MEMORY);
6035772Sas200622 		}
6045772Sas200622 
6055772Sas200622 		value = tmp;
6065772Sas200622 	}
6075772Sas200622 
6085772Sas200622 	rc = smb_smf_set_string_property(handle, cfg->sc_name, value);
6095772Sas200622 
6105772Sas200622 	free(tmp);
6115772Sas200622 	(void) smb_smf_end_transaction(handle);
6125772Sas200622 	smb_smf_scf_fini(handle);
6135772Sas200622 	return (rc);
6145331Samw }
6155331Samw 
6165331Samw /*
6175331Samw  * smb_config_setnum
6185331Samw  *
6195772Sas200622  * Sets a numeric configuration iterm
6205331Samw  */
6215331Samw int
smb_config_setnum(smb_cfg_id_t id,int64_t value)6225772Sas200622 smb_config_setnum(smb_cfg_id_t id, int64_t value)
6235331Samw {
6245772Sas200622 	smb_scfhandle_t *handle;
6255331Samw 	smb_cfg_param_t *cfg;
6265772Sas200622 	int rc = SMBD_SMF_OK;
6275772Sas200622 
6285772Sas200622 	cfg = smb_config_getent(id);
6295772Sas200622 	assert(cfg->sc_type == SCF_TYPE_INTEGER);
6305331Samw 
6315772Sas200622 	handle = smb_smf_scf_init(SMBD_FMRI_PREFIX);
6325772Sas200622 	if (handle == NULL)
6335772Sas200622 		return (SMBD_SMF_SYSTEM_ERR);
6345772Sas200622 
6355772Sas200622 	rc = smb_smf_create_service_pgroup(handle, SMBD_PG_NAME);
6365772Sas200622 	if (rc == SMBD_SMF_OK)
6375772Sas200622 		rc = smb_smf_start_transaction(handle);
6385772Sas200622 
6395772Sas200622 	if (rc != SMBD_SMF_OK) {
6405772Sas200622 		smb_smf_scf_fini(handle);
6415331Samw 		return (rc);
6425331Samw 	}
6435331Samw 
6445772Sas200622 	rc = smb_smf_set_integer_property(handle, cfg->sc_name, value);
6455331Samw 
6465772Sas200622 	(void) smb_smf_end_transaction(handle);
6475772Sas200622 	smb_smf_scf_fini(handle);
6485772Sas200622 	return (rc);
6495331Samw }
6505331Samw 
6515331Samw /*
6525772Sas200622  * smb_config_setbool
6535331Samw  *
6545772Sas200622  * Sets a boolean configuration iterm
6555331Samw  */
6565772Sas200622 int
smb_config_setbool(smb_cfg_id_t id,boolean_t value)6575772Sas200622 smb_config_setbool(smb_cfg_id_t id, boolean_t value)
6585331Samw {
6595772Sas200622 	smb_scfhandle_t *handle;
6605331Samw 	smb_cfg_param_t *cfg;
6615772Sas200622 	int rc = SMBD_SMF_OK;
6625772Sas200622 
6635772Sas200622 	cfg = smb_config_getent(id);
6645772Sas200622 	assert(cfg->sc_type == SCF_TYPE_BOOLEAN);
6655331Samw 
6665331Samw 	handle = smb_smf_scf_init(SMBD_FMRI_PREFIX);
6675772Sas200622 	if (handle == NULL)
6685772Sas200622 		return (SMBD_SMF_SYSTEM_ERR);
6695331Samw 
6705772Sas200622 	rc = smb_smf_create_service_pgroup(handle, SMBD_PG_NAME);
6715772Sas200622 	if (rc == SMBD_SMF_OK)
6725772Sas200622 		rc = smb_smf_start_transaction(handle);
6735772Sas200622 
6745772Sas200622 	if (rc != SMBD_SMF_OK) {
6755772Sas200622 		smb_smf_scf_fini(handle);
6765772Sas200622 		return (rc);
6775331Samw 	}
6785331Samw 
6795772Sas200622 	rc = smb_smf_set_boolean_property(handle, cfg->sc_name, value);
6805331Samw 
6815772Sas200622 	(void) smb_smf_end_transaction(handle);
6825772Sas200622 	smb_smf_scf_fini(handle);
6835772Sas200622 	return (rc);
6845331Samw }
6855331Samw 
6865331Samw /*
6875772Sas200622  * smb_config_set
6885331Samw  *
6895772Sas200622  * This function sets the value of the specified config
6905772Sas200622  * iterm regardless of its type in string format. This should
6915772Sas200622  * be used when the config item type is not known by the caller.
6925331Samw  */
6935772Sas200622 int
smb_config_set(smb_cfg_id_t id,char * value)6945772Sas200622 smb_config_set(smb_cfg_id_t id, char *value)
6955331Samw {
6965772Sas200622 	smb_cfg_param_t *cfg;
6975772Sas200622 	int64_t cint;
6985331Samw 
6995772Sas200622 	cfg = smb_config_getent(id);
7005772Sas200622 	switch (cfg->sc_type) {
7015772Sas200622 	case SCF_TYPE_ASTRING:
7025772Sas200622 		return (smb_config_setstr(id, value));
7035331Samw 
7045772Sas200622 	case SCF_TYPE_INTEGER:
7055772Sas200622 		cint = atoi(value);
7065772Sas200622 		return (smb_config_setnum(id, cint));
7075772Sas200622 
7085772Sas200622 	case SCF_TYPE_BOOLEAN:
7095772Sas200622 		return (smb_config_setbool(id, strcasecmp(value, "true") == 0));
7105331Samw 	}
7115331Samw 
7125772Sas200622 	return (SMBD_SMF_INVALID_ARG);
7135331Samw }
7145331Samw uint8_t
smb_config_get_fg_flag()7155331Samw smb_config_get_fg_flag()
7165331Samw {
7175331Samw 	uint8_t run_fg = 0; /* Default is to run in daemon mode */
7185331Samw 	smb_scfhandle_t *handle = NULL;
7195331Samw 
7205331Samw 	handle = smb_smf_scf_init(SMBD_FMRI_PREFIX);
7215331Samw 	if (handle == NULL) {
7225331Samw 		return (run_fg);
7235331Samw 	}
7245331Samw 
7255331Samw 	if (smb_smf_create_service_pgroup(handle,
7265331Samw 	    SMBD_PG_NAME) != SMBD_SMF_OK) {
7275331Samw 		smb_smf_scf_fini(handle);
7285331Samw 		return (run_fg);
7295331Samw 	}
7305331Samw 
7315331Samw 	if (smb_smf_get_boolean_property(handle, "run_fg", &run_fg) != 0) {
7325331Samw 		smb_smf_scf_fini(handle);
7335331Samw 		return (run_fg);
7345331Samw 	}
7355331Samw 
7365331Samw 	smb_smf_scf_fini(handle);
7375331Samw 
7385331Samw 	return (run_fg);
7395331Samw }
7405331Samw 
7415331Samw /*
7425331Samw  * smb_config_get_localsid
7435331Samw  *
7445331Samw  * Returns value of the "config/machine_sid" parameter
7455331Samw  * from the IDMAP SMF configuration repository.
7465331Samw  *
7475331Samw  */
7485331Samw char *
smb_config_get_localsid(void)7495331Samw smb_config_get_localsid(void)
7505331Samw {
7515331Samw 	return (smb_config_getenv_generic(MACHINE_SID, IDMAP_FMRI_PREFIX,
7525331Samw 	    IDMAP_PG_NAME));
7535331Samw }
7545331Samw 
7555331Samw /*
7565331Samw  * smb_config_set_idmap_domain
7575331Samw  *
7585521Sas200622  * Set the "config/domain_name" parameter from IDMAP SMF repository.
7595331Samw  */
7605331Samw int
smb_config_set_idmap_domain(char * value)7615331Samw smb_config_set_idmap_domain(char *value)
7625331Samw {
7635331Samw 	return (smb_config_setenv_generic(IDMAP_FMRI_PREFIX, IDMAP_PG_NAME,
7645521Sas200622 	    IDMAP_DOMAIN, value));
7655331Samw }
7665331Samw 
7675331Samw /*
7685331Samw  * smb_config_refresh_idmap
7695331Samw  *
7705331Samw  * Refresh IDMAP SMF service after making changes to its configuration.
7715331Samw  */
7725331Samw int
smb_config_refresh_idmap(void)7735331Samw smb_config_refresh_idmap(void)
7745331Samw {
7755331Samw 	char instance[32];
7765331Samw 
7775331Samw 	(void) snprintf(instance, sizeof (instance), "%s:default",
7785331Samw 	    IDMAP_FMRI_PREFIX);
7795331Samw 	return (smf_refresh_instance(instance));
7805331Samw }
7815331Samw 
7825331Samw int
smb_config_secmode_fromstr(char * secmode)7835331Samw smb_config_secmode_fromstr(char *secmode)
7845331Samw {
7855331Samw 	if (secmode == NULL)
7865331Samw 		return (SMB_SECMODE_WORKGRP);
7875331Samw 
7885331Samw 	if (strcasecmp(secmode, SMB_SECMODE_DOMAIN_STR) == 0)
7895331Samw 		return (SMB_SECMODE_DOMAIN);
7905331Samw 
7915331Samw 	return (SMB_SECMODE_WORKGRP);
7925331Samw }
7935331Samw 
7945331Samw char *
smb_config_secmode_tostr(int secmode)7955331Samw smb_config_secmode_tostr(int secmode)
7965331Samw {
7975331Samw 	if (secmode == SMB_SECMODE_DOMAIN)
7985331Samw 		return (SMB_SECMODE_DOMAIN_STR);
7995331Samw 
8005331Samw 	return (SMB_SECMODE_WORKGRP_STR);
8015331Samw }
8025331Samw 
8035331Samw int
smb_config_get_secmode()8045331Samw smb_config_get_secmode()
8055331Samw {
8065772Sas200622 	char p[16];
8075331Samw 
8085772Sas200622 	(void) smb_config_getstr(SMB_CI_SECURITY, p, sizeof (p));
8095331Samw 	return (smb_config_secmode_fromstr(p));
8105331Samw }
8115331Samw 
8125331Samw int
smb_config_set_secmode(int secmode)8135331Samw smb_config_set_secmode(int secmode)
8145331Samw {
8155331Samw 	char *p;
8165331Samw 
8175331Samw 	p = smb_config_secmode_tostr(secmode);
8185772Sas200622 	return (smb_config_setstr(SMB_CI_SECURITY, p));
8195331Samw }
8205772Sas200622 
8218334SJose.Borrego@Sun.COM void
smb_config_getdomaininfo(char * domain,char * fqdn,char * sid,char * forest,char * guid)8229832Samw@Sun.COM smb_config_getdomaininfo(char *domain, char *fqdn, char *sid, char *forest,
8239832Samw@Sun.COM     char *guid)
8248334SJose.Borrego@Sun.COM {
8259832Samw@Sun.COM 	if (domain)
8269832Samw@Sun.COM 		(void) smb_config_getstr(SMB_CI_DOMAIN_NAME, domain,
8279832Samw@Sun.COM 		    NETBIOS_NAME_SZ);
8289832Samw@Sun.COM 
8299832Samw@Sun.COM 	if (fqdn)
8309832Samw@Sun.COM 		(void) smb_config_getstr(SMB_CI_DOMAIN_FQDN, fqdn,
8319832Samw@Sun.COM 		    MAXHOSTNAMELEN);
8329832Samw@Sun.COM 
8339832Samw@Sun.COM 	if (sid)
8349832Samw@Sun.COM 		(void) smb_config_getstr(SMB_CI_DOMAIN_SID, sid,
8359832Samw@Sun.COM 		    SMB_SID_STRSZ);
8369832Samw@Sun.COM 
8379832Samw@Sun.COM 	if (forest)
8389832Samw@Sun.COM 		(void) smb_config_getstr(SMB_CI_DOMAIN_FOREST, forest,
8399832Samw@Sun.COM 		    MAXHOSTNAMELEN);
8409832Samw@Sun.COM 
8419832Samw@Sun.COM 	if (guid)
8429832Samw@Sun.COM 		(void) smb_config_getstr(SMB_CI_DOMAIN_GUID, guid,
8439832Samw@Sun.COM 		    UUID_PRINTABLE_STRING_LENGTH);
8448334SJose.Borrego@Sun.COM }
8458334SJose.Borrego@Sun.COM 
8468334SJose.Borrego@Sun.COM void
smb_config_setdomaininfo(char * domain,char * fqdn,char * sid,char * forest,char * guid)8479832Samw@Sun.COM smb_config_setdomaininfo(char *domain, char *fqdn, char *sid, char *forest,
8489832Samw@Sun.COM     char *guid)
8498334SJose.Borrego@Sun.COM {
8509832Samw@Sun.COM 	if (domain)
8519832Samw@Sun.COM 		(void) smb_config_setstr(SMB_CI_DOMAIN_NAME, domain);
8529832Samw@Sun.COM 	if (fqdn)
8539832Samw@Sun.COM 		(void) smb_config_setstr(SMB_CI_DOMAIN_FQDN, fqdn);
8549832Samw@Sun.COM 	if (sid)
8559832Samw@Sun.COM 		(void) smb_config_setstr(SMB_CI_DOMAIN_SID, sid);
8569832Samw@Sun.COM 	if (forest)
8579832Samw@Sun.COM 		(void) smb_config_setstr(SMB_CI_DOMAIN_FOREST, forest);
8589832Samw@Sun.COM 	if (guid)
8599832Samw@Sun.COM 		(void) smb_config_setstr(SMB_CI_DOMAIN_GUID, guid);
8608334SJose.Borrego@Sun.COM }
86111963SAfshin.Ardakani@Sun.COM 
86211963SAfshin.Ardakani@Sun.COM /*
86311963SAfshin.Ardakani@Sun.COM  * The version stored in SMF in string format as N.N where
86411963SAfshin.Ardakani@Sun.COM  * N is a number defined by Microsoft. The first number represents
86511963SAfshin.Ardakani@Sun.COM  * the major version and the second number is the minor version.
86611963SAfshin.Ardakani@Sun.COM  * Current defined values can be found here in 'ver_table'.
86711963SAfshin.Ardakani@Sun.COM  *
86811963SAfshin.Ardakani@Sun.COM  * This function reads the SMF string value and converts it to
86911963SAfshin.Ardakani@Sun.COM  * two numbers returned in the given 'version' structure.
87011963SAfshin.Ardakani@Sun.COM  * Current default version number is 5.0 which is for Windows 2000.
87111963SAfshin.Ardakani@Sun.COM  */
87211963SAfshin.Ardakani@Sun.COM void
smb_config_get_version(smb_version_t * version)87311963SAfshin.Ardakani@Sun.COM smb_config_get_version(smb_version_t *version)
87411963SAfshin.Ardakani@Sun.COM {
87511963SAfshin.Ardakani@Sun.COM 	smb_version_t tmpver;
87611963SAfshin.Ardakani@Sun.COM 	char verstr[SMB_VERSTR_LEN];
87711963SAfshin.Ardakani@Sun.COM 	char *p;
87811963SAfshin.Ardakani@Sun.COM 	int rc, i;
87911963SAfshin.Ardakani@Sun.COM 	static smb_version_t ver_table [] = {
880*13082SJoyce.McIntosh@Sun.COM 		{ 0, SMB_MAJOR_NT,	SMB_MINOR_NT,		1381,	0 },
881*13082SJoyce.McIntosh@Sun.COM 		{ 0, SMB_MAJOR_2000,	SMB_MINOR_2000,		2195,	0 },
882*13082SJoyce.McIntosh@Sun.COM 		{ 0, SMB_MAJOR_XP,	SMB_MINOR_XP,		2196,	0 },
883*13082SJoyce.McIntosh@Sun.COM 		{ 0, SMB_MAJOR_2003,	SMB_MINOR_2003,		2196,	0 },
884*13082SJoyce.McIntosh@Sun.COM 		{ 0, SMB_MAJOR_VISTA,	SMB_MINOR_VISTA,	6000,	0 },
885*13082SJoyce.McIntosh@Sun.COM 		{ 0, SMB_MAJOR_2008,	SMB_MINOR_2008,		6000,	0 },
886*13082SJoyce.McIntosh@Sun.COM 		{ 0, SMB_MAJOR_2008R2,	SMB_MINOR_2008R2,	7007,	0 },
887*13082SJoyce.McIntosh@Sun.COM 		{ 0, SMB_MAJOR_7,	SMB_MINOR_7,		7007,	0 }
88811963SAfshin.Ardakani@Sun.COM 	};
88911963SAfshin.Ardakani@Sun.COM 
89011963SAfshin.Ardakani@Sun.COM 	*version = ver_table[1];
891*13082SJoyce.McIntosh@Sun.COM 	version->sv_size = sizeof (smb_version_t);
89211963SAfshin.Ardakani@Sun.COM 
89311963SAfshin.Ardakani@Sun.COM 	rc = smb_config_getstr(SMB_CI_VERSION, verstr, sizeof (verstr));
89411963SAfshin.Ardakani@Sun.COM 	if (rc != SMBD_SMF_OK)
89511963SAfshin.Ardakani@Sun.COM 		return;
89611963SAfshin.Ardakani@Sun.COM 
89711963SAfshin.Ardakani@Sun.COM 	if ((p = strchr(verstr, '.')) == NULL)
89811963SAfshin.Ardakani@Sun.COM 		return;
89911963SAfshin.Ardakani@Sun.COM 
90011963SAfshin.Ardakani@Sun.COM 	*p = '\0';
90111963SAfshin.Ardakani@Sun.COM 	tmpver.sv_major = (uint8_t)atoi(verstr);
90211963SAfshin.Ardakani@Sun.COM 	tmpver.sv_minor = (uint8_t)atoi(p + 1);
90311963SAfshin.Ardakani@Sun.COM 
90411963SAfshin.Ardakani@Sun.COM 	for (i = 0; i < sizeof (ver_table)/sizeof (ver_table[0]); ++i) {
90511963SAfshin.Ardakani@Sun.COM 		if ((tmpver.sv_major == ver_table[i].sv_major) &&
90611963SAfshin.Ardakani@Sun.COM 		    (tmpver.sv_minor == ver_table[i].sv_minor)) {
90711963SAfshin.Ardakani@Sun.COM 			*version = ver_table[i];
908*13082SJoyce.McIntosh@Sun.COM 			version->sv_size = sizeof (smb_version_t);
90911963SAfshin.Ardakani@Sun.COM 			break;
91011963SAfshin.Ardakani@Sun.COM 		}
91111963SAfshin.Ardakani@Sun.COM 	}
91211963SAfshin.Ardakani@Sun.COM }
91311963SAfshin.Ardakani@Sun.COM 
91412508Samw@Sun.COM /*
91512508Samw@Sun.COM  * Reads share exec script properties
91612508Samw@Sun.COM  */
91712508Samw@Sun.COM uint32_t
smb_config_get_execinfo(char * map,char * unmap,size_t bufsz)91812508Samw@Sun.COM smb_config_get_execinfo(char *map, char *unmap, size_t bufsz)
91912508Samw@Sun.COM {
92012508Samw@Sun.COM 	char buf[MAXPATHLEN];
92112508Samw@Sun.COM 	uint32_t flags = 0;
92212508Samw@Sun.COM 
92312508Samw@Sun.COM 	if (map == NULL) {
92412508Samw@Sun.COM 		map = buf;
92512508Samw@Sun.COM 		bufsz = MAXPATHLEN;
92612508Samw@Sun.COM 	}
92712508Samw@Sun.COM 
92812508Samw@Sun.COM 	*map = '\0';
92912508Samw@Sun.COM 	(void) smb_config_getstr(SMB_CI_MAP, map, bufsz);
93012508Samw@Sun.COM 	if (*map != '\0')
93112508Samw@Sun.COM 		flags |= SMB_EXEC_MAP;
93212508Samw@Sun.COM 
93312508Samw@Sun.COM 	if (unmap == NULL) {
93412508Samw@Sun.COM 		unmap = buf;
93512508Samw@Sun.COM 		bufsz = MAXPATHLEN;
93612508Samw@Sun.COM 	}
93712508Samw@Sun.COM 
93812508Samw@Sun.COM 	*unmap = '\0';
93912508Samw@Sun.COM 	(void) smb_config_getstr(SMB_CI_UNMAP, unmap, bufsz);
94012508Samw@Sun.COM 	if (*unmap != '\0')
94112508Samw@Sun.COM 		flags |= SMB_EXEC_UNMAP;
94212508Samw@Sun.COM 
94312508Samw@Sun.COM 	*buf = '\0';
94412508Samw@Sun.COM 	(void) smb_config_getstr(SMB_CI_DISPOSITION, buf, sizeof (buf));
94512508Samw@Sun.COM 	if (*buf != '\0')
94612508Samw@Sun.COM 		if (strcasecmp(buf, SMB_EXEC_DISP_TERMINATE) == 0)
94712508Samw@Sun.COM 			flags |= SMB_EXEC_TERM;
94812508Samw@Sun.COM 
94912508Samw@Sun.COM 	return (flags);
95012508Samw@Sun.COM }
95112508Samw@Sun.COM 
95211963SAfshin.Ardakani@Sun.COM static smb_cfg_param_t *
smb_config_getent(smb_cfg_id_t id)95311963SAfshin.Ardakani@Sun.COM smb_config_getent(smb_cfg_id_t id)
95411963SAfshin.Ardakani@Sun.COM {
95511963SAfshin.Ardakani@Sun.COM 	int i;
95611963SAfshin.Ardakani@Sun.COM 
95711963SAfshin.Ardakani@Sun.COM 	for (i = 0; i < SMB_CI_MAX; i++)
95811963SAfshin.Ardakani@Sun.COM 		if (smb_cfg_table[i].sc_id == id)
95911963SAfshin.Ardakani@Sun.COM 			return (&smb_cfg_table[id]);
96011963SAfshin.Ardakani@Sun.COM 
96111963SAfshin.Ardakani@Sun.COM 	assert(0);
96211963SAfshin.Ardakani@Sun.COM 	return (NULL);
96311963SAfshin.Ardakani@Sun.COM }
964