15331Samw /* 25331Samw * CDDL HEADER START 35331Samw * 45331Samw * The contents of this file are subject to the terms of the 55331Samw * Common Development and Distribution License (the "License"). 65331Samw * You may not use this file except in compliance with the License. 75331Samw * 85331Samw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 95331Samw * or http://www.opensolaris.org/os/licensing. 105331Samw * See the License for the specific language governing permissions 115331Samw * and limitations under the License. 125331Samw * 135331Samw * When distributing Covered Code, include this CDDL HEADER in each 145331Samw * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 155331Samw * If applicable, add the following below this CDDL HEADER, with the 165331Samw * fields enclosed by brackets "[]" replaced with your own identifying 175331Samw * information: Portions Copyright [yyyy] [name of copyright owner] 185331Samw * 195331Samw * CDDL HEADER END 205331Samw */ 215331Samw /* 2212065SKeyur.Desai@Sun.COM * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. 235331Samw */ 245331Samw 255331Samw #ifndef _SMBSRV_SMB_XDR_H 265331Samw #define _SMBSRV_SMB_XDR_H 275331Samw 285331Samw #ifdef __cplusplus 295331Samw extern "C" { 305331Samw #endif 315331Samw 325331Samw #include <rpc/xdr.h> 335331Samw #include <sys/param.h> 3411963SAfshin.Ardakani@Sun.COM #include <sys/avl.h> 3511337SWilliam.Krier@Sun.COM #include <smbsrv/wintypes.h> 3611337SWilliam.Krier@Sun.COM #include <smbsrv/smb_sid.h> 378670SJose.Borrego@Sun.COM #include <smbsrv/smbinfo.h> 3810122SJordan.Brown@Sun.COM #include <smbsrv/smb_ioctl.h> 3911963SAfshin.Ardakani@Sun.COM #include <smbsrv/smb_sid.h> 40*12508Samw@Sun.COM #include <smbsrv/smb_share.h> 4111963SAfshin.Ardakani@Sun.COM #include <smbsrv/smb_dfs.h> 42*12508Samw@Sun.COM #include <smbsrv/wintypes.h> 435331Samw 445331Samw #ifdef _KERNEL 455331Samw #define xdr_int8_t xdr_char 465331Samw #define xdr_uint8_t xdr_u_char 475331Samw #define xdr_int16_t xdr_short 485331Samw #define xdr_uint16_t xdr_u_short 495331Samw #endif /* _KERNEL */ 505331Samw 5111963SAfshin.Ardakani@Sun.COM /* null-terminated string */ 5211963SAfshin.Ardakani@Sun.COM typedef struct smb_string { 535331Samw char *buf; 5411963SAfshin.Ardakani@Sun.COM } smb_string_t; 555331Samw 5611963SAfshin.Ardakani@Sun.COM /* 32-bit opaque buffer (non-null terminated strings) */ 5711963SAfshin.Ardakani@Sun.COM typedef struct smb_buf32 { 5811963SAfshin.Ardakani@Sun.COM uint32_t len; 5911963SAfshin.Ardakani@Sun.COM uint8_t *val; 6011963SAfshin.Ardakani@Sun.COM } smb_buf32_t; 615331Samw 627052Samw #define SMB_OPIPE_HDR_MAGIC 0x4F484452 /* OHDR */ 637052Samw #define SMB_OPIPE_DOOR_BUFSIZE (30 * 1024) 647052Samw 655331Samw /* 667052Samw * Door operations for opipes. 675331Samw */ 687052Samw typedef enum { 697052Samw SMB_OPIPE_NULL = 0, 707052Samw SMB_OPIPE_LOOKUP, 717052Samw SMB_OPIPE_OPEN, 727052Samw SMB_OPIPE_CLOSE, 737052Samw SMB_OPIPE_READ, 747052Samw SMB_OPIPE_WRITE, 7511963SAfshin.Ardakani@Sun.COM SMB_OPIPE_EXEC 767052Samw } smb_opipe_op_t; 777052Samw 7811963SAfshin.Ardakani@Sun.COM #define SMB_DOOR_HDR_MAGIC 0x444F4F52 /* DOOR */ 7911963SAfshin.Ardakani@Sun.COM 8011963SAfshin.Ardakani@Sun.COM /* 8111963SAfshin.Ardakani@Sun.COM * Door header flags. 8211963SAfshin.Ardakani@Sun.COM */ 8311963SAfshin.Ardakani@Sun.COM #define SMB_DF_ASYNC 0x00000001 /* Asynchronous call */ 8411963SAfshin.Ardakani@Sun.COM #define SMB_DF_SYSSPACE 0x00000002 /* Called from the kernel */ 8511963SAfshin.Ardakani@Sun.COM #define SMB_DF_USERSPACE 0x00000004 /* Called from user space */ 8611963SAfshin.Ardakani@Sun.COM 8711963SAfshin.Ardakani@Sun.COM /* 8811963SAfshin.Ardakani@Sun.COM * Header for door calls. The op codes and return codes are defined 8911963SAfshin.Ardakani@Sun.COM * in smb_door.h. The header is here to make it available to XDR. 9011963SAfshin.Ardakani@Sun.COM * 9111963SAfshin.Ardakani@Sun.COM * fid For opipe: the pipe identifier. 9211963SAfshin.Ardakani@Sun.COM * op The door operation being invoked. 9311963SAfshin.Ardakani@Sun.COM * txid Unique transaction id for the current door call. 9411963SAfshin.Ardakani@Sun.COM * datalen Bytes of data following the header (excludes the header). 9511963SAfshin.Ardakani@Sun.COM * resid For opipe: the number of bytes remaining in the server. 9611963SAfshin.Ardakani@Sun.COM * door_rc Return code provided by the door server. 9711963SAfshin.Ardakani@Sun.COM * status A pass-through status provided by the door operation. 9811963SAfshin.Ardakani@Sun.COM */ 9911963SAfshin.Ardakani@Sun.COM typedef struct smb_doorhdr { 10011963SAfshin.Ardakani@Sun.COM uint32_t dh_magic; 10111963SAfshin.Ardakani@Sun.COM uint32_t dh_flags; 10211963SAfshin.Ardakani@Sun.COM uint32_t dh_fid; 10311963SAfshin.Ardakani@Sun.COM uint32_t dh_op; 10411963SAfshin.Ardakani@Sun.COM uint32_t dh_txid; 10511963SAfshin.Ardakani@Sun.COM uint32_t dh_datalen; 10611963SAfshin.Ardakani@Sun.COM uint32_t dh_resid; 10711963SAfshin.Ardakani@Sun.COM uint32_t dh_door_rc; 10811963SAfshin.Ardakani@Sun.COM uint32_t dh_status; 10911963SAfshin.Ardakani@Sun.COM } smb_doorhdr_t; 1107052Samw 11110122SJordan.Brown@Sun.COM typedef struct smb_netuserinfo { 11210122SJordan.Brown@Sun.COM uint64_t ui_session_id; 11312065SKeyur.Desai@Sun.COM uint16_t ui_smb_uid; 11410122SJordan.Brown@Sun.COM uint16_t ui_domain_len; 11510122SJordan.Brown@Sun.COM char *ui_domain; 11610122SJordan.Brown@Sun.COM uint16_t ui_account_len; 11710122SJordan.Brown@Sun.COM char *ui_account; 11812065SKeyur.Desai@Sun.COM uid_t ui_posix_uid; 11910122SJordan.Brown@Sun.COM uint16_t ui_workstation_len; 12010122SJordan.Brown@Sun.COM char *ui_workstation; 12110122SJordan.Brown@Sun.COM smb_inaddr_t ui_ipaddr; 12210122SJordan.Brown@Sun.COM int32_t ui_native_os; 12310122SJordan.Brown@Sun.COM int64_t ui_logon_time; 12410122SJordan.Brown@Sun.COM uint32_t ui_numopens; 12510122SJordan.Brown@Sun.COM uint32_t ui_flags; 12610122SJordan.Brown@Sun.COM } smb_netuserinfo_t; 12710122SJordan.Brown@Sun.COM 12810122SJordan.Brown@Sun.COM typedef struct smb_opennum { 12910122SJordan.Brown@Sun.COM uint32_t open_users; 13010122SJordan.Brown@Sun.COM uint32_t open_trees; 13110122SJordan.Brown@Sun.COM uint32_t open_files; 13210122SJordan.Brown@Sun.COM uint32_t qualtype; 13310122SJordan.Brown@Sun.COM char qualifier[MAXNAMELEN]; 13410122SJordan.Brown@Sun.COM } smb_opennum_t; 1355331Samw 13610122SJordan.Brown@Sun.COM typedef struct smb_netconnectinfo { 13710122SJordan.Brown@Sun.COM uint32_t ci_id; 13810122SJordan.Brown@Sun.COM uint32_t ci_type; 13910122SJordan.Brown@Sun.COM uint32_t ci_numopens; 14010122SJordan.Brown@Sun.COM uint32_t ci_numusers; 14110122SJordan.Brown@Sun.COM uint32_t ci_time; 14210122SJordan.Brown@Sun.COM uint32_t ci_namelen; 14310122SJordan.Brown@Sun.COM uint32_t ci_sharelen; 14410122SJordan.Brown@Sun.COM char *ci_username; 14510122SJordan.Brown@Sun.COM char *ci_share; 14610122SJordan.Brown@Sun.COM } smb_netconnectinfo_t; 14710122SJordan.Brown@Sun.COM 14810122SJordan.Brown@Sun.COM typedef struct smb_netfileinfo { 14910122SJordan.Brown@Sun.COM uint16_t fi_fid; 15010122SJordan.Brown@Sun.COM uint32_t fi_uniqid; 15110122SJordan.Brown@Sun.COM uint32_t fi_permissions; 15210122SJordan.Brown@Sun.COM uint32_t fi_numlocks; 15310122SJordan.Brown@Sun.COM uint32_t fi_pathlen; 15410122SJordan.Brown@Sun.COM uint32_t fi_namelen; 15510122SJordan.Brown@Sun.COM char *fi_path; 15610122SJordan.Brown@Sun.COM char *fi_username; 15710122SJordan.Brown@Sun.COM } smb_netfileinfo_t; 15810122SJordan.Brown@Sun.COM 15910122SJordan.Brown@Sun.COM typedef struct smb_netsvcitem { 16010122SJordan.Brown@Sun.COM list_node_t nsi_lnd; 16110122SJordan.Brown@Sun.COM union { 16210122SJordan.Brown@Sun.COM smb_netuserinfo_t nsi_user; 16310122SJordan.Brown@Sun.COM smb_netconnectinfo_t nsi_tree; 16410122SJordan.Brown@Sun.COM smb_netfileinfo_t nsi_ofile; 16510122SJordan.Brown@Sun.COM } nsi_un; 16610122SJordan.Brown@Sun.COM } smb_netsvcitem_t; 16710122SJordan.Brown@Sun.COM 16810122SJordan.Brown@Sun.COM typedef struct smb_netsvc { 16910122SJordan.Brown@Sun.COM list_t ns_list; 17010122SJordan.Brown@Sun.COM smb_netsvcitem_t *ns_items; 17110122SJordan.Brown@Sun.COM smb_ioc_svcenum_t *ns_ioc; 17210122SJordan.Brown@Sun.COM uint32_t ns_ioclen; 17310122SJordan.Brown@Sun.COM } smb_netsvc_t; 1745331Samw 1755331Samw 17611963SAfshin.Ardakani@Sun.COM bool_t smb_buf32_xdr(XDR *, smb_buf32_t *); 17711963SAfshin.Ardakani@Sun.COM bool_t smb_string_xdr(XDR *, smb_string_t *); 17811963SAfshin.Ardakani@Sun.COM bool_t smb_inaddr_xdr(XDR *, smb_inaddr_t *); 17911963SAfshin.Ardakani@Sun.COM 18011963SAfshin.Ardakani@Sun.COM const char *smb_doorhdr_opname(uint32_t); 18111963SAfshin.Ardakani@Sun.COM int smb_doorhdr_encode(smb_doorhdr_t *, uint8_t *, uint32_t); 18211963SAfshin.Ardakani@Sun.COM int smb_doorhdr_decode(smb_doorhdr_t *, uint8_t *, uint32_t); 18311963SAfshin.Ardakani@Sun.COM bool_t smb_doorhdr_xdr(XDR *xdrs, smb_doorhdr_t *objp); 18410122SJordan.Brown@Sun.COM int smb_netuserinfo_encode(smb_netuserinfo_t *, uint8_t *, uint32_t, uint_t *); 18510122SJordan.Brown@Sun.COM int smb_netuserinfo_decode(smb_netuserinfo_t *, uint8_t *, uint32_t, uint_t *); 18610122SJordan.Brown@Sun.COM bool_t smb_netuserinfo_xdr(XDR *, smb_netuserinfo_t *); 18710122SJordan.Brown@Sun.COM int smb_netconnectinfo_encode(smb_netconnectinfo_t *, uint8_t *, uint32_t, 1889832Samw@Sun.COM uint_t *); 18910122SJordan.Brown@Sun.COM int smb_netconnectinfo_decode(smb_netconnectinfo_t *, uint8_t *, uint32_t, 1909832Samw@Sun.COM uint_t *); 19110122SJordan.Brown@Sun.COM bool_t smb_netconnectinfo_xdr(XDR *, smb_netconnectinfo_t *); 19210122SJordan.Brown@Sun.COM int smb_netfileinfo_encode(smb_netfileinfo_t *, uint8_t *, uint32_t, uint_t *); 19310122SJordan.Brown@Sun.COM int smb_netfileinfo_decode(smb_netfileinfo_t *, uint8_t *, uint32_t, uint_t *); 19410122SJordan.Brown@Sun.COM bool_t smb_netfileinfo_xdr(XDR *, smb_netfileinfo_t *); 19510122SJordan.Brown@Sun.COM 19611337SWilliam.Krier@Sun.COM typedef uint16_t sid_type_t; 19711337SWilliam.Krier@Sun.COM 19811337SWilliam.Krier@Sun.COM typedef struct lsa_account { 19911337SWilliam.Krier@Sun.COM ntstatus_t a_status; 20011337SWilliam.Krier@Sun.COM sid_type_t a_sidtype; 20111337SWilliam.Krier@Sun.COM char a_domain[MAXNAMELEN]; 20211337SWilliam.Krier@Sun.COM char a_name[MAXNAMELEN]; 20311337SWilliam.Krier@Sun.COM char a_sid[SMB_SID_STRSZ]; 20411337SWilliam.Krier@Sun.COM } lsa_account_t; 20511337SWilliam.Krier@Sun.COM 20611337SWilliam.Krier@Sun.COM int lsa_account_encode(lsa_account_t *, uint8_t *, uint32_t); 20711337SWilliam.Krier@Sun.COM int lsa_account_decode(lsa_account_t *, uint8_t *, uint32_t); 20811337SWilliam.Krier@Sun.COM bool_t lsa_account_xdr(XDR *, lsa_account_t *); 20911337SWilliam.Krier@Sun.COM 2108474SJose.Borrego@Sun.COM /* 2118474SJose.Borrego@Sun.COM * VSS Door Structures 2128474SJose.Borrego@Sun.COM */ 2138474SJose.Borrego@Sun.COM #define SMB_VSS_GMT_SIZE sizeof ("@GMT-yyyy.mm.dd-hh.mm.ss") 2148474SJose.Borrego@Sun.COM 21511963SAfshin.Ardakani@Sun.COM typedef struct smb_gmttoken_query { 21611963SAfshin.Ardakani@Sun.COM uint32_t gtq_count; 21711963SAfshin.Ardakani@Sun.COM char *gtq_path; 21811963SAfshin.Ardakani@Sun.COM } smb_gmttoken_query_t; 2198474SJose.Borrego@Sun.COM 22011963SAfshin.Ardakani@Sun.COM typedef char *smb_gmttoken_t; 2218474SJose.Borrego@Sun.COM 22211963SAfshin.Ardakani@Sun.COM typedef struct smb_gmttoken_response { 22311963SAfshin.Ardakani@Sun.COM uint32_t gtr_count; 2248474SJose.Borrego@Sun.COM struct { 22511963SAfshin.Ardakani@Sun.COM uint_t gtr_gmttokens_len; 22611963SAfshin.Ardakani@Sun.COM smb_gmttoken_t *gtr_gmttokens_val; 22711963SAfshin.Ardakani@Sun.COM } gtr_gmttokens; 22811963SAfshin.Ardakani@Sun.COM } smb_gmttoken_response_t; 22911963SAfshin.Ardakani@Sun.COM 23011963SAfshin.Ardakani@Sun.COM typedef struct smb_gmttoken_snapname { 23111963SAfshin.Ardakani@Sun.COM char *gts_path; 23211963SAfshin.Ardakani@Sun.COM char *gts_gmttoken; 23311963SAfshin.Ardakani@Sun.COM } smb_gmttoken_snapname_t; 23411963SAfshin.Ardakani@Sun.COM 23511963SAfshin.Ardakani@Sun.COM bool_t smb_gmttoken_query_xdr(XDR *, smb_gmttoken_query_t *); 23611963SAfshin.Ardakani@Sun.COM bool_t smb_gmttoken_response_xdr(XDR *, smb_gmttoken_response_t *); 23711963SAfshin.Ardakani@Sun.COM bool_t smb_gmttoken_snapname_xdr(XDR *, smb_gmttoken_snapname_t *); 23811963SAfshin.Ardakani@Sun.COM 23911963SAfshin.Ardakani@Sun.COM /* 24011963SAfshin.Ardakani@Sun.COM * User and Group Quotas 24111963SAfshin.Ardakani@Sun.COM * 24211963SAfshin.Ardakani@Sun.COM * SMB User and Group quota values of SMB_QUOTA_UNLIMITED mean 24311963SAfshin.Ardakani@Sun.COM * No Limit. This maps to 0 (none) on ZFS. 24411963SAfshin.Ardakani@Sun.COM */ 24511963SAfshin.Ardakani@Sun.COM #define SMB_QUOTA_UNLIMITED 0xFFFFFFFFFFFFFFFF 24611963SAfshin.Ardakani@Sun.COM 24711963SAfshin.Ardakani@Sun.COM typedef struct smb_quota { 24811963SAfshin.Ardakani@Sun.COM list_node_t q_list_node; 24911963SAfshin.Ardakani@Sun.COM char q_sidstr[SMB_SID_STRSZ]; 25011963SAfshin.Ardakani@Sun.COM uint32_t q_sidtype; 25111963SAfshin.Ardakani@Sun.COM uint64_t q_used; 25211963SAfshin.Ardakani@Sun.COM uint64_t q_thresh; 25311963SAfshin.Ardakani@Sun.COM uint64_t q_limit; 25411963SAfshin.Ardakani@Sun.COM avl_node_t q_avl_node; 25511963SAfshin.Ardakani@Sun.COM } smb_quota_t; 25611963SAfshin.Ardakani@Sun.COM 25711963SAfshin.Ardakani@Sun.COM typedef struct smb_quota_sid { 25811963SAfshin.Ardakani@Sun.COM list_node_t qs_list_node; 25911963SAfshin.Ardakani@Sun.COM char qs_sidstr[SMB_SID_STRSZ]; 26011963SAfshin.Ardakani@Sun.COM } smb_quota_sid_t; 2618474SJose.Borrego@Sun.COM 26211963SAfshin.Ardakani@Sun.COM typedef enum { 26311963SAfshin.Ardakani@Sun.COM SMB_QUOTA_QUERY_INVALID_OP, 26411963SAfshin.Ardakani@Sun.COM SMB_QUOTA_QUERY_SIDLIST, 26511963SAfshin.Ardakani@Sun.COM SMB_QUOTA_QUERY_STARTSID, 26611963SAfshin.Ardakani@Sun.COM SMB_QUOTA_QUERY_ALL 26711963SAfshin.Ardakani@Sun.COM } smb_quota_query_op_t; 26811963SAfshin.Ardakani@Sun.COM 26911963SAfshin.Ardakani@Sun.COM typedef struct smb_quota_query { 27011963SAfshin.Ardakani@Sun.COM char *qq_root_path; 27111963SAfshin.Ardakani@Sun.COM uint32_t qq_query_op; /* smb_quota_query_op_t */ 27211963SAfshin.Ardakani@Sun.COM bool_t qq_single; 27311963SAfshin.Ardakani@Sun.COM bool_t qq_restart; 27411963SAfshin.Ardakani@Sun.COM uint32_t qq_max_quota; 27511963SAfshin.Ardakani@Sun.COM list_t qq_sid_list; /* list of smb_quota_sid_t */ 27611963SAfshin.Ardakani@Sun.COM } smb_quota_query_t; 27711963SAfshin.Ardakani@Sun.COM 27811963SAfshin.Ardakani@Sun.COM typedef struct smb_quota_response { 27911963SAfshin.Ardakani@Sun.COM uint32_t qr_status; 28011963SAfshin.Ardakani@Sun.COM list_t qr_quota_list; /* list of smb_quota_t */ 28111963SAfshin.Ardakani@Sun.COM } smb_quota_response_t; 2828474SJose.Borrego@Sun.COM 28311963SAfshin.Ardakani@Sun.COM typedef struct smb_quota_set { 28411963SAfshin.Ardakani@Sun.COM char *qs_root_path; 28511963SAfshin.Ardakani@Sun.COM list_t qs_quota_list; /* list of smb_quota_t */ 28611963SAfshin.Ardakani@Sun.COM } smb_quota_set_t; 28711963SAfshin.Ardakani@Sun.COM 28811963SAfshin.Ardakani@Sun.COM bool_t smb_quota_query_xdr(XDR *, smb_quota_query_t *); 28911963SAfshin.Ardakani@Sun.COM bool_t smb_quota_response_xdr(XDR *, smb_quota_response_t *); 29011963SAfshin.Ardakani@Sun.COM bool_t smb_quota_set_xdr(XDR *, smb_quota_set_t *); 29111963SAfshin.Ardakani@Sun.COM 29211963SAfshin.Ardakani@Sun.COM typedef struct dfs_referral_query { 29311963SAfshin.Ardakani@Sun.COM dfs_reftype_t rq_type; 29411963SAfshin.Ardakani@Sun.COM char *rq_path; 29511963SAfshin.Ardakani@Sun.COM } dfs_referral_query_t; 29611963SAfshin.Ardakani@Sun.COM 29711963SAfshin.Ardakani@Sun.COM typedef struct dfs_referral_response { 29811963SAfshin.Ardakani@Sun.COM dfs_info_t rp_referrals; 29911963SAfshin.Ardakani@Sun.COM uint32_t rp_status; 30011963SAfshin.Ardakani@Sun.COM } dfs_referral_response_t; 30111963SAfshin.Ardakani@Sun.COM 30211963SAfshin.Ardakani@Sun.COM bool_t dfs_referral_query_xdr(XDR *, dfs_referral_query_t *); 30311963SAfshin.Ardakani@Sun.COM bool_t dfs_referral_response_xdr(XDR *, dfs_referral_response_t *); 3047052Samw 305*12508Samw@Sun.COM typedef struct smb_shr_hostaccess_query { 306*12508Samw@Sun.COM char *shq_none; 307*12508Samw@Sun.COM char *shq_ro; 308*12508Samw@Sun.COM char *shq_rw; 309*12508Samw@Sun.COM uint32_t shq_flag; 310*12508Samw@Sun.COM smb_inaddr_t shq_ipaddr; 311*12508Samw@Sun.COM } smb_shr_hostaccess_query_t; 312*12508Samw@Sun.COM 313*12508Samw@Sun.COM bool_t smb_shr_hostaccess_query_xdr(XDR *, smb_shr_hostaccess_query_t *); 314*12508Samw@Sun.COM bool_t smb_shr_execinfo_xdr(XDR *, smb_shr_execinfo_t *); 315*12508Samw@Sun.COM 3165331Samw #ifdef __cplusplus 3175331Samw } 3185331Samw #endif 3195331Samw 3205331Samw #endif /* _SMBSRV_SMB_XDR_H */ 321