1*da6c28aaSamw /* 2*da6c28aaSamw * CDDL HEADER START 3*da6c28aaSamw * 4*da6c28aaSamw * The contents of this file are subject to the terms of the 5*da6c28aaSamw * Common Development and Distribution License (the "License"). 6*da6c28aaSamw * You may not use this file except in compliance with the License. 7*da6c28aaSamw * 8*da6c28aaSamw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*da6c28aaSamw * or http://www.opensolaris.org/os/licensing. 10*da6c28aaSamw * See the License for the specific language governing permissions 11*da6c28aaSamw * and limitations under the License. 12*da6c28aaSamw * 13*da6c28aaSamw * When distributing Covered Code, include this CDDL HEADER in each 14*da6c28aaSamw * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*da6c28aaSamw * If applicable, add the following below this CDDL HEADER, with the 16*da6c28aaSamw * fields enclosed by brackets "[]" replaced with your own identifying 17*da6c28aaSamw * information: Portions Copyright [yyyy] [name of copyright owner] 18*da6c28aaSamw * 19*da6c28aaSamw * CDDL HEADER END 20*da6c28aaSamw */ 21*da6c28aaSamw /* 22*da6c28aaSamw * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 23*da6c28aaSamw * Use is subject to license terms. 24*da6c28aaSamw */ 25*da6c28aaSamw 26*da6c28aaSamw #ifndef _LIBSMB_H 27*da6c28aaSamw #define _LIBSMB_H 28*da6c28aaSamw 29*da6c28aaSamw #pragma ident "%Z%%M% %I% %E% SMI" 30*da6c28aaSamw 31*da6c28aaSamw #ifdef __cplusplus 32*da6c28aaSamw extern "C" { 33*da6c28aaSamw #endif 34*da6c28aaSamw 35*da6c28aaSamw #include <sys/types.h> 36*da6c28aaSamw #include <arpa/inet.h> 37*da6c28aaSamw 38*da6c28aaSamw #include <stdlib.h> 39*da6c28aaSamw #include <libscf.h> 40*da6c28aaSamw #include <libshare.h> 41*da6c28aaSamw 42*da6c28aaSamw #include <smbsrv/smb_idmap.h> 43*da6c28aaSamw 44*da6c28aaSamw /* 45*da6c28aaSamw * XXX - These header files are here, only because other libraries 46*da6c28aaSamw * can compile. Move the header files in to the internal header files 47*da6c28aaSamw * of other libraries, once the restructure is complete. libsmb.h does not 48*da6c28aaSamw * need these header files. 49*da6c28aaSamw */ 50*da6c28aaSamw #include <smbsrv/lmshare.h> 51*da6c28aaSamw #include <smbsrv/lmshare_door.h> 52*da6c28aaSamw #include <smbsrv/ntstatus.h> 53*da6c28aaSamw #include <smbsrv/smb_door_svc.h> 54*da6c28aaSamw #include <smbsrv/alloc.h> 55*da6c28aaSamw #include <smbsrv/codepage.h> 56*da6c28aaSamw #include <smbsrv/crypt.h> 57*da6c28aaSamw #include <smbsrv/ctype.h> 58*da6c28aaSamw #include <smbsrv/hash_table.h> 59*da6c28aaSamw #include <smbsrv/msgbuf.h> 60*da6c28aaSamw #include <smbsrv/oem.h> 61*da6c28aaSamw #include <smbsrv/string.h> 62*da6c28aaSamw #include <smbsrv/smb_i18n.h> 63*da6c28aaSamw #include <smbsrv/wintypes.h> 64*da6c28aaSamw #include <smbsrv/smb_xdr.h> 65*da6c28aaSamw #include <smbsrv/smbinfo.h> 66*da6c28aaSamw /* End of header files to be removed. */ 67*da6c28aaSamw 68*da6c28aaSamw /* Max value length of all SMB properties */ 69*da6c28aaSamw #define MAX_VALUE_BUFLEN 512 70*da6c28aaSamw #define SMB_PI_MAX_DOMAIN_U 48 71*da6c28aaSamw 72*da6c28aaSamw #define SMBD_FMRI_PREFIX "network/smb/server" 73*da6c28aaSamw #define SMBD_DEFAULT_INSTANCE_FMRI "svc:/network/smb/server:default" 74*da6c28aaSamw #define SMBD_PG_NAME "smbd" 75*da6c28aaSamw #define SMBD_PROTECTED_PG_NAME "read" 76*da6c28aaSamw 77*da6c28aaSamw #define SMBD_SMF_OK 0 78*da6c28aaSamw #define SMBD_SMF_NO_MEMORY 1 /* no memory for data structures */ 79*da6c28aaSamw #define SMBD_SMF_SYSTEM_ERR 2 /* system error, use errno */ 80*da6c28aaSamw #define SMBD_SMF_NO_PERMISSION 3 /* no permission for operation */ 81*da6c28aaSamw 82*da6c28aaSamw #define SCH_STATE_UNINIT 0 83*da6c28aaSamw #define SCH_STATE_INITIALIZING 1 84*da6c28aaSamw #define SCH_STATE_INIT 2 85*da6c28aaSamw 86*da6c28aaSamw typedef struct smb_scfhandle { 87*da6c28aaSamw scf_handle_t *scf_handle; 88*da6c28aaSamw int scf_state; 89*da6c28aaSamw scf_service_t *scf_service; 90*da6c28aaSamw scf_scope_t *scf_scope; 91*da6c28aaSamw scf_transaction_t *scf_trans; 92*da6c28aaSamw scf_transaction_entry_t *scf_entry; 93*da6c28aaSamw scf_propertygroup_t *scf_pg; 94*da6c28aaSamw scf_instance_t *scf_instance; 95*da6c28aaSamw scf_iter_t *scf_inst_iter; 96*da6c28aaSamw scf_iter_t *scf_pg_iter; 97*da6c28aaSamw } smb_scfhandle_t; 98*da6c28aaSamw 99*da6c28aaSamw /* 100*da6c28aaSamw * CIFS Configuration Management 101*da6c28aaSamw */ 102*da6c28aaSamw 103*da6c28aaSamw /* macros for the description of all config params */ 104*da6c28aaSamw #define SMB_CD_RDR_IPCMODE "rdr_ipcmode" 105*da6c28aaSamw #define SMB_CD_RDR_IPCUSER "rdr_ipcuser" 106*da6c28aaSamw #define SMB_CD_RDR_IPCPWD "rdr_ipcpasswd" 107*da6c28aaSamw 108*da6c28aaSamw #define SMB_CD_OPLOCK_ENABLE "oplock_enable" 109*da6c28aaSamw #define SMB_CD_OPLOCK_TIMEOUT "oplock_timeout" 110*da6c28aaSamw 111*da6c28aaSamw #define SMB_CD_AUTOHOME_MAP "autohome_map" 112*da6c28aaSamw 113*da6c28aaSamw #define SMB_CD_DOMAIN_SID "domain_sid" 114*da6c28aaSamw #define SMB_CD_DOMAIN_MEMB "domain_member" 115*da6c28aaSamw #define SMB_CD_DOMAIN_NAME "domain_name" 116*da6c28aaSamw #define SMB_CD_DOMAIN_SRV "pdc" 117*da6c28aaSamw 118*da6c28aaSamw #define SMB_CD_WINS_SRV1 "wins_server_1" 119*da6c28aaSamw #define SMB_CD_WINS_SRV2 "wins_server_2" 120*da6c28aaSamw #define SMB_CD_WINS_EXCL "wins_exclude" 121*da6c28aaSamw 122*da6c28aaSamw #define SMB_CD_SRVSVC_SHRSET_ENABLE "srvsvc_sharesetinfo_enable" 123*da6c28aaSamw #define SMB_CD_LOGR_ENABLE "logr_enable" 124*da6c28aaSamw #define SMB_CD_MLRPC_KALIVE "mlrpc_keep_alive_interval" 125*da6c28aaSamw 126*da6c28aaSamw #define SMB_CD_MAX_BUFSIZE "max_bufsize" 127*da6c28aaSamw #define SMB_CD_MAX_WORKERS "max_workers" 128*da6c28aaSamw #define SMB_CD_MAX_CONNECTIONS "max_connections" 129*da6c28aaSamw #define SMB_CD_KEEPALIVE "keep_alive" 130*da6c28aaSamw #define SMB_CD_RESTRICT_ANON "restrict_anonymous" 131*da6c28aaSamw 132*da6c28aaSamw #define SMB_CD_SIGNING_ENABLE "signing_enabled" 133*da6c28aaSamw #define SMB_CD_SIGNING_REQD "signing_required" 134*da6c28aaSamw #define SMB_CD_SIGNING_CHECK "signing_check" 135*da6c28aaSamw 136*da6c28aaSamw #define SMB_CD_FLUSH_REQUIRED "flush_required" 137*da6c28aaSamw #define SMB_CD_SYNC_ENABLE "sync_enable" 138*da6c28aaSamw #define SMB_CD_DIRSYMLINK_DISABLE "dir_symlink_disable" 139*da6c28aaSamw #define SMB_CD_ANNONCE_QUOTA "announce_quota" 140*da6c28aaSamw 141*da6c28aaSamw #define SMB_CD_SECURITY "security" 142*da6c28aaSamw #define SMB_CD_NBSCOPE "netbios_scope" 143*da6c28aaSamw #define SMB_CD_SYS_CMNT "system_comment" 144*da6c28aaSamw #define SMB_CD_LM_LEVEL "lmauth_level" 145*da6c28aaSamw #define SMB_CD_MSDCS_DISABLE "msdcs_disable" 146*da6c28aaSamw 147*da6c28aaSamw #define SMB_CD_ADS_ENABLE "ads_enable" 148*da6c28aaSamw #define SMB_CD_ADS_USER "ads_user" 149*da6c28aaSamw #define SMB_CD_ADS_PASSWD "ads_passwd" 150*da6c28aaSamw #define SMB_CD_ADS_DOMAIN "ads_domain" 151*da6c28aaSamw #define SMB_CD_ADS_USER_CONTAINER "ads_user_container" 152*da6c28aaSamw #define SMB_CD_ADS_SITE "ads_site" 153*da6c28aaSamw #define SMB_CD_ADS_IPLOOKUP "ads_ip_lookup" 154*da6c28aaSamw 155*da6c28aaSamw #define SMB_CD_DYNDNS_ENABLE "ddns_enable" 156*da6c28aaSamw #define SMB_CD_DYNDNS_RETRY_COUNT "ddns_retry_cnt" 157*da6c28aaSamw #define SMB_CD_DYNDNS_RETRY_SEC "ddns_retry_sec" 158*da6c28aaSamw 159*da6c28aaSamw #define SMB_CD_MACHINE_PASSWD "machine_passwd" 160*da6c28aaSamw 161*da6c28aaSamw /* configuration identifier */ 162*da6c28aaSamw typedef enum { 163*da6c28aaSamw SMB_CI_RDR_IPCMODE = 0, 164*da6c28aaSamw SMB_CI_RDR_IPCUSER, 165*da6c28aaSamw SMB_CI_RDR_IPCPWD, 166*da6c28aaSamw 167*da6c28aaSamw SMB_CI_OPLOCK_ENABLE, 168*da6c28aaSamw SMB_CI_OPLOCK_TIMEOUT, 169*da6c28aaSamw 170*da6c28aaSamw SMB_CI_AUTOHOME_MAP, 171*da6c28aaSamw 172*da6c28aaSamw SMB_CI_DOMAIN_SID, 173*da6c28aaSamw SMB_CI_DOMAIN_MEMB, 174*da6c28aaSamw SMB_CI_DOMAIN_NAME, 175*da6c28aaSamw SMB_CI_DOMAIN_SRV, 176*da6c28aaSamw 177*da6c28aaSamw SMB_CI_WINS_SRV1, 178*da6c28aaSamw SMB_CI_WINS_SRV2, 179*da6c28aaSamw SMB_CI_WINS_EXCL, 180*da6c28aaSamw 181*da6c28aaSamw SMB_CI_SRVSVC_SHRSET_ENABLE, 182*da6c28aaSamw SMB_CI_LOGR_ENABLE, 183*da6c28aaSamw SMB_CI_MLRPC_KALIVE, 184*da6c28aaSamw 185*da6c28aaSamw SMB_CI_MAX_BUFSIZE, 186*da6c28aaSamw SMB_CI_MAX_WORKERS, 187*da6c28aaSamw SMB_CI_MAX_CONNECTIONS, 188*da6c28aaSamw SMB_CI_KEEPALIVE, 189*da6c28aaSamw SMB_CI_RESTRICT_ANON, 190*da6c28aaSamw 191*da6c28aaSamw SMB_CI_SIGNING_ENABLE, 192*da6c28aaSamw SMB_CI_SIGNING_REQD, 193*da6c28aaSamw SMB_CI_SIGNING_CHECK, 194*da6c28aaSamw 195*da6c28aaSamw SMB_CI_FLUSH_REQUIRED, 196*da6c28aaSamw SMB_CI_SYNC_ENABLE, 197*da6c28aaSamw SMB_CI_DIRSYMLINK_DISABLE, 198*da6c28aaSamw SMB_CI_ANNONCE_QUOTA, 199*da6c28aaSamw 200*da6c28aaSamw SMB_CI_SECURITY, 201*da6c28aaSamw SMB_CI_NBSCOPE, 202*da6c28aaSamw SMB_CI_SYS_CMNT, 203*da6c28aaSamw SMB_CI_LM_LEVEL, 204*da6c28aaSamw SMB_CI_MSDCS_DISABLE, 205*da6c28aaSamw 206*da6c28aaSamw SMB_CI_ADS_ENABLE, 207*da6c28aaSamw SMB_CI_ADS_USER, 208*da6c28aaSamw SMB_CI_ADS_PASSWD, 209*da6c28aaSamw SMB_CI_ADS_DOMAIN, 210*da6c28aaSamw SMB_CI_ADS_USER_CONTAINER, 211*da6c28aaSamw SMB_CI_ADS_SITE, 212*da6c28aaSamw SMB_CI_ADS_IPLOOKUP, 213*da6c28aaSamw 214*da6c28aaSamw SMB_CI_DYNDNS_ENABLE, 215*da6c28aaSamw SMB_CI_DYNDNS_RETRY_COUNT, 216*da6c28aaSamw SMB_CI_DYNDNS_RETRY_SEC, 217*da6c28aaSamw 218*da6c28aaSamw SMB_CI_MACHINE_PASSWD, 219*da6c28aaSamw SMB_CI_MAX 220*da6c28aaSamw } smb_cfg_id_t; 221*da6c28aaSamw 222*da6c28aaSamw /* SMF helper functions */ 223*da6c28aaSamw extern smb_scfhandle_t *smb_smf_scf_init(char *); 224*da6c28aaSamw extern void smb_smf_scf_fini(smb_scfhandle_t *); 225*da6c28aaSamw extern int smb_smf_start_transaction(smb_scfhandle_t *); 226*da6c28aaSamw extern int smb_smf_end_transaction(smb_scfhandle_t *); 227*da6c28aaSamw extern int smb_smf_set_string_property(smb_scfhandle_t *, char *, char *); 228*da6c28aaSamw extern int smb_smf_get_string_property(smb_scfhandle_t *, char *, 229*da6c28aaSamw char *, size_t); 230*da6c28aaSamw extern int smb_smf_set_integer_property(smb_scfhandle_t *, char *, int64_t); 231*da6c28aaSamw extern int smb_smf_get_integer_property(smb_scfhandle_t *, char *, int64_t *); 232*da6c28aaSamw extern int smb_smf_set_boolean_property(smb_scfhandle_t *, char *, uint8_t); 233*da6c28aaSamw extern int smb_smf_get_boolean_property(smb_scfhandle_t *, char *, uint8_t *); 234*da6c28aaSamw extern int smb_smf_set_opaque_property(smb_scfhandle_t *, char *, 235*da6c28aaSamw void *, size_t); 236*da6c28aaSamw extern int smb_smf_get_opaque_property(smb_scfhandle_t *, char *, 237*da6c28aaSamw void *, size_t); 238*da6c28aaSamw extern int smb_smf_create_service_pgroup(smb_scfhandle_t *, char *); 239*da6c28aaSamw extern int smb_smf_delete_service_pgroup(smb_scfhandle_t *, char *); 240*da6c28aaSamw extern int smb_smf_create_instance_pgroup(smb_scfhandle_t *, char *); 241*da6c28aaSamw extern int smb_smf_delete_instance_pgroup(smb_scfhandle_t *, char *); 242*da6c28aaSamw extern int smb_smf_delete_property(smb_scfhandle_t *, char *); 243*da6c28aaSamw extern int smb_smf_instance_exists(smb_scfhandle_t *, char *); 244*da6c28aaSamw extern int smb_smf_instance_create(smb_scfhandle_t *, char *, char *); 245*da6c28aaSamw extern int smb_smf_instance_delete(smb_scfhandle_t *, char *); 246*da6c28aaSamw extern smb_scfhandle_t *smb_smf_get_iterator(char *); 247*da6c28aaSamw extern int smb_smf_get_property(smb_scfhandle_t *, int, char *, char *, 248*da6c28aaSamw size_t); 249*da6c28aaSamw extern int smb_smf_set_property(smb_scfhandle_t *, int, char *, char *); 250*da6c28aaSamw 251*da6c28aaSamw /* Configuration management functions */ 252*da6c28aaSamw extern int smb_config_load(void); 253*da6c28aaSamw extern void smb_config_rdlock(void); 254*da6c28aaSamw extern void smb_config_wrlock(void); 255*da6c28aaSamw extern void smb_config_unlock(void); 256*da6c28aaSamw extern char *smb_config_get(smb_cfg_id_t); 257*da6c28aaSamw extern char *smb_config_getstr(smb_cfg_id_t); 258*da6c28aaSamw extern int smb_config_getyorn(smb_cfg_id_t); 259*da6c28aaSamw extern uint32_t smb_config_getnum(smb_cfg_id_t); 260*da6c28aaSamw 261*da6c28aaSamw /* 262*da6c28aaSamw * smb_config_getenv 263*da6c28aaSamw * 264*da6c28aaSamw * Retrieves the property value from SMF. 265*da6c28aaSamw * Caller must free the returned buffer. 266*da6c28aaSamw * 267*da6c28aaSamw */ 268*da6c28aaSamw extern char *smb_config_getenv(smb_cfg_id_t id); 269*da6c28aaSamw 270*da6c28aaSamw extern int smb_config_set(smb_cfg_id_t, char *); 271*da6c28aaSamw extern int smb_config_setnum(smb_cfg_id_t, uint32_t); 272*da6c28aaSamw extern uint8_t smb_config_get_fg_flag(void); 273*da6c28aaSamw extern int smb_config_setenv(smb_cfg_id_t id, char *); 274*da6c28aaSamw extern char *smb_config_get_localsid(void); 275*da6c28aaSamw extern int smb_config_secmode_fromstr(char *secmode); 276*da6c28aaSamw extern char *smb_config_secmode_tostr(int secmode); 277*da6c28aaSamw extern int smb_config_get_secmode(void); 278*da6c28aaSamw extern int smb_config_set_secmode(int secmode); 279*da6c28aaSamw extern int smb_config_set_idmap_domain(char *value); 280*da6c28aaSamw extern int smb_config_set_idmap_gc(char *value); 281*da6c28aaSamw extern int smb_config_refresh_idmap(void); 282*da6c28aaSamw 283*da6c28aaSamw /* smb_door_client.c */ 284*da6c28aaSamw typedef struct smb_joininfo { 285*da6c28aaSamw char domain_name[SMB_PI_MAX_DOMAIN]; 286*da6c28aaSamw char domain_username[BUF_LEN + 1]; 287*da6c28aaSamw char domain_passwd[BUF_LEN + 1]; 288*da6c28aaSamw uint32_t mode; 289*da6c28aaSamw } smb_joininfo_t; 290*da6c28aaSamw 291*da6c28aaSamw /* APIs to communicate with SMB daemon via door calls */ 292*da6c28aaSamw extern int smbd_set_param(smb_cfg_id_t, char *); 293*da6c28aaSamw extern int smbd_get_param(smb_cfg_id_t, char *); 294*da6c28aaSamw extern int smbd_get_security_mode(int *); 295*da6c28aaSamw extern int smbd_netbios_reconfig(void); 296*da6c28aaSamw extern uint32_t smb_join(smb_joininfo_t *info); 297*da6c28aaSamw 298*da6c28aaSamw 299*da6c28aaSamw #define SMB_DOMAIN_NOMACHINE_SID -1 300*da6c28aaSamw #define SMB_DOMAIN_NODOMAIN_SID -2 301*da6c28aaSamw 302*da6c28aaSamw extern int nt_domain_init(char *resource_domain, uint32_t secmode); 303*da6c28aaSamw 304*da6c28aaSamw /* Following set of functions, manipulate WINS server configuration */ 305*da6c28aaSamw extern int smb_wins_allow_list(char *config_list, char *allow_list); 306*da6c28aaSamw extern int smb_wins_exclude_list(char *config_list, char *exclude_list); 307*da6c28aaSamw extern boolean_t smb_wins_is_excluded(in_addr_t ipaddr, 308*da6c28aaSamw unsigned long *exclude_list, int nexclude); 309*da6c28aaSamw extern void smb_wins_build_list(char *buf, uint32_t iplist[], int max_naddr); 310*da6c28aaSamw extern int smb_wins_iplist(char *list, uint32_t iplist[], int max_naddr); 311*da6c28aaSamw 312*da6c28aaSamw /* 313*da6c28aaSamw * Information on a particular domain: the domain name, the 314*da6c28aaSamw * name of a controller (PDC or BDC) and it's ip address. 315*da6c28aaSamw */ 316*da6c28aaSamw typedef struct smb_ntdomain { 317*da6c28aaSamw char domain[SMB_PI_MAX_DOMAIN_U]; 318*da6c28aaSamw char server[SMB_PI_MAX_DOMAIN_U]; 319*da6c28aaSamw uint32_t ipaddr; 320*da6c28aaSamw } smb_ntdomain_t; 321*da6c28aaSamw 322*da6c28aaSamw /* SMB domain information management functions */ 323*da6c28aaSamw extern void smb_purge_domain_info(void); 324*da6c28aaSamw extern int smb_is_domain_member(void); 325*da6c28aaSamw extern uint8_t smb_get_fg_flag(void); 326*da6c28aaSamw extern void smb_set_domain_member(int set); 327*da6c28aaSamw extern smb_ntdomain_t *smb_getdomaininfo(uint32_t timeout); 328*da6c28aaSamw extern void smb_setdomaininfo(char *domain, char *server, uint32_t ipaddr); 329*da6c28aaSamw extern void smb_logdomaininfo(smb_ntdomain_t *di); 330*da6c28aaSamw extern uint32_t smb_get_security_mode(void); 331*da6c28aaSamw 332*da6c28aaSamw extern int nt_priv_presentable_num(void); 333*da6c28aaSamw 334*da6c28aaSamw /* 335*da6c28aaSamw * Following set of function, handle calls to SMB Kernel driver, via 336*da6c28aaSamw * Kernel doors interface. 337*da6c28aaSamw */ 338*da6c28aaSamw extern uint64_t smb_dwncall_user_num(void); 339*da6c28aaSamw extern int smb_dwncall_share(int, char *, char *); 340*da6c28aaSamw 341*da6c28aaSamw /* 342*da6c28aaSamw * buffer context structure. This is used to keep track of the buffer 343*da6c28aaSamw * context. 344*da6c28aaSamw * 345*da6c28aaSamw * basep: points to the beginning of the buffer 346*da6c28aaSamw * curp: points to the current offset 347*da6c28aaSamw * endp: points to the limit of the buffer 348*da6c28aaSamw */ 349*da6c28aaSamw typedef struct { 350*da6c28aaSamw unsigned char *basep; 351*da6c28aaSamw unsigned char *curp; 352*da6c28aaSamw unsigned char *endp; 353*da6c28aaSamw } smb_ctxbuf_t; 354*da6c28aaSamw 355*da6c28aaSamw extern int smb_ctxbuf_init(smb_ctxbuf_t *ctx, unsigned char *buf, 356*da6c28aaSamw size_t buflen); 357*da6c28aaSamw extern int smb_ctxbuf_len(smb_ctxbuf_t *ctx); 358*da6c28aaSamw extern int smb_ctxbuf_printf(smb_ctxbuf_t *ctx, const char *fmt, ...); 359*da6c28aaSamw 360*da6c28aaSamw /* Functions to handle SMB daemon communications with idmap service */ 361*da6c28aaSamw extern int smb_idmap_start(void); 362*da6c28aaSamw extern void smb_idmap_stop(void); 363*da6c28aaSamw extern int smb_idmap_restart(void); 364*da6c28aaSamw 365*da6c28aaSamw /* Miscellaneous functions */ 366*da6c28aaSamw extern void hexdump(unsigned char *, int); 367*da6c28aaSamw extern size_t bintohex(const char *, size_t, char *, size_t); 368*da6c28aaSamw extern size_t hextobin(const char *, size_t, char *, size_t); 369*da6c28aaSamw extern char *trim_whitespace(char *buf); 370*da6c28aaSamw extern void randomize(char *, unsigned); 371*da6c28aaSamw extern void rand_hash(unsigned char *, size_t, unsigned char *, size_t); 372*da6c28aaSamw 373*da6c28aaSamw extern int smb_getdomainname(char *, size_t); 374*da6c28aaSamw extern int smb_getfqhostname(char *, size_t); 375*da6c28aaSamw extern int smb_gethostname(char *, size_t, int); 376*da6c28aaSamw extern int smb_getnetbiosname(char *, size_t); 377*da6c28aaSamw 378*da6c28aaSamw void smb_trace(const char *s); 379*da6c28aaSamw void smb_tracef(const char *fmt, ...); 380*da6c28aaSamw 381*da6c28aaSamw /* 382*da6c28aaSamw * Authentication 383*da6c28aaSamw */ 384*da6c28aaSamw 385*da6c28aaSamw #define SMBAUTH_LM_MAGIC_STR "KGS!@#$%" 386*da6c28aaSamw 387*da6c28aaSamw #define SMBAUTH_HASH_SZ 16 /* also LM/NTLM/NTLMv2 Hash size */ 388*da6c28aaSamw #define SMBAUTH_LM_RESP_SZ 24 /* also NTLM Response size */ 389*da6c28aaSamw #define SMBAUTH_LM_PWD_SZ 14 /* LM password size */ 390*da6c28aaSamw #define SMBAUTH_V2_CLNT_CHALLENGE_SZ 8 /* both LMv2 and NTLMv2 */ 391*da6c28aaSamw #define SMBAUTH_SESSION_KEY_SZ SMBAUTH_HASH_SZ 392*da6c28aaSamw #define SMBAUTH_HEXHASH_SZ (SMBAUTH_HASH_SZ * 2) 393*da6c28aaSamw 394*da6c28aaSamw #define SMBAUTH_FAILURE 1 395*da6c28aaSamw #define SMBAUTH_SUCCESS 0 396*da6c28aaSamw #define MD_DIGEST_LEN 16 397*da6c28aaSamw 398*da6c28aaSamw /* 399*da6c28aaSamw * Name Types 400*da6c28aaSamw * 401*da6c28aaSamw * The list of names near the end of the data blob (i.e. the ndb_names 402*da6c28aaSamw * field of the smb_auth_data_blob_t data structure) can be classify into 403*da6c28aaSamw * the following types: 404*da6c28aaSamw * 405*da6c28aaSamw * 0x0000 Indicates the end of the list. 406*da6c28aaSamw * 0x0001 The name is a NetBIOS machine name (e.g. server name) 407*da6c28aaSamw * 0x0002 The name is an NT Domain NetBIOS name. 408*da6c28aaSamw * 0x0003 The name is the server's DNS hostname. 409*da6c28aaSamw * 0x0004 The name is a W2K Domain name (a DNS name). 410*da6c28aaSamw */ 411*da6c28aaSamw #define SMBAUTH_NAME_TYPE_LIST_END 0x0000 412*da6c28aaSamw #define SMBAUTH_NAME_TYPE_SERVER_NETBIOS 0x0001 413*da6c28aaSamw #define SMBAUTH_NAME_TYPE_DOMAIN_NETBIOS 0x0002 414*da6c28aaSamw #define SMBAUTH_NAME_TYPE_SERVER_DNS 0x0003 415*da6c28aaSamw #define SMBAUTH_NAME_TYPE_DOMAIN_DNS 0x0004 416*da6c28aaSamw 417*da6c28aaSamw /* 418*da6c28aaSamw * smb_auth_name_entry_t 419*da6c28aaSamw * 420*da6c28aaSamw * Each name entry in the data blob consists of the following 3 fields: 421*da6c28aaSamw * 422*da6c28aaSamw * nne_type - name type 423*da6c28aaSamw * nne_len - the length of the name 424*da6c28aaSamw * nne_name - the name, in uppercase UCS-2LE Unicode format 425*da6c28aaSamw */ 426*da6c28aaSamw typedef struct smb_auth_name_entry { 427*da6c28aaSamw unsigned short nne_type; 428*da6c28aaSamw unsigned short nne_len; 429*da6c28aaSamw mts_wchar_t nne_name[SMB_PI_MAX_DOMAIN * 2]; 430*da6c28aaSamw } smb_auth_name_entry_t; 431*da6c28aaSamw 432*da6c28aaSamw /* 433*da6c28aaSamw * smb_auth_data_blob 434*da6c28aaSamw * 435*da6c28aaSamw * The format of this NTLMv2 data blob structure is as follow: 436*da6c28aaSamw * 437*da6c28aaSamw * - Blob Signature 0x01010000 (4 bytes) 438*da6c28aaSamw * - Reserved (0x00000000) (4 bytes) 439*da6c28aaSamw * - Timestamp Little-endian, 64-bit signed value representing 440*da6c28aaSamw * the number of tenths of a microsecond since January 1, 1601. 441*da6c28aaSamw * (8 bytes) 442*da6c28aaSamw * - Client Challenge (8 bytes) 443*da6c28aaSamw * - Unknown1 (4 bytes) 444*da6c28aaSamw * - List of Target Information (variable length) 445*da6c28aaSamw * - Unknown2 (4 bytes) 446*da6c28aaSamw */ 447*da6c28aaSamw typedef struct smb_auth_data_blob { 448*da6c28aaSamw unsigned char ndb_signature[4]; 449*da6c28aaSamw unsigned char ndb_reserved[4]; 450*da6c28aaSamw uint64_t ndb_timestamp; 451*da6c28aaSamw unsigned char ndb_clnt_challenge[SMBAUTH_V2_CLNT_CHALLENGE_SZ]; 452*da6c28aaSamw unsigned char ndb_unknown[4]; 453*da6c28aaSamw smb_auth_name_entry_t ndb_names[2]; 454*da6c28aaSamw unsigned char ndb_unknown2[4]; 455*da6c28aaSamw } smb_auth_data_blob_t; 456*da6c28aaSamw 457*da6c28aaSamw #define SMBAUTH_BLOB_MAXLEN (sizeof (smb_auth_data_blob_t)) 458*da6c28aaSamw #define SMBAUTH_CI_MAXLEN SMBAUTH_LM_RESP_SZ 459*da6c28aaSamw #define SMBAUTH_CS_MAXLEN (SMBAUTH_BLOB_MAXLEN + SMBAUTH_HASH_SZ) 460*da6c28aaSamw 461*da6c28aaSamw /* 462*da6c28aaSamw * smb_auth_info_t 463*da6c28aaSamw * 464*da6c28aaSamw * The structure contains all the authentication information 465*da6c28aaSamw * needed for the preparaton of the SMBSessionSetupAndx request 466*da6c28aaSamw * and the user session key. 467*da6c28aaSamw * 468*da6c28aaSamw * hash - NTLM hash 469*da6c28aaSamw * hash_v2 - NTLMv2 hash 470*da6c28aaSamw * ci_len - the length of the case-insensitive password 471*da6c28aaSamw * ci - case-insensitive password 472*da6c28aaSamw * (If NTLMv2 authentication mechanism is used, it 473*da6c28aaSamw * represents the LMv2 response. Otherwise, it 474*da6c28aaSamw * is empty.) 475*da6c28aaSamw * cs_len - the length of the case-sensitive password 476*da6c28aaSamw * cs - case-sensitive password 477*da6c28aaSamw * (If NTLMv2 authentication mechanism is used, it 478*da6c28aaSamw * represents the NTLMv2 response. Otherwise, it 479*da6c28aaSamw * represents the NTLM response.) 480*da6c28aaSamw * data_blob - NTLMv2 data blob 481*da6c28aaSamw */ 482*da6c28aaSamw typedef struct smb_auth_info { 483*da6c28aaSamw unsigned char hash[SMBAUTH_HASH_SZ]; 484*da6c28aaSamw unsigned char hash_v2[SMBAUTH_HASH_SZ]; 485*da6c28aaSamw unsigned short ci_len; 486*da6c28aaSamw unsigned char ci[SMBAUTH_CI_MAXLEN]; 487*da6c28aaSamw unsigned short cs_len; 488*da6c28aaSamw unsigned char cs[SMBAUTH_CS_MAXLEN]; 489*da6c28aaSamw int lmcompatibility_lvl; 490*da6c28aaSamw smb_auth_data_blob_t data_blob; 491*da6c28aaSamw } smb_auth_info_t; 492*da6c28aaSamw 493*da6c28aaSamw extern int smb_getdomainname(char *, size_t); 494*da6c28aaSamw extern int smb_getfqhostname(char *, size_t); 495*da6c28aaSamw extern int smb_gethostname(char *, size_t, int); 496*da6c28aaSamw extern int smb_getnetbiosname(char *, size_t); 497*da6c28aaSamw 498*da6c28aaSamw void smb_trace(const char *s); 499*da6c28aaSamw void smb_tracef(const char *fmt, ...); 500*da6c28aaSamw 501*da6c28aaSamw /* 502*da6c28aaSamw * SMB password management 503*da6c28aaSamw */ 504*da6c28aaSamw 505*da6c28aaSamw #define SMB_PWF_LM 0x01 /* LM hash is present */ 506*da6c28aaSamw #define SMB_PWF_NT 0x02 /* NT hash is present */ 507*da6c28aaSamw #define SMB_PWF_DISABLE 0x04 /* Account is disabled */ 508*da6c28aaSamw 509*da6c28aaSamw typedef struct smb_passwd { 510*da6c28aaSamw uid_t pw_uid; 511*da6c28aaSamw uint32_t pw_flags; 512*da6c28aaSamw unsigned char pw_lmhash[SMBAUTH_HASH_SZ]; 513*da6c28aaSamw unsigned char pw_nthash[SMBAUTH_HASH_SZ]; 514*da6c28aaSamw } smb_passwd_t; 515*da6c28aaSamw 516*da6c28aaSamw /* 517*da6c28aaSamw * Control flags passed to smb_pwd_setcntl 518*da6c28aaSamw */ 519*da6c28aaSamw #define SMB_PWC_DISABLE 0x01 520*da6c28aaSamw #define SMB_PWC_ENABLE 0x02 521*da6c28aaSamw #define SMB_PWC_NOLM 0x04 522*da6c28aaSamw 523*da6c28aaSamw #define SMB_PWE_SUCCESS 0 524*da6c28aaSamw #define SMB_PWE_USER_UNKNOWN 1 525*da6c28aaSamw #define SMB_PWE_USER_DISABLE 2 526*da6c28aaSamw #define SMB_PWE_CLOSE_FAILED 3 527*da6c28aaSamw #define SMB_PWE_OPEN_FAILED 4 528*da6c28aaSamw #define SMB_PWE_WRITE_FAILED 6 529*da6c28aaSamw #define SMB_PWE_UPDATE_FAILED 7 530*da6c28aaSamw #define SMB_PWE_STAT_FAILED 8 531*da6c28aaSamw #define SMB_PWE_BUSY 9 532*da6c28aaSamw #define SMB_PWE_DENIED 10 533*da6c28aaSamw #define SMB_PWE_SYSTEM_ERROR 11 534*da6c28aaSamw #define SMB_PWE_MAX 12 535*da6c28aaSamw 536*da6c28aaSamw extern smb_passwd_t *smb_pwd_getpasswd(const char *, smb_passwd_t *); 537*da6c28aaSamw extern int smb_pwd_setpasswd(const char *, const char *); 538*da6c28aaSamw extern int smb_pwd_setcntl(const char *, int); 539*da6c28aaSamw 540*da6c28aaSamw extern int smb_auth_qnd_unicode(mts_wchar_t *dst, char *src, int length); 541*da6c28aaSamw extern int smb_auth_hmac_md5(unsigned char *data, int data_len, 542*da6c28aaSamw unsigned char *key, int key_len, unsigned char *digest); 543*da6c28aaSamw 544*da6c28aaSamw /* 545*da6c28aaSamw * A variation on HMAC-MD5 known as HMACT64 is used by Windows systems. 546*da6c28aaSamw * The HMACT64() function is the same as the HMAC-MD5() except that 547*da6c28aaSamw * it truncates the input key to 64 bytes rather than hashing it down 548*da6c28aaSamw * to 16 bytes using the MD5() function. 549*da6c28aaSamw */ 550*da6c28aaSamw #define SMBAUTH_HMACT64(D, Ds, K, Ks, digest) \ 551*da6c28aaSamw smb_auth_hmac_md5(D, Ds, K, (Ks > 64) ? 64 : Ks, digest) 552*da6c28aaSamw 553*da6c28aaSamw extern int smb_auth_DES(unsigned char *, int, unsigned char *, int, 554*da6c28aaSamw unsigned char *, int); 555*da6c28aaSamw 556*da6c28aaSamw extern int smb_auth_md4(unsigned char *, unsigned char *, int); 557*da6c28aaSamw extern int smb_auth_lm_hash(char *, unsigned char *); 558*da6c28aaSamw extern int smb_auth_ntlm_hash(char *, unsigned char *); 559*da6c28aaSamw 560*da6c28aaSamw extern int smb_auth_set_info(char *, char *, 561*da6c28aaSamw unsigned char *, char *, unsigned char *, 562*da6c28aaSamw int, int, smb_auth_info_t *); 563*da6c28aaSamw 564*da6c28aaSamw extern int smb_auth_gen_session_key(smb_auth_info_t *, unsigned char *); 565*da6c28aaSamw 566*da6c28aaSamw boolean_t smb_auth_validate_lm(unsigned char *, uint32_t, smb_passwd_t *, 567*da6c28aaSamw unsigned char *, int, char *); 568*da6c28aaSamw boolean_t smb_auth_validate_nt(unsigned char *, uint32_t, smb_passwd_t *, 569*da6c28aaSamw unsigned char *, int, char *); 570*da6c28aaSamw 571*da6c28aaSamw /* 572*da6c28aaSamw * SMB MAC Signing 573*da6c28aaSamw */ 574*da6c28aaSamw 575*da6c28aaSamw #define SMB_MAC_KEY_SZ (SMBAUTH_SESSION_KEY_SZ + SMBAUTH_CS_MAXLEN) 576*da6c28aaSamw #define SMB_SIG_OFFS 14 /* signature field offset within header */ 577*da6c28aaSamw #define SMB_SIG_SIZE 8 /* SMB signature size */ 578*da6c28aaSamw 579*da6c28aaSamw /* 580*da6c28aaSamw * Signing flags: 581*da6c28aaSamw * 582*da6c28aaSamw * SMB_SCF_ENABLE Signing is enabled. 583*da6c28aaSamw * 584*da6c28aaSamw * SMB_SCF_REQUIRED Signing is enabled and required. 585*da6c28aaSamw * This flag shouldn't be set if 586*da6c28aaSamw * SMB_SCF_ENABLE isn't set. 587*da6c28aaSamw * 588*da6c28aaSamw * SMB_SCF_STARTED Signing will start after receiving 589*da6c28aaSamw * the first non-anonymous SessionSetup 590*da6c28aaSamw * request. 591*da6c28aaSamw * 592*da6c28aaSamw * SMB_SCF_KEY_ISSET_THIS_LOGON Indicates whether the MAC key has just 593*da6c28aaSamw * been set for this logon. (prior to 594*da6c28aaSamw * sending the SMBSessionSetup request) 595*da6c28aaSamw * 596*da6c28aaSamw */ 597*da6c28aaSamw #define SMB_SCF_ENABLE 0x01 598*da6c28aaSamw #define SMB_SCF_REQUIRED 0x02 599*da6c28aaSamw #define SMB_SCF_STARTED 0x04 600*da6c28aaSamw #define SMB_SCF_KEY_ISSET_THIS_LOGON 0x08 601*da6c28aaSamw 602*da6c28aaSamw /* 603*da6c28aaSamw * smb_sign_ctx 604*da6c28aaSamw * 605*da6c28aaSamw * SMB signing context. 606*da6c28aaSamw * 607*da6c28aaSamw * ssc_seqnum sequence number 608*da6c28aaSamw * ssc_keylen mac key length 609*da6c28aaSamw * ssc_mid multiplex id - reserved 610*da6c28aaSamw * ssc_flags flags 611*da6c28aaSamw * ssc_mackey mac key 612*da6c28aaSamw * ssc_sign mac signature 613*da6c28aaSamw * 614*da6c28aaSamw */ 615*da6c28aaSamw typedef struct smb_sign_ctx { 616*da6c28aaSamw unsigned int ssc_seqnum; 617*da6c28aaSamw unsigned short ssc_keylen; 618*da6c28aaSamw unsigned short ssc_mid; 619*da6c28aaSamw unsigned int ssc_flags; 620*da6c28aaSamw unsigned char ssc_mackey[SMB_MAC_KEY_SZ]; 621*da6c28aaSamw unsigned char ssc_sign[SMB_SIG_SIZE]; 622*da6c28aaSamw } smb_sign_ctx_t; 623*da6c28aaSamw 624*da6c28aaSamw extern int smb_mac_init(smb_sign_ctx_t *sign_ctx, smb_auth_info_t *auth); 625*da6c28aaSamw extern int smb_mac_calc(smb_sign_ctx_t *sign_ctx, 626*da6c28aaSamw const unsigned char *buf, size_t buf_len, unsigned char *mac_sign); 627*da6c28aaSamw extern int smb_mac_chk(smb_sign_ctx_t *sign_ctx, 628*da6c28aaSamw const unsigned char *buf, size_t buf_len); 629*da6c28aaSamw extern int smb_mac_sign(smb_sign_ctx_t *sign_ctx, 630*da6c28aaSamw unsigned char *buf, size_t buf_len); 631*da6c28aaSamw extern void smb_mac_inc_seqnum(smb_sign_ctx_t *sign_ctx); 632*da6c28aaSamw extern void smb_mac_dec_seqnum(smb_sign_ctx_t *sign_ctx); 633*da6c28aaSamw 634*da6c28aaSamw /* 635*da6c28aaSamw * Each domain is categorized using the enum values below. 636*da6c28aaSamw * The local domain refers to the local machine and is named 637*da6c28aaSamw * after the local hostname. The primary domain is the domain 638*da6c28aaSamw * that the system joined. All other domains are either 639*da6c28aaSamw * trusted or untrusted, as defined by the primary domain PDC. 640*da6c28aaSamw * 641*da6c28aaSamw * This enum must be kept in step with the table of strings 642*da6c28aaSamw * in ntdomain.c. 643*da6c28aaSamw */ 644*da6c28aaSamw typedef enum nt_domain_type { 645*da6c28aaSamw NT_DOMAIN_NULL, 646*da6c28aaSamw NT_DOMAIN_BUILTIN, 647*da6c28aaSamw NT_DOMAIN_LOCAL, 648*da6c28aaSamw NT_DOMAIN_PRIMARY, 649*da6c28aaSamw NT_DOMAIN_ACCOUNT, 650*da6c28aaSamw NT_DOMAIN_TRUSTED, 651*da6c28aaSamw NT_DOMAIN_UNTRUSTED, 652*da6c28aaSamw NT_DOMAIN_NUM_TYPES 653*da6c28aaSamw } nt_domain_type_t; 654*da6c28aaSamw 655*da6c28aaSamw 656*da6c28aaSamw /* 657*da6c28aaSamw * This is the information that is held about each domain. The database 658*da6c28aaSamw * is a linked list that is threaded through the domain structures. As 659*da6c28aaSamw * the number of domains in the database should be small (32 max), this 660*da6c28aaSamw * should be sufficient. 661*da6c28aaSamw */ 662*da6c28aaSamw typedef struct nt_domain { 663*da6c28aaSamw struct nt_domain *next; 664*da6c28aaSamw nt_domain_type_t type; 665*da6c28aaSamw char *name; 666*da6c28aaSamw nt_sid_t *sid; 667*da6c28aaSamw } nt_domain_t; 668*da6c28aaSamw 669*da6c28aaSamw nt_domain_t *nt_domain_new(nt_domain_type_t type, char *name, nt_sid_t *sid); 670*da6c28aaSamw void nt_domain_delete(nt_domain_t *domain); 671*da6c28aaSamw nt_domain_t *nt_domain_add(nt_domain_t *new_domain); 672*da6c28aaSamw void nt_domain_remove(nt_domain_t *domain); 673*da6c28aaSamw void nt_domain_flush(nt_domain_type_t domain_type); 674*da6c28aaSamw void nt_domain_sync(void); 675*da6c28aaSamw char *nt_domain_xlat_type(nt_domain_type_t domain_type); 676*da6c28aaSamw nt_domain_type_t nt_domain_xlat_type_name(char *type_name); 677*da6c28aaSamw nt_domain_t *nt_domain_lookup_name(char *domain_name); 678*da6c28aaSamw nt_domain_t *nt_domain_lookup_sid(nt_sid_t *domain_sid); 679*da6c28aaSamw nt_domain_t *nt_domain_lookupbytype(nt_domain_type_t type); 680*da6c28aaSamw nt_sid_t *nt_domain_local_sid(void); 681*da6c28aaSamw 682*da6c28aaSamw #define SMB_GROUP_PER_LIST 5 683*da6c28aaSamw 684*da6c28aaSamw /* 685*da6c28aaSamw * This structure takes different args passed from the client/server routines 686*da6c28aaSamw * of the SMB local group door service. Extend this structure if a new type 687*da6c28aaSamw * client paramater needs to be passed. 688*da6c28aaSamw */ 689*da6c28aaSamw typedef struct ntgrp_dr_arg { 690*da6c28aaSamw char *gname; 691*da6c28aaSamw char *desc; 692*da6c28aaSamw char *member; 693*da6c28aaSamw char *newgname; 694*da6c28aaSamw uint32_t privid; 695*da6c28aaSamw uint32_t priv_attr; 696*da6c28aaSamw int offset; 697*da6c28aaSamw char *scope; 698*da6c28aaSamw int type; 699*da6c28aaSamw int count; 700*da6c28aaSamw uint32_t ntstatus; 701*da6c28aaSamw } ntgrp_dr_arg_t; 702*da6c28aaSamw 703*da6c28aaSamw typedef struct ntgrp { 704*da6c28aaSamw DWORD rid; /* Rid of the group */ 705*da6c28aaSamw char *name; /* Name of the group */ 706*da6c28aaSamw char *desc; /* Desc of gruup */ 707*da6c28aaSamw char *type; /* sid_name_use */ 708*da6c28aaSamw char *sid; /* Sid */ 709*da6c28aaSamw DWORD attr; /* Attribute */ 710*da6c28aaSamw } ntgrp_t; 711*da6c28aaSamw 712*da6c28aaSamw typedef struct ntgrp_list { 713*da6c28aaSamw int cnt; 714*da6c28aaSamw ntgrp_t groups[SMB_GROUP_PER_LIST]; 715*da6c28aaSamw } ntgrp_list_t; 716*da6c28aaSamw 717*da6c28aaSamw typedef char *members_list; 718*da6c28aaSamw typedef struct ntgrp_member_list { 719*da6c28aaSamw DWORD rid; /* Rid of the group in which members belong */ 720*da6c28aaSamw int cnt; /* members */ 721*da6c28aaSamw members_list members[SMB_GROUP_PER_LIST]; 722*da6c28aaSamw } ntgrp_member_list_t; 723*da6c28aaSamw 724*da6c28aaSamw typedef struct ntpriv { 725*da6c28aaSamw DWORD id; /* Id of priv */ 726*da6c28aaSamw char *name; /* Name of priv */ 727*da6c28aaSamw } ntpriv_t; 728*da6c28aaSamw typedef ntpriv_t *privs_t; 729*da6c28aaSamw 730*da6c28aaSamw typedef struct ntpriv_list { 731*da6c28aaSamw int cnt; /* Number of privs */ 732*da6c28aaSamw privs_t privs[ANY_SIZE_ARRAY]; /* privs only presentable ones */ 733*da6c28aaSamw } ntpriv_list_t; 734*da6c28aaSamw 735*da6c28aaSamw 736*da6c28aaSamw /* the xdr functions */ 737*da6c28aaSamw extern bool_t xdr_ntgrp_dr_arg_t(XDR *, ntgrp_dr_arg_t *); 738*da6c28aaSamw extern bool_t xdr_ntgrp_t(XDR *, ntgrp_t *); 739*da6c28aaSamw extern bool_t xdr_ntgrp_list_t(XDR *, ntgrp_list_t *); 740*da6c28aaSamw extern bool_t xdr_members_list(XDR *, members_list *); 741*da6c28aaSamw extern bool_t xdr_ntgrp_member_list_t(XDR *, ntgrp_member_list_t *); 742*da6c28aaSamw extern bool_t xdr_ntpriv_t(XDR *, ntpriv_t *); 743*da6c28aaSamw extern bool_t xdr_privs_t(XDR *, privs_t *); 744*da6c28aaSamw extern bool_t xdr_ntpriv_list_t(XDR *, ntpriv_list_t *); 745*da6c28aaSamw 746*da6c28aaSamw extern void smb_group_free_memberlist(ntgrp_member_list_t *, int); 747*da6c28aaSamw extern void smb_group_free_list(ntgrp_list_t *, int); 748*da6c28aaSamw extern void smb_group_free_privlist(ntpriv_list_t *, int); 749*da6c28aaSamw 750*da6c28aaSamw extern uint32_t smb_group_add(char *, char *); 751*da6c28aaSamw extern uint32_t smb_group_modify(char *, char *, char *); 752*da6c28aaSamw extern uint32_t smb_group_delete(char *); 753*da6c28aaSamw extern uint32_t smb_group_member_remove(char *, char *); 754*da6c28aaSamw extern uint32_t smb_group_member_add(char *, char *); 755*da6c28aaSamw extern uint32_t smb_group_priv_num(int *); 756*da6c28aaSamw extern uint32_t smb_group_priv_list(ntpriv_list_t **); 757*da6c28aaSamw extern uint32_t smb_group_priv_get(char *, uint32_t, uint32_t *); 758*da6c28aaSamw extern uint32_t smb_group_priv_set(char *, uint32_t, uint32_t); 759*da6c28aaSamw extern uint32_t smb_group_count(int *); 760*da6c28aaSamw extern uint32_t smb_group_list(int, ntgrp_list_t **, char *, int); 761*da6c28aaSamw extern uint32_t smb_group_member_count(char *, int *); 762*da6c28aaSamw extern uint32_t smb_group_member_list(char *, int, ntgrp_member_list_t **); 763*da6c28aaSamw 764*da6c28aaSamw extern char *smb_dr_encode_grp_privlist(uint32_t, ntpriv_list_t *, size_t *); 765*da6c28aaSamw extern ntpriv_list_t *smb_dr_decode_grp_privlist(char *, size_t); 766*da6c28aaSamw 767*da6c28aaSamw extern char *smb_dr_encode_grp_list(uint32_t, ntgrp_list_t *, size_t *); 768*da6c28aaSamw extern ntgrp_list_t *smb_dr_decode_grp_list(char *, size_t); 769*da6c28aaSamw 770*da6c28aaSamw extern char *smb_dr_encode_grp_memberlist(uint32_t, ntgrp_member_list_t *, 771*da6c28aaSamw size_t *); 772*da6c28aaSamw extern ntgrp_member_list_t *smb_dr_decode_grp_memberlist(char *buf, size_t len); 773*da6c28aaSamw 774*da6c28aaSamw #ifdef __cplusplus 775*da6c28aaSamw } 776*da6c28aaSamw #endif 777*da6c28aaSamw 778*da6c28aaSamw #endif /* _LIBSMB_H */ 779