19c9af259SGordon Ross /* 29c9af259SGordon Ross * Copyright (c) 2000-2001 Boris Popov 39c9af259SGordon Ross * All rights reserved. 49c9af259SGordon Ross * 59c9af259SGordon Ross * Redistribution and use in source and binary forms, with or without 69c9af259SGordon Ross * modification, are permitted provided that the following conditions 79c9af259SGordon Ross * are met: 89c9af259SGordon Ross * 1. Redistributions of source code must retain the above copyright 99c9af259SGordon Ross * notice, this list of conditions and the following disclaimer. 109c9af259SGordon Ross * 2. Redistributions in binary form must reproduce the above copyright 119c9af259SGordon Ross * notice, this list of conditions and the following disclaimer in the 129c9af259SGordon Ross * documentation and/or other materials provided with the distribution. 139c9af259SGordon Ross * 3. All advertising materials mentioning features or use of this software 149c9af259SGordon Ross * must display the following acknowledgement: 159c9af259SGordon Ross * This product includes software developed by Boris Popov. 169c9af259SGordon Ross * 4. Neither the name of the author nor the names of any co-contributors 179c9af259SGordon Ross * may be used to endorse or promote products derived from this software 189c9af259SGordon Ross * without specific prior written permission. 199c9af259SGordon Ross * 209c9af259SGordon Ross * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 219c9af259SGordon Ross * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 229c9af259SGordon Ross * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 239c9af259SGordon Ross * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 249c9af259SGordon Ross * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 259c9af259SGordon Ross * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 269c9af259SGordon Ross * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 279c9af259SGordon Ross * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 289c9af259SGordon Ross * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 299c9af259SGordon Ross * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 309c9af259SGordon Ross * SUCH DAMAGE. 319c9af259SGordon Ross */ 329c9af259SGordon Ross 339c9af259SGordon Ross /* 34*613a2f6bSGordon Ross * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 359c9af259SGordon Ross * Use is subject to license terms. 369c9af259SGordon Ross */ 379c9af259SGordon Ross 389c9af259SGordon Ross #ifndef _PRIVATE_H 399c9af259SGordon Ross #define _PRIVATE_H 409c9af259SGordon Ross 419c9af259SGordon Ross /* 429c9af259SGordon Ross * Private declarations for this library. 439c9af259SGordon Ross * Moved from smb_lib.h 449c9af259SGordon Ross */ 459c9af259SGordon Ross 469c9af259SGordon Ross #include <inttypes.h> 47*613a2f6bSGordon Ross #include <sys/byteorder.h> 48*613a2f6bSGordon Ross #include <sys/ccompile.h> 49*613a2f6bSGordon Ross 50*613a2f6bSGordon Ross #include <netsmb/netbios.h> 51*613a2f6bSGordon Ross 52*613a2f6bSGordon Ross extern void dprint(const char *, const char *, ...) 53*613a2f6bSGordon Ross __PRINTFLIKE(2); 54*613a2f6bSGordon Ross 55*613a2f6bSGordon Ross #if defined(DEBUG) || defined(__lint) 56*613a2f6bSGordon Ross #define DPRINT(...) dprint(__func__, __VA_ARGS__) 57*613a2f6bSGordon Ross #else 58*613a2f6bSGordon Ross #define DPRINT(...) ((void)0) 59*613a2f6bSGordon Ross #endif 60*613a2f6bSGordon Ross 61*613a2f6bSGordon Ross /* 62*613a2f6bSGordon Ross * Flags bits in ct_vcflags (copied from smb_conn.h) 63*613a2f6bSGordon Ross * Pass these to the driver? 64*613a2f6bSGordon Ross */ 65*613a2f6bSGordon Ross #define SMBV_RECONNECTING 0x0002 /* conn in process of reconnection */ 66*613a2f6bSGordon Ross #define SMBV_LONGNAMES 0x0004 /* conn configured to use long names */ 67*613a2f6bSGordon Ross #define SMBV_ENCRYPT 0x0008 /* server demands encrypted password */ 68*613a2f6bSGordon Ross #define SMBV_WIN95 0x0010 /* used to apply bugfixes for this OS */ 69*613a2f6bSGordon Ross #define SMBV_NT4 0x0020 /* used when NT4 issues invalid resp */ 70*613a2f6bSGordon Ross #define SMBV_UNICODE 0x0040 /* conn configured to use Unicode */ 71*613a2f6bSGordon Ross #define SMBV_EXT_SEC 0x0080 /* conn to use extended security */ 72*613a2f6bSGordon Ross #define SMBV_WILL_SIGN 0x0100 /* negotiated signing */ 73*613a2f6bSGordon Ross 749c9af259SGordon Ross 759c9af259SGordon Ross /* 769c9af259SGordon Ross * BSD-style mbuf simulation 779c9af259SGordon Ross */ 789c9af259SGordon Ross struct mbuf { 799c9af259SGordon Ross int m_len; 809c9af259SGordon Ross int m_maxlen; 819c9af259SGordon Ross char *m_data; 829c9af259SGordon Ross struct mbuf *m_next; 839c9af259SGordon Ross }; 849c9af259SGordon Ross typedef struct mbuf mbuf_t; 859c9af259SGordon Ross 869c9af259SGordon Ross struct mbdata { 879c9af259SGordon Ross struct mbuf *mb_top; 889c9af259SGordon Ross struct mbuf *mb_cur; 899c9af259SGordon Ross char *mb_pos; 909c9af259SGordon Ross int mb_count; 919c9af259SGordon Ross }; 929c9af259SGordon Ross typedef struct mbdata mbdata_t; 939c9af259SGordon Ross 94*613a2f6bSGordon Ross /* 95*613a2f6bSGordon Ross * Note: Leaving a little space (8 bytes) between the 96*613a2f6bSGordon Ross * mbuf header and the start of the data so we can 97*613a2f6bSGordon Ross * prepend a NetBIOS header in that space. 98*613a2f6bSGordon Ross */ 999c9af259SGordon Ross #define M_ALIGNFACTOR (sizeof (long)) 1009c9af259SGordon Ross #define M_ALIGN(len) (((len) + M_ALIGNFACTOR - 1) & ~(M_ALIGNFACTOR - 1)) 101*613a2f6bSGordon Ross #define M_BASESIZE (sizeof (struct mbuf) + 8) 102*613a2f6bSGordon Ross #define M_MINSIZE (1024 - M_BASESIZE) 1039c9af259SGordon Ross #define M_TOP(m) ((char *)(m) + M_BASESIZE) 1049c9af259SGordon Ross #define M_TRAILINGSPACE(m) ((m)->m_maxlen - (m)->m_len) 1059c9af259SGordon Ross #define mtod(m, t) ((t)(m)->m_data) 1069c9af259SGordon Ross 1079c9af259SGordon Ross /* 1089c9af259SGordon Ross * request handling structures 1099c9af259SGordon Ross */ 1109c9af259SGordon Ross struct smb_rq { 111*613a2f6bSGordon Ross struct smb_ctx *rq_ctx; 1129c9af259SGordon Ross struct mbdata rq_rq; 1139c9af259SGordon Ross struct mbdata rq_rp; 114*613a2f6bSGordon Ross int rq_rpbufsz; 115*613a2f6bSGordon Ross uint8_t rq_cmd; 116*613a2f6bSGordon Ross uint8_t rq_hflags; 117*613a2f6bSGordon Ross uint16_t rq_hflags2; 118*613a2f6bSGordon Ross uint32_t rq_status; 119*613a2f6bSGordon Ross uint16_t rq_uid; 120*613a2f6bSGordon Ross uint16_t rq_tid; 121*613a2f6bSGordon Ross uint16_t rq_mid; 122*613a2f6bSGordon Ross uint32_t rq_seqno; 123*613a2f6bSGordon Ross /* See rq_[bw]{start,end} functions */ 124*613a2f6bSGordon Ross char *rq_wcntp; 125*613a2f6bSGordon Ross int rq_wcbase; 126*613a2f6bSGordon Ross char *rq_bcntp; 127*613a2f6bSGordon Ross int rq_bcbase; 1289c9af259SGordon Ross }; 1299c9af259SGordon Ross typedef struct smb_rq smb_rq_t; 1309c9af259SGordon Ross 1319c9af259SGordon Ross #define smb_rq_getrequest(rqp) (&(rqp)->rq_rq) 1329c9af259SGordon Ross #define smb_rq_getreply(rqp) (&(rqp)->rq_rp) 1339c9af259SGordon Ross 134*613a2f6bSGordon Ross int smb_rq_init(struct smb_ctx *, uchar_t, struct smb_rq **); 1359c9af259SGordon Ross void smb_rq_done(struct smb_rq *); 136*613a2f6bSGordon Ross void smb_rq_bstart(struct smb_rq *); 137*613a2f6bSGordon Ross void smb_rq_bend(struct smb_rq *); 138*613a2f6bSGordon Ross void smb_rq_wstart(struct smb_rq *); 1399c9af259SGordon Ross void smb_rq_wend(struct smb_rq *); 1409c9af259SGordon Ross int smb_rq_simple(struct smb_rq *); 1419c9af259SGordon Ross int smb_rq_dmem(struct mbdata *, const char *, size_t); 142*613a2f6bSGordon Ross int smb_rq_internal(struct smb_ctx *, struct smb_rq *); 143*613a2f6bSGordon Ross int smb_rq_sign(struct smb_rq *); 144*613a2f6bSGordon Ross int smb_rq_verify(struct smb_rq *); 1459c9af259SGordon Ross 1469c9af259SGordon Ross 1479c9af259SGordon Ross /* 1489c9af259SGordon Ross * Message compose/parse 1499c9af259SGordon Ross */ 1509c9af259SGordon Ross 151*613a2f6bSGordon Ross void m_freem(struct mbuf *); 1529c9af259SGordon Ross int m_getm(struct mbuf *, size_t, struct mbuf **); 1539c9af259SGordon Ross int m_lineup(struct mbuf *, struct mbuf **); 154*613a2f6bSGordon Ross size_t m_totlen(struct mbuf *); 155*613a2f6bSGordon Ross 1569c9af259SGordon Ross int mb_init(struct mbdata *, size_t); 1579c9af259SGordon Ross int mb_initm(struct mbdata *, struct mbuf *); 1589c9af259SGordon Ross int mb_done(struct mbdata *); 1599c9af259SGordon Ross int mb_fit(struct mbdata *mbp, size_t size, char **pp); 1609c9af259SGordon Ross int mb_put_uint8(struct mbdata *, uint8_t); 1619c9af259SGordon Ross int mb_put_uint16be(struct mbdata *, uint16_t); 1629c9af259SGordon Ross int mb_put_uint16le(struct mbdata *, uint16_t); 1639c9af259SGordon Ross int mb_put_uint32be(struct mbdata *, uint32_t); 1649c9af259SGordon Ross int mb_put_uint32le(struct mbdata *, uint32_t); 1659c9af259SGordon Ross int mb_put_uint64be(struct mbdata *, uint64_t); 1669c9af259SGordon Ross int mb_put_uint64le(struct mbdata *, uint64_t); 167*613a2f6bSGordon Ross int mb_put_mem(struct mbdata *, const void *, size_t); 1689c9af259SGordon Ross int mb_put_mbuf(struct mbdata *, struct mbuf *); 169*613a2f6bSGordon Ross int mb_put_astring(struct mbdata *mbp, const char *s); 170*613a2f6bSGordon Ross int mb_put_dstring(struct mbdata *mbp, const char *s, int); 171*613a2f6bSGordon Ross int mb_put_ustring(struct mbdata *mbp, const char *s); 1729c9af259SGordon Ross 1739c9af259SGordon Ross int mb_get_uint8(struct mbdata *, uint8_t *); 1749c9af259SGordon Ross int mb_get_uint16(struct mbdata *, uint16_t *); 1759c9af259SGordon Ross int mb_get_uint16le(struct mbdata *, uint16_t *); 1769c9af259SGordon Ross int mb_get_uint16be(struct mbdata *, uint16_t *); 1779c9af259SGordon Ross int mb_get_uint32(struct mbdata *, uint32_t *); 1789c9af259SGordon Ross int mb_get_uint32be(struct mbdata *, uint32_t *); 1799c9af259SGordon Ross int mb_get_uint32le(struct mbdata *, uint32_t *); 1809c9af259SGordon Ross int mb_get_uint64(struct mbdata *, uint64_t *); 1819c9af259SGordon Ross int mb_get_uint64be(struct mbdata *, uint64_t *); 1829c9af259SGordon Ross int mb_get_uint64le(struct mbdata *, uint64_t *); 183*613a2f6bSGordon Ross int mb_get_mem(struct mbdata *, void *, size_t); 184*613a2f6bSGordon Ross int mb_get_mbuf(struct mbdata *, int, struct mbuf **); 185*613a2f6bSGordon Ross int mb_get_string(struct mbdata *, char **, int); 186*613a2f6bSGordon Ross int mb_get_astring(struct mbdata *, char **); 187*613a2f6bSGordon Ross int mb_get_ustring(struct mbdata *, char **); 188*613a2f6bSGordon Ross 1899c9af259SGordon Ross 1909c9af259SGordon Ross /* 1919c9af259SGordon Ross * Network stuff (NetBIOS and otherwise) 1929c9af259SGordon Ross */ 193*613a2f6bSGordon Ross struct nb_name; 194*613a2f6bSGordon Ross struct sockaddr_nb; 195*613a2f6bSGordon Ross 196*613a2f6bSGordon Ross extern int smb_recv_timeout; /* seconds */ 197*613a2f6bSGordon Ross 198*613a2f6bSGordon Ross void dump_ctx(char *, struct smb_ctx *); 199*613a2f6bSGordon Ross void dump_addrinfo(struct addrinfo *); 200*613a2f6bSGordon Ross void dump_sockaddr(struct sockaddr *); 201*613a2f6bSGordon Ross int nb_ssn_request(struct smb_ctx *, char *); 2029c9af259SGordon Ross 2039c9af259SGordon Ross int nb_name_len(struct nb_name *); 204*613a2f6bSGordon Ross int nb_name_encode(struct mbdata *, struct nb_name *); 2059c9af259SGordon Ross int nb_encname_len(const uchar_t *); 2069c9af259SGordon Ross 207*613a2f6bSGordon Ross int nb_snballoc(struct sockaddr_nb **); 2089c9af259SGordon Ross void nb_snbfree(struct sockaddr *); 2099c9af259SGordon Ross int nb_sockaddr(struct sockaddr *, struct nb_name *, struct sockaddr_nb **); 2109c9af259SGordon Ross 211*613a2f6bSGordon Ross int nbns_getaddrinfo(const char *name, struct nb_ctx *nbc, 212*613a2f6bSGordon Ross struct addrinfo **res); 2139c9af259SGordon Ross int nbns_resolvename(const char *, struct nb_ctx *, struct sockaddr **); 214*613a2f6bSGordon Ross int get_xti_err(int); 2159c9af259SGordon Ross 216*613a2f6bSGordon Ross 217*613a2f6bSGordon Ross /* 218*613a2f6bSGordon Ross * Private SMB stuff 219*613a2f6bSGordon Ross */ 220*613a2f6bSGordon Ross 221*613a2f6bSGordon Ross struct smb_bitname { 222*613a2f6bSGordon Ross uint_t bn_bit; 223*613a2f6bSGordon Ross char *bn_name; 224*613a2f6bSGordon Ross }; 225*613a2f6bSGordon Ross typedef struct smb_bitname smb_bitname_t; 226*613a2f6bSGordon Ross char *smb_printb(char *, int, const struct smb_bitname *); 227*613a2f6bSGordon Ross 228*613a2f6bSGordon Ross int smb_ctx_getaddr(struct smb_ctx *ctx); 229*613a2f6bSGordon Ross int smb_ctx_gethandle(struct smb_ctx *ctx); 230*613a2f6bSGordon Ross 231*613a2f6bSGordon Ross int smb_ssn_send(struct smb_ctx *, struct mbdata *); 232*613a2f6bSGordon Ross int smb_ssn_recv(struct smb_ctx *, struct mbdata *); 233*613a2f6bSGordon Ross 234*613a2f6bSGordon Ross int smb_negprot(struct smb_ctx *, struct mbdata *); 235*613a2f6bSGordon Ross 236*613a2f6bSGordon Ross int smb_ssnsetup_null(struct smb_ctx *); 237*613a2f6bSGordon Ross int smb_ssnsetup_ntlm1(struct smb_ctx *); 238*613a2f6bSGordon Ross int smb_ssnsetup_ntlm2(struct smb_ctx *); 239*613a2f6bSGordon Ross int smb_ssnsetup_spnego(struct smb_ctx *, struct mbdata *); 240*613a2f6bSGordon Ross 241*613a2f6bSGordon Ross void smb_time_local2server(struct timeval *, int, long *); 242*613a2f6bSGordon Ross void smb_time_server2local(ulong_t, int, struct timeval *); 243*613a2f6bSGordon Ross void smb_time_NT2local(uint64_t, int, struct timeval *); 244*613a2f6bSGordon Ross void smb_time_local2NT(struct timeval *, int, uint64_t *); 245*613a2f6bSGordon Ross 246*613a2f6bSGordon Ross int smb_getlocalname(char **); 247*613a2f6bSGordon Ross int smb_get_authentication(struct smb_ctx *); 248*613a2f6bSGordon Ross int smb_get_keychain(struct smb_ctx *ctx); 249*613a2f6bSGordon Ross void smb_hexdump(const void *buf, int len); 250*613a2f6bSGordon Ross 251*613a2f6bSGordon Ross /* See ssp.c */ 252*613a2f6bSGordon Ross int ssp_ctx_create_client(struct smb_ctx *, struct mbdata *); 253*613a2f6bSGordon Ross int ssp_ctx_next_token(struct smb_ctx *, struct mbdata *, struct mbdata *); 254*613a2f6bSGordon Ross void ssp_ctx_destroy(struct smb_ctx *); 255*613a2f6bSGordon Ross 256*613a2f6bSGordon Ross #ifdef KICONV_SUPPORT 257*613a2f6bSGordon Ross /* See nls.c (get rid of this?) */ 2589c9af259SGordon Ross extern uchar_t nls_lower[256], nls_upper[256]; 259*613a2f6bSGordon Ross #endif /* KICONV_SUPPORT */ 2609c9af259SGordon Ross 2619c9af259SGordon Ross #endif /* _PRIVATE_H */ 262