xref: /illumos-gate/usr/src/uts/common/smbsrv/smb_door.h (revision b3700b074e637f8c6991b70754c88a2cfffb246b)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
23  * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
24  */
25 
26 #ifndef _SMBSRV_SMB_DOOR_H
27 #define	_SMBSRV_SMB_DOOR_H
28 
29 #include <sys/door.h>
30 #include <smbsrv/wintypes.h>
31 #include <smbsrv/smb_xdr.h>
32 #include <smbsrv/smb_token.h>
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 
38 #define	SMBD_DOOR_NAME			"/var/run/smbd_door"
39 
40 #define	SMB_DOOR_CALL_RETRIES		3
41 
42 /*
43  * Opcodes for smbd door.
44  *
45  * SMB_DR_NULL is the equivalent of the NULL RPC.  It ensures that an
46  * opcode of zero is not misinterpreted as an operational door call
47  * and it is available as a test interface.
48  *
49  * SMB_DR_ASYNC_RESPONSE delivers the response part of an asynchronous
50  * request and must be processed as a synchronous request.
51  */
52 typedef enum smb_dopcode {
53 	SMB_DR_NULL = 0,
54 	SMB_DR_ASYNC_RESPONSE,
55 	SMB_DR_USER_AUTH_LOGON,
56 	SMB_DR_USER_NONAUTH_LOGON,
57 	SMB_DR_USER_AUTH_LOGOFF,
58 	SMB_DR_LOOKUP_SID,
59 	SMB_DR_LOOKUP_NAME,
60 	SMB_DR_JOIN,
61 	SMB_DR_GET_DCINFO,
62 	SMB_DR_VSS_GET_COUNT,
63 	SMB_DR_VSS_GET_SNAPSHOTS,
64 	SMB_DR_VSS_MAP_GMTTOKEN,
65 	SMB_DR_ADS_FIND_HOST,
66 	SMB_DR_QUOTA_QUERY,
67 	SMB_DR_QUOTA_SET,
68 	SMB_DR_DFS_GET_REFERRALS,
69 	SMB_DR_SHR_HOSTACCESS,
70 	SMB_DR_SHR_EXEC,
71 	SMB_DR_NOTIFY_DC_CHANGED
72 } smb_dopcode_t;
73 
74 struct smb_event;
75 
76 typedef struct smb_doorarg {
77 	smb_doorhdr_t		da_hdr;
78 	door_arg_t		da_arg;
79 	xdrproc_t		da_req_xdr;
80 	xdrproc_t		da_rsp_xdr;
81 	void			*da_req_data;
82 	void			*da_rsp_data;
83 	smb_dopcode_t		da_opcode;
84 	const char		*da_opname;
85 	struct smb_event	*da_event;
86 	uint32_t		da_flags;
87 } smb_doorarg_t;
88 
89 /*
90  * Door call return codes.
91  */
92 #define	SMB_DOP_SUCCESS			0
93 #define	SMB_DOP_NOT_CALLED		1
94 #define	SMB_DOP_DECODE_ERROR		2
95 #define	SMB_DOP_ENCODE_ERROR		3
96 #define	SMB_DOP_EMPTYBUF		4
97 
98 #if !defined(_KERNEL) && !defined(_FAKE_KERNEL)
99 char *smb_common_encode(void *, xdrproc_t, size_t *);
100 int smb_common_decode(char *, size_t, xdrproc_t, void *);
101 char *smb_string_encode(char *, size_t *);
102 int smb_string_decode(smb_string_t *, char *, size_t);
103 #endif /* !_KERNEL */
104 
105 /* libfksmbsrv "kdoor" callback to smbd-d */
106 typedef int fksmb_kdoor_disp_func_t(smb_doorarg_t *);
107 
108 /* libfksmbsrv "opipe" callback to smbd-d */
109 typedef int fksmb_opipe_disp_func_t(door_arg_t *);
110 
111 /*
112  * Legacy door interface
113  */
114 #define	SMB_SHARE_DNAME		"/var/run/smb_share_door"
115 #define	SMB_SHARE_DSIZE		(65 * 1024)
116 
117 /*
118  * door operations
119  */
120 #define	SMB_SHROP_NUM_SHARES		1
121 #define	SMB_SHROP_DELETE		2
122 #define	SMB_SHROP_RENAME		3
123 #define	SMB_SHROP_ADD			4
124 #define	SMB_SHROP_MODIFY		5
125 #define	SMB_SHROP_LIST			6
126 
127 /*
128  * Door server status
129  *
130  * SMB_SHARE_DERROR is returned by the door server if there is problem
131  * with marshalling/unmarshalling. Otherwise, SMB_SHARE_DSUCCESS is
132  * returned.
133  *
134  */
135 #define	SMB_SHARE_DSUCCESS		0
136 #define	SMB_SHARE_DERROR		-1
137 
138 typedef struct smb_dr_ctx {
139 	char *ptr;
140 	char *start_ptr;
141 	char *end_ptr;
142 	int status;
143 } smb_dr_ctx_t;
144 
145 smb_dr_ctx_t *smb_dr_decode_start(char *, int);
146 int smb_dr_decode_finish(smb_dr_ctx_t *);
147 
148 smb_dr_ctx_t *smb_dr_encode_start(char *, int);
149 int smb_dr_encode_finish(smb_dr_ctx_t *, unsigned int *);
150 
151 int32_t smb_dr_get_int32(smb_dr_ctx_t *);
152 DWORD smb_dr_get_dword(smb_dr_ctx_t *);
153 uint32_t smb_dr_get_uint32(smb_dr_ctx_t *);
154 int64_t smb_dr_get_int64(smb_dr_ctx_t *);
155 uint64_t smb_dr_get_uint64(smb_dr_ctx_t *);
156 unsigned short smb_dr_get_ushort(smb_dr_ctx_t *);
157 
158 void smb_dr_put_int32(smb_dr_ctx_t *, int32_t);
159 void smb_dr_put_dword(smb_dr_ctx_t *, DWORD);
160 void smb_dr_put_uint32(smb_dr_ctx_t *, uint32_t);
161 void smb_dr_put_int64(smb_dr_ctx_t *, int64_t);
162 void smb_dr_put_uint64(smb_dr_ctx_t *, uint64_t);
163 void smb_dr_put_ushort(smb_dr_ctx_t *, unsigned short);
164 
165 char *smb_dr_get_string(smb_dr_ctx_t *);
166 void smb_dr_put_string(smb_dr_ctx_t *, const char *);
167 void smb_dr_free_string(char *);
168 
169 void smb_dr_put_word(smb_dr_ctx_t *, WORD);
170 WORD smb_dr_get_word(smb_dr_ctx_t *);
171 
172 void smb_dr_put_BYTE(smb_dr_ctx_t *, BYTE);
173 BYTE smb_dr_get_BYTE(smb_dr_ctx_t *);
174 
175 void smb_dr_put_buf(smb_dr_ctx_t *, unsigned char *, int);
176 int smb_dr_get_buf(smb_dr_ctx_t *, unsigned char *, int);
177 
178 void smb_dr_get_share(smb_dr_ctx_t *, smb_share_t *);
179 void smb_dr_put_share(smb_dr_ctx_t *, smb_share_t *);
180 
181 void smb_share_door_clnt_init(void);
182 void smb_share_door_clnt_fini(void);
183 
184 #ifdef __cplusplus
185 }
186 #endif
187 
188 #endif	/* _SMBSRV_SMB_DOOR_H */
189