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