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 2010 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 *
25 * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
26 */
27
28 /*
29 * This file was originally generated using rpcgen.
30 */
31
32 #if !defined(_KERNEL) && !defined(_FAKE_KERNEL)
33 #include <stdlib.h>
34 #endif /* !_KERNEL */
35 #include <smb/wintypes.h>
36 #include <smbsrv/smb_sid.h>
37 #include <smbsrv/smb_xdr.h>
38 #include <smbsrv/smb_token.h>
39
40 static bool_t smb_privset_xdr(XDR *, smb_privset_t *);
41 static bool_t smb_sid_xdr(XDR *, smb_sid_t *);
42
43 static bool_t
smb_privset_helper_xdr(XDR * xdrs,char ** privs)44 smb_privset_helper_xdr(XDR *xdrs, char **privs)
45 {
46 uint32_t pos, len;
47 uint32_t cnt;
48 bool_t rc;
49 smb_privset_t *p;
50
51 if (xdrs->x_op == XDR_DECODE) {
52 pos = xdr_getpos(xdrs);
53
54 if (!xdr_bool(xdrs, &rc))
55 return (FALSE);
56
57 if (!xdr_uint32_t(xdrs, &cnt))
58 return (FALSE);
59
60 rc = xdr_setpos(xdrs, pos);
61
62 if (rc == FALSE)
63 return (FALSE);
64 } else {
65 if (*privs == NULL)
66 return (FALSE);
67
68 p = (smb_privset_t *)(uintptr_t)*privs;
69 cnt = p->priv_cnt;
70 }
71
72 len = sizeof (smb_privset_t)
73 - sizeof (smb_luid_attrs_t)
74 + (cnt * sizeof (smb_luid_attrs_t));
75
76 if (!xdr_pointer(xdrs, privs, len, (xdrproc_t)smb_privset_xdr))
77 return (FALSE);
78
79 return (TRUE);
80 }
81
82 static bool_t
smb_id_xdr(XDR * xdrs,smb_id_t * objp)83 smb_id_xdr(XDR *xdrs, smb_id_t *objp)
84 {
85 uint8_t len;
86
87 if ((xdrs->x_op == XDR_ENCODE) || (xdrs->x_op == XDR_FREE))
88 len = smb_sid_len(objp->i_sid);
89
90 if (!xdr_uint32_t(xdrs, &objp->i_attrs))
91 return (FALSE);
92
93 if (!xdr_uint8_t(xdrs, &len))
94 return (FALSE);
95
96 if (!xdr_pointer(xdrs, (char **)&objp->i_sid, len,
97 (xdrproc_t)smb_sid_xdr))
98 return (FALSE);
99
100 if (!xdr_uint32_t(xdrs, (uint32_t *)&objp->i_id))
101 return (FALSE);
102
103 return (TRUE);
104 }
105
106 static bool_t
smb_ids_xdr(XDR * xdrs,smb_ids_t * objp)107 smb_ids_xdr(XDR *xdrs, smb_ids_t *objp)
108 {
109 if (!xdr_array(xdrs, (char **)&objp->i_ids, (uint32_t *)&objp->i_cnt,
110 ~0, sizeof (smb_id_t), (xdrproc_t)smb_id_xdr))
111 return (FALSE);
112
113 return (TRUE);
114 }
115
116 static bool_t
smb_posix_grps_xdr(XDR * xdrs,smb_posix_grps_t * objp)117 smb_posix_grps_xdr(XDR *xdrs, smb_posix_grps_t *objp)
118 {
119 if (!xdr_uint32_t(xdrs, &objp->pg_ngrps))
120 return (FALSE);
121 if (!xdr_vector(xdrs, (char *)objp->pg_grps, objp->pg_ngrps,
122 sizeof (uint32_t), (xdrproc_t)xdr_uint32_t))
123 return (FALSE);
124 return (TRUE);
125 }
126
127 static bool_t
smb_posix_grps_helper_xdr(XDR * xdrs,char ** identity)128 smb_posix_grps_helper_xdr(XDR *xdrs, char **identity)
129 {
130 uint32_t pos, len;
131 uint32_t cnt;
132 bool_t rc;
133
134 if (xdrs->x_op == XDR_DECODE) {
135 pos = xdr_getpos(xdrs);
136
137 if (!xdr_bool(xdrs, &rc))
138 return (FALSE);
139
140 if (!xdr_uint32_t(xdrs, &cnt))
141 return (FALSE);
142
143 rc = xdr_setpos(xdrs, pos);
144 if (rc == FALSE)
145 return (FALSE);
146 } else {
147 if (*identity == NULL)
148 return (FALSE);
149 cnt = ((smb_posix_grps_t *)(uintptr_t)*identity)->pg_ngrps;
150 }
151
152 len = SMB_POSIX_GRPS_SIZE(cnt);
153
154 if (!xdr_pointer(xdrs, identity, len, (xdrproc_t)smb_posix_grps_xdr))
155 return (FALSE);
156 return (TRUE);
157 }
158
159 bool_t
smb_logon_xdr(XDR * xdrs,smb_logon_t * objp)160 smb_logon_xdr(XDR *xdrs, smb_logon_t *objp)
161 {
162 if (!xdr_uint16_t(xdrs, &objp->lg_level))
163 return (FALSE);
164 if (!xdr_string(xdrs, &objp->lg_username, ~0))
165 return (FALSE);
166 if (!xdr_string(xdrs, &objp->lg_domain, ~0))
167 return (FALSE);
168 if (!xdr_string(xdrs, &objp->lg_e_username, ~0))
169 return (FALSE);
170 if (!xdr_string(xdrs, &objp->lg_e_domain, ~0))
171 return (FALSE);
172 if (!xdr_string(xdrs, &objp->lg_workstation, ~0))
173 return (FALSE);
174 if (!smb_inaddr_xdr(xdrs, &objp->lg_clnt_ipaddr))
175 return (FALSE);
176 if (!smb_inaddr_xdr(xdrs, &objp->lg_local_ipaddr))
177 return (FALSE);
178 if (!xdr_uint16_t(xdrs, &objp->lg_local_port))
179 return (FALSE);
180 if (!smb_buf32_xdr(xdrs, &objp->lg_challenge_key))
181 return (FALSE);
182 if (!smb_buf32_xdr(xdrs, &objp->lg_nt_password))
183 return (FALSE);
184 if (!smb_buf32_xdr(xdrs, &objp->lg_lm_password))
185 return (FALSE);
186 if (!xdr_uint32_t(xdrs, &objp->lg_ntlm_flags))
187 return (FALSE);
188 if (!xdr_int(xdrs, &objp->lg_native_os))
189 return (FALSE);
190 if (!xdr_int(xdrs, &objp->lg_native_lm))
191 return (FALSE);
192 if (!xdr_uint32_t(xdrs, &objp->lg_flags))
193 return (FALSE);
194 if (!xdr_uint32_t(xdrs, &objp->lg_logon_id))
195 return (FALSE);
196 if (!xdr_uint32_t(xdrs, &objp->lg_domain_type))
197 return (FALSE);
198 if (!xdr_uint32_t(xdrs, &objp->lg_secmode))
199 return (FALSE);
200 if (!xdr_uint32_t(xdrs, &objp->lg_status))
201 return (FALSE);
202 return (TRUE);
203 }
204
205 static bool_t
smb_sid_xdr(XDR * xdrs,smb_sid_t * objp)206 smb_sid_xdr(XDR *xdrs, smb_sid_t *objp)
207 {
208 if (!xdr_uint8_t(xdrs, &objp->sid_revision))
209 return (FALSE);
210 if (!xdr_uint8_t(xdrs, &objp->sid_subauthcnt))
211 return (FALSE);
212 if (!xdr_vector(xdrs, (char *)objp->sid_authority, NT_SID_AUTH_MAX,
213 sizeof (uint8_t), (xdrproc_t)xdr_uint8_t))
214 return (FALSE);
215 if (!xdr_vector(xdrs, (char *)objp->sid_subauth, objp->sid_subauthcnt,
216 sizeof (uint32_t), (xdrproc_t)xdr_uint32_t))
217 return (FALSE);
218 return (TRUE);
219 }
220
221 static bool_t
smb_luid_xdr(XDR * xdrs,smb_luid_t * objp)222 smb_luid_xdr(XDR *xdrs, smb_luid_t *objp)
223 {
224 if (!xdr_uint32_t(xdrs, &objp->lo_part))
225 return (FALSE);
226 if (!xdr_uint32_t(xdrs, &objp->hi_part))
227 return (FALSE);
228 return (TRUE);
229 }
230
231 static bool_t
smb_luid_attrs_xdr(XDR * xdrs,smb_luid_attrs_t * objp)232 smb_luid_attrs_xdr(XDR *xdrs, smb_luid_attrs_t *objp)
233 {
234 if (!smb_luid_xdr(xdrs, &objp->luid))
235 return (FALSE);
236 if (!xdr_uint32_t(xdrs, &objp->attrs))
237 return (FALSE);
238 return (TRUE);
239 }
240
241 static bool_t
smb_privset_xdr(XDR * xdrs,smb_privset_t * objp)242 smb_privset_xdr(XDR *xdrs, smb_privset_t *objp)
243 {
244 if (!xdr_uint32_t(xdrs, &objp->priv_cnt))
245 return (FALSE);
246 if (!xdr_uint32_t(xdrs, &objp->control))
247 return (FALSE);
248 if (!xdr_vector(xdrs, (char *)objp->priv, objp->priv_cnt,
249 sizeof (smb_luid_attrs_t),
250 (xdrproc_t)smb_luid_attrs_xdr))
251 return (FALSE);
252 return (TRUE);
253 }
254
255 bool_t
smb_token_xdr(XDR * xdrs,smb_token_t * objp)256 smb_token_xdr(XDR *xdrs, smb_token_t *objp)
257 {
258 if (!smb_id_xdr(xdrs, &objp->tkn_user))
259 return (FALSE);
260 if (!smb_id_xdr(xdrs, &objp->tkn_owner))
261 return (FALSE);
262 if (!smb_id_xdr(xdrs, &objp->tkn_primary_grp))
263 return (FALSE);
264 if (!smb_ids_xdr(xdrs, &objp->tkn_win_grps))
265 return (FALSE);
266 if (!smb_privset_helper_xdr(xdrs, (char **)&objp->tkn_privileges))
267 return (FALSE);
268 if (!xdr_string(xdrs, &objp->tkn_account_name, ~0))
269 return (FALSE);
270 if (!xdr_string(xdrs, &objp->tkn_domain_name, ~0))
271 return (FALSE);
272 if (!xdr_uint32_t(xdrs, &objp->tkn_flags))
273 return (FALSE);
274 if (!xdr_uint32_t(xdrs, &objp->tkn_audit_sid))
275 return (FALSE);
276 if (!smb_buf32_xdr(xdrs, &objp->tkn_ssnkey))
277 return (FALSE);
278 if (!smb_posix_grps_helper_xdr(xdrs, (char **)&objp->tkn_posix_grps))
279 return (FALSE);
280 return (TRUE);
281 }
282