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 */