15331Samw /*
25331Samw * CDDL HEADER START
35331Samw *
45331Samw * The contents of this file are subject to the terms of the
55331Samw * Common Development and Distribution License (the "License").
65331Samw * You may not use this file except in compliance with the License.
75331Samw *
85331Samw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95331Samw * or http://www.opensolaris.org/os/licensing.
105331Samw * See the License for the specific language governing permissions
115331Samw * and limitations under the License.
125331Samw *
135331Samw * When distributing Covered Code, include this CDDL HEADER in each
145331Samw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155331Samw * If applicable, add the following below this CDDL HEADER, with the
165331Samw * fields enclosed by brackets "[]" replaced with your own identifying
175331Samw * information: Portions Copyright [yyyy] [name of copyright owner]
185331Samw *
195331Samw * CDDL HEADER END
205331Samw */
215331Samw /*
22*11963SAfshin.Ardakani@Sun.COM * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
235331Samw * Use is subject to license terms.
245331Samw */
255331Samw
265331Samw /*
275331Samw * This file was originally generated using rpcgen.
285331Samw */
295331Samw
305331Samw #ifndef _KERNEL
315331Samw #include <stdlib.h>
325331Samw #endif /* !_KERNEL */
335331Samw #include <smbsrv/wintypes.h>
346432Sas200622 #include <smbsrv/smb_sid.h>
355331Samw #include <smbsrv/smb_xdr.h>
365331Samw #include <smbsrv/smb_token.h>
375331Samw
38*11963SAfshin.Ardakani@Sun.COM static bool_t smb_privset_xdr(XDR *, smb_privset_t *);
39*11963SAfshin.Ardakani@Sun.COM static bool_t smb_sid_xdr(XDR *, smb_sid_t *);
405331Samw
418670SJose.Borrego@Sun.COM static bool_t
smb_privset_helper_xdr(XDR * xdrs,char ** privs)42*11963SAfshin.Ardakani@Sun.COM smb_privset_helper_xdr(XDR *xdrs, char **privs)
435331Samw {
445331Samw uint32_t pos, len;
455331Samw uint32_t cnt;
465331Samw bool_t rc;
475331Samw smb_privset_t *p;
485331Samw
495331Samw if (xdrs->x_op == XDR_DECODE) {
505331Samw pos = xdr_getpos(xdrs);
515331Samw
525331Samw if (!xdr_bool(xdrs, &rc))
535331Samw return (FALSE);
545331Samw
555331Samw if (!xdr_uint32_t(xdrs, &cnt))
565331Samw return (FALSE);
575331Samw
585331Samw rc = xdr_setpos(xdrs, pos);
595331Samw
605331Samw if (rc == FALSE)
615331Samw return (FALSE);
625331Samw } else {
635331Samw if (*privs == NULL)
645331Samw return (FALSE);
655331Samw
665331Samw p = (smb_privset_t *)(uintptr_t)*privs;
675331Samw cnt = p->priv_cnt;
685331Samw }
695331Samw
705331Samw len = sizeof (smb_privset_t)
715331Samw - sizeof (smb_luid_attrs_t)
725331Samw + (cnt * sizeof (smb_luid_attrs_t));
735331Samw
74*11963SAfshin.Ardakani@Sun.COM if (!xdr_pointer(xdrs, privs, len, (xdrproc_t)smb_privset_xdr))
755331Samw return (FALSE);
765331Samw
775331Samw return (TRUE);
785331Samw }
795331Samw
808670SJose.Borrego@Sun.COM static bool_t
smb_id_xdr(XDR * xdrs,smb_id_t * objp)81*11963SAfshin.Ardakani@Sun.COM smb_id_xdr(XDR *xdrs, smb_id_t *objp)
825331Samw {
838670SJose.Borrego@Sun.COM uint8_t len;
845331Samw
858670SJose.Borrego@Sun.COM if ((xdrs->x_op == XDR_ENCODE) || (xdrs->x_op == XDR_FREE))
868670SJose.Borrego@Sun.COM len = smb_sid_len(objp->i_sid);
875331Samw
888670SJose.Borrego@Sun.COM if (!xdr_uint32_t(xdrs, &objp->i_attrs))
898670SJose.Borrego@Sun.COM return (FALSE);
908670SJose.Borrego@Sun.COM
918670SJose.Borrego@Sun.COM if (!xdr_uint8_t(xdrs, &len))
928670SJose.Borrego@Sun.COM return (FALSE);
935331Samw
948670SJose.Borrego@Sun.COM if (!xdr_pointer(xdrs, (char **)&objp->i_sid, len,
95*11963SAfshin.Ardakani@Sun.COM (xdrproc_t)smb_sid_xdr))
968670SJose.Borrego@Sun.COM return (FALSE);
975331Samw
988670SJose.Borrego@Sun.COM if (!xdr_uint32_t(xdrs, (uint32_t *)&objp->i_id))
995331Samw return (FALSE);
1005331Samw
1015331Samw return (TRUE);
1025331Samw }
1035331Samw
1048670SJose.Borrego@Sun.COM static bool_t
smb_ids_xdr(XDR * xdrs,smb_ids_t * objp)105*11963SAfshin.Ardakani@Sun.COM smb_ids_xdr(XDR *xdrs, smb_ids_t *objp)
1065331Samw {
1078670SJose.Borrego@Sun.COM if (!xdr_array(xdrs, (char **)&objp->i_ids, (uint32_t *)&objp->i_cnt,
108*11963SAfshin.Ardakani@Sun.COM ~0, sizeof (smb_id_t), (xdrproc_t)smb_id_xdr))
1095331Samw return (FALSE);
1108670SJose.Borrego@Sun.COM
1115331Samw return (TRUE);
1125331Samw }
1135331Samw
1148670SJose.Borrego@Sun.COM static bool_t
smb_posix_grps_xdr(XDR * xdrs,smb_posix_grps_t * objp)115*11963SAfshin.Ardakani@Sun.COM smb_posix_grps_xdr(XDR *xdrs, smb_posix_grps_t *objp)
1165331Samw {
1175331Samw if (!xdr_uint32_t(xdrs, &objp->pg_ngrps))
1185331Samw return (FALSE);
1195331Samw if (!xdr_vector(xdrs, (char *)objp->pg_grps, objp->pg_ngrps,
120*11963SAfshin.Ardakani@Sun.COM sizeof (uint32_t), (xdrproc_t)xdr_uint32_t))
1215331Samw return (FALSE);
1225331Samw return (TRUE);
1235331Samw }
1245331Samw
1258670SJose.Borrego@Sun.COM static bool_t
smb_posix_grps_helper_xdr(XDR * xdrs,char ** identity)126*11963SAfshin.Ardakani@Sun.COM smb_posix_grps_helper_xdr(XDR *xdrs, char **identity)
1275331Samw {
1285331Samw uint32_t pos, len;
1295331Samw uint32_t cnt;
1305331Samw bool_t rc;
1315331Samw
1325331Samw if (xdrs->x_op == XDR_DECODE) {
1335331Samw pos = xdr_getpos(xdrs);
1345331Samw
1355331Samw if (!xdr_bool(xdrs, &rc))
1365331Samw return (FALSE);
1375331Samw
1385331Samw if (!xdr_uint32_t(xdrs, &cnt))
1395331Samw return (FALSE);
1405331Samw
1415331Samw rc = xdr_setpos(xdrs, pos);
1425331Samw if (rc == FALSE)
1435331Samw return (FALSE);
1445331Samw } else {
1455331Samw if (*identity == NULL)
1465331Samw return (FALSE);
1475331Samw cnt = ((smb_posix_grps_t *)(uintptr_t)*identity)->pg_ngrps;
1485331Samw }
1495331Samw
1505331Samw len = SMB_POSIX_GRPS_SIZE(cnt);
1515331Samw
152*11963SAfshin.Ardakani@Sun.COM if (!xdr_pointer(xdrs, identity, len, (xdrproc_t)smb_posix_grps_xdr))
1535331Samw return (FALSE);
1545331Samw return (TRUE);
1555331Samw }
1565331Samw
1578670SJose.Borrego@Sun.COM static bool_t
smb_session_key_xdr(XDR * xdrs,smb_session_key_t * objp)158*11963SAfshin.Ardakani@Sun.COM smb_session_key_xdr(XDR *xdrs, smb_session_key_t *objp)
1595331Samw {
1605331Samw if (!xdr_vector(xdrs, (char *)objp->data, 16,
1615331Samw sizeof (uint8_t), (xdrproc_t)xdr_uint8_t))
1625331Samw return (FALSE);
1635331Samw return (TRUE);
1645331Samw }
1655331Samw
1665331Samw bool_t
smb_logon_xdr(XDR * xdrs,smb_logon_t * objp)167*11963SAfshin.Ardakani@Sun.COM smb_logon_xdr(XDR *xdrs, smb_logon_t *objp)
1685331Samw {
169*11963SAfshin.Ardakani@Sun.COM if (!xdr_uint16_t(xdrs, &objp->lg_level))
170*11963SAfshin.Ardakani@Sun.COM return (FALSE);
171*11963SAfshin.Ardakani@Sun.COM if (!xdr_string(xdrs, &objp->lg_username, ~0))
1725331Samw return (FALSE);
173*11963SAfshin.Ardakani@Sun.COM if (!xdr_string(xdrs, &objp->lg_domain, ~0))
174*11963SAfshin.Ardakani@Sun.COM return (FALSE);
175*11963SAfshin.Ardakani@Sun.COM if (!xdr_string(xdrs, &objp->lg_e_username, ~0))
1765331Samw return (FALSE);
177*11963SAfshin.Ardakani@Sun.COM if (!xdr_string(xdrs, &objp->lg_e_domain, ~0))
1785331Samw return (FALSE);
179*11963SAfshin.Ardakani@Sun.COM if (!xdr_string(xdrs, &objp->lg_workstation, ~0))
1808670SJose.Borrego@Sun.COM return (FALSE);
181*11963SAfshin.Ardakani@Sun.COM if (!smb_inaddr_xdr(xdrs, &objp->lg_clnt_ipaddr))
1828670SJose.Borrego@Sun.COM return (FALSE);
183*11963SAfshin.Ardakani@Sun.COM if (!smb_inaddr_xdr(xdrs, &objp->lg_local_ipaddr))
1845331Samw return (FALSE);
185*11963SAfshin.Ardakani@Sun.COM if (!xdr_uint16_t(xdrs, &objp->lg_local_port))
1865331Samw return (FALSE);
187*11963SAfshin.Ardakani@Sun.COM if (!smb_buf32_xdr(xdrs, &objp->lg_challenge_key))
188*11963SAfshin.Ardakani@Sun.COM return (FALSE);
189*11963SAfshin.Ardakani@Sun.COM if (!smb_buf32_xdr(xdrs, &objp->lg_nt_password))
1905331Samw return (FALSE);
191*11963SAfshin.Ardakani@Sun.COM if (!smb_buf32_xdr(xdrs, &objp->lg_lm_password))
192*11963SAfshin.Ardakani@Sun.COM return (FALSE);
193*11963SAfshin.Ardakani@Sun.COM if (!xdr_int(xdrs, &objp->lg_native_os))
194*11963SAfshin.Ardakani@Sun.COM return (FALSE);
195*11963SAfshin.Ardakani@Sun.COM if (!xdr_int(xdrs, &objp->lg_native_lm))
1965331Samw return (FALSE);
197*11963SAfshin.Ardakani@Sun.COM if (!xdr_uint32_t(xdrs, &objp->lg_flags))
1985331Samw return (FALSE);
199*11963SAfshin.Ardakani@Sun.COM if (!xdr_uint32_t(xdrs, &objp->lg_logon_id))
2005331Samw return (FALSE);
201*11963SAfshin.Ardakani@Sun.COM if (!xdr_uint32_t(xdrs, &objp->lg_domain_type))
2025331Samw return (FALSE);
203*11963SAfshin.Ardakani@Sun.COM if (!xdr_uint32_t(xdrs, &objp->lg_secmode))
2045331Samw return (FALSE);
205*11963SAfshin.Ardakani@Sun.COM if (!xdr_uint32_t(xdrs, &objp->lg_status))
2065331Samw return (FALSE);
2075331Samw return (TRUE);
2085331Samw }
2095331Samw
2108670SJose.Borrego@Sun.COM static bool_t
smb_sid_xdr(XDR * xdrs,smb_sid_t * objp)211*11963SAfshin.Ardakani@Sun.COM smb_sid_xdr(XDR *xdrs, smb_sid_t *objp)
2125331Samw {
2136432Sas200622 if (!xdr_uint8_t(xdrs, &objp->sid_revision))
2145331Samw return (FALSE);
2156432Sas200622 if (!xdr_uint8_t(xdrs, &objp->sid_subauthcnt))
2165331Samw return (FALSE);
2176432Sas200622 if (!xdr_vector(xdrs, (char *)objp->sid_authority, NT_SID_AUTH_MAX,
2185331Samw sizeof (uint8_t), (xdrproc_t)xdr_uint8_t))
2195331Samw return (FALSE);
2206432Sas200622 if (!xdr_vector(xdrs, (char *)objp->sid_subauth, objp->sid_subauthcnt,
2215331Samw sizeof (uint32_t), (xdrproc_t)xdr_uint32_t))
2225331Samw return (FALSE);
2235331Samw return (TRUE);
2245331Samw }
2255331Samw
2268670SJose.Borrego@Sun.COM static bool_t
smb_luid_xdr(XDR * xdrs,smb_luid_t * objp)227*11963SAfshin.Ardakani@Sun.COM smb_luid_xdr(XDR *xdrs, smb_luid_t *objp)
2285331Samw {
2295331Samw if (!xdr_uint32_t(xdrs, &objp->lo_part))
2305331Samw return (FALSE);
2315331Samw if (!xdr_uint32_t(xdrs, &objp->hi_part))
2325331Samw return (FALSE);
2335331Samw return (TRUE);
2345331Samw }
2355331Samw
2368670SJose.Borrego@Sun.COM static bool_t
smb_luid_attrs_xdr(XDR * xdrs,smb_luid_attrs_t * objp)237*11963SAfshin.Ardakani@Sun.COM smb_luid_attrs_xdr(XDR *xdrs, smb_luid_attrs_t *objp)
2385331Samw {
239*11963SAfshin.Ardakani@Sun.COM if (!smb_luid_xdr(xdrs, &objp->luid))
2405331Samw return (FALSE);
2415331Samw if (!xdr_uint32_t(xdrs, &objp->attrs))
2425331Samw return (FALSE);
2435331Samw return (TRUE);
2445331Samw }
2455331Samw
2468670SJose.Borrego@Sun.COM static bool_t
smb_privset_xdr(XDR * xdrs,smb_privset_t * objp)247*11963SAfshin.Ardakani@Sun.COM smb_privset_xdr(XDR *xdrs, smb_privset_t *objp)
2485331Samw {
2495331Samw if (!xdr_uint32_t(xdrs, &objp->priv_cnt))
2505331Samw return (FALSE);
2515331Samw if (!xdr_uint32_t(xdrs, &objp->control))
2525331Samw return (FALSE);
2535331Samw if (!xdr_vector(xdrs, (char *)objp->priv, objp->priv_cnt,
2545331Samw sizeof (smb_luid_attrs_t),
255*11963SAfshin.Ardakani@Sun.COM (xdrproc_t)smb_luid_attrs_xdr))
2565331Samw return (FALSE);
2575331Samw return (TRUE);
2585331Samw }
2595331Samw
2605331Samw bool_t
smb_token_xdr(XDR * xdrs,smb_token_t * objp)261*11963SAfshin.Ardakani@Sun.COM smb_token_xdr(XDR *xdrs, smb_token_t *objp)
2625331Samw {
263*11963SAfshin.Ardakani@Sun.COM if (!smb_id_xdr(xdrs, &objp->tkn_user))
264*11963SAfshin.Ardakani@Sun.COM return (FALSE);
265*11963SAfshin.Ardakani@Sun.COM if (!smb_id_xdr(xdrs, &objp->tkn_owner))
2668670SJose.Borrego@Sun.COM return (FALSE);
267*11963SAfshin.Ardakani@Sun.COM if (!smb_id_xdr(xdrs, &objp->tkn_primary_grp))
2685331Samw return (FALSE);
269*11963SAfshin.Ardakani@Sun.COM if (!smb_ids_xdr(xdrs, &objp->tkn_win_grps))
2705331Samw return (FALSE);
271*11963SAfshin.Ardakani@Sun.COM if (!smb_privset_helper_xdr(xdrs, (char **)&objp->tkn_privileges))
2725331Samw return (FALSE);
2735331Samw if (!xdr_string(xdrs, &objp->tkn_account_name, ~0))
2745331Samw return (FALSE);
2755331Samw if (!xdr_string(xdrs, &objp->tkn_domain_name, ~0))
2765331Samw return (FALSE);
2775331Samw if (!xdr_uint32_t(xdrs, &objp->tkn_flags))
2785331Samw return (FALSE);
2795331Samw if (!xdr_uint32_t(xdrs, &objp->tkn_audit_sid))
2805331Samw return (FALSE);
2815331Samw if (!xdr_pointer(xdrs, (char **)&objp->tkn_session_key,
282*11963SAfshin.Ardakani@Sun.COM sizeof (smb_session_key_t), (xdrproc_t)smb_session_key_xdr))
2835331Samw return (FALSE);
284*11963SAfshin.Ardakani@Sun.COM if (!smb_posix_grps_helper_xdr(xdrs, (char **)&objp->tkn_posix_grps))
2855331Samw return (FALSE);
2865331Samw return (TRUE);
2875331Samw }
288