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
35extern "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 */
52typedef 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
74struct smb_event;
75
76typedef 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)
99char *smb_common_encode(void *, xdrproc_t, size_t *);
100int smb_common_decode(char *, size_t, xdrproc_t, void *);
101char *smb_string_encode(char *, size_t *);
102int smb_string_decode(smb_string_t *, char *, size_t);
103#endif /* !_KERNEL */
104
105/* libfksmbsrv "kdoor" callback to smbd-d */
106typedef int fksmb_kdoor_disp_func_t(smb_doorarg_t *);
107
108/* libfksmbsrv "opipe" callback to smbd-d */
109typedef 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
138typedef struct smb_dr_ctx {
139	char *ptr;
140	char *start_ptr;
141	char *end_ptr;
142	int status;
143} smb_dr_ctx_t;
144
145smb_dr_ctx_t *smb_dr_decode_start(char *, int);
146int smb_dr_decode_finish(smb_dr_ctx_t *);
147
148smb_dr_ctx_t *smb_dr_encode_start(char *, int);
149int smb_dr_encode_finish(smb_dr_ctx_t *, unsigned int *);
150
151int32_t smb_dr_get_int32(smb_dr_ctx_t *);
152DWORD smb_dr_get_dword(smb_dr_ctx_t *);
153uint32_t smb_dr_get_uint32(smb_dr_ctx_t *);
154int64_t smb_dr_get_int64(smb_dr_ctx_t *);
155uint64_t smb_dr_get_uint64(smb_dr_ctx_t *);
156unsigned short smb_dr_get_ushort(smb_dr_ctx_t *);
157
158void smb_dr_put_int32(smb_dr_ctx_t *, int32_t);
159void smb_dr_put_dword(smb_dr_ctx_t *, DWORD);
160void smb_dr_put_uint32(smb_dr_ctx_t *, uint32_t);
161void smb_dr_put_int64(smb_dr_ctx_t *, int64_t);
162void smb_dr_put_uint64(smb_dr_ctx_t *, uint64_t);
163void smb_dr_put_ushort(smb_dr_ctx_t *, unsigned short);
164
165char *smb_dr_get_string(smb_dr_ctx_t *);
166void smb_dr_put_string(smb_dr_ctx_t *, const char *);
167void smb_dr_free_string(char *);
168
169void smb_dr_put_word(smb_dr_ctx_t *, WORD);
170WORD smb_dr_get_word(smb_dr_ctx_t *);
171
172void smb_dr_put_BYTE(smb_dr_ctx_t *, BYTE);
173BYTE smb_dr_get_BYTE(smb_dr_ctx_t *);
174
175void smb_dr_put_buf(smb_dr_ctx_t *, unsigned char *, int);
176int smb_dr_get_buf(smb_dr_ctx_t *, unsigned char *, int);
177
178void smb_dr_get_share(smb_dr_ctx_t *, smb_share_t *);
179void smb_dr_put_share(smb_dr_ctx_t *, smb_share_t *);
180
181void smb_share_door_clnt_init(void);
182void smb_share_door_clnt_fini(void);
183
184#ifdef __cplusplus
185}
186#endif
187
188#endif	/* _SMBSRV_SMB_DOOR_H */
189