1da6c28aaSamw /* 2da6c28aaSamw * CDDL HEADER START 3da6c28aaSamw * 4da6c28aaSamw * The contents of this file are subject to the terms of the 5da6c28aaSamw * Common Development and Distribution License (the "License"). 6da6c28aaSamw * You may not use this file except in compliance with the License. 7da6c28aaSamw * 8da6c28aaSamw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9da6c28aaSamw * or http://www.opensolaris.org/os/licensing. 10da6c28aaSamw * See the License for the specific language governing permissions 11da6c28aaSamw * and limitations under the License. 12da6c28aaSamw * 13da6c28aaSamw * When distributing Covered Code, include this CDDL HEADER in each 14da6c28aaSamw * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15da6c28aaSamw * If applicable, add the following below this CDDL HEADER, with the 16da6c28aaSamw * fields enclosed by brackets "[]" replaced with your own identifying 17da6c28aaSamw * information: Portions Copyright [yyyy] [name of copyright owner] 18da6c28aaSamw * 19da6c28aaSamw * CDDL HEADER END 20da6c28aaSamw */ 21da6c28aaSamw /* 22*6537f381Sas200622 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23da6c28aaSamw * Use is subject to license terms. 24da6c28aaSamw */ 25da6c28aaSamw 26da6c28aaSamw #pragma ident "%Z%%M% %I% %E% SMI" 27da6c28aaSamw 28da6c28aaSamw /* 29da6c28aaSamw * This file was originally generated using rpcgen. 30da6c28aaSamw */ 31da6c28aaSamw 32da6c28aaSamw #ifndef _KERNEL 33da6c28aaSamw #include <stdlib.h> 34da6c28aaSamw #endif /* !_KERNEL */ 35da6c28aaSamw #include <smbsrv/smb_vops.h> 36da6c28aaSamw #include <smbsrv/wintypes.h> 37*6537f381Sas200622 #include <smbsrv/smb_sid.h> 38da6c28aaSamw #include <smbsrv/smb_xdr.h> 39da6c28aaSamw #include <smbsrv/smb_token.h> 40da6c28aaSamw 41*6537f381Sas200622 static bool_t 42*6537f381Sas200622 xdr_sid_helper(xdrs, sid) 43da6c28aaSamw XDR *xdrs; 44da6c28aaSamw char **sid; 45da6c28aaSamw { 46da6c28aaSamw uint32_t pos, len; 47da6c28aaSamw uint8_t dummy, cnt; 48da6c28aaSamw bool_t rc; 49da6c28aaSamw 50da6c28aaSamw switch (xdrs->x_op) { 51da6c28aaSamw case XDR_DECODE: 52da6c28aaSamw /* 53*6537f381Sas200622 * chicken-and-egg: Can't use smb_sid_len() since it takes 54da6c28aaSamw * SID as its parameter while sid is yet to be decoded. 55da6c28aaSamw */ 56da6c28aaSamw pos = xdr_getpos(xdrs); 57da6c28aaSamw 58da6c28aaSamw if (!xdr_bool(xdrs, &rc)) 59da6c28aaSamw return (FALSE); 60da6c28aaSamw 61da6c28aaSamw if (!xdr_uint8_t(xdrs, &dummy)) 62da6c28aaSamw return (FALSE); 63da6c28aaSamw 64da6c28aaSamw if (!xdr_uint8_t(xdrs, &cnt)) 65da6c28aaSamw return (FALSE); 66da6c28aaSamw 67da6c28aaSamw rc = xdr_setpos(xdrs, pos); 68da6c28aaSamw 69da6c28aaSamw if (rc == FALSE) 70da6c28aaSamw return (FALSE); 71da6c28aaSamw 72*6537f381Sas200622 len = sizeof (smb_sid_t) - sizeof (uint32_t) + 73da6c28aaSamw (cnt * sizeof (uint32_t)); 74da6c28aaSamw 75*6537f381Sas200622 if (!xdr_pointer(xdrs, sid, len, (xdrproc_t)xdr_smb_sid_t)) 76da6c28aaSamw return (FALSE); 77da6c28aaSamw break; 78da6c28aaSamw 79da6c28aaSamw case XDR_ENCODE: 80da6c28aaSamw case XDR_FREE: 81da6c28aaSamw if (*sid == NULL) 82da6c28aaSamw return (FALSE); 83da6c28aaSamw 84*6537f381Sas200622 len = smb_sid_len((smb_sid_t *)(uintptr_t)*sid); 85*6537f381Sas200622 if (!xdr_pointer(xdrs, sid, len, (xdrproc_t)xdr_smb_sid_t)) 86da6c28aaSamw return (FALSE); 87da6c28aaSamw break; 88da6c28aaSamw } 89da6c28aaSamw 90da6c28aaSamw return (TRUE); 91da6c28aaSamw } 92da6c28aaSamw 93da6c28aaSamw bool_t 94da6c28aaSamw xdr_smb_privset_helper(xdrs, privs) 95da6c28aaSamw XDR *xdrs; 96da6c28aaSamw char **privs; 97da6c28aaSamw { 98da6c28aaSamw uint32_t pos, len; 99da6c28aaSamw uint32_t cnt; 100da6c28aaSamw bool_t rc; 101da6c28aaSamw smb_privset_t *p; 102da6c28aaSamw 103da6c28aaSamw if (xdrs->x_op == XDR_DECODE) { 104da6c28aaSamw pos = xdr_getpos(xdrs); 105da6c28aaSamw 106da6c28aaSamw if (!xdr_bool(xdrs, &rc)) 107da6c28aaSamw return (FALSE); 108da6c28aaSamw 109da6c28aaSamw if (!xdr_uint32_t(xdrs, &cnt)) 110da6c28aaSamw return (FALSE); 111da6c28aaSamw 112da6c28aaSamw rc = xdr_setpos(xdrs, pos); 113da6c28aaSamw 114da6c28aaSamw if (rc == FALSE) 115da6c28aaSamw return (FALSE); 116da6c28aaSamw } else { 117da6c28aaSamw if (*privs == NULL) 118da6c28aaSamw return (FALSE); 119da6c28aaSamw 120da6c28aaSamw p = (smb_privset_t *)(uintptr_t)*privs; 121da6c28aaSamw cnt = p->priv_cnt; 122da6c28aaSamw } 123da6c28aaSamw 124da6c28aaSamw len = sizeof (smb_privset_t) 125da6c28aaSamw - sizeof (smb_luid_attrs_t) 126da6c28aaSamw + (cnt * sizeof (smb_luid_attrs_t)); 127da6c28aaSamw 128da6c28aaSamw if (!xdr_pointer(xdrs, privs, len, (xdrproc_t)xdr_smb_privset_t)) 129da6c28aaSamw return (FALSE); 130da6c28aaSamw 131da6c28aaSamw return (TRUE); 132da6c28aaSamw } 133da6c28aaSamw 134da6c28aaSamw bool_t 135da6c28aaSamw xdr_smb_win_grps_helper(xdrs, grps) 136da6c28aaSamw XDR *xdrs; 137da6c28aaSamw char **grps; 138da6c28aaSamw { 139da6c28aaSamw uint32_t pos, len; 140da6c28aaSamw uint16_t cnt; 141da6c28aaSamw bool_t rc; 142da6c28aaSamw 143da6c28aaSamw if (xdrs->x_op == XDR_DECODE) { 144da6c28aaSamw pos = xdr_getpos(xdrs); 145da6c28aaSamw 146da6c28aaSamw if (!xdr_bool(xdrs, &rc)) 147da6c28aaSamw return (FALSE); 148da6c28aaSamw 149da6c28aaSamw if (!xdr_uint16_t(xdrs, &cnt)) 150da6c28aaSamw return (FALSE); 151da6c28aaSamw 152da6c28aaSamw rc = xdr_setpos(xdrs, pos); 153da6c28aaSamw if (rc == FALSE) 154da6c28aaSamw return (FALSE); 155da6c28aaSamw } else { 156da6c28aaSamw if (*grps == NULL) 157da6c28aaSamw return (FALSE); 158da6c28aaSamw 159da6c28aaSamw cnt = ((smb_win_grps_t *)(uintptr_t)*grps)->wg_count; 160da6c28aaSamw } 161da6c28aaSamw 162da6c28aaSamw len = cnt * sizeof (smb_id_t) + sizeof (smb_win_grps_t); 163da6c28aaSamw 164da6c28aaSamw if (!xdr_pointer(xdrs, grps, len, (xdrproc_t)xdr_smb_win_grps_t)) 165da6c28aaSamw return (FALSE); 166da6c28aaSamw 167da6c28aaSamw return (TRUE); 168da6c28aaSamw } 169da6c28aaSamw 170da6c28aaSamw bool_t 171da6c28aaSamw xdr_smb_id_t(xdrs, objp) 172da6c28aaSamw XDR *xdrs; 173da6c28aaSamw smb_id_t *objp; 174da6c28aaSamw { 175da6c28aaSamw if (!xdr_smb_sid_attrs_t(xdrs, &objp->i_sidattr)) 176da6c28aaSamw return (FALSE); 177da6c28aaSamw if (!xdr_uint32_t(xdrs, (uint32_t *)&objp->i_id)) 178da6c28aaSamw return (FALSE); 179da6c28aaSamw return (TRUE); 180da6c28aaSamw } 181da6c28aaSamw 182da6c28aaSamw bool_t 183da6c28aaSamw xdr_smb_win_grps_t(xdrs, objp) 184da6c28aaSamw XDR *xdrs; 185da6c28aaSamw smb_win_grps_t *objp; 186da6c28aaSamw { 187da6c28aaSamw if (!xdr_uint16_t(xdrs, &objp->wg_count)) 188da6c28aaSamw return (FALSE); 189da6c28aaSamw if (!xdr_vector(xdrs, (char *)objp->wg_groups, objp->wg_count, 190da6c28aaSamw sizeof (smb_id_t), (xdrproc_t)xdr_smb_id_t)) 191da6c28aaSamw return (FALSE); 192da6c28aaSamw return (TRUE); 193da6c28aaSamw } 194da6c28aaSamw 195da6c28aaSamw bool_t 196da6c28aaSamw xdr_smb_posix_grps_t(xdrs, objp) 197da6c28aaSamw XDR *xdrs; 198da6c28aaSamw smb_posix_grps_t *objp; 199da6c28aaSamw { 200da6c28aaSamw if (!xdr_uint32_t(xdrs, &objp->pg_ngrps)) 201da6c28aaSamw return (FALSE); 202da6c28aaSamw if (!xdr_vector(xdrs, (char *)objp->pg_grps, objp->pg_ngrps, 203da6c28aaSamw sizeof (uint32_t), (xdrproc_t)xdr_uint32_t)) 204da6c28aaSamw return (FALSE); 205da6c28aaSamw return (TRUE); 206da6c28aaSamw } 207da6c28aaSamw 208da6c28aaSamw bool_t 209da6c28aaSamw xdr_smb_posix_grps_helper(xdrs, identity) 210da6c28aaSamw XDR *xdrs; 211da6c28aaSamw char **identity; 212da6c28aaSamw { 213da6c28aaSamw uint32_t pos, len; 214da6c28aaSamw uint32_t cnt; 215da6c28aaSamw bool_t rc; 216da6c28aaSamw 217da6c28aaSamw if (xdrs->x_op == XDR_DECODE) { 218da6c28aaSamw pos = xdr_getpos(xdrs); 219da6c28aaSamw 220da6c28aaSamw if (!xdr_bool(xdrs, &rc)) 221da6c28aaSamw return (FALSE); 222da6c28aaSamw 223da6c28aaSamw if (!xdr_uint32_t(xdrs, &cnt)) 224da6c28aaSamw return (FALSE); 225da6c28aaSamw 226da6c28aaSamw rc = xdr_setpos(xdrs, pos); 227da6c28aaSamw if (rc == FALSE) 228da6c28aaSamw return (FALSE); 229da6c28aaSamw } else { 230da6c28aaSamw if (*identity == NULL) 231da6c28aaSamw return (FALSE); 232da6c28aaSamw cnt = ((smb_posix_grps_t *)(uintptr_t)*identity)->pg_ngrps; 233da6c28aaSamw } 234da6c28aaSamw 235da6c28aaSamw len = SMB_POSIX_GRPS_SIZE(cnt); 236da6c28aaSamw 237da6c28aaSamw if (!xdr_pointer(xdrs, identity, len, (xdrproc_t)xdr_smb_posix_grps_t)) 238da6c28aaSamw return (FALSE); 239da6c28aaSamw return (TRUE); 240da6c28aaSamw } 241da6c28aaSamw 242da6c28aaSamw bool_t 243da6c28aaSamw xdr_smb_session_key_t(xdrs, objp) 244da6c28aaSamw XDR *xdrs; 245da6c28aaSamw smb_session_key_t *objp; 246da6c28aaSamw { 247da6c28aaSamw if (!xdr_vector(xdrs, (char *)objp->data, 16, 248da6c28aaSamw sizeof (uint8_t), (xdrproc_t)xdr_uint8_t)) 249da6c28aaSamw return (FALSE); 250da6c28aaSamw return (TRUE); 251da6c28aaSamw } 252da6c28aaSamw 253da6c28aaSamw bool_t 254da6c28aaSamw xdr_netr_client_t(xdrs, objp) 255da6c28aaSamw XDR *xdrs; 256da6c28aaSamw netr_client_t *objp; 257da6c28aaSamw { 258da6c28aaSamw if (!xdr_uint16_t(xdrs, &objp->logon_level)) 259da6c28aaSamw return (FALSE); 260da6c28aaSamw if (!xdr_string(xdrs, &objp->username, ~0)) 261da6c28aaSamw return (FALSE); 262da6c28aaSamw if (!xdr_string(xdrs, &objp->domain, ~0)) 263da6c28aaSamw return (FALSE); 264da6c28aaSamw if (!xdr_string(xdrs, &objp->workstation, ~0)) 265da6c28aaSamw return (FALSE); 266da6c28aaSamw if (!xdr_uint32_t(xdrs, &objp->ipaddr)) 267da6c28aaSamw return (FALSE); 268da6c28aaSamw if (!xdr_array(xdrs, (char **)&objp->challenge_key.challenge_key_val, 269da6c28aaSamw (uint32_t *)&objp->challenge_key.challenge_key_len, ~0, 270da6c28aaSamw sizeof (uint8_t), (xdrproc_t)xdr_uint8_t)) 271da6c28aaSamw return (FALSE); 272da6c28aaSamw if (!xdr_array(xdrs, (char **)&objp->nt_password.nt_password_val, 273da6c28aaSamw (uint32_t *)&objp->nt_password.nt_password_len, ~0, 274da6c28aaSamw sizeof (uint8_t), (xdrproc_t)xdr_uint8_t)) 275da6c28aaSamw return (FALSE); 276da6c28aaSamw if (!xdr_array(xdrs, (char **)&objp->lm_password.lm_password_val, 277da6c28aaSamw (uint32_t *)&objp->lm_password.lm_password_len, ~0, 278da6c28aaSamw sizeof (uint8_t), (xdrproc_t)xdr_uint8_t)) 279da6c28aaSamw return (FALSE); 280da6c28aaSamw if (!xdr_uint32_t(xdrs, &objp->logon_id)) 281da6c28aaSamw return (FALSE); 282da6c28aaSamw if (!xdr_int(xdrs, &objp->native_os)) 283da6c28aaSamw return (FALSE); 284da6c28aaSamw if (!xdr_int(xdrs, &objp->native_lm)) 285da6c28aaSamw return (FALSE); 286da6c28aaSamw if (!xdr_uint32_t(xdrs, &objp->local_ipaddr)) 287da6c28aaSamw return (FALSE); 288da6c28aaSamw if (!xdr_uint16_t(xdrs, &objp->local_port)) 289da6c28aaSamw return (FALSE); 290da6c28aaSamw if (!xdr_uint32_t(xdrs, &objp->flags)) 291da6c28aaSamw return (FALSE); 292da6c28aaSamw return (TRUE); 293da6c28aaSamw } 294da6c28aaSamw 295da6c28aaSamw bool_t 296*6537f381Sas200622 xdr_smb_sid_t(xdrs, objp) 297da6c28aaSamw XDR *xdrs; 298*6537f381Sas200622 smb_sid_t *objp; 299da6c28aaSamw { 300*6537f381Sas200622 if (!xdr_uint8_t(xdrs, &objp->sid_revision)) 301da6c28aaSamw return (FALSE); 302*6537f381Sas200622 if (!xdr_uint8_t(xdrs, &objp->sid_subauthcnt)) 303da6c28aaSamw return (FALSE); 304*6537f381Sas200622 if (!xdr_vector(xdrs, (char *)objp->sid_authority, NT_SID_AUTH_MAX, 305da6c28aaSamw sizeof (uint8_t), (xdrproc_t)xdr_uint8_t)) 306da6c28aaSamw return (FALSE); 307*6537f381Sas200622 if (!xdr_vector(xdrs, (char *)objp->sid_subauth, objp->sid_subauthcnt, 308da6c28aaSamw sizeof (uint32_t), (xdrproc_t)xdr_uint32_t)) 309da6c28aaSamw return (FALSE); 310da6c28aaSamw return (TRUE); 311da6c28aaSamw } 312da6c28aaSamw 313da6c28aaSamw bool_t 314da6c28aaSamw xdr_smb_luid_t(xdrs, objp) 315da6c28aaSamw XDR *xdrs; 316da6c28aaSamw smb_luid_t *objp; 317da6c28aaSamw { 318da6c28aaSamw if (!xdr_uint32_t(xdrs, &objp->lo_part)) 319da6c28aaSamw return (FALSE); 320da6c28aaSamw if (!xdr_uint32_t(xdrs, &objp->hi_part)) 321da6c28aaSamw return (FALSE); 322da6c28aaSamw return (TRUE); 323da6c28aaSamw } 324da6c28aaSamw 325da6c28aaSamw bool_t 326da6c28aaSamw xdr_smb_luid_attrs_t(xdrs, objp) 327da6c28aaSamw XDR *xdrs; 328da6c28aaSamw smb_luid_attrs_t *objp; 329da6c28aaSamw { 330da6c28aaSamw if (!xdr_smb_luid_t(xdrs, &objp->luid)) 331da6c28aaSamw return (FALSE); 332da6c28aaSamw if (!xdr_uint32_t(xdrs, &objp->attrs)) 333da6c28aaSamw return (FALSE); 334da6c28aaSamw return (TRUE); 335da6c28aaSamw } 336da6c28aaSamw 337da6c28aaSamw bool_t 338da6c28aaSamw xdr_smb_privset_t(xdrs, objp) 339da6c28aaSamw XDR *xdrs; 340da6c28aaSamw smb_privset_t *objp; 341da6c28aaSamw { 342da6c28aaSamw if (!xdr_uint32_t(xdrs, &objp->priv_cnt)) 343da6c28aaSamw return (FALSE); 344da6c28aaSamw if (!xdr_uint32_t(xdrs, &objp->control)) 345da6c28aaSamw return (FALSE); 346da6c28aaSamw if (!xdr_vector(xdrs, (char *)objp->priv, objp->priv_cnt, 347da6c28aaSamw sizeof (smb_luid_attrs_t), 348da6c28aaSamw (xdrproc_t)xdr_smb_luid_attrs_t)) 349da6c28aaSamw return (FALSE); 350da6c28aaSamw return (TRUE); 351da6c28aaSamw } 352da6c28aaSamw 353da6c28aaSamw bool_t 354da6c28aaSamw xdr_smb_sid_attrs_t(xdrs, objp) 355da6c28aaSamw XDR *xdrs; 356da6c28aaSamw smb_sid_attrs_t *objp; 357da6c28aaSamw { 358da6c28aaSamw if (!xdr_uint32_t(xdrs, &objp->attrs)) 359da6c28aaSamw return (FALSE); 360*6537f381Sas200622 return (xdr_sid_helper(xdrs, (char **)&objp->sid)); 361da6c28aaSamw } 362da6c28aaSamw 363da6c28aaSamw bool_t 364da6c28aaSamw xdr_smb_token_t(xdrs, objp) 365da6c28aaSamw XDR *xdrs; 366da6c28aaSamw smb_token_t *objp; 367da6c28aaSamw { 368da6c28aaSamw if (!xdr_pointer(xdrs, (char **)&objp->tkn_user, 369da6c28aaSamw sizeof (smb_id_t), (xdrproc_t)xdr_smb_id_t)) 370da6c28aaSamw return (FALSE); 371da6c28aaSamw if (!xdr_pointer(xdrs, (char **)&objp->tkn_owner, 372da6c28aaSamw sizeof (smb_id_t), (xdrproc_t)xdr_smb_id_t)) 373da6c28aaSamw return (FALSE); 374da6c28aaSamw if (!xdr_pointer(xdrs, (char **)&objp->tkn_primary_grp, 375da6c28aaSamw sizeof (smb_id_t), (xdrproc_t)xdr_smb_id_t)) 376da6c28aaSamw return (FALSE); 377da6c28aaSamw if (!xdr_smb_win_grps_helper(xdrs, (char **)&objp->tkn_win_grps)) 378da6c28aaSamw return (FALSE); 379da6c28aaSamw if (!xdr_smb_privset_helper(xdrs, (char **)&objp->tkn_privileges)) 380da6c28aaSamw return (FALSE); 381da6c28aaSamw if (!xdr_string(xdrs, &objp->tkn_account_name, ~0)) 382da6c28aaSamw return (FALSE); 383da6c28aaSamw if (!xdr_string(xdrs, &objp->tkn_domain_name, ~0)) 384da6c28aaSamw return (FALSE); 385da6c28aaSamw if (!xdr_uint32_t(xdrs, &objp->tkn_flags)) 386da6c28aaSamw return (FALSE); 387da6c28aaSamw if (!xdr_uint32_t(xdrs, &objp->tkn_audit_sid)) 388da6c28aaSamw return (FALSE); 389da6c28aaSamw if (!xdr_pointer(xdrs, (char **)&objp->tkn_session_key, 390da6c28aaSamw sizeof (smb_session_key_t), (xdrproc_t)xdr_smb_session_key_t)) 391da6c28aaSamw return (FALSE); 392da6c28aaSamw if (!xdr_smb_posix_grps_helper(xdrs, (char **)&objp->tkn_posix_grps)) 393da6c28aaSamw return (FALSE); 394da6c28aaSamw return (TRUE); 395da6c28aaSamw } 396