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 2019 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 <smb/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 * See also: smb_doorhdr_opname() 53 */ 54 typedef enum smb_dopcode { 55 SMB_DR_NULL = 0, 56 SMB_DR_ASYNC_RESPONSE, 57 SMB_DR_USER_AUTH_LOGON, 58 SMB_DR_USER_NONAUTH_LOGON, 59 SMB_DR_USER_AUTH_LOGOFF, 60 SMB_DR_LOOKUP_SID, 61 SMB_DR_LOOKUP_NAME, 62 SMB_DR_JOIN, 63 SMB_DR_GET_DCINFO, 64 SMB_DR_VSS_GET_COUNT, 65 SMB_DR_VSS_GET_SNAPSHOTS, 66 SMB_DR_VSS_MAP_GMTTOKEN, 67 SMB_DR_ADS_FIND_HOST, 68 SMB_DR_QUOTA_QUERY, 69 SMB_DR_QUOTA_SET, 70 SMB_DR_DFS_GET_REFERRALS, 71 SMB_DR_SHR_HOSTACCESS, 72 SMB_DR_SHR_EXEC, 73 SMB_DR_NOTIFY_DC_CHANGED, 74 SMB_DR_LOOKUP_LSID, 75 SMB_DR_LOOKUP_LNAME 76 } smb_dopcode_t; 77 78 struct smb_event; 79 80 typedef struct smb_doorarg { 81 smb_doorhdr_t da_hdr; 82 door_arg_t da_arg; 83 xdrproc_t da_req_xdr; 84 xdrproc_t da_rsp_xdr; 85 void *da_req_data; 86 void *da_rsp_data; 87 smb_dopcode_t da_opcode; 88 const char *da_opname; 89 struct smb_event *da_event; 90 uint32_t da_flags; 91 } smb_doorarg_t; 92 93 /* 94 * Door call return codes. 95 */ 96 #define SMB_DOP_SUCCESS 0 97 #define SMB_DOP_NOT_CALLED 1 98 #define SMB_DOP_DECODE_ERROR 2 99 #define SMB_DOP_ENCODE_ERROR 3 100 #define SMB_DOP_EMPTYBUF 4 101 102 #if !defined(_KERNEL) && !defined(_FAKE_KERNEL) 103 char *smb_common_encode(void *, xdrproc_t, size_t *); 104 int smb_common_decode(char *, size_t, xdrproc_t, void *); 105 char *smb_string_encode(char *, size_t *); 106 int smb_string_decode(smb_string_t *, char *, size_t); 107 #endif /* !_KERNEL */ 108 109 /* libfksmbsrv "kdoor" callback to smbd-d */ 110 typedef int fksmb_kdoor_disp_func_t(smb_doorarg_t *); 111 112 /* libfksmbsrv "opipe" callback to smbd-d */ 113 typedef int fksmb_opipe_disp_func_t(door_arg_t *); 114 115 /* 116 * Legacy door interface 117 */ 118 #define SMB_SHARE_DNAME "/var/run/smb_share_door" 119 #define SMB_SHARE_DSIZE (65 * 1024) 120 121 /* 122 * door operations 123 */ 124 #define SMB_SHROP_NUM_SHARES 1 125 #define SMB_SHROP_DELETE 2 126 #define SMB_SHROP_RENAME 3 127 #define SMB_SHROP_ADD 4 128 #define SMB_SHROP_MODIFY 5 129 #define SMB_SHROP_LIST 6 130 131 /* 132 * Door server status 133 * 134 * SMB_SHARE_DERROR is returned by the door server if there is problem 135 * with marshalling/unmarshalling. Otherwise, SMB_SHARE_DSUCCESS is 136 * returned. 137 * 138 */ 139 #define SMB_SHARE_DSUCCESS 0 140 #define SMB_SHARE_DERROR -1 141 142 typedef struct smb_dr_ctx { 143 char *ptr; 144 char *start_ptr; 145 char *end_ptr; 146 int status; 147 } smb_dr_ctx_t; 148 149 smb_dr_ctx_t *smb_dr_decode_start(char *, int); 150 int smb_dr_decode_finish(smb_dr_ctx_t *); 151 152 smb_dr_ctx_t *smb_dr_encode_start(char *, int); 153 int smb_dr_encode_finish(smb_dr_ctx_t *, unsigned int *); 154 155 int32_t smb_dr_get_int32(smb_dr_ctx_t *); 156 DWORD smb_dr_get_dword(smb_dr_ctx_t *); 157 uint32_t smb_dr_get_uint32(smb_dr_ctx_t *); 158 int64_t smb_dr_get_int64(smb_dr_ctx_t *); 159 uint64_t smb_dr_get_uint64(smb_dr_ctx_t *); 160 unsigned short smb_dr_get_ushort(smb_dr_ctx_t *); 161 162 void smb_dr_put_int32(smb_dr_ctx_t *, int32_t); 163 void smb_dr_put_dword(smb_dr_ctx_t *, DWORD); 164 void smb_dr_put_uint32(smb_dr_ctx_t *, uint32_t); 165 void smb_dr_put_int64(smb_dr_ctx_t *, int64_t); 166 void smb_dr_put_uint64(smb_dr_ctx_t *, uint64_t); 167 void smb_dr_put_ushort(smb_dr_ctx_t *, unsigned short); 168 169 char *smb_dr_get_string(smb_dr_ctx_t *); 170 void smb_dr_put_string(smb_dr_ctx_t *, const char *); 171 void smb_dr_free_string(char *); 172 173 void smb_dr_put_word(smb_dr_ctx_t *, WORD); 174 WORD smb_dr_get_word(smb_dr_ctx_t *); 175 176 void smb_dr_put_BYTE(smb_dr_ctx_t *, BYTE); 177 BYTE smb_dr_get_BYTE(smb_dr_ctx_t *); 178 179 void smb_dr_put_buf(smb_dr_ctx_t *, unsigned char *, int); 180 int smb_dr_get_buf(smb_dr_ctx_t *, unsigned char *, int); 181 182 void smb_dr_get_share(smb_dr_ctx_t *, smb_share_t *); 183 void smb_dr_put_share(smb_dr_ctx_t *, smb_share_t *); 184 185 void smb_share_door_clnt_init(void); 186 void smb_share_door_clnt_fini(void); 187 188 #ifdef __cplusplus 189 } 190 #endif 191 192 #endif /* _SMBSRV_SMB_DOOR_H */ 193