xref: /onnv-gate/usr/src/common/smbsrv/smb_xdr.c (revision 12508:edb7861a1533)
111963SAfshin.Ardakani@Sun.COM /*
211963SAfshin.Ardakani@Sun.COM  * CDDL HEADER START
311963SAfshin.Ardakani@Sun.COM  *
411963SAfshin.Ardakani@Sun.COM  * The contents of this file are subject to the terms of the
511963SAfshin.Ardakani@Sun.COM  * Common Development and Distribution License (the "License").
611963SAfshin.Ardakani@Sun.COM  * You may not use this file except in compliance with the License.
711963SAfshin.Ardakani@Sun.COM  *
811963SAfshin.Ardakani@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
911963SAfshin.Ardakani@Sun.COM  * or http://www.opensolaris.org/os/licensing.
1011963SAfshin.Ardakani@Sun.COM  * See the License for the specific language governing permissions
1111963SAfshin.Ardakani@Sun.COM  * and limitations under the License.
1211963SAfshin.Ardakani@Sun.COM  *
1311963SAfshin.Ardakani@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
1411963SAfshin.Ardakani@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1511963SAfshin.Ardakani@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
1611963SAfshin.Ardakani@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
1711963SAfshin.Ardakani@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
1811963SAfshin.Ardakani@Sun.COM  *
1911963SAfshin.Ardakani@Sun.COM  * CDDL HEADER END
2011963SAfshin.Ardakani@Sun.COM  */
2111963SAfshin.Ardakani@Sun.COM /*
2212065SKeyur.Desai@Sun.COM  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
2311963SAfshin.Ardakani@Sun.COM  */
2411963SAfshin.Ardakani@Sun.COM 
2511963SAfshin.Ardakani@Sun.COM #include <sys/sunddi.h>
2611963SAfshin.Ardakani@Sun.COM #ifndef _KERNEL
2711963SAfshin.Ardakani@Sun.COM #include <string.h>
2811963SAfshin.Ardakani@Sun.COM #include <strings.h>
2911963SAfshin.Ardakani@Sun.COM #include <stddef.h>
3011963SAfshin.Ardakani@Sun.COM #endif /* _KERNEL */
3111963SAfshin.Ardakani@Sun.COM #include <smbsrv/smb_door.h>
3211963SAfshin.Ardakani@Sun.COM #include <smbsrv/alloc.h>
3311963SAfshin.Ardakani@Sun.COM #include <sys/socket.h>
3411963SAfshin.Ardakani@Sun.COM #include <sys/sysmacros.h>
3511963SAfshin.Ardakani@Sun.COM 
3611963SAfshin.Ardakani@Sun.COM #define	SMB_XDRMAX32_SZ		0xFFFFFFFF
3711963SAfshin.Ardakani@Sun.COM 
3811963SAfshin.Ardakani@Sun.COM bool_t smb_list_xdr(XDR *, list_t *,  const size_t, const size_t,
3911963SAfshin.Ardakani@Sun.COM     const xdrproc_t);
4011963SAfshin.Ardakani@Sun.COM 
4111963SAfshin.Ardakani@Sun.COM bool_t
smb_buf32_xdr(XDR * xdrs,smb_buf32_t * objp)4211963SAfshin.Ardakani@Sun.COM smb_buf32_xdr(XDR *xdrs, smb_buf32_t *objp)
4311963SAfshin.Ardakani@Sun.COM {
4411963SAfshin.Ardakani@Sun.COM 	uint_t	maxsize = SMB_XDRMAX32_SZ;
4511963SAfshin.Ardakani@Sun.COM 	uint_t	size;
4611963SAfshin.Ardakani@Sun.COM 
4711963SAfshin.Ardakani@Sun.COM 	if (xdrs->x_op != XDR_DECODE)
4811963SAfshin.Ardakani@Sun.COM 		maxsize = size = (uint_t)objp->len;
4911963SAfshin.Ardakani@Sun.COM 
5011963SAfshin.Ardakani@Sun.COM 	if (xdr_bytes(xdrs, (char **)&objp->val, &size, maxsize)) {
5111963SAfshin.Ardakani@Sun.COM 		if (xdrs->x_op == XDR_DECODE)
5211963SAfshin.Ardakani@Sun.COM 			objp->len = (uint32_t)size;
5311963SAfshin.Ardakani@Sun.COM 		return (TRUE);
5411963SAfshin.Ardakani@Sun.COM 	}
5511963SAfshin.Ardakani@Sun.COM 
5611963SAfshin.Ardakani@Sun.COM 	return (FALSE);
5711963SAfshin.Ardakani@Sun.COM }
5811963SAfshin.Ardakani@Sun.COM 
5911963SAfshin.Ardakani@Sun.COM /*
6011963SAfshin.Ardakani@Sun.COM  * When decoding into a string, ensure that objp->buf is NULL or
6111963SAfshin.Ardakani@Sun.COM  * is pointing at a buffer large enough to receive the string.
6211963SAfshin.Ardakani@Sun.COM  * Don't leave it as an uninitialized pointer.
6311963SAfshin.Ardakani@Sun.COM  *
6411963SAfshin.Ardakani@Sun.COM  * If objp->buf is NULL, xdr_string will allocate memory for the
6511963SAfshin.Ardakani@Sun.COM  * string.  Otherwise it will copy into the available buffer.
6611963SAfshin.Ardakani@Sun.COM  */
6711963SAfshin.Ardakani@Sun.COM bool_t
smb_string_xdr(XDR * xdrs,smb_string_t * objp)6811963SAfshin.Ardakani@Sun.COM smb_string_xdr(XDR *xdrs, smb_string_t *objp)
6911963SAfshin.Ardakani@Sun.COM {
7011963SAfshin.Ardakani@Sun.COM 	if (!xdr_string(xdrs, &objp->buf, ~0))
7111963SAfshin.Ardakani@Sun.COM 		return (FALSE);
7211963SAfshin.Ardakani@Sun.COM 	return (TRUE);
7311963SAfshin.Ardakani@Sun.COM }
7411963SAfshin.Ardakani@Sun.COM 
7511963SAfshin.Ardakani@Sun.COM const char *
smb_doorhdr_opname(uint32_t op)7611963SAfshin.Ardakani@Sun.COM smb_doorhdr_opname(uint32_t op)
7711963SAfshin.Ardakani@Sun.COM {
7811963SAfshin.Ardakani@Sun.COM 	struct {
7911963SAfshin.Ardakani@Sun.COM 		uint32_t	op;
8011963SAfshin.Ardakani@Sun.COM 		const char	*name;
8111963SAfshin.Ardakani@Sun.COM 	} ops[] = {
8211963SAfshin.Ardakani@Sun.COM 		{ SMB_DR_NULL,			"null" },
8311963SAfshin.Ardakani@Sun.COM 		{ SMB_DR_ASYNC_RESPONSE,	"async_response" },
8411963SAfshin.Ardakani@Sun.COM 		{ SMB_DR_USER_AUTH_LOGON,	"user_auth_logon" },
8511963SAfshin.Ardakani@Sun.COM 		{ SMB_DR_USER_NONAUTH_LOGON,	"user_nonauth_logon" },
8611963SAfshin.Ardakani@Sun.COM 		{ SMB_DR_USER_AUTH_LOGOFF,	"user_auth_logoff" },
8711963SAfshin.Ardakani@Sun.COM 		{ SMB_DR_LOOKUP_SID,		"lookup_sid" },
8811963SAfshin.Ardakani@Sun.COM 		{ SMB_DR_LOOKUP_NAME,		"lookup_name" },
8911963SAfshin.Ardakani@Sun.COM 		{ SMB_DR_JOIN,			"join" },
9011963SAfshin.Ardakani@Sun.COM 		{ SMB_DR_GET_DCINFO,		"get_dcinfo" },
9111963SAfshin.Ardakani@Sun.COM 		{ SMB_DR_VSS_GET_COUNT,		"vss_get_count" },
9211963SAfshin.Ardakani@Sun.COM 		{ SMB_DR_VSS_GET_SNAPSHOTS,	"vss_get_snapshots" },
9311963SAfshin.Ardakani@Sun.COM 		{ SMB_DR_VSS_MAP_GMTTOKEN,	"vss_map_gmttoken" },
9411963SAfshin.Ardakani@Sun.COM 		{ SMB_DR_ADS_FIND_HOST,		"ads_find_host" },
9511963SAfshin.Ardakani@Sun.COM 		{ SMB_DR_QUOTA_QUERY,		"quota_query" },
9611963SAfshin.Ardakani@Sun.COM 		{ SMB_DR_QUOTA_SET,		"quota_set" },
97*12508Samw@Sun.COM 		{ SMB_DR_DFS_GET_REFERRALS,	"dfs_get_referrals" },
98*12508Samw@Sun.COM 		{ SMB_DR_SHR_HOSTACCESS,	"share_hostaccess" },
99*12508Samw@Sun.COM 		{ SMB_DR_SHR_EXEC,		"share_exec" }
10011963SAfshin.Ardakani@Sun.COM 	};
10111963SAfshin.Ardakani@Sun.COM 	int	i;
10211963SAfshin.Ardakani@Sun.COM 
10311963SAfshin.Ardakani@Sun.COM 	for (i = 0; i < (sizeof (ops) / sizeof (ops[0])); ++i) {
10411963SAfshin.Ardakani@Sun.COM 		if (ops[i].op == op)
10511963SAfshin.Ardakani@Sun.COM 			return (ops[i].name);
10611963SAfshin.Ardakani@Sun.COM 	}
10711963SAfshin.Ardakani@Sun.COM 
10811963SAfshin.Ardakani@Sun.COM 	return ("unknown");
10911963SAfshin.Ardakani@Sun.COM }
11011963SAfshin.Ardakani@Sun.COM 
11111963SAfshin.Ardakani@Sun.COM /*
11211963SAfshin.Ardakani@Sun.COM  * Encode a door header structure into an XDR buffer.
11311963SAfshin.Ardakani@Sun.COM  */
11411963SAfshin.Ardakani@Sun.COM int
smb_doorhdr_encode(smb_doorhdr_t * hdr,uint8_t * buf,uint32_t buflen)11511963SAfshin.Ardakani@Sun.COM smb_doorhdr_encode(smb_doorhdr_t *hdr, uint8_t *buf, uint32_t buflen)
11611963SAfshin.Ardakani@Sun.COM {
11711963SAfshin.Ardakani@Sun.COM 	XDR xdrs;
11811963SAfshin.Ardakani@Sun.COM 	int rc = 0;
11911963SAfshin.Ardakani@Sun.COM 
12011963SAfshin.Ardakani@Sun.COM 	xdrmem_create(&xdrs, (const caddr_t)buf, buflen, XDR_ENCODE);
12111963SAfshin.Ardakani@Sun.COM 
12211963SAfshin.Ardakani@Sun.COM 	if (!smb_doorhdr_xdr(&xdrs, hdr))
12311963SAfshin.Ardakani@Sun.COM 		rc = -1;
12411963SAfshin.Ardakani@Sun.COM 
12511963SAfshin.Ardakani@Sun.COM 	xdr_destroy(&xdrs);
12611963SAfshin.Ardakani@Sun.COM 	return (rc);
12711963SAfshin.Ardakani@Sun.COM }
12811963SAfshin.Ardakani@Sun.COM 
12911963SAfshin.Ardakani@Sun.COM /*
13011963SAfshin.Ardakani@Sun.COM  * Decode an XDR buffer into a door header structure.
13111963SAfshin.Ardakani@Sun.COM  */
13211963SAfshin.Ardakani@Sun.COM int
smb_doorhdr_decode(smb_doorhdr_t * hdr,uint8_t * buf,uint32_t buflen)13311963SAfshin.Ardakani@Sun.COM smb_doorhdr_decode(smb_doorhdr_t *hdr, uint8_t *buf, uint32_t buflen)
13411963SAfshin.Ardakani@Sun.COM {
13511963SAfshin.Ardakani@Sun.COM 	XDR xdrs;
13611963SAfshin.Ardakani@Sun.COM 	int rc = 0;
13711963SAfshin.Ardakani@Sun.COM 
13811963SAfshin.Ardakani@Sun.COM 	bzero(hdr, sizeof (smb_doorhdr_t));
13911963SAfshin.Ardakani@Sun.COM 	xdrmem_create(&xdrs, (const caddr_t)buf, buflen, XDR_DECODE);
14011963SAfshin.Ardakani@Sun.COM 
14111963SAfshin.Ardakani@Sun.COM 	if (!smb_doorhdr_xdr(&xdrs, hdr))
14211963SAfshin.Ardakani@Sun.COM 		rc = -1;
14311963SAfshin.Ardakani@Sun.COM 
14411963SAfshin.Ardakani@Sun.COM 	xdr_destroy(&xdrs);
14511963SAfshin.Ardakani@Sun.COM 	return (rc);
14611963SAfshin.Ardakani@Sun.COM }
14711963SAfshin.Ardakani@Sun.COM 
14811963SAfshin.Ardakani@Sun.COM bool_t
smb_doorhdr_xdr(XDR * xdrs,smb_doorhdr_t * objp)14911963SAfshin.Ardakani@Sun.COM smb_doorhdr_xdr(XDR *xdrs, smb_doorhdr_t *objp)
15011963SAfshin.Ardakani@Sun.COM {
15111963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->dh_magic))
15211963SAfshin.Ardakani@Sun.COM 		return (FALSE);
15311963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->dh_flags))
15411963SAfshin.Ardakani@Sun.COM 		return (FALSE);
15511963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->dh_fid))
15611963SAfshin.Ardakani@Sun.COM 		return (FALSE);
15711963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->dh_op))
15811963SAfshin.Ardakani@Sun.COM 		return (FALSE);
15911963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->dh_txid))
16011963SAfshin.Ardakani@Sun.COM 		return (FALSE);
16111963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->dh_datalen))
16211963SAfshin.Ardakani@Sun.COM 		return (FALSE);
16311963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->dh_resid))
16411963SAfshin.Ardakani@Sun.COM 		return (FALSE);
16511963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->dh_door_rc))
16611963SAfshin.Ardakani@Sun.COM 		return (FALSE);
16711963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->dh_status))
16811963SAfshin.Ardakani@Sun.COM 		return (FALSE);
16911963SAfshin.Ardakani@Sun.COM 	return (TRUE);
17011963SAfshin.Ardakani@Sun.COM }
17111963SAfshin.Ardakani@Sun.COM 
17211963SAfshin.Ardakani@Sun.COM /*
17311963SAfshin.Ardakani@Sun.COM  * Encode an smb_netuserinfo_t into a buffer.
17411963SAfshin.Ardakani@Sun.COM  */
17511963SAfshin.Ardakani@Sun.COM int
smb_netuserinfo_encode(smb_netuserinfo_t * info,uint8_t * buf,uint32_t buflen,uint_t * nbytes)17611963SAfshin.Ardakani@Sun.COM smb_netuserinfo_encode(smb_netuserinfo_t *info, uint8_t *buf,
17711963SAfshin.Ardakani@Sun.COM     uint32_t buflen, uint_t *nbytes)
17811963SAfshin.Ardakani@Sun.COM {
17911963SAfshin.Ardakani@Sun.COM 	XDR xdrs;
18011963SAfshin.Ardakani@Sun.COM 	int rc = 0;
18111963SAfshin.Ardakani@Sun.COM 
18211963SAfshin.Ardakani@Sun.COM 	xdrmem_create(&xdrs, (const caddr_t)buf, buflen, XDR_ENCODE);
18311963SAfshin.Ardakani@Sun.COM 
18411963SAfshin.Ardakani@Sun.COM 	if (!smb_netuserinfo_xdr(&xdrs, info))
18511963SAfshin.Ardakani@Sun.COM 		rc = -1;
18611963SAfshin.Ardakani@Sun.COM 
18711963SAfshin.Ardakani@Sun.COM 	if (nbytes != NULL)
18811963SAfshin.Ardakani@Sun.COM 		*nbytes = xdr_getpos(&xdrs);
18911963SAfshin.Ardakani@Sun.COM 	xdr_destroy(&xdrs);
19011963SAfshin.Ardakani@Sun.COM 	return (rc);
19111963SAfshin.Ardakani@Sun.COM }
19211963SAfshin.Ardakani@Sun.COM 
19311963SAfshin.Ardakani@Sun.COM /*
19411963SAfshin.Ardakani@Sun.COM  * Decode an XDR buffer into an smb_netuserinfo_t.
19511963SAfshin.Ardakani@Sun.COM  */
19611963SAfshin.Ardakani@Sun.COM int
smb_netuserinfo_decode(smb_netuserinfo_t * info,uint8_t * buf,uint32_t buflen,uint_t * nbytes)19711963SAfshin.Ardakani@Sun.COM smb_netuserinfo_decode(smb_netuserinfo_t *info, uint8_t *buf,
19811963SAfshin.Ardakani@Sun.COM     uint32_t buflen, uint_t *nbytes)
19911963SAfshin.Ardakani@Sun.COM {
20011963SAfshin.Ardakani@Sun.COM 	XDR xdrs;
20111963SAfshin.Ardakani@Sun.COM 	int rc = 0;
20211963SAfshin.Ardakani@Sun.COM 
20311963SAfshin.Ardakani@Sun.COM 	xdrmem_create(&xdrs, (const caddr_t)buf, buflen, XDR_DECODE);
20411963SAfshin.Ardakani@Sun.COM 
20511963SAfshin.Ardakani@Sun.COM 	bzero(info, sizeof (smb_netuserinfo_t));
20611963SAfshin.Ardakani@Sun.COM 	if (!smb_netuserinfo_xdr(&xdrs, info))
20711963SAfshin.Ardakani@Sun.COM 		rc = -1;
20811963SAfshin.Ardakani@Sun.COM 
20911963SAfshin.Ardakani@Sun.COM 	if (nbytes != NULL)
21011963SAfshin.Ardakani@Sun.COM 		*nbytes = xdr_getpos(&xdrs);
21111963SAfshin.Ardakani@Sun.COM 	xdr_destroy(&xdrs);
21211963SAfshin.Ardakani@Sun.COM 	return (rc);
21311963SAfshin.Ardakani@Sun.COM }
21411963SAfshin.Ardakani@Sun.COM 
21511963SAfshin.Ardakani@Sun.COM bool_t
smb_inaddr_xdr(XDR * xdrs,smb_inaddr_t * objp)21611963SAfshin.Ardakani@Sun.COM smb_inaddr_xdr(XDR *xdrs, smb_inaddr_t *objp)
21711963SAfshin.Ardakani@Sun.COM {
21811963SAfshin.Ardakani@Sun.COM 	if (!xdr_int32_t(xdrs, &objp->a_family))
21911963SAfshin.Ardakani@Sun.COM 		return (FALSE);
22011963SAfshin.Ardakani@Sun.COM 	if (objp->a_family == AF_INET) {
22111963SAfshin.Ardakani@Sun.COM 		if (!xdr_uint32_t(xdrs, (in_addr_t *)&objp->a_ipv4))
22211963SAfshin.Ardakani@Sun.COM 			return (FALSE);
22311963SAfshin.Ardakani@Sun.COM 	} else {
22411963SAfshin.Ardakani@Sun.COM 		if (!xdr_vector(xdrs, (char *)&objp->a_ipv6,
22511963SAfshin.Ardakani@Sun.COM 		    sizeof (objp->a_ipv6), sizeof (char), (xdrproc_t)xdr_char))
22611963SAfshin.Ardakani@Sun.COM 			return (FALSE);
22711963SAfshin.Ardakani@Sun.COM 	}
22811963SAfshin.Ardakani@Sun.COM 	return (TRUE);
22911963SAfshin.Ardakani@Sun.COM }
23011963SAfshin.Ardakani@Sun.COM 
23111963SAfshin.Ardakani@Sun.COM /*
23211963SAfshin.Ardakani@Sun.COM  * XDR encode/decode for smb_netuserinfo_t.
23311963SAfshin.Ardakani@Sun.COM  */
23411963SAfshin.Ardakani@Sun.COM bool_t
smb_netuserinfo_xdr(XDR * xdrs,smb_netuserinfo_t * objp)23511963SAfshin.Ardakani@Sun.COM smb_netuserinfo_xdr(XDR *xdrs, smb_netuserinfo_t *objp)
23611963SAfshin.Ardakani@Sun.COM {
23711963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint64_t(xdrs, &objp->ui_session_id))
23811963SAfshin.Ardakani@Sun.COM 		return (FALSE);
23912065SKeyur.Desai@Sun.COM 	if (!xdr_uint16_t(xdrs, &objp->ui_smb_uid))
24011963SAfshin.Ardakani@Sun.COM 		return (FALSE);
24111963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint16_t(xdrs, &objp->ui_domain_len))
24211963SAfshin.Ardakani@Sun.COM 		return (FALSE);
24311963SAfshin.Ardakani@Sun.COM 	if (!xdr_string(xdrs, &objp->ui_domain, ~0))
24411963SAfshin.Ardakani@Sun.COM 		return (FALSE);
24511963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint16_t(xdrs, &objp->ui_account_len))
24611963SAfshin.Ardakani@Sun.COM 		return (FALSE);
24711963SAfshin.Ardakani@Sun.COM 	if (!xdr_string(xdrs, &objp->ui_account, ~0))
24811963SAfshin.Ardakani@Sun.COM 		return (FALSE);
24912065SKeyur.Desai@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->ui_posix_uid))
25012065SKeyur.Desai@Sun.COM 		return (FALSE);
25111963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint16_t(xdrs, &objp->ui_workstation_len))
25211963SAfshin.Ardakani@Sun.COM 		return (FALSE);
25311963SAfshin.Ardakani@Sun.COM 	if (!xdr_string(xdrs, &objp->ui_workstation, ~0))
25411963SAfshin.Ardakani@Sun.COM 		return (FALSE);
25511963SAfshin.Ardakani@Sun.COM 	if (!smb_inaddr_xdr(xdrs, &objp->ui_ipaddr))
25611963SAfshin.Ardakani@Sun.COM 		return (FALSE);
25711963SAfshin.Ardakani@Sun.COM 	if (!xdr_int32_t(xdrs, &objp->ui_native_os))
25811963SAfshin.Ardakani@Sun.COM 		return (FALSE);
25911963SAfshin.Ardakani@Sun.COM 	if (!xdr_int64_t(xdrs, &objp->ui_logon_time))
26011963SAfshin.Ardakani@Sun.COM 		return (FALSE);
26111963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->ui_numopens))
26211963SAfshin.Ardakani@Sun.COM 		return (FALSE);
26311963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->ui_flags))
26411963SAfshin.Ardakani@Sun.COM 		return (FALSE);
26511963SAfshin.Ardakani@Sun.COM 	return (TRUE);
26611963SAfshin.Ardakani@Sun.COM }
26711963SAfshin.Ardakani@Sun.COM 
26811963SAfshin.Ardakani@Sun.COM /*
26911963SAfshin.Ardakani@Sun.COM  * Encode an smb_netconnectinfo_t into a buffer.
27011963SAfshin.Ardakani@Sun.COM  */
27111963SAfshin.Ardakani@Sun.COM int
smb_netconnectinfo_encode(smb_netconnectinfo_t * info,uint8_t * buf,uint32_t buflen,uint_t * nbytes)27211963SAfshin.Ardakani@Sun.COM smb_netconnectinfo_encode(smb_netconnectinfo_t *info, uint8_t *buf,
27311963SAfshin.Ardakani@Sun.COM     uint32_t buflen, uint_t *nbytes)
27411963SAfshin.Ardakani@Sun.COM {
27511963SAfshin.Ardakani@Sun.COM 	XDR xdrs;
27611963SAfshin.Ardakani@Sun.COM 	int rc = 0;
27711963SAfshin.Ardakani@Sun.COM 
27811963SAfshin.Ardakani@Sun.COM 	xdrmem_create(&xdrs, (const caddr_t)buf, buflen, XDR_ENCODE);
27911963SAfshin.Ardakani@Sun.COM 
28011963SAfshin.Ardakani@Sun.COM 	if (!smb_netconnectinfo_xdr(&xdrs, info))
28111963SAfshin.Ardakani@Sun.COM 		rc = -1;
28211963SAfshin.Ardakani@Sun.COM 
28311963SAfshin.Ardakani@Sun.COM 	if (nbytes != NULL)
28411963SAfshin.Ardakani@Sun.COM 		*nbytes = xdr_getpos(&xdrs);
28511963SAfshin.Ardakani@Sun.COM 	xdr_destroy(&xdrs);
28611963SAfshin.Ardakani@Sun.COM 	return (rc);
28711963SAfshin.Ardakani@Sun.COM }
28811963SAfshin.Ardakani@Sun.COM 
28911963SAfshin.Ardakani@Sun.COM /*
29011963SAfshin.Ardakani@Sun.COM  * Decode an XDR buffer into an smb_netconnectinfo_t.
29111963SAfshin.Ardakani@Sun.COM  */
29211963SAfshin.Ardakani@Sun.COM int
smb_netconnectinfo_decode(smb_netconnectinfo_t * info,uint8_t * buf,uint32_t buflen,uint_t * nbytes)29311963SAfshin.Ardakani@Sun.COM smb_netconnectinfo_decode(smb_netconnectinfo_t *info, uint8_t *buf,
29411963SAfshin.Ardakani@Sun.COM     uint32_t buflen, uint_t *nbytes)
29511963SAfshin.Ardakani@Sun.COM {
29611963SAfshin.Ardakani@Sun.COM 	XDR xdrs;
29711963SAfshin.Ardakani@Sun.COM 	int rc = 0;
29811963SAfshin.Ardakani@Sun.COM 
29911963SAfshin.Ardakani@Sun.COM 	xdrmem_create(&xdrs, (const caddr_t)buf, buflen, XDR_DECODE);
30011963SAfshin.Ardakani@Sun.COM 
30111963SAfshin.Ardakani@Sun.COM 	bzero(info, sizeof (smb_netconnectinfo_t));
30211963SAfshin.Ardakani@Sun.COM 	if (!smb_netconnectinfo_xdr(&xdrs, info))
30311963SAfshin.Ardakani@Sun.COM 		rc = -1;
30411963SAfshin.Ardakani@Sun.COM 
30511963SAfshin.Ardakani@Sun.COM 	if (nbytes != NULL)
30611963SAfshin.Ardakani@Sun.COM 		*nbytes = xdr_getpos(&xdrs);
30711963SAfshin.Ardakani@Sun.COM 	xdr_destroy(&xdrs);
30811963SAfshin.Ardakani@Sun.COM 	return (rc);
30911963SAfshin.Ardakani@Sun.COM }
31011963SAfshin.Ardakani@Sun.COM 
31111963SAfshin.Ardakani@Sun.COM /*
31211963SAfshin.Ardakani@Sun.COM  * XDR encode/decode for smb_netconnectinfo_t.
31311963SAfshin.Ardakani@Sun.COM  */
31411963SAfshin.Ardakani@Sun.COM bool_t
smb_netconnectinfo_xdr(XDR * xdrs,smb_netconnectinfo_t * objp)31511963SAfshin.Ardakani@Sun.COM smb_netconnectinfo_xdr(XDR *xdrs, smb_netconnectinfo_t *objp)
31611963SAfshin.Ardakani@Sun.COM {
31711963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->ci_id))
31811963SAfshin.Ardakani@Sun.COM 		return (FALSE);
31911963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->ci_type))
32011963SAfshin.Ardakani@Sun.COM 		return (FALSE);
32111963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->ci_numopens))
32211963SAfshin.Ardakani@Sun.COM 		return (FALSE);
32311963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->ci_numusers))
32411963SAfshin.Ardakani@Sun.COM 		return (FALSE);
32511963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->ci_time))
32611963SAfshin.Ardakani@Sun.COM 		return (FALSE);
32711963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->ci_namelen))
32811963SAfshin.Ardakani@Sun.COM 		return (FALSE);
32911963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->ci_sharelen))
33011963SAfshin.Ardakani@Sun.COM 		return (FALSE);
33111963SAfshin.Ardakani@Sun.COM 	if (!xdr_string(xdrs, &objp->ci_username, MAXNAMELEN))
33211963SAfshin.Ardakani@Sun.COM 		return (FALSE);
33311963SAfshin.Ardakani@Sun.COM 	if (!xdr_string(xdrs, &objp->ci_share, MAXNAMELEN))
33411963SAfshin.Ardakani@Sun.COM 		return (FALSE);
33511963SAfshin.Ardakani@Sun.COM 	return (TRUE);
33611963SAfshin.Ardakani@Sun.COM }
33711963SAfshin.Ardakani@Sun.COM 
33811963SAfshin.Ardakani@Sun.COM /*
33911963SAfshin.Ardakani@Sun.COM  * Encode an smb_netfileinfo_t into a buffer.
34011963SAfshin.Ardakani@Sun.COM  */
34111963SAfshin.Ardakani@Sun.COM int
smb_netfileinfo_encode(smb_netfileinfo_t * info,uint8_t * buf,uint32_t buflen,uint_t * nbytes)34211963SAfshin.Ardakani@Sun.COM smb_netfileinfo_encode(smb_netfileinfo_t *info, uint8_t *buf,
34311963SAfshin.Ardakani@Sun.COM     uint32_t buflen, uint_t *nbytes)
34411963SAfshin.Ardakani@Sun.COM {
34511963SAfshin.Ardakani@Sun.COM 	XDR xdrs;
34611963SAfshin.Ardakani@Sun.COM 	int rc = 0;
34711963SAfshin.Ardakani@Sun.COM 
34811963SAfshin.Ardakani@Sun.COM 	xdrmem_create(&xdrs, (const caddr_t)buf, buflen, XDR_ENCODE);
34911963SAfshin.Ardakani@Sun.COM 
35011963SAfshin.Ardakani@Sun.COM 	if (!smb_netfileinfo_xdr(&xdrs, info))
35111963SAfshin.Ardakani@Sun.COM 		rc = -1;
35211963SAfshin.Ardakani@Sun.COM 
35311963SAfshin.Ardakani@Sun.COM 	if (nbytes != NULL)
35411963SAfshin.Ardakani@Sun.COM 		*nbytes = xdr_getpos(&xdrs);
35511963SAfshin.Ardakani@Sun.COM 	xdr_destroy(&xdrs);
35611963SAfshin.Ardakani@Sun.COM 	return (rc);
35711963SAfshin.Ardakani@Sun.COM }
35811963SAfshin.Ardakani@Sun.COM 
35911963SAfshin.Ardakani@Sun.COM /*
36011963SAfshin.Ardakani@Sun.COM  * Decode an XDR buffer into an smb_netfileinfo_t.
36111963SAfshin.Ardakani@Sun.COM  */
36211963SAfshin.Ardakani@Sun.COM int
smb_netfileinfo_decode(smb_netfileinfo_t * info,uint8_t * buf,uint32_t buflen,uint_t * nbytes)36311963SAfshin.Ardakani@Sun.COM smb_netfileinfo_decode(smb_netfileinfo_t *info, uint8_t *buf,
36411963SAfshin.Ardakani@Sun.COM     uint32_t buflen, uint_t *nbytes)
36511963SAfshin.Ardakani@Sun.COM {
36611963SAfshin.Ardakani@Sun.COM 	XDR xdrs;
36711963SAfshin.Ardakani@Sun.COM 	int rc = 0;
36811963SAfshin.Ardakani@Sun.COM 
36911963SAfshin.Ardakani@Sun.COM 	xdrmem_create(&xdrs, (const caddr_t)buf, buflen, XDR_DECODE);
37011963SAfshin.Ardakani@Sun.COM 
37111963SAfshin.Ardakani@Sun.COM 	bzero(info, sizeof (smb_netfileinfo_t));
37211963SAfshin.Ardakani@Sun.COM 	if (!smb_netfileinfo_xdr(&xdrs, info))
37311963SAfshin.Ardakani@Sun.COM 		rc = -1;
37411963SAfshin.Ardakani@Sun.COM 
37511963SAfshin.Ardakani@Sun.COM 	if (nbytes != NULL)
37611963SAfshin.Ardakani@Sun.COM 		*nbytes = xdr_getpos(&xdrs);
37711963SAfshin.Ardakani@Sun.COM 	xdr_destroy(&xdrs);
37811963SAfshin.Ardakani@Sun.COM 	return (rc);
37911963SAfshin.Ardakani@Sun.COM }
38011963SAfshin.Ardakani@Sun.COM 
38111963SAfshin.Ardakani@Sun.COM /*
38211963SAfshin.Ardakani@Sun.COM  * XDR encode/decode for smb_netfileinfo_t.
38311963SAfshin.Ardakani@Sun.COM  */
38411963SAfshin.Ardakani@Sun.COM bool_t
smb_netfileinfo_xdr(XDR * xdrs,smb_netfileinfo_t * objp)38511963SAfshin.Ardakani@Sun.COM smb_netfileinfo_xdr(XDR *xdrs, smb_netfileinfo_t *objp)
38611963SAfshin.Ardakani@Sun.COM {
38711963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint16_t(xdrs, &objp->fi_fid))
38811963SAfshin.Ardakani@Sun.COM 		return (FALSE);
38911963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->fi_uniqid))
39011963SAfshin.Ardakani@Sun.COM 		return (FALSE);
39111963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->fi_permissions))
39211963SAfshin.Ardakani@Sun.COM 		return (FALSE);
39311963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->fi_numlocks))
39411963SAfshin.Ardakani@Sun.COM 		return (FALSE);
39511963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->fi_pathlen))
39611963SAfshin.Ardakani@Sun.COM 		return (FALSE);
39711963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->fi_namelen))
39811963SAfshin.Ardakani@Sun.COM 		return (FALSE);
39911963SAfshin.Ardakani@Sun.COM 	if (!xdr_string(xdrs, &objp->fi_path, MAXPATHLEN))
40011963SAfshin.Ardakani@Sun.COM 		return (FALSE);
40111963SAfshin.Ardakani@Sun.COM 	if (!xdr_string(xdrs, &objp->fi_username, MAXNAMELEN))
40211963SAfshin.Ardakani@Sun.COM 		return (FALSE);
40311963SAfshin.Ardakani@Sun.COM 	return (TRUE);
40411963SAfshin.Ardakani@Sun.COM }
40511963SAfshin.Ardakani@Sun.COM 
40611963SAfshin.Ardakani@Sun.COM bool_t
smb_gmttoken_query_xdr(XDR * xdrs,smb_gmttoken_query_t * objp)40711963SAfshin.Ardakani@Sun.COM smb_gmttoken_query_xdr(XDR *xdrs, smb_gmttoken_query_t *objp)
40811963SAfshin.Ardakani@Sun.COM {
40911963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->gtq_count)) {
41011963SAfshin.Ardakani@Sun.COM 		return (FALSE);
41111963SAfshin.Ardakani@Sun.COM 	}
41211963SAfshin.Ardakani@Sun.COM 	if (!xdr_string(xdrs, &objp->gtq_path, ~0)) {
41311963SAfshin.Ardakani@Sun.COM 		return (FALSE);
41411963SAfshin.Ardakani@Sun.COM 	}
41511963SAfshin.Ardakani@Sun.COM 	return (TRUE);
41611963SAfshin.Ardakani@Sun.COM }
41711963SAfshin.Ardakani@Sun.COM 
41811963SAfshin.Ardakani@Sun.COM static bool_t
smb_gmttoken_xdr(XDR * xdrs,smb_gmttoken_t * objp)41911963SAfshin.Ardakani@Sun.COM smb_gmttoken_xdr(XDR *xdrs, smb_gmttoken_t *objp)
42011963SAfshin.Ardakani@Sun.COM {
42111963SAfshin.Ardakani@Sun.COM 	if (!xdr_string(xdrs, objp, SMB_VSS_GMT_SIZE)) {
42211963SAfshin.Ardakani@Sun.COM 		return (FALSE);
42311963SAfshin.Ardakani@Sun.COM 	}
42411963SAfshin.Ardakani@Sun.COM 	return (TRUE);
42511963SAfshin.Ardakani@Sun.COM }
42611963SAfshin.Ardakani@Sun.COM 
42711963SAfshin.Ardakani@Sun.COM bool_t
smb_gmttoken_response_xdr(XDR * xdrs,smb_gmttoken_response_t * objp)42811963SAfshin.Ardakani@Sun.COM smb_gmttoken_response_xdr(XDR *xdrs, smb_gmttoken_response_t *objp)
42911963SAfshin.Ardakani@Sun.COM {
43011963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->gtr_count)) {
43111963SAfshin.Ardakani@Sun.COM 		return (FALSE);
43211963SAfshin.Ardakani@Sun.COM 	}
43311963SAfshin.Ardakani@Sun.COM 	if (!xdr_array(xdrs, (char **)&objp->gtr_gmttokens.gtr_gmttokens_val,
43411963SAfshin.Ardakani@Sun.COM 	    (uint_t *)&objp->gtr_gmttokens.gtr_gmttokens_len, ~0,
43511963SAfshin.Ardakani@Sun.COM 	    sizeof (smb_gmttoken_t), (xdrproc_t)smb_gmttoken_xdr)) {
43611963SAfshin.Ardakani@Sun.COM 		return (FALSE);
43711963SAfshin.Ardakani@Sun.COM 	}
43811963SAfshin.Ardakani@Sun.COM 	return (TRUE);
43911963SAfshin.Ardakani@Sun.COM }
44011963SAfshin.Ardakani@Sun.COM 
44111963SAfshin.Ardakani@Sun.COM bool_t
smb_gmttoken_snapname_xdr(XDR * xdrs,smb_gmttoken_snapname_t * objp)44211963SAfshin.Ardakani@Sun.COM smb_gmttoken_snapname_xdr(XDR *xdrs, smb_gmttoken_snapname_t *objp)
44311963SAfshin.Ardakani@Sun.COM {
44411963SAfshin.Ardakani@Sun.COM 	if (!xdr_string(xdrs, &objp->gts_path, MAXPATHLEN)) {
44511963SAfshin.Ardakani@Sun.COM 		return (FALSE);
44611963SAfshin.Ardakani@Sun.COM 	}
44711963SAfshin.Ardakani@Sun.COM 	if (!xdr_string(xdrs, &objp->gts_gmttoken, SMB_VSS_GMT_SIZE)) {
44811963SAfshin.Ardakani@Sun.COM 		return (FALSE);
44911963SAfshin.Ardakani@Sun.COM 	}
45011963SAfshin.Ardakani@Sun.COM 	return (TRUE);
45111963SAfshin.Ardakani@Sun.COM }
45211963SAfshin.Ardakani@Sun.COM 
45311963SAfshin.Ardakani@Sun.COM bool_t
smb_quota_xdr(XDR * xdrs,smb_quota_t * objp)45411963SAfshin.Ardakani@Sun.COM smb_quota_xdr(XDR *xdrs, smb_quota_t *objp)
45511963SAfshin.Ardakani@Sun.COM {
45611963SAfshin.Ardakani@Sun.COM 	if (!xdr_vector(xdrs, (char *)objp->q_sidstr, SMB_SID_STRSZ,
45711963SAfshin.Ardakani@Sun.COM 	    sizeof (char), (xdrproc_t)xdr_char))
45811963SAfshin.Ardakani@Sun.COM 		return (FALSE);
45911963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->q_sidtype))
46011963SAfshin.Ardakani@Sun.COM 		return (FALSE);
46111963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint64_t(xdrs, &objp->q_used))
46211963SAfshin.Ardakani@Sun.COM 		return (FALSE);
46311963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint64_t(xdrs, &objp->q_thresh))
46411963SAfshin.Ardakani@Sun.COM 		return (FALSE);
46511963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint64_t(xdrs, &objp->q_limit))
46611963SAfshin.Ardakani@Sun.COM 		return (FALSE);
46711963SAfshin.Ardakani@Sun.COM 
46811963SAfshin.Ardakani@Sun.COM 	return (TRUE);
46911963SAfshin.Ardakani@Sun.COM }
47011963SAfshin.Ardakani@Sun.COM 
47111963SAfshin.Ardakani@Sun.COM bool_t
smb_quota_sid_xdr(XDR * xdrs,smb_quota_sid_t * objp)47211963SAfshin.Ardakani@Sun.COM smb_quota_sid_xdr(XDR *xdrs, smb_quota_sid_t *objp)
47311963SAfshin.Ardakani@Sun.COM {
47411963SAfshin.Ardakani@Sun.COM 	if (!xdr_vector(xdrs, (char *)objp->qs_sidstr, SMB_SID_STRSZ,
47511963SAfshin.Ardakani@Sun.COM 	    sizeof (char), (xdrproc_t)xdr_char))
47611963SAfshin.Ardakani@Sun.COM 		return (FALSE);
47711963SAfshin.Ardakani@Sun.COM 	return (TRUE);
47811963SAfshin.Ardakani@Sun.COM }
47911963SAfshin.Ardakani@Sun.COM 
48011963SAfshin.Ardakani@Sun.COM bool_t
smb_quota_query_xdr(XDR * xdrs,smb_quota_query_t * objp)48111963SAfshin.Ardakani@Sun.COM smb_quota_query_xdr(XDR *xdrs, smb_quota_query_t *objp)
48211963SAfshin.Ardakani@Sun.COM {
48311963SAfshin.Ardakani@Sun.COM 	if (!xdr_string(xdrs, &objp->qq_root_path, ~0))
48411963SAfshin.Ardakani@Sun.COM 		return (FALSE);
48511963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->qq_query_op))
48611963SAfshin.Ardakani@Sun.COM 		return (FALSE);
48711963SAfshin.Ardakani@Sun.COM 	if (!xdr_bool(xdrs, &objp->qq_single))
48811963SAfshin.Ardakani@Sun.COM 		return (FALSE);
48911963SAfshin.Ardakani@Sun.COM 	if (!xdr_bool(xdrs, &objp->qq_restart))
49011963SAfshin.Ardakani@Sun.COM 		return (FALSE);
49111963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->qq_max_quota))
49211963SAfshin.Ardakani@Sun.COM 		return (FALSE);
49311963SAfshin.Ardakani@Sun.COM 	if (!smb_list_xdr(xdrs, &objp->qq_sid_list,
49411963SAfshin.Ardakani@Sun.COM 	    offsetof(smb_quota_sid_t, qs_list_node),
49511963SAfshin.Ardakani@Sun.COM 	    sizeof (smb_quota_sid_t), (xdrproc_t)smb_quota_sid_xdr))
49611963SAfshin.Ardakani@Sun.COM 		return (FALSE);
49711963SAfshin.Ardakani@Sun.COM 
49811963SAfshin.Ardakani@Sun.COM 	return (TRUE);
49911963SAfshin.Ardakani@Sun.COM }
50011963SAfshin.Ardakani@Sun.COM 
50111963SAfshin.Ardakani@Sun.COM bool_t
smb_quota_response_xdr(XDR * xdrs,smb_quota_response_t * objp)50211963SAfshin.Ardakani@Sun.COM smb_quota_response_xdr(XDR *xdrs, smb_quota_response_t *objp)
50311963SAfshin.Ardakani@Sun.COM {
50411963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->qr_status))
50511963SAfshin.Ardakani@Sun.COM 		return (FALSE);
50611963SAfshin.Ardakani@Sun.COM 	if (!smb_list_xdr(xdrs, &objp->qr_quota_list,
50711963SAfshin.Ardakani@Sun.COM 	    offsetof(smb_quota_t, q_list_node),
50811963SAfshin.Ardakani@Sun.COM 	    sizeof (smb_quota_t), (xdrproc_t)smb_quota_xdr))
50911963SAfshin.Ardakani@Sun.COM 		return (FALSE);
51011963SAfshin.Ardakani@Sun.COM 	return (TRUE);
51111963SAfshin.Ardakani@Sun.COM }
51211963SAfshin.Ardakani@Sun.COM 
51311963SAfshin.Ardakani@Sun.COM bool_t
smb_quota_set_xdr(XDR * xdrs,smb_quota_set_t * objp)51411963SAfshin.Ardakani@Sun.COM smb_quota_set_xdr(XDR *xdrs, smb_quota_set_t *objp)
51511963SAfshin.Ardakani@Sun.COM {
51611963SAfshin.Ardakani@Sun.COM 	if (!xdr_string(xdrs, &objp->qs_root_path, ~0))
51711963SAfshin.Ardakani@Sun.COM 		return (FALSE);
51811963SAfshin.Ardakani@Sun.COM 	if (!smb_list_xdr(xdrs, &objp->qs_quota_list,
51911963SAfshin.Ardakani@Sun.COM 	    offsetof(smb_quota_t, q_list_node),
52011963SAfshin.Ardakani@Sun.COM 	    sizeof (smb_quota_t), (xdrproc_t)smb_quota_xdr))
52111963SAfshin.Ardakani@Sun.COM 		return (FALSE);
52211963SAfshin.Ardakani@Sun.COM 	return (TRUE);
52311963SAfshin.Ardakani@Sun.COM }
52411963SAfshin.Ardakani@Sun.COM 
52511963SAfshin.Ardakani@Sun.COM /*
52611963SAfshin.Ardakani@Sun.COM  * XDR a list_t list of elements
52711963SAfshin.Ardakani@Sun.COM  * offset - offset of list_node_t in list element
52811963SAfshin.Ardakani@Sun.COM  * elsize - size of list element
52911963SAfshin.Ardakani@Sun.COM  * elproc - XDR function for the list element
53011963SAfshin.Ardakani@Sun.COM  */
53111963SAfshin.Ardakani@Sun.COM bool_t
smb_list_xdr(XDR * xdrs,list_t * list,const size_t offset,const size_t elsize,const xdrproc_t elproc)53211963SAfshin.Ardakani@Sun.COM smb_list_xdr(XDR *xdrs, list_t *list,  const size_t offset,
53311963SAfshin.Ardakani@Sun.COM     const size_t elsize, const xdrproc_t elproc)
53411963SAfshin.Ardakani@Sun.COM {
53511963SAfshin.Ardakani@Sun.COM 	void *node;
53611963SAfshin.Ardakani@Sun.COM 	uint32_t count = 0;
53711963SAfshin.Ardakani@Sun.COM 
53811963SAfshin.Ardakani@Sun.COM 	switch (xdrs->x_op) {
53911963SAfshin.Ardakani@Sun.COM 	case XDR_ENCODE:
54011963SAfshin.Ardakani@Sun.COM 		node = list_head(list);
54111963SAfshin.Ardakani@Sun.COM 		while (node) {
54211963SAfshin.Ardakani@Sun.COM 			++count;
54311963SAfshin.Ardakani@Sun.COM 			node = list_next(list, node);
54411963SAfshin.Ardakani@Sun.COM 		}
54511963SAfshin.Ardakani@Sun.COM 		if (!xdr_uint32_t(xdrs, &count))
54611963SAfshin.Ardakani@Sun.COM 			return (FALSE);
54711963SAfshin.Ardakani@Sun.COM 
54811963SAfshin.Ardakani@Sun.COM 		node = list_head(list);
54911963SAfshin.Ardakani@Sun.COM 		while (node) {
55011963SAfshin.Ardakani@Sun.COM 			if (!elproc(xdrs, node))
55111963SAfshin.Ardakani@Sun.COM 				return (FALSE);
55211963SAfshin.Ardakani@Sun.COM 			node = list_next(list, node);
55311963SAfshin.Ardakani@Sun.COM 		}
55411963SAfshin.Ardakani@Sun.COM 		return (TRUE);
55511963SAfshin.Ardakani@Sun.COM 
55611963SAfshin.Ardakani@Sun.COM 	case XDR_DECODE:
55711963SAfshin.Ardakani@Sun.COM 		if (!xdr_uint32_t(xdrs, &count))
55811963SAfshin.Ardakani@Sun.COM 			return (FALSE);
55911963SAfshin.Ardakani@Sun.COM 		list_create(list, elsize, offset);
56011963SAfshin.Ardakani@Sun.COM 		while (count) {
56111963SAfshin.Ardakani@Sun.COM 			node = MEM_MALLOC("xdr", elsize);
56211963SAfshin.Ardakani@Sun.COM 			if (node == NULL)
56311963SAfshin.Ardakani@Sun.COM 				return (FALSE);
56411963SAfshin.Ardakani@Sun.COM 			if (!elproc(xdrs, node))
56511963SAfshin.Ardakani@Sun.COM 				return (FALSE);
56611963SAfshin.Ardakani@Sun.COM 			list_insert_tail(list, node);
56711963SAfshin.Ardakani@Sun.COM 			--count;
56811963SAfshin.Ardakani@Sun.COM 		}
56911963SAfshin.Ardakani@Sun.COM 		return (TRUE);
57011963SAfshin.Ardakani@Sun.COM 
57111963SAfshin.Ardakani@Sun.COM 	case XDR_FREE:
57211963SAfshin.Ardakani@Sun.COM 		while ((node = list_head(list)) != NULL) {
57311963SAfshin.Ardakani@Sun.COM 			list_remove(list, node);
57411963SAfshin.Ardakani@Sun.COM 			(void) elproc(xdrs, node);
57511963SAfshin.Ardakani@Sun.COM 			MEM_FREE("xdr", node);
57611963SAfshin.Ardakani@Sun.COM 		}
57711963SAfshin.Ardakani@Sun.COM 		list_destroy(list);
57811963SAfshin.Ardakani@Sun.COM 		return (TRUE);
57911963SAfshin.Ardakani@Sun.COM 	}
58011963SAfshin.Ardakani@Sun.COM 
58111963SAfshin.Ardakani@Sun.COM 	return (FALSE);
58211963SAfshin.Ardakani@Sun.COM }
58311963SAfshin.Ardakani@Sun.COM 
58411963SAfshin.Ardakani@Sun.COM bool_t
dfs_target_pclass_xdr(XDR * xdrs,dfs_target_pclass_t * objp)58511963SAfshin.Ardakani@Sun.COM dfs_target_pclass_xdr(XDR *xdrs, dfs_target_pclass_t *objp)
58611963SAfshin.Ardakani@Sun.COM {
58711963SAfshin.Ardakani@Sun.COM 	return (xdr_enum(xdrs, (enum_t *)objp));
58811963SAfshin.Ardakani@Sun.COM }
58911963SAfshin.Ardakani@Sun.COM 
59011963SAfshin.Ardakani@Sun.COM bool_t
dfs_target_priority_xdr(XDR * xdrs,dfs_target_priority_t * objp)59111963SAfshin.Ardakani@Sun.COM dfs_target_priority_xdr(XDR *xdrs, dfs_target_priority_t *objp)
59211963SAfshin.Ardakani@Sun.COM {
59311963SAfshin.Ardakani@Sun.COM 	if (!dfs_target_pclass_xdr(xdrs, &objp->p_class))
59411963SAfshin.Ardakani@Sun.COM 		return (FALSE);
59511963SAfshin.Ardakani@Sun.COM 
59611963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint16_t(xdrs, &objp->p_rank))
59711963SAfshin.Ardakani@Sun.COM 		return (FALSE);
59811963SAfshin.Ardakani@Sun.COM 
59911963SAfshin.Ardakani@Sun.COM 	return (TRUE);
60011963SAfshin.Ardakani@Sun.COM }
60111963SAfshin.Ardakani@Sun.COM 
60211963SAfshin.Ardakani@Sun.COM bool_t
dfs_target_xdr(XDR * xdrs,dfs_target_t * objp)60311963SAfshin.Ardakani@Sun.COM dfs_target_xdr(XDR *xdrs, dfs_target_t *objp)
60411963SAfshin.Ardakani@Sun.COM {
60511963SAfshin.Ardakani@Sun.COM 	if (!xdr_vector(xdrs, (char *)objp->t_server, DFS_SRVNAME_MAX,
60611963SAfshin.Ardakani@Sun.COM 	    sizeof (char), (xdrproc_t)xdr_char))
60711963SAfshin.Ardakani@Sun.COM 		return (FALSE);
60811963SAfshin.Ardakani@Sun.COM 
60911963SAfshin.Ardakani@Sun.COM 	if (!xdr_vector(xdrs, (char *)objp->t_share, DFS_NAME_MAX,
61011963SAfshin.Ardakani@Sun.COM 	    sizeof (char), (xdrproc_t)xdr_char))
61111963SAfshin.Ardakani@Sun.COM 		return (FALSE);
61211963SAfshin.Ardakani@Sun.COM 
61311963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->t_state))
61411963SAfshin.Ardakani@Sun.COM 		return (FALSE);
61511963SAfshin.Ardakani@Sun.COM 
61611963SAfshin.Ardakani@Sun.COM 	if (!dfs_target_priority_xdr(xdrs, &objp->t_priority))
61711963SAfshin.Ardakani@Sun.COM 		return (FALSE);
61811963SAfshin.Ardakani@Sun.COM 
61911963SAfshin.Ardakani@Sun.COM 	return (TRUE);
62011963SAfshin.Ardakani@Sun.COM }
62111963SAfshin.Ardakani@Sun.COM 
62211963SAfshin.Ardakani@Sun.COM bool_t
dfs_reftype_xdr(XDR * xdrs,dfs_reftype_t * objp)62311963SAfshin.Ardakani@Sun.COM dfs_reftype_xdr(XDR *xdrs, dfs_reftype_t *objp)
62411963SAfshin.Ardakani@Sun.COM {
62511963SAfshin.Ardakani@Sun.COM 	return (xdr_enum(xdrs, (enum_t *)objp));
62611963SAfshin.Ardakani@Sun.COM }
62711963SAfshin.Ardakani@Sun.COM 
62811963SAfshin.Ardakani@Sun.COM bool_t
dfs_info_xdr(XDR * xdrs,dfs_info_t * objp)62911963SAfshin.Ardakani@Sun.COM dfs_info_xdr(XDR *xdrs, dfs_info_t *objp)
63011963SAfshin.Ardakani@Sun.COM {
63111963SAfshin.Ardakani@Sun.COM 	if (!xdr_vector(xdrs, (char *)objp->i_uncpath, DFS_PATH_MAX,
63211963SAfshin.Ardakani@Sun.COM 	    sizeof (char), (xdrproc_t)xdr_char))
63311963SAfshin.Ardakani@Sun.COM 		return (FALSE);
63411963SAfshin.Ardakani@Sun.COM 
63511963SAfshin.Ardakani@Sun.COM 	if (!xdr_vector(xdrs, (char *)objp->i_comment, DFS_COMMENT_MAX,
63611963SAfshin.Ardakani@Sun.COM 	    sizeof (char), (xdrproc_t)xdr_char))
63711963SAfshin.Ardakani@Sun.COM 		return (FALSE);
63811963SAfshin.Ardakani@Sun.COM 
63911963SAfshin.Ardakani@Sun.COM 	if (!xdr_vector(xdrs, (char *)objp->i_guid,
64011963SAfshin.Ardakani@Sun.COM 	    UUID_PRINTABLE_STRING_LENGTH, sizeof (char), (xdrproc_t)xdr_char))
64111963SAfshin.Ardakani@Sun.COM 		return (FALSE);
64211963SAfshin.Ardakani@Sun.COM 
64311963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->i_state))
64411963SAfshin.Ardakani@Sun.COM 		return (FALSE);
64511963SAfshin.Ardakani@Sun.COM 
64611963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->i_timeout))
64711963SAfshin.Ardakani@Sun.COM 		return (FALSE);
64811963SAfshin.Ardakani@Sun.COM 
64911963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->i_propflags))
65011963SAfshin.Ardakani@Sun.COM 		return (FALSE);
65111963SAfshin.Ardakani@Sun.COM 
65211963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->i_type))
65311963SAfshin.Ardakani@Sun.COM 		return (FALSE);
65411963SAfshin.Ardakani@Sun.COM 
65511963SAfshin.Ardakani@Sun.COM 	if (!xdr_array(xdrs, (char **)&objp->i_targets,
65611963SAfshin.Ardakani@Sun.COM 	    (uint32_t *)&objp->i_ntargets, ~0, sizeof (dfs_target_t),
65711963SAfshin.Ardakani@Sun.COM 	    (xdrproc_t)dfs_target_xdr))
65811963SAfshin.Ardakani@Sun.COM 		return (FALSE);
65911963SAfshin.Ardakani@Sun.COM 
66011963SAfshin.Ardakani@Sun.COM 	return (TRUE);
66111963SAfshin.Ardakani@Sun.COM }
66211963SAfshin.Ardakani@Sun.COM 
66311963SAfshin.Ardakani@Sun.COM bool_t
dfs_referral_query_xdr(XDR * xdrs,dfs_referral_query_t * objp)66411963SAfshin.Ardakani@Sun.COM dfs_referral_query_xdr(XDR *xdrs, dfs_referral_query_t *objp)
66511963SAfshin.Ardakani@Sun.COM {
66611963SAfshin.Ardakani@Sun.COM 	if (!dfs_reftype_xdr(xdrs, &objp->rq_type))
66711963SAfshin.Ardakani@Sun.COM 		return (FALSE);
66811963SAfshin.Ardakani@Sun.COM 
66911963SAfshin.Ardakani@Sun.COM 	if (!xdr_string(xdrs, &objp->rq_path, ~0))
67011963SAfshin.Ardakani@Sun.COM 		return (FALSE);
67111963SAfshin.Ardakani@Sun.COM 
67211963SAfshin.Ardakani@Sun.COM 	return (TRUE);
67311963SAfshin.Ardakani@Sun.COM }
67411963SAfshin.Ardakani@Sun.COM 
67511963SAfshin.Ardakani@Sun.COM bool_t
dfs_referral_response_xdr(XDR * xdrs,dfs_referral_response_t * objp)67611963SAfshin.Ardakani@Sun.COM dfs_referral_response_xdr(XDR *xdrs, dfs_referral_response_t *objp)
67711963SAfshin.Ardakani@Sun.COM {
67811963SAfshin.Ardakani@Sun.COM 	if (!dfs_info_xdr(xdrs, &objp->rp_referrals))
67911963SAfshin.Ardakani@Sun.COM 		return (FALSE);
68011963SAfshin.Ardakani@Sun.COM 
68111963SAfshin.Ardakani@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->rp_status))
68211963SAfshin.Ardakani@Sun.COM 		return (FALSE);
68311963SAfshin.Ardakani@Sun.COM 
68411963SAfshin.Ardakani@Sun.COM 	return (TRUE);
68511963SAfshin.Ardakani@Sun.COM }
686*12508Samw@Sun.COM 
687*12508Samw@Sun.COM bool_t
smb_shr_hostaccess_query_xdr(XDR * xdrs,smb_shr_hostaccess_query_t * objp)688*12508Samw@Sun.COM smb_shr_hostaccess_query_xdr(XDR *xdrs, smb_shr_hostaccess_query_t *objp)
689*12508Samw@Sun.COM {
690*12508Samw@Sun.COM 	if (!xdr_string(xdrs, &objp->shq_none, ~0))
691*12508Samw@Sun.COM 		return (FALSE);
692*12508Samw@Sun.COM 
693*12508Samw@Sun.COM 	if (!xdr_string(xdrs, &objp->shq_ro, ~0))
694*12508Samw@Sun.COM 		return (FALSE);
695*12508Samw@Sun.COM 
696*12508Samw@Sun.COM 	if (!xdr_string(xdrs, &objp->shq_rw, ~0))
697*12508Samw@Sun.COM 		return (FALSE);
698*12508Samw@Sun.COM 
699*12508Samw@Sun.COM 	if (!xdr_uint32_t(xdrs, &objp->shq_flag))
700*12508Samw@Sun.COM 		return (FALSE);
701*12508Samw@Sun.COM 
702*12508Samw@Sun.COM 	if (!smb_inaddr_xdr(xdrs, &objp->shq_ipaddr))
703*12508Samw@Sun.COM 		return (FALSE);
704*12508Samw@Sun.COM 
705*12508Samw@Sun.COM 	return (TRUE);
706*12508Samw@Sun.COM }
707*12508Samw@Sun.COM 
708*12508Samw@Sun.COM bool_t
smb_shr_execinfo_xdr(XDR * xdrs,smb_shr_execinfo_t * objp)709*12508Samw@Sun.COM smb_shr_execinfo_xdr(XDR *xdrs, smb_shr_execinfo_t *objp)
710*12508Samw@Sun.COM {
711*12508Samw@Sun.COM 	if (!xdr_string(xdrs, &objp->e_sharename, ~0))
712*12508Samw@Sun.COM 		return (FALSE);
713*12508Samw@Sun.COM 
714*12508Samw@Sun.COM 	if (!xdr_string(xdrs, &objp->e_winname, ~0))
715*12508Samw@Sun.COM 		return (FALSE);
716*12508Samw@Sun.COM 
717*12508Samw@Sun.COM 	if (!xdr_string(xdrs, &objp->e_userdom, ~0))
718*12508Samw@Sun.COM 		return (FALSE);
719*12508Samw@Sun.COM 
720*12508Samw@Sun.COM 	if (!smb_inaddr_xdr(xdrs, &objp->e_srv_ipaddr))
721*12508Samw@Sun.COM 		return (FALSE);
722*12508Samw@Sun.COM 
723*12508Samw@Sun.COM 	if (!smb_inaddr_xdr(xdrs, &objp->e_cli_ipaddr))
724*12508Samw@Sun.COM 		return (FALSE);
725*12508Samw@Sun.COM 
726*12508Samw@Sun.COM 	if (!xdr_string(xdrs, &objp->e_cli_netbiosname, ~0))
727*12508Samw@Sun.COM 		return (FALSE);
728*12508Samw@Sun.COM 
729*12508Samw@Sun.COM 	if (!xdr_u_int(xdrs, &objp->e_uid))
730*12508Samw@Sun.COM 		return (FALSE);
731*12508Samw@Sun.COM 
732*12508Samw@Sun.COM 	if (!xdr_int(xdrs, &objp->e_type))
733*12508Samw@Sun.COM 		return (FALSE);
734*12508Samw@Sun.COM 
735*12508Samw@Sun.COM 	return (TRUE);
736*12508Samw@Sun.COM }
737