xref: /onnv-gate/usr/src/uts/common/smbsrv/smb_share.h (revision 7052:efa04b030974)
1*7052Samw /*
2*7052Samw  * CDDL HEADER START
3*7052Samw  *
4*7052Samw  * The contents of this file are subject to the terms of the
5*7052Samw  * Common Development and Distribution License (the "License").
6*7052Samw  * You may not use this file except in compliance with the License.
7*7052Samw  *
8*7052Samw  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*7052Samw  * or http://www.opensolaris.org/os/licensing.
10*7052Samw  * See the License for the specific language governing permissions
11*7052Samw  * and limitations under the License.
12*7052Samw  *
13*7052Samw  * When distributing Covered Code, include this CDDL HEADER in each
14*7052Samw  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*7052Samw  * If applicable, add the following below this CDDL HEADER, with the
16*7052Samw  * fields enclosed by brackets "[]" replaced with your own identifying
17*7052Samw  * information: Portions Copyright [yyyy] [name of copyright owner]
18*7052Samw  *
19*7052Samw  * CDDL HEADER END
20*7052Samw  */
21*7052Samw /*
22*7052Samw  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23*7052Samw  * Use is subject to license terms.
24*7052Samw  */
25*7052Samw 
26*7052Samw #ifndef _SMB_SHARE_H
27*7052Samw #define	_SMB_SHARE_H
28*7052Samw 
29*7052Samw #pragma ident	"%Z%%M%	%I%	%E% SMI"
30*7052Samw 
31*7052Samw /*
32*7052Samw  * This file defines the LanMan (CIFS/SMB) resource share interface.
33*7052Samw  */
34*7052Samw 
35*7052Samw #include <sys/param.h>
36*7052Samw #include <smbsrv/string.h>
37*7052Samw #include <smbsrv/hash_table.h>
38*7052Samw #include <smbsrv/smb_fsd.h>
39*7052Samw #include <smbsrv/wintypes.h>
40*7052Samw #include <smbsrv/lmerr.h>
41*7052Samw #include <smbsrv/smb_common_door.h>
42*7052Samw 
43*7052Samw #ifndef _KERNEL
44*7052Samw #include <libshare.h>
45*7052Samw #else
46*7052Samw #include <sys/door.h>
47*7052Samw #endif
48*7052Samw 
49*7052Samw #ifdef __cplusplus
50*7052Samw extern "C" {
51*7052Samw #endif
52*7052Samw 
53*7052Samw /*
54*7052Samw  * The following 4 macros are mainly for sharemgr use
55*7052Samw  */
56*7052Samw #define	SMB_SHROPT_AD_CONTAINER	"ad-container"
57*7052Samw #define	SMB_SHROPT_NAME		"name"	/* name is a pseudo property */
58*7052Samw 
59*7052Samw #define	SMB_DEFAULT_SHARE_GROUP	"smb"
60*7052Samw #define	SMB_PROTOCOL_NAME	"smb"
61*7052Samw 
62*7052Samw /*
63*7052Samw  * RAP protocol share related commands only understand
64*7052Samw  * share names in OEM format and there is a 13 char size
65*7052Samw  * limitation
66*7052Samw  */
67*7052Samw #define	SMB_SHARE_OEMNAME_MAX		13
68*7052Samw #define	SMB_SHARE_CMNT_MAX		(64 * MTS_MB_CHAR_MAX)
69*7052Samw 
70*7052Samw /*
71*7052Samw  *	struct SHARE_INFO_1 {
72*7052Samw  *		char		shi1_netname[13]
73*7052Samw  *		char		shi1_pad;
74*7052Samw  *		unsigned short	shi1_type
75*7052Samw  *		char		*shi1_remark;
76*7052Samw  *	}
77*7052Samw  */
78*7052Samw #define	SHARE_INFO_1_SIZE	(SMB_SHARE_OEMNAME_MAX + 1 + 2 + 4)
79*7052Samw 
80*7052Samw /*
81*7052Samw  * Share flags:
82*7052Samw  *
83*7052Samw  * SMB_SHRF_TRANS	Transient share
84*7052Samw  * SMB_SHRF_PERM	Permanent share
85*7052Samw  * SMB_SHRF_AUTOHOME	Autohome share.
86*7052Samw  * SMB_SHRF_LONGNAME	Share name in OEM is longer than 13 chars
87*7052Samw  * SMB_SHRF_ADMIN	Admin share
88*7052Samw  *
89*7052Samw  * All autohome shares are transient but not all transient shares are autohome.
90*7052Samw  * IPC$ and drive letter shares (e.g. d$, e$, etc) are transient but
91*7052Samw  * not autohome.
92*7052Samw  */
93*7052Samw #define	SMB_SHRF_TRANS		0x0001
94*7052Samw #define	SMB_SHRF_PERM		0x0002
95*7052Samw #define	SMB_SHRF_AUTOHOME	0x0004
96*7052Samw #define	SMB_SHRF_LONGNAME	0x0008
97*7052Samw #define	SMB_SHRF_ADMIN		0x0010
98*7052Samw #define	SMB_SHRF_ALL		(SMB_SHRF_TRANS | SMB_SHRF_PERM)
99*7052Samw 
100*7052Samw /*
101*7052Samw  * refcnt is currently only used for autohome.  autohome needs a refcnt
102*7052Samw  * because a user can map his autohome share from more than one client
103*7052Samw  * at the same time and the share should only be removed when the last
104*7052Samw  * one is disconnected
105*7052Samw  */
106*7052Samw typedef struct smb_share {
107*7052Samw 	char		shr_name[MAXNAMELEN];
108*7052Samw 	char		shr_path[MAXPATHLEN];
109*7052Samw 	char		shr_cmnt[SMB_SHARE_CMNT_MAX];
110*7052Samw 	char		shr_container[MAXPATHLEN];
111*7052Samw 	char		shr_oemname[SMB_SHARE_OEMNAME_MAX];
112*7052Samw 	uint32_t	shr_flags;
113*7052Samw 	uint32_t	shr_type;
114*7052Samw 	uint32_t	shr_refcnt;
115*7052Samw } smb_share_t;
116*7052Samw 
117*7052Samw typedef struct smb_shriter {
118*7052Samw 	smb_share_t	si_share;
119*7052Samw 	HT_ITERATOR	si_hashiter;
120*7052Samw 	uint32_t	si_counter;
121*7052Samw 	uint32_t	si_mode;
122*7052Samw } smb_shriter_t;
123*7052Samw 
124*7052Samw #define	LMSHARES_PER_REQUEST  10
125*7052Samw typedef struct smb_shrlist {
126*7052Samw 	int		no;
127*7052Samw 	smb_share_t	smbshr[LMSHARES_PER_REQUEST];
128*7052Samw } smb_shrlist_t;
129*7052Samw 
130*7052Samw /*
131*7052Samw  * This structure is a helper for building NetShareEnum response
132*7052Samw  * in user space and send it back down to kernel.
133*7052Samw  *
134*7052Samw  * es_username	name of the user requesting the shares list which
135*7052Samw  * 		is used to detect if the user has any autohome
136*7052Samw  * es_bufsize	size of the response buffer
137*7052Samw  * es_buf	pointer to the response buffer
138*7052Samw  * es_ntotal	total number of shares exported by server which
139*7052Samw  * 		their OEM names is less then 13 chars
140*7052Samw  * es_nsent	number of shares that can fit in the specified buffer
141*7052Samw  * es_datasize	actual data size (share's data) which was encoded
142*7052Samw  * 		in the response buffer
143*7052Samw  */
144*7052Samw typedef struct smb_enumshare_info {
145*7052Samw 	char		*es_username;
146*7052Samw 	uint16_t	es_bufsize;
147*7052Samw 	char		*es_buf;
148*7052Samw 	uint16_t	es_ntotal;
149*7052Samw 	uint16_t	es_nsent;
150*7052Samw 	uint16_t	es_datasize;
151*7052Samw } smb_enumshare_info_t;
152*7052Samw 
153*7052Samw /*
154*7052Samw  * LanMan share API (for both SMB kernel module and GUI/CLI sub-system)
155*7052Samw  *
156*7052Samw  * NOTE: If any error is encounted by either the door server or client,
157*7052Samw  * NERR_InternalError will be returned by most functions, smb_share_count
158*7052Samw  * will return -1.
159*7052Samw  */
160*7052Samw 
161*7052Samw #ifndef _KERNEL
162*7052Samw 
163*7052Samw /*
164*7052Samw  * CIFS share management functions in libmlsvc
165*7052Samw  */
166*7052Samw int smb_shr_start(void);
167*7052Samw void smb_shr_stop(void);
168*7052Samw void smb_shr_iterinit(smb_shriter_t *, uint32_t);
169*7052Samw smb_share_t *smb_shr_iterate(smb_shriter_t *iterator);
170*7052Samw void smb_shr_list(int offset, smb_shrlist_t *list);
171*7052Samw int smb_shr_count(void);
172*7052Samw uint32_t smb_shr_add(smb_share_t *si, int);
173*7052Samw uint32_t smb_shr_del(char *share_name, int);
174*7052Samw uint32_t smb_shr_ren(char *from, char *to, int);
175*7052Samw uint32_t smb_shr_get(char *share_name, smb_share_t *si);
176*7052Samw uint32_t smb_shr_set(smb_share_t *si, int);
177*7052Samw uint32_t smb_shr_get_realpath(const char *srcbuf, char *dstbuf, int maxlen);
178*7052Samw 
179*7052Samw int smb_shr_exists(char *share_name);
180*7052Samw int smb_shr_is_special(char *share_name);
181*7052Samw int smb_shr_is_restricted(char *share_name);
182*7052Samw int smb_shr_is_admin(char *share_name);
183*7052Samw int smb_shr_is_valid(char *share_name);
184*7052Samw int smb_shr_is_dir(char *path);
185*7052Samw uint32_t smb_shr_add_adminshare(char *volname, unsigned char drive);
186*7052Samw 
187*7052Samw sa_group_t smb_get_smb_share_group(sa_handle_t);
188*7052Samw void smb_build_lmshare_info(char *, char *, sa_resource_t, smb_share_t *);
189*7052Samw 
190*7052Samw /*
191*7052Samw  * CIFS share management API exported for other processes
192*7052Samw  */
193*7052Samw uint32_t smb_share_list(int offset, smb_shrlist_t *list);
194*7052Samw int smb_share_count(void);
195*7052Samw uint32_t smb_share_get(char *, smb_share_t *);
196*7052Samw uint32_t smb_share_del(char *);
197*7052Samw uint32_t smb_share_ren(char *, char *);
198*7052Samw uint32_t smb_share_add(smb_share_t *);
199*7052Samw uint32_t smb_share_set(smb_share_t *);
200*7052Samw 
201*7052Samw #else
202*7052Samw 
203*7052Samw door_handle_t smb_kshare_init(int);
204*7052Samw void smb_kshare_fini(door_handle_t);
205*7052Samw uint32_t smb_kshare_getinfo(door_handle_t, char *, smb_share_t *);
206*7052Samw int smb_kshare_upcall(door_handle_t, void *, boolean_t);
207*7052Samw uint32_t smb_kshare_enum(door_handle_t, smb_enumshare_info_t *);
208*7052Samw 
209*7052Samw #endif
210*7052Samw 
211*7052Samw #define	SMB_SHARE_DNAME		"/var/run/smb_lmshare_door"
212*7052Samw #define	SMB_SHARE_DSIZE		(65 * 1024)
213*7052Samw 
214*7052Samw /*
215*7052Samw  * Door interface
216*7052Samw  *
217*7052Samw  * Define door operations
218*7052Samw  */
219*7052Samw #define	SMB_SHROP_NUM_SHARES		1
220*7052Samw #define	SMB_SHROP_DELETE		2
221*7052Samw #define	SMB_SHROP_RENAME		3
222*7052Samw #define	SMB_SHROP_GETINFO		4
223*7052Samw #define	SMB_SHROP_ADD			5
224*7052Samw #define	SMB_SHROP_SETINFO		6
225*7052Samw #define	SMB_SHROP_LIST			7
226*7052Samw #define	SMB_SHROP_ENUM			8
227*7052Samw 
228*7052Samw /*
229*7052Samw  * Door server status
230*7052Samw  *
231*7052Samw  * SMB_SHARE_DERROR is returned by the door server if there is problem
232*7052Samw  * with marshalling/unmarshalling. Otherwise, SMB_SHARE_DSUCCESS is
233*7052Samw  * returned.
234*7052Samw  *
235*7052Samw  */
236*7052Samw #define	SMB_SHARE_DSUCCESS		0
237*7052Samw #define	SMB_SHARE_DERROR		-1
238*7052Samw 
239*7052Samw void smb_dr_get_share(smb_dr_ctx_t *, smb_share_t *);
240*7052Samw void smb_dr_put_share(smb_dr_ctx_t *, smb_share_t *);
241*7052Samw 
242*7052Samw void smb_dr_get_shrlist(smb_dr_ctx_t *, smb_shrlist_t *);
243*7052Samw void smb_dr_put_shrlist(smb_dr_ctx_t *, smb_shrlist_t *);
244*7052Samw 
245*7052Samw void smb_share_dclose(void);
246*7052Samw 
247*7052Samw #ifdef __cplusplus
248*7052Samw }
249*7052Samw #endif
250*7052Samw 
251*7052Samw #endif /* _SMB_SHARE_H */
252