xref: /illumos-gate/usr/src/lib/smbsrv/libsmb/common/libsmb.h (revision da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0)
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