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