1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _SMBSRV_SMB_COMMON_DOOR_H 27 #define _SMBSRV_SMB_COMMON_DOOR_H 28 29 #pragma ident "@(#)smb_common_door.h 1.1 07/10/25 SMI" 30 31 #include <smbsrv/wintypes.h> 32 #include <smbsrv/smb_xdr.h> 33 #include <smbsrv/smb_token.h> 34 35 #ifdef __cplusplus 36 extern "C" { 37 #endif 38 39 extern int smb_dr_get_opcode(char *argp, size_t arg_size); 40 extern int smb_dr_get_res_stat(char *rbufp, size_t rbuf_size); 41 extern char *smb_dr_set_opcode(uint32_t opcode, size_t *len); 42 extern char *smb_dr_set_res_stat(uint32_t stat, size_t *len); 43 extern char *smb_dr_encode_string(uint32_t reserved, char *buf, size_t *len); 44 45 #ifdef _KERNEL 46 extern int smb_kdr_decode_common(char *buf, size_t len, xdrproc_t proc, 47 void *data); 48 extern char *smb_kdr_encode_common(uint_t reserved, void *data, 49 xdrproc_t proc, size_t *len); 50 51 /* kernel encode functions */ 52 extern char *smb_dr_encode_arg_get_token(netr_client_t *clnt_info, 53 size_t *len); 54 /* kernel decode functions */ 55 extern smb_token_t *smb_dr_decode_res_token(char *buf, size_t len); 56 extern smb_dr_kshare_t *smb_dr_decode_kshare(char *buf, size_t len); 57 58 /* kernel free functions */ 59 void smb_dr_kshare_free(smb_dr_kshare_t *kshare); 60 #else /* _KERNEL */ 61 extern int smb_dr_decode_common(char *buf, size_t len, xdrproc_t proc, 62 void *data); 63 extern char *smb_dr_encode_common(uint_t reserved, void *data, xdrproc_t proc, 64 size_t *len); 65 66 /* user-space encode functions */ 67 extern char *smb_dr_encode_res_token(smb_token_t *token, size_t *len); 68 extern char *smb_dr_encode_kshare(smb_dr_kshare_t *, size_t *); 69 70 /* user-space decode functions */ 71 extern netr_client_t *smb_dr_decode_arg_get_token(char *buf, size_t len); 72 extern char *smb_dr_decode_string(char *buf, size_t len); 73 74 /* user-space free functions */ 75 extern void smb_dr_ulist_free(smb_dr_ulist_t *ulist); 76 #endif /* _KERNEL */ 77 78 /* 79 * PBSHORTCUT - should be removed once XDR is used for 80 * serializing/deserializing data across door. 81 */ 82 83 /* 84 * Common encode/decode functions used by door clients/servers. 85 */ 86 87 typedef struct smb_dr_ctx { 88 char *ptr; 89 char *start_ptr; 90 char *end_ptr; 91 int status; 92 } smb_dr_ctx_t; 93 94 95 extern smb_dr_ctx_t *smb_dr_decode_start(char *ptr, int size); 96 extern int smb_dr_decode_finish(smb_dr_ctx_t *ctx); 97 98 extern smb_dr_ctx_t *smb_dr_encode_start(char *ptr, int size); 99 extern int smb_dr_encode_finish(smb_dr_ctx_t *ctx, unsigned int *used); 100 101 extern int32_t smb_dr_get_int32(smb_dr_ctx_t *ctx); 102 extern DWORD smb_dr_get_dword(smb_dr_ctx_t *ctx); 103 extern uint32_t smb_dr_get_uint32(smb_dr_ctx_t *ctx); 104 extern int64_t smb_dr_get_int64(smb_dr_ctx_t *ctx); 105 extern uint64_t smb_dr_get_uint64(smb_dr_ctx_t *ctx); 106 107 extern void smb_dr_put_int32(smb_dr_ctx_t *ctx, int32_t num); 108 extern void smb_dr_put_dword(smb_dr_ctx_t *ctx, DWORD num); 109 extern void smb_dr_put_uint32(smb_dr_ctx_t *ctx, uint32_t num); 110 extern void smb_dr_put_int64(smb_dr_ctx_t *ctx, int64_t num); 111 extern void smb_dr_put_uint64(smb_dr_ctx_t *ctx, uint64_t num); 112 113 extern char *smb_dr_get_string(smb_dr_ctx_t *ctx); 114 extern void smb_dr_put_string(smb_dr_ctx_t *ctx, char *buf); 115 extern void smb_dr_free_string(char *buf); 116 117 extern void smb_dr_put_word(smb_dr_ctx_t *ctx, WORD num); 118 extern WORD smb_dr_get_word(smb_dr_ctx_t *ctx); 119 120 extern void smb_dr_put_BYTE(smb_dr_ctx_t *ctx, BYTE byte); 121 extern BYTE smb_dr_get_BYTE(smb_dr_ctx_t *ctx); 122 123 extern void smb_dr_put_buf(smb_dr_ctx_t *ctx, unsigned char *start, int len); 124 extern int smb_dr_get_buf(smb_dr_ctx_t *ctx, unsigned char *buf, int bufsize); 125 126 #ifdef __cplusplus 127 } 128 #endif 129 130 #endif /* _SMBSRV_SMB_COMMON_DOOR_H */ 131