1f1b9d127SSheldon Hearn /* 2f1b9d127SSheldon Hearn * Copyright (c) 2000-2001 Boris Popov 3f1b9d127SSheldon Hearn * All rights reserved. 4f1b9d127SSheldon Hearn * 5f1b9d127SSheldon Hearn * Redistribution and use in source and binary forms, with or without 6f1b9d127SSheldon Hearn * modification, are permitted provided that the following conditions 7f1b9d127SSheldon Hearn * are met: 8f1b9d127SSheldon Hearn * 1. Redistributions of source code must retain the above copyright 9f1b9d127SSheldon Hearn * notice, this list of conditions and the following disclaimer. 10f1b9d127SSheldon Hearn * 2. Redistributions in binary form must reproduce the above copyright 11f1b9d127SSheldon Hearn * notice, this list of conditions and the following disclaimer in the 12f1b9d127SSheldon Hearn * documentation and/or other materials provided with the distribution. 13f1b9d127SSheldon Hearn * 3. All advertising materials mentioning features or use of this software 14f1b9d127SSheldon Hearn * must display the following acknowledgement: 15f1b9d127SSheldon Hearn * This product includes software developed by Boris Popov. 16f1b9d127SSheldon Hearn * 4. Neither the name of the author nor the names of any co-contributors 17f1b9d127SSheldon Hearn * may be used to endorse or promote products derived from this software 18f1b9d127SSheldon Hearn * without specific prior written permission. 19f1b9d127SSheldon Hearn * 20f1b9d127SSheldon Hearn * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 21f1b9d127SSheldon Hearn * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22f1b9d127SSheldon Hearn * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23f1b9d127SSheldon Hearn * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 24f1b9d127SSheldon Hearn * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25f1b9d127SSheldon Hearn * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26f1b9d127SSheldon Hearn * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27f1b9d127SSheldon Hearn * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28f1b9d127SSheldon Hearn * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29f1b9d127SSheldon Hearn * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30f1b9d127SSheldon Hearn * SUCH DAMAGE. 31f1b9d127SSheldon Hearn * 32df3342d6SSheldon Hearn * $Id: smb_lib.h,v 1.24 2001/12/20 15:19:43 bp Exp $ 33bb6275a8SR. Imura * $FreeBSD$ 34f1b9d127SSheldon Hearn */ 35f1b9d127SSheldon Hearn #ifndef _NETSMB_SMB_LIB_H_ 36f1b9d127SSheldon Hearn #define _NETSMB_SMB_LIB_H_ 37f1b9d127SSheldon Hearn 38f1b9d127SSheldon Hearn #include <netsmb/smb.h> 39f1b9d127SSheldon Hearn #include <netsmb/smb_dev.h> 40f1b9d127SSheldon Hearn 41df3342d6SSheldon Hearn #ifndef SMB_CFG_FILE 42f1b9d127SSheldon Hearn #define SMB_CFG_FILE "/usr/local/etc/nsmb.conf" 43df3342d6SSheldon Hearn #endif 44f1b9d127SSheldon Hearn 45f1b9d127SSheldon Hearn #define STDPARAM_ARGS 'A':case 'B':case 'C':case 'E':case 'I': \ 46f1b9d127SSheldon Hearn case 'L':case 'M': \ 47f1b9d127SSheldon Hearn case 'N':case 'U':case 'R':case 'S':case 'T': \ 48f1b9d127SSheldon Hearn case 'W':case 'O':case 'P' 49f1b9d127SSheldon Hearn 50f1b9d127SSheldon Hearn #define STDPARAM_OPT "A:BCE:I:L:M:NO:P:U:R:S:T:W:" 51f1b9d127SSheldon Hearn 52f1b9d127SSheldon Hearn /* 53f1b9d127SSheldon Hearn * bits to indicate the source of error 54f1b9d127SSheldon Hearn */ 55f1b9d127SSheldon Hearn #define SMB_ERRTYPE_MASK 0xf0000 56f1b9d127SSheldon Hearn #define SMB_SYS_ERROR 0x00000 57f1b9d127SSheldon Hearn #define SMB_RAP_ERROR 0x10000 58f1b9d127SSheldon Hearn #define SMB_NB_ERROR 0x20000 59f1b9d127SSheldon Hearn 60f1b9d127SSheldon Hearn #ifndef min 61f1b9d127SSheldon Hearn #define min(a,b) (((a)<(b)) ? (a) : (b)) 62f1b9d127SSheldon Hearn #endif 63f1b9d127SSheldon Hearn 64f1b9d127SSheldon Hearn #define getb(buf,ofs) (((const u_int8_t *)(buf))[ofs]) 65f1b9d127SSheldon Hearn #define setb(buf,ofs,val) (((u_int8_t*)(buf))[ofs])=val 66f1b9d127SSheldon Hearn #define getbw(buf,ofs) ((u_int16_t)(getb(buf,ofs))) 67f1b9d127SSheldon Hearn #define getw(buf,ofs) (*((u_int16_t*)(&((u_int8_t*)(buf))[ofs]))) 68f1b9d127SSheldon Hearn #define getdw(buf,ofs) (*((u_int32_t*)(&((u_int8_t*)(buf))[ofs]))) 69f1b9d127SSheldon Hearn 70f1b9d127SSheldon Hearn #if (BYTE_ORDER == LITTLE_ENDIAN) 71f1b9d127SSheldon Hearn 72f1b9d127SSheldon Hearn #define getwle(buf,ofs) (*((u_int16_t*)(&((u_int8_t*)(buf))[ofs]))) 73f1b9d127SSheldon Hearn #define getdle(buf,ofs) (*((u_int32_t*)(&((u_int8_t*)(buf))[ofs]))) 74f1b9d127SSheldon Hearn #define getwbe(buf,ofs) (ntohs(getwle(buf,ofs))) 75f1b9d127SSheldon Hearn #define getdbe(buf,ofs) (ntohl(getdle(buf,ofs))) 76f1b9d127SSheldon Hearn 77f1b9d127SSheldon Hearn #define setwle(buf,ofs,val) getwle(buf,ofs)=val 78f1b9d127SSheldon Hearn #define setwbe(buf,ofs,val) getwle(buf,ofs)=htons(val) 79f1b9d127SSheldon Hearn #define setdle(buf,ofs,val) getdle(buf,ofs)=val 80f1b9d127SSheldon Hearn #define setdbe(buf,ofs,val) getdle(buf,ofs)=htonl(val) 81f1b9d127SSheldon Hearn 82f1b9d127SSheldon Hearn #else /* (BYTE_ORDER == LITTLE_ENDIAN) */ 83bb6275a8SR. Imura 84f1b9d127SSheldon Hearn #define getwbe(buf,ofs) (*((u_int16_t*)(&((u_int8_t*)(buf))[ofs]))) 85f1b9d127SSheldon Hearn #define getdbe(buf,ofs) (*((u_int32_t*)(&((u_int8_t*)(buf))[ofs]))) 86bb6275a8SR. Imura #define getwle(buf,ofs) (bswap16(getwbe(buf,ofs))) 87bb6275a8SR. Imura #define getdle(buf,ofs) (bswap32(getdbe(buf,ofs))) 88bb6275a8SR. Imura 89bb6275a8SR. Imura #define setwbe(buf,ofs,val) getwbe(buf,ofs)=val 90bb6275a8SR. Imura #define setwle(buf,ofs,val) getwbe(buf,ofs)=bswap16(val) 91bb6275a8SR. Imura #define setdbe(buf,ofs,val) getdbe(buf,ofs)=val 92bb6275a8SR. Imura #define setdle(buf,ofs,val) getdbe(buf,ofs)=bswap32(val) 93f1b9d127SSheldon Hearn 94f1b9d127SSheldon Hearn #endif /* (BYTE_ORDER == LITTLE_ENDIAN) */ 95f1b9d127SSheldon Hearn 96f1b9d127SSheldon Hearn /* 97f1b9d127SSheldon Hearn * SMB work context. Used to store all values which is necessary 98f1b9d127SSheldon Hearn * to establish connection to an SMB server. 99f1b9d127SSheldon Hearn */ 100f1b9d127SSheldon Hearn struct smb_ctx { 101f1b9d127SSheldon Hearn int ct_flags; /* SMBCF_ */ 102f1b9d127SSheldon Hearn int ct_fd; /* handle of connection */ 103f1b9d127SSheldon Hearn int ct_parsedlevel; 104f1b9d127SSheldon Hearn int ct_minlevel; 105f1b9d127SSheldon Hearn int ct_maxlevel; 106f1b9d127SSheldon Hearn char * ct_srvaddr; /* hostname or IP address of server */ 107f1b9d127SSheldon Hearn char ct_locname[SMB_MAXUSERNAMELEN + 1]; 108f1b9d127SSheldon Hearn const char * ct_uncnext; 109f1b9d127SSheldon Hearn struct nb_ctx * ct_nb; 110f1b9d127SSheldon Hearn struct smbioc_ossn ct_ssn; 111f1b9d127SSheldon Hearn struct smbioc_oshare ct_sh; 112ef29b0f6SBoris Popov long ct_smbtcpport; 113f1b9d127SSheldon Hearn }; 114f1b9d127SSheldon Hearn 115f1b9d127SSheldon Hearn #define SMBCF_NOPWD 0x0001 /* don't ask for a password */ 116f1b9d127SSheldon Hearn #define SMBCF_SRIGHTS 0x0002 /* share access rights was supplied */ 117f1b9d127SSheldon Hearn #define SMBCF_LOCALE 0x0004 /* use current locale */ 118f1b9d127SSheldon Hearn #define SMBCF_RESOLVED 0x8000 /* structure has been verified */ 119f1b9d127SSheldon Hearn 120f1b9d127SSheldon Hearn /* 121f1b9d127SSheldon Hearn * request handling structures 122f1b9d127SSheldon Hearn */ 123f1b9d127SSheldon Hearn struct mbuf { 124f1b9d127SSheldon Hearn int m_len; 125f1b9d127SSheldon Hearn int m_maxlen; 126f1b9d127SSheldon Hearn char * m_data; 127f1b9d127SSheldon Hearn struct mbuf * m_next; 128f1b9d127SSheldon Hearn }; 129f1b9d127SSheldon Hearn 130f1b9d127SSheldon Hearn struct mbdata { 131f1b9d127SSheldon Hearn struct mbuf * mb_top; 132f1b9d127SSheldon Hearn struct mbuf * mb_cur; 133f1b9d127SSheldon Hearn char * mb_pos; 134f1b9d127SSheldon Hearn int mb_count; 135f1b9d127SSheldon Hearn }; 136f1b9d127SSheldon Hearn 137f1b9d127SSheldon Hearn #define M_ALIGNFACTOR (sizeof(long)) 138f1b9d127SSheldon Hearn #define M_ALIGN(len) (((len) + M_ALIGNFACTOR - 1) & ~(M_ALIGNFACTOR - 1)) 139f1b9d127SSheldon Hearn #define M_BASESIZE (sizeof(struct mbuf)) 140f1b9d127SSheldon Hearn #define M_MINSIZE (256 - M_BASESIZE) 141f1b9d127SSheldon Hearn #define M_TOP(m) ((char*)(m) + M_BASESIZE) 142f1b9d127SSheldon Hearn #define mtod(m,t) ((t)(m)->m_data) 143f1b9d127SSheldon Hearn #define M_TRAILINGSPACE(m) ((m)->m_maxlen - (m)->m_len) 144f1b9d127SSheldon Hearn 145f1b9d127SSheldon Hearn struct smb_rq { 146f1b9d127SSheldon Hearn u_char rq_cmd; 147f1b9d127SSheldon Hearn struct mbdata rq_rq; 148f1b9d127SSheldon Hearn struct mbdata rq_rp; 149f1b9d127SSheldon Hearn struct smb_ctx *rq_ctx; 150f1b9d127SSheldon Hearn int rq_wcount; 151f1b9d127SSheldon Hearn int rq_bcount; 152f1b9d127SSheldon Hearn }; 153f1b9d127SSheldon Hearn 154f1b9d127SSheldon Hearn struct smb_bitname { 155f1b9d127SSheldon Hearn u_int bn_bit; 156f1b9d127SSheldon Hearn char *bn_name; 157f1b9d127SSheldon Hearn }; 158f1b9d127SSheldon Hearn 159f1b9d127SSheldon Hearn extern struct rcfile *smb_rc; 160f1b9d127SSheldon Hearn 161f1b9d127SSheldon Hearn __BEGIN_DECLS 162f1b9d127SSheldon Hearn 163f1b9d127SSheldon Hearn struct sockaddr; 164f1b9d127SSheldon Hearn 165f1b9d127SSheldon Hearn int smb_lib_init(void); 166f1b9d127SSheldon Hearn int smb_open_rcfile(void); 167f1b9d127SSheldon Hearn void smb_error(const char *, int,...); 168f1b9d127SSheldon Hearn char *smb_printb(char *, int, const struct smb_bitname *); 169f1b9d127SSheldon Hearn void *smb_dumptree(void); 170f1b9d127SSheldon Hearn 171f1b9d127SSheldon Hearn /* 172f1b9d127SSheldon Hearn * Context management 173f1b9d127SSheldon Hearn */ 174f1b9d127SSheldon Hearn int smb_ctx_init(struct smb_ctx *, int, char *[], int, int, int); 175f1b9d127SSheldon Hearn void smb_ctx_done(struct smb_ctx *); 176f1b9d127SSheldon Hearn int smb_ctx_parseunc(struct smb_ctx *, const char *, int, const char **); 177f1b9d127SSheldon Hearn int smb_ctx_setcharset(struct smb_ctx *, const char *); 178f1b9d127SSheldon Hearn int smb_ctx_setserver(struct smb_ctx *, const char *); 179ef29b0f6SBoris Popov int smb_ctx_setnbport(struct smb_ctx *, int); 180ef29b0f6SBoris Popov int smb_ctx_setsmbport(struct smb_ctx *, int); 181f1b9d127SSheldon Hearn int smb_ctx_setuser(struct smb_ctx *, const char *); 182f1b9d127SSheldon Hearn int smb_ctx_setshare(struct smb_ctx *, const char *, int); 183f1b9d127SSheldon Hearn int smb_ctx_setscope(struct smb_ctx *, const char *); 184f1b9d127SSheldon Hearn int smb_ctx_setworkgroup(struct smb_ctx *, const char *); 185f1b9d127SSheldon Hearn int smb_ctx_setpassword(struct smb_ctx *, const char *); 186f1b9d127SSheldon Hearn int smb_ctx_setsrvaddr(struct smb_ctx *, const char *); 187f1b9d127SSheldon Hearn int smb_ctx_opt(struct smb_ctx *, int, const char *); 188f1b9d127SSheldon Hearn int smb_ctx_lookup(struct smb_ctx *, int, int); 189f1b9d127SSheldon Hearn int smb_ctx_login(struct smb_ctx *); 190f1b9d127SSheldon Hearn int smb_ctx_readrc(struct smb_ctx *); 191f1b9d127SSheldon Hearn int smb_ctx_resolve(struct smb_ctx *); 192f1b9d127SSheldon Hearn int smb_ctx_setflags(struct smb_ctx *, int, int, int); 193f1b9d127SSheldon Hearn 194*1243a98eSTijl Coosemans int smb_smb_open_print_file(struct smb_ctx *, int, int, char *, smbfh*); 195f1b9d127SSheldon Hearn int smb_smb_close_print_file(struct smb_ctx *, smbfh); 196f1b9d127SSheldon Hearn 197f1b9d127SSheldon Hearn int smb_read(struct smb_ctx *, smbfh, off_t, size_t, char *); 198f1b9d127SSheldon Hearn int smb_write(struct smb_ctx *, smbfh, off_t, size_t, const char *); 199f1b9d127SSheldon Hearn 200f1b9d127SSheldon Hearn #define smb_rq_getrequest(rqp) (&(rqp)->rq_rq) 201f1b9d127SSheldon Hearn #define smb_rq_getreply(rqp) (&(rqp)->rq_rp) 202f1b9d127SSheldon Hearn 203f1b9d127SSheldon Hearn int smb_rq_init(struct smb_ctx *, u_char, size_t, struct smb_rq **); 204f1b9d127SSheldon Hearn void smb_rq_done(struct smb_rq *); 205f1b9d127SSheldon Hearn void smb_rq_wend(struct smb_rq *); 206f1b9d127SSheldon Hearn int smb_rq_simple(struct smb_rq *); 207*1243a98eSTijl Coosemans int smb_rq_dmem(struct mbdata *, char *, size_t); 208*1243a98eSTijl Coosemans int smb_rq_dstring(struct mbdata *, char *); 209f1b9d127SSheldon Hearn 210f1b9d127SSheldon Hearn int smb_t2_request(struct smb_ctx *, int, int, const char *, 211f1b9d127SSheldon Hearn int, void *, int, void *, int *, void *, int *, void *); 212f1b9d127SSheldon Hearn 213df3342d6SSheldon Hearn char* smb_simplecrypt(char *dst, const char *src); 214f1b9d127SSheldon Hearn int smb_simpledecrypt(char *dst, const char *src); 215f1b9d127SSheldon Hearn 216f1b9d127SSheldon Hearn int m_getm(struct mbuf *, size_t, struct mbuf **); 217f1b9d127SSheldon Hearn int m_lineup(struct mbuf *, struct mbuf **); 218f1b9d127SSheldon Hearn int mb_init(struct mbdata *, size_t); 219f1b9d127SSheldon Hearn int mb_initm(struct mbdata *, struct mbuf *); 220f1b9d127SSheldon Hearn int mb_done(struct mbdata *); 221f1b9d127SSheldon Hearn int mb_fit(struct mbdata *mbp, size_t size, char **pp); 222f1b9d127SSheldon Hearn int mb_put_uint8(struct mbdata *, u_int8_t); 223f1b9d127SSheldon Hearn int mb_put_uint16be(struct mbdata *, u_int16_t); 224f1b9d127SSheldon Hearn int mb_put_uint16le(struct mbdata *, u_int16_t); 225f1b9d127SSheldon Hearn int mb_put_uint32be(struct mbdata *, u_int32_t); 226f1b9d127SSheldon Hearn int mb_put_uint32le(struct mbdata *, u_int32_t); 227f1b9d127SSheldon Hearn int mb_put_int64be(struct mbdata *, int64_t); 228f1b9d127SSheldon Hearn int mb_put_int64le(struct mbdata *, int64_t); 229f1b9d127SSheldon Hearn int mb_put_mem(struct mbdata *, const char *, size_t); 230f1b9d127SSheldon Hearn int mb_put_pstring(struct mbdata *mbp, const char *s); 231f1b9d127SSheldon Hearn int mb_put_mbuf(struct mbdata *, struct mbuf *); 232f1b9d127SSheldon Hearn 233f1b9d127SSheldon Hearn int mb_get_uint8(struct mbdata *, u_int8_t *); 234f1b9d127SSheldon Hearn int mb_get_uint16(struct mbdata *, u_int16_t *); 235f1b9d127SSheldon Hearn int mb_get_uint16le(struct mbdata *, u_int16_t *); 236f1b9d127SSheldon Hearn int mb_get_uint16be(struct mbdata *, u_int16_t *); 237f1b9d127SSheldon Hearn int mb_get_uint32(struct mbdata *, u_int32_t *); 238f1b9d127SSheldon Hearn int mb_get_uint32be(struct mbdata *, u_int32_t *); 239f1b9d127SSheldon Hearn int mb_get_uint32le(struct mbdata *, u_int32_t *); 240f1b9d127SSheldon Hearn int mb_get_int64(struct mbdata *, int64_t *); 241f1b9d127SSheldon Hearn int mb_get_int64be(struct mbdata *, int64_t *); 242f1b9d127SSheldon Hearn int mb_get_int64le(struct mbdata *, int64_t *); 243f1b9d127SSheldon Hearn int mb_get_mem(struct mbdata *, char *, size_t); 244f1b9d127SSheldon Hearn 245f1b9d127SSheldon Hearn extern u_char nls_lower[256], nls_upper[256]; 246f1b9d127SSheldon Hearn 247f1b9d127SSheldon Hearn int nls_setrecode(const char *, const char *); 248f1b9d127SSheldon Hearn int nls_setlocale(const char *); 249*1243a98eSTijl Coosemans char* nls_str_toext(char *, char *); 250*1243a98eSTijl Coosemans char* nls_str_toloc(char *, char *); 251*1243a98eSTijl Coosemans void* nls_mem_toext(void *, void *, int); 252*1243a98eSTijl Coosemans void* nls_mem_toloc(void *, void *, int); 253f1b9d127SSheldon Hearn char* nls_str_upper(char *, const char *); 254f1b9d127SSheldon Hearn char* nls_str_lower(char *, const char *); 255f1b9d127SSheldon Hearn 256f1b9d127SSheldon Hearn __END_DECLS 257f1b9d127SSheldon Hearn 258f1b9d127SSheldon Hearn #endif /* _NETSMB_SMB_LIB_H_ */ 259