smb_xdr_utils.c revision 1fcced4c370617db71610fecffd5451a5894ca5e
2N/A/*
2N/A * CDDL HEADER START
2N/A *
2N/A * The contents of this file are subject to the terms of the
2N/A * Common Development and Distribution License (the "License").
2N/A * You may not use this file except in compliance with the License.
2N/A *
2N/A * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2N/A * or http://www.opensolaris.org/os/licensing.
2N/A * See the License for the specific language governing permissions
2N/A * and limitations under the License.
2N/A *
2N/A * When distributing Covered Code, include this CDDL HEADER in each
2N/A * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2N/A * If applicable, add the following below this CDDL HEADER, with the
2N/A * fields enclosed by brackets "[]" replaced with your own identifying
2N/A * information: Portions Copyright [yyyy] [name of copyright owner]
2N/A *
2N/A * CDDL HEADER END
2N/A */
2N/A/*
2N/A * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
2N/A * Use is subject to license terms.
2N/A */
2N/A
2N/A#include <sys/sunddi.h>
2N/A#ifndef _KERNEL
2N/A#include <string.h>
2N/A#include <strings.h>
2N/A#endif /* _KERNEL */
2N/A#include <smbsrv/smb_xdr.h>
2N/A#include <sys/socket.h>
2N/A
2N/Abool_t
2N/Axdr_smb_dr_string_t(xdrs, objp)
2N/A XDR *xdrs;
2N/A smb_dr_string_t *objp;
2N/A{
2N/A if (!xdr_string(xdrs, &objp->buf, ~0))
2N/A return (FALSE);
2N/A return (TRUE);
2N/A}
2N/A
2N/Abool_t
2N/Axdr_smb_dr_bytes_t(xdrs, objp)
2N/A XDR *xdrs;
2N/A smb_dr_bytes_t *objp;
2N/A{
2N/A if (!xdr_array(xdrs, (char **)&objp->bytes_val,
2N/A (uint32_t *)&objp->bytes_len, ~0, sizeof (uint8_t),
2N/A (xdrproc_t)xdr_uint8_t))
2N/A return (FALSE);
2N/A return (TRUE);
2N/A}
2N/A
2N/A/*
2N/A * Encode an opipe header structure into a buffer.
2N/A */
2N/Aint
2N/Asmb_opipe_hdr_encode(smb_opipe_hdr_t *hdr, uint8_t *buf, uint32_t buflen)
2N/A{
2N/A XDR xdrs;
2N/A int rc = 0;
2N/A
2N/A xdrmem_create(&xdrs, (const caddr_t)buf, buflen, XDR_ENCODE);
2N/A
2N/A if (!smb_opipe_hdr_xdr(&xdrs, hdr))
2N/A rc = -1;
2N/A
2N/A xdr_destroy(&xdrs);
2N/A return (rc);
2N/A}
2N/A
2N/A/*
2N/A * Decode an XDR buffer into an opipe header structure.
2N/A */
2N/Aint
2N/Asmb_opipe_hdr_decode(smb_opipe_hdr_t *hdr, uint8_t *buf, uint32_t buflen)
2N/A{
2N/A XDR xdrs;
2N/A int rc = 0;
2N/A
2N/A bzero(hdr, sizeof (smb_opipe_hdr_t));
2N/A xdrmem_create(&xdrs, (const caddr_t)buf, buflen, XDR_DECODE);
2N/A
2N/A if (!smb_opipe_hdr_xdr(&xdrs, hdr))
2N/A rc = -1;
2N/A
2N/A xdr_destroy(&xdrs);
2N/A return (rc);
2N/A}
2N/A
2N/Abool_t
2N/Asmb_opipe_hdr_xdr(XDR *xdrs, smb_opipe_hdr_t *objp)
2N/A{
2N/A if (!xdr_uint32_t(xdrs, &objp->oh_magic))
2N/A return (FALSE);
2N/A if (!xdr_uint32_t(xdrs, &objp->oh_fid))
2N/A return (FALSE);
2N/A if (!xdr_uint32_t(xdrs, &objp->oh_op))
2N/A return (FALSE);
2N/A if (!xdr_uint32_t(xdrs, &objp->oh_datalen))
2N/A return (FALSE);
2N/A if (!xdr_uint32_t(xdrs, &objp->oh_resid))
2N/A return (FALSE);
2N/A if (!xdr_uint32_t(xdrs, &objp->oh_status))
2N/A return (FALSE);
2N/A return (TRUE);
2N/A}
2N/A
2N/A/*
2N/A * Encode an smb_netuserinfo_t into a buffer.
2N/A */
2N/Aint
2N/Asmb_netuserinfo_encode(smb_netuserinfo_t *info, uint8_t *buf,
2N/A uint32_t buflen, uint_t *nbytes)
2N/A{
2N/A XDR xdrs;
2N/A int rc = 0;
2N/A
2N/A xdrmem_create(&xdrs, (const caddr_t)buf, buflen, XDR_ENCODE);
2N/A
2N/A if (!smb_netuserinfo_xdr(&xdrs, info))
2N/A rc = -1;
2N/A
2N/A if (nbytes != NULL)
2N/A *nbytes = xdr_getpos(&xdrs);
2N/A xdr_destroy(&xdrs);
2N/A return (rc);
2N/A}
2N/A
2N/A/*
2N/A * Decode an XDR buffer into an smb_netuserinfo_t.
2N/A */
2N/Aint
2N/Asmb_netuserinfo_decode(smb_netuserinfo_t *info, uint8_t *buf,
2N/A uint32_t buflen, uint_t *nbytes)
2N/A{
2N/A XDR xdrs;
2N/A int rc = 0;
2N/A
2N/A xdrmem_create(&xdrs, (const caddr_t)buf, buflen, XDR_DECODE);
2N/A
2N/A bzero(info, sizeof (smb_netuserinfo_t));
2N/A if (!smb_netuserinfo_xdr(&xdrs, info))
2N/A rc = -1;
2N/A
2N/A if (nbytes != NULL)
2N/A *nbytes = xdr_getpos(&xdrs);
2N/A xdr_destroy(&xdrs);
2N/A return (rc);
2N/A}
2N/A
2N/Abool_t
2N/Axdr_smb_inaddr_t(XDR *xdrs, smb_inaddr_t *objp)
2N/A{
2N/A if (!xdr_int32_t(xdrs, &objp->a_family))
2N/A return (FALSE);
2N/A if (objp->a_family == AF_INET) {
2N/A if (!xdr_uint32_t(xdrs, (in_addr_t *)&objp->a_ipv4))
2N/A return (FALSE);
2N/A } else {
2N/A if (!xdr_vector(xdrs, (char *)&objp->a_ipv6,
2N/A sizeof (objp->a_ipv6), sizeof (char), (xdrproc_t)xdr_char))
2N/A return (FALSE);
2N/A }
2N/A return (TRUE);
2N/A}
2N/A
2N/A/*
2N/A * XDR encode/decode for smb_netuserinfo_t.
2N/A */
2N/Abool_t
2N/Asmb_netuserinfo_xdr(XDR *xdrs, smb_netuserinfo_t *objp)
2N/A{
2N/A if (!xdr_uint64_t(xdrs, &objp->ui_session_id))
2N/A return (FALSE);
2N/A if (!xdr_uint16_t(xdrs, &objp->ui_uid))
2N/A return (FALSE);
2N/A if (!xdr_uint16_t(xdrs, &objp->ui_domain_len))
2N/A return (FALSE);
2N/A if (!xdr_string(xdrs, &objp->ui_domain, ~0))
2N/A return (FALSE);
2N/A if (!xdr_uint16_t(xdrs, &objp->ui_account_len))
2N/A return (FALSE);
2N/A if (!xdr_string(xdrs, &objp->ui_account, ~0))
2N/A return (FALSE);
2N/A if (!xdr_uint16_t(xdrs, &objp->ui_workstation_len))
2N/A return (FALSE);
2N/A if (!xdr_string(xdrs, &objp->ui_workstation, ~0))
2N/A return (FALSE);
2N/A if (!xdr_smb_inaddr_t(xdrs, &objp->ui_ipaddr))
2N/A return (FALSE);
2N/A if (!xdr_int32_t(xdrs, &objp->ui_native_os))
2N/A return (FALSE);
2N/A if (!xdr_int64_t(xdrs, &objp->ui_logon_time))
2N/A return (FALSE);
2N/A if (!xdr_uint32_t(xdrs, &objp->ui_numopens))
2N/A return (FALSE);
2N/A if (!xdr_uint32_t(xdrs, &objp->ui_flags))
2N/A return (FALSE);
2N/A return (TRUE);
2N/A}
2N/A
2N/A/*
2N/A * Encode an smb_netconnectinfo_t into a buffer.
2N/A */
2N/Aint
2N/Asmb_netconnectinfo_encode(smb_netconnectinfo_t *info, uint8_t *buf,
2N/A uint32_t buflen, uint_t *nbytes)
2N/A{
2N/A XDR xdrs;
2N/A int rc = 0;
2N/A
2N/A xdrmem_create(&xdrs, (const caddr_t)buf, buflen, XDR_ENCODE);
2N/A
2N/A if (!smb_netconnectinfo_xdr(&xdrs, info))
2N/A rc = -1;
2N/A
2N/A if (nbytes != NULL)
2N/A *nbytes = xdr_getpos(&xdrs);
2N/A xdr_destroy(&xdrs);
2N/A return (rc);
2N/A}
2N/A
2N/A/*
2N/A * Decode an XDR buffer into an smb_netconnectinfo_t.
2N/A */
2N/Aint
2N/Asmb_netconnectinfo_decode(smb_netconnectinfo_t *info, uint8_t *buf,
2N/A uint32_t buflen, uint_t *nbytes)
2N/A{
2N/A XDR xdrs;
2N/A int rc = 0;
2N/A
2N/A xdrmem_create(&xdrs, (const caddr_t)buf, buflen, XDR_DECODE);
2N/A
2N/A bzero(info, sizeof (smb_netconnectinfo_t));
2N/A if (!smb_netconnectinfo_xdr(&xdrs, info))
2N/A rc = -1;
2N/A
2N/A if (nbytes != NULL)
2N/A *nbytes = xdr_getpos(&xdrs);
2N/A xdr_destroy(&xdrs);
2N/A return (rc);
2N/A}
2N/A
2N/A/*
2N/A * XDR encode/decode for smb_netconnectinfo_t.
2N/A */
2N/Abool_t
2N/Asmb_netconnectinfo_xdr(XDR *xdrs, smb_netconnectinfo_t *objp)
2N/A{
2N/A if (!xdr_uint32_t(xdrs, &objp->ci_id))
2N/A return (FALSE);
2N/A if (!xdr_uint32_t(xdrs, &objp->ci_type))
2N/A return (FALSE);
2N/A if (!xdr_uint32_t(xdrs, &objp->ci_numopens))
2N/A return (FALSE);
2N/A if (!xdr_uint32_t(xdrs, &objp->ci_numusers))
2N/A return (FALSE);
2N/A if (!xdr_uint32_t(xdrs, &objp->ci_time))
2N/A return (FALSE);
2N/A if (!xdr_uint32_t(xdrs, &objp->ci_namelen))
2N/A return (FALSE);
2N/A if (!xdr_uint32_t(xdrs, &objp->ci_sharelen))
2N/A return (FALSE);
2N/A if (!xdr_string(xdrs, &objp->ci_username, MAXNAMELEN))
2N/A return (FALSE);
2N/A if (!xdr_string(xdrs, &objp->ci_share, MAXNAMELEN))
2N/A return (FALSE);
2N/A return (TRUE);
2N/A}
2N/A
2N/A/*
2N/A * Encode an smb_netfileinfo_t into a buffer.
2N/A */
2N/Aint
2N/Asmb_netfileinfo_encode(smb_netfileinfo_t *info, uint8_t *buf,
2N/A uint32_t buflen, uint_t *nbytes)
2N/A{
2N/A XDR xdrs;
2N/A int rc = 0;
2N/A
2N/A xdrmem_create(&xdrs, (const caddr_t)buf, buflen, XDR_ENCODE);
2N/A
2N/A if (!smb_netfileinfo_xdr(&xdrs, info))
2N/A rc = -1;
2N/A
2N/A if (nbytes != NULL)
2N/A *nbytes = xdr_getpos(&xdrs);
2N/A xdr_destroy(&xdrs);
2N/A return (rc);
2N/A}
2N/A
2N/A/*
2N/A * Decode an XDR buffer into an smb_netfileinfo_t.
2N/A */
2N/Aint
2N/Asmb_netfileinfo_decode(smb_netfileinfo_t *info, uint8_t *buf,
2N/A uint32_t buflen, uint_t *nbytes)
2N/A{
2N/A XDR xdrs;
2N/A int rc = 0;
2N/A
2N/A xdrmem_create(&xdrs, (const caddr_t)buf, buflen, XDR_DECODE);
2N/A
2N/A bzero(info, sizeof (smb_netfileinfo_t));
2N/A if (!smb_netfileinfo_xdr(&xdrs, info))
2N/A rc = -1;
2N/A
2N/A if (nbytes != NULL)
2N/A *nbytes = xdr_getpos(&xdrs);
2N/A xdr_destroy(&xdrs);
2N/A return (rc);
2N/A}
2N/A
2N/A/*
2N/A * XDR encode/decode for smb_netfileinfo_t.
2N/A */
2N/Abool_t
2N/Asmb_netfileinfo_xdr(XDR *xdrs, smb_netfileinfo_t *objp)
2N/A{
2N/A if (!xdr_uint16_t(xdrs, &objp->fi_fid))
2N/A return (FALSE);
2N/A if (!xdr_uint32_t(xdrs, &objp->fi_uniqid))
2N/A return (FALSE);
2N/A if (!xdr_uint32_t(xdrs, &objp->fi_permissions))
2N/A return (FALSE);
2N/A if (!xdr_uint32_t(xdrs, &objp->fi_numlocks))
2N/A return (FALSE);
2N/A if (!xdr_uint32_t(xdrs, &objp->fi_pathlen))
2N/A return (FALSE);
2N/A if (!xdr_uint32_t(xdrs, &objp->fi_namelen))
2N/A return (FALSE);
2N/A if (!xdr_string(xdrs, &objp->fi_path, MAXPATHLEN))
2N/A return (FALSE);
2N/A if (!xdr_string(xdrs, &objp->fi_username, MAXNAMELEN))
2N/A return (FALSE);
2N/A return (TRUE);
2N/A}
2N/A
2N/Abool_t
2N/Axdr_smb_dr_kshare_t(xdrs, objp)
2N/A XDR *xdrs;
2N/A smb_dr_kshare_t *objp;
2N/A{
2N/A if (!xdr_int32_t(xdrs, &objp->k_op))
2N/A return (FALSE);
2N/A if (!xdr_string(xdrs, &objp->k_path, MAXPATHLEN))
2N/A return (FALSE);
2N/A if (!xdr_string(xdrs, &objp->k_sharename, MAXNAMELEN))
2N/A return (FALSE);
2N/A return (TRUE);
2N/A}
2N/A
2N/Abool_t
2N/Axdr_smb_dr_get_gmttokens_t(XDR *xdrs, smb_dr_get_gmttokens_t *objp)
2N/A{
2N/A if (!xdr_uint32_t(xdrs, &objp->gg_count)) {
2N/A return (FALSE);
2N/A }
2N/A if (!xdr_string(xdrs, &objp->gg_path, ~0)) {
2N/A return (FALSE);
2N/A }
2N/A return (TRUE);
2N/A}
2N/A
2N/Abool_t
2N/Axdr_gmttoken(XDR *xdrs, gmttoken *objp)
2N/A{
2N/A if (!xdr_string(xdrs, objp, SMB_VSS_GMT_SIZE)) {
2N/A return (FALSE);
2N/A }
2N/A return (TRUE);
2N/A}
2N/A
2N/Abool_t
2N/Axdr_smb_dr_return_gmttokens_t(XDR *xdrs, smb_dr_return_gmttokens_t *objp)
2N/A{
2N/A if (!xdr_uint32_t(xdrs, &objp->rg_count)) {
2N/A return (FALSE);
2N/A }
2N/A if (!xdr_array(xdrs, (char **)&objp->rg_gmttokens.rg_gmttokens_val,
2N/A (uint_t *)&objp->rg_gmttokens.rg_gmttokens_len, ~0,
2N/A sizeof (gmttoken), (xdrproc_t)xdr_gmttoken)) {
2N/A return (FALSE);
2N/A }
2N/A return (TRUE);
2N/A}
2N/A
2N/Abool_t
2N/Axdr_smb_dr_map_gmttoken_t(XDR *xdrs, smb_dr_map_gmttoken_t *objp)
2N/A{
2N/A if (!xdr_string(xdrs, &objp->mg_path, MAXPATHLEN)) {
2N/A return (FALSE);
2N/A }
2N/A if (!xdr_string(xdrs, &objp->mg_gmttoken, SMB_VSS_GMT_SIZE)) {
2N/A return (FALSE);
2N/A }
2N/A return (TRUE);
2N/A}
2N/A