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 /* 2289dc44ceSjose borrego * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23da6c28aaSamw * Use is subject to license terms. 24da6c28aaSamw */ 25da6c28aaSamw 26da6c28aaSamw #ifndef _SMBSRV_SMB_XDR_H 27da6c28aaSamw #define _SMBSRV_SMB_XDR_H 28da6c28aaSamw 29da6c28aaSamw #ifdef __cplusplus 30da6c28aaSamw extern "C" { 31da6c28aaSamw #endif 32da6c28aaSamw 33da6c28aaSamw #include <rpc/xdr.h> 34da6c28aaSamw #include <sys/param.h> 35*7f667e74Sjose borrego #include <smbsrv/smbinfo.h> 36da6c28aaSamw 37da6c28aaSamw typedef struct smb_dr_kshare { 38da6c28aaSamw int32_t k_op; 39da6c28aaSamw char *k_path; 40da6c28aaSamw char *k_sharename; 41da6c28aaSamw } smb_dr_kshare_t; 42da6c28aaSamw 43da6c28aaSamw #ifdef _KERNEL 44da6c28aaSamw #define xdr_int8_t xdr_char 45da6c28aaSamw #define xdr_uint8_t xdr_u_char 46da6c28aaSamw #define xdr_int16_t xdr_short 47da6c28aaSamw #define xdr_uint16_t xdr_u_short 48da6c28aaSamw 49da6c28aaSamw extern bool_t xdr_u_char(XDR *xdrs, uchar_t *cp); 50da6c28aaSamw extern bool_t xdr_vector(XDR *xdrs, char *basep, uint_t nelem, 51da6c28aaSamw uint_t elemsize, xdrproc_t xdr_elem); 52da6c28aaSamw 53da6c28aaSamw smb_dr_kshare_t *smb_share_mkabsolute(uint8_t *buf, uint32_t len); 54da6c28aaSamw #else 55da6c28aaSamw uint8_t *smb_kshare_mkselfrel(smb_dr_kshare_t *kshare, uint32_t *len); 56da6c28aaSamw #endif /* _KERNEL */ 57da6c28aaSamw 58da6c28aaSamw /* null-terminated string buffer */ 59da6c28aaSamw typedef struct smb_dr_string { 60da6c28aaSamw char *buf; 61da6c28aaSamw } smb_dr_string_t; 62da6c28aaSamw 63da6c28aaSamw /* byte buffer (non-null terminated) */ 64da6c28aaSamw typedef struct smb_dr_bytes { 65da6c28aaSamw uint32_t bytes_len; 66da6c28aaSamw uint8_t *bytes_val; 67da6c28aaSamw } smb_dr_bytes_t; 68da6c28aaSamw 693db3f65cSamw #define SMB_DR_MAX_USERS 50 703db3f65cSamw 713db3f65cSamw #define SMB_OPIPE_HDR_MAGIC 0x4F484452 /* OHDR */ 723db3f65cSamw #define SMB_OPIPE_DOOR_BUFSIZE (30 * 1024) 733db3f65cSamw 74da6c28aaSamw /* 753db3f65cSamw * Door operations for opipes. 76da6c28aaSamw */ 773db3f65cSamw typedef enum { 783db3f65cSamw SMB_OPIPE_NULL = 0, 793db3f65cSamw SMB_OPIPE_LOOKUP, 803db3f65cSamw SMB_OPIPE_OPEN, 813db3f65cSamw SMB_OPIPE_CLOSE, 823db3f65cSamw SMB_OPIPE_READ, 833db3f65cSamw SMB_OPIPE_WRITE, 843db3f65cSamw SMB_OPIPE_STAT 853db3f65cSamw } smb_opipe_op_t; 863db3f65cSamw 873db3f65cSamw typedef struct smb_opipe_hdr { 883db3f65cSamw uint32_t oh_magic; 893db3f65cSamw uint32_t oh_fid; 903db3f65cSamw uint32_t oh_op; 913db3f65cSamw uint32_t oh_datalen; 923db3f65cSamw uint32_t oh_resid; 933db3f65cSamw uint32_t oh_status; 943db3f65cSamw } smb_opipe_hdr_t; 953db3f65cSamw 963db3f65cSamw typedef struct smb_opipe_context { 973db3f65cSamw uint64_t oc_session_id; 983db3f65cSamw uint16_t oc_uid; 993db3f65cSamw uint16_t oc_domain_len; 1003db3f65cSamw char *oc_domain; 1013db3f65cSamw uint16_t oc_account_len; 1023db3f65cSamw char *oc_account; 1033db3f65cSamw uint16_t oc_workstation_len; 1043db3f65cSamw char *oc_workstation; 105*7f667e74Sjose borrego smb_inaddr_t oc_ipaddr; 1063db3f65cSamw int32_t oc_native_os; 1073db3f65cSamw int64_t oc_logon_time; 1083db3f65cSamw uint32_t oc_flags; 1093db3f65cSamw } smb_opipe_context_t; 110da6c28aaSamw 111da6c28aaSamw typedef struct smb_dr_ulist { 112da6c28aaSamw uint32_t dul_cnt; 1133db3f65cSamw smb_opipe_context_t dul_users[SMB_DR_MAX_USERS]; 114da6c28aaSamw } smb_dr_ulist_t; 115da6c28aaSamw 116da6c28aaSamw /* xdr routines for common door arguments/results */ 117da6c28aaSamw extern bool_t xdr_smb_dr_string_t(XDR *, smb_dr_string_t *); 118da6c28aaSamw extern bool_t xdr_smb_dr_bytes_t(XDR *, smb_dr_bytes_t *); 119da6c28aaSamw extern bool_t xdr_smb_dr_ulist_t(XDR *, smb_dr_ulist_t *); 120da6c28aaSamw extern bool_t xdr_smb_dr_kshare_t(XDR *, smb_dr_kshare_t *); 121*7f667e74Sjose borrego extern bool_t xdr_smb_inaddr_t(XDR *, smb_inaddr_t *); 122da6c28aaSamw 1233db3f65cSamw int smb_opipe_hdr_encode(smb_opipe_hdr_t *, uint8_t *, uint32_t); 1243db3f65cSamw int smb_opipe_hdr_decode(smb_opipe_hdr_t *, uint8_t *, uint32_t); 1253db3f65cSamw bool_t smb_opipe_hdr_xdr(XDR *xdrs, smb_opipe_hdr_t *objp); 1263db3f65cSamw int smb_opipe_context_encode(smb_opipe_context_t *, uint8_t *, uint32_t); 1273db3f65cSamw int smb_opipe_context_decode(smb_opipe_context_t *, uint8_t *, uint32_t); 1283db3f65cSamw bool_t smb_opipe_context_xdr(XDR *, smb_opipe_context_t *); 12989dc44ceSjose borrego /* 13089dc44ceSjose borrego * VSS Door Structures 13189dc44ceSjose borrego */ 13289dc44ceSjose borrego #define SMB_VSS_GMT_SIZE sizeof ("@GMT-yyyy.mm.dd-hh.mm.ss") 13389dc44ceSjose borrego 13489dc44ceSjose borrego typedef struct smb_dr_get_gmttokens { 13589dc44ceSjose borrego uint32_t gg_count; 13689dc44ceSjose borrego char *gg_path; 13789dc44ceSjose borrego } smb_dr_get_gmttokens_t; 13889dc44ceSjose borrego 13989dc44ceSjose borrego typedef char *gmttoken; 14089dc44ceSjose borrego 14189dc44ceSjose borrego typedef struct smb_dr_return_gmttokens { 14289dc44ceSjose borrego uint32_t rg_count; 14389dc44ceSjose borrego struct { 14489dc44ceSjose borrego uint_t rg_gmttokens_len; 14589dc44ceSjose borrego gmttoken *rg_gmttokens_val; 14689dc44ceSjose borrego } rg_gmttokens; 14789dc44ceSjose borrego } smb_dr_return_gmttokens_t; 14889dc44ceSjose borrego 14989dc44ceSjose borrego typedef struct smb_dr_map_gmttoken { 15089dc44ceSjose borrego char *mg_path; 15189dc44ceSjose borrego char *mg_gmttoken; 15289dc44ceSjose borrego } smb_dr_map_gmttoken_t; 15389dc44ceSjose borrego 15489dc44ceSjose borrego extern bool_t xdr_smb_dr_get_gmttokens_t(XDR *, smb_dr_get_gmttokens_t *); 15589dc44ceSjose borrego extern bool_t xdr_gmttoken(XDR *, gmttoken *); 15689dc44ceSjose borrego extern bool_t xdr_smb_dr_return_gmttokens_t(XDR *xdrs, 15789dc44ceSjose borrego smb_dr_return_gmttokens_t *); 15889dc44ceSjose borrego extern bool_t xdr_smb_dr_map_gmttoken_t(XDR *, smb_dr_map_gmttoken_t *); 1593db3f65cSamw 160da6c28aaSamw #ifdef __cplusplus 161da6c28aaSamw } 162da6c28aaSamw #endif 163da6c28aaSamw 164da6c28aaSamw #endif /* _SMBSRV_SMB_XDR_H */ 165