diff options
Diffstat (limited to 'contrib/smbfs/include/netsmb/smb_lib.h')
-rw-r--r-- | contrib/smbfs/include/netsmb/smb_lib.h | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/contrib/smbfs/include/netsmb/smb_lib.h b/contrib/smbfs/include/netsmb/smb_lib.h new file mode 100644 index 000000000000..24fccb86dc70 --- /dev/null +++ b/contrib/smbfs/include/netsmb/smb_lib.h @@ -0,0 +1,256 @@ +/* + * Copyright (c) 2000-2001 Boris Popov + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Boris Popov. + * 4. Neither the name of the author nor the names of any co-contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: smb_lib.h,v 1.22 2001/04/10 05:37:22 bp Exp $ + */ +#ifndef _NETSMB_SMB_LIB_H_ +#define _NETSMB_SMB_LIB_H_ + +#include <netsmb/smb.h> +#include <netsmb/smb_dev.h> + +#define SMB_CFG_FILE "/usr/local/etc/nsmb.conf" + +#define STDPARAM_ARGS 'A':case 'B':case 'C':case 'E':case 'I': \ + case 'L':case 'M': \ + case 'N':case 'U':case 'R':case 'S':case 'T': \ + case 'W':case 'O':case 'P' + +#define STDPARAM_OPT "A:BCE:I:L:M:NO:P:U:R:S:T:W:" + +/* + * bits to indicate the source of error + */ +#define SMB_ERRTYPE_MASK 0xf0000 +#define SMB_SYS_ERROR 0x00000 +#define SMB_RAP_ERROR 0x10000 +#define SMB_NB_ERROR 0x20000 + +#ifndef min +#define min(a,b) (((a)<(b)) ? (a) : (b)) +#endif + +#define getb(buf,ofs) (((const u_int8_t *)(buf))[ofs]) +#define setb(buf,ofs,val) (((u_int8_t*)(buf))[ofs])=val +#define getbw(buf,ofs) ((u_int16_t)(getb(buf,ofs))) +#define getw(buf,ofs) (*((u_int16_t*)(&((u_int8_t*)(buf))[ofs]))) +#define getdw(buf,ofs) (*((u_int32_t*)(&((u_int8_t*)(buf))[ofs]))) + +#if (BYTE_ORDER == LITTLE_ENDIAN) + +#define getwle(buf,ofs) (*((u_int16_t*)(&((u_int8_t*)(buf))[ofs]))) +#define getdle(buf,ofs) (*((u_int32_t*)(&((u_int8_t*)(buf))[ofs]))) +#define getwbe(buf,ofs) (ntohs(getwle(buf,ofs))) +#define getdbe(buf,ofs) (ntohl(getdle(buf,ofs))) + +#define setwle(buf,ofs,val) getwle(buf,ofs)=val +#define setwbe(buf,ofs,val) getwle(buf,ofs)=htons(val) +#define setdle(buf,ofs,val) getdle(buf,ofs)=val +#define setdbe(buf,ofs,val) getdle(buf,ofs)=htonl(val) + +#else /* (BYTE_ORDER == LITTLE_ENDIAN) */ +#error "Macros for Big-Endians are incomplete" +#define getwle(buf,ofs) ((u_int16_t)(getb(buf, ofs) | (getb(buf, ofs + 1) << 8))) +#define getdle(buf,ofs) ((u_int32_t)(getb(buf, ofs) | \ + (getb(buf, ofs + 1) << 8) | \ + (getb(buf, ofs + 2) << 16) | \ + (getb(buf, ofs + 3) << 24))) +#define getwbe(buf,ofs) (*((u_int16_t*)(&((u_int8_t*)(buf))[ofs]))) +#define getdbe(buf,ofs) (*((u_int32_t*)(&((u_int8_t*)(buf))[ofs]))) +/* +#define setwle(buf,ofs,val) getwle(buf,ofs)=val +#define setdle(buf,ofs,val) getdle(buf,ofs)=val +*/ +#define setwbe(buf,ofs,val) getwle(buf,ofs)=val +#define setdbe(buf,ofs,val) getdle(buf,ofs)=val + +#endif /* (BYTE_ORDER == LITTLE_ENDIAN) */ + +/* + * SMB work context. Used to store all values which is necessary + * to establish connection to an SMB server. + */ +struct smb_ctx { + int ct_flags; /* SMBCF_ */ + int ct_fd; /* handle of connection */ + int ct_parsedlevel; + int ct_minlevel; + int ct_maxlevel; + char * ct_srvaddr; /* hostname or IP address of server */ + char ct_locname[SMB_MAXUSERNAMELEN + 1]; + const char * ct_uncnext; + struct nb_ctx * ct_nb; + struct smbioc_ossn ct_ssn; + struct smbioc_oshare ct_sh; +}; + +#define SMBCF_NOPWD 0x0001 /* don't ask for a password */ +#define SMBCF_SRIGHTS 0x0002 /* share access rights was supplied */ +#define SMBCF_LOCALE 0x0004 /* use current locale */ +#define SMBCF_RESOLVED 0x8000 /* structure has been verified */ + +/* + * request handling structures + */ +struct mbuf { + int m_len; + int m_maxlen; + char * m_data; + struct mbuf * m_next; +}; + +struct mbdata { + struct mbuf * mb_top; + struct mbuf * mb_cur; + char * mb_pos; + int mb_count; +}; + +#define M_ALIGNFACTOR (sizeof(long)) +#define M_ALIGN(len) (((len) + M_ALIGNFACTOR - 1) & ~(M_ALIGNFACTOR - 1)) +#define M_BASESIZE (sizeof(struct mbuf)) +#define M_MINSIZE (256 - M_BASESIZE) +#define M_TOP(m) ((char*)(m) + M_BASESIZE) +#define mtod(m,t) ((t)(m)->m_data) +#define M_TRAILINGSPACE(m) ((m)->m_maxlen - (m)->m_len) + +struct smb_rq { + u_char rq_cmd; + struct mbdata rq_rq; + struct mbdata rq_rp; + struct smb_ctx *rq_ctx; + int rq_wcount; + int rq_bcount; +}; + +struct smb_bitname { + u_int bn_bit; + char *bn_name; +}; + +extern struct rcfile *smb_rc; + +__BEGIN_DECLS + +struct sockaddr; + +int smb_lib_init(void); +int smb_open_rcfile(void); +void smb_error(const char *, int,...); +char *smb_printb(char *, int, const struct smb_bitname *); +void *smb_dumptree(void); + +/* + * Context management + */ +int smb_ctx_init(struct smb_ctx *, int, char *[], int, int, int); +void smb_ctx_done(struct smb_ctx *); +int smb_ctx_parseunc(struct smb_ctx *, const char *, int, const char **); +int smb_ctx_setcharset(struct smb_ctx *, const char *); +int smb_ctx_setserver(struct smb_ctx *, const char *); +int smb_ctx_setuser(struct smb_ctx *, const char *); +int smb_ctx_setshare(struct smb_ctx *, const char *, int); +int smb_ctx_setscope(struct smb_ctx *, const char *); +int smb_ctx_setworkgroup(struct smb_ctx *, const char *); +int smb_ctx_setpassword(struct smb_ctx *, const char *); +int smb_ctx_setsrvaddr(struct smb_ctx *, const char *); +int smb_ctx_opt(struct smb_ctx *, int, const char *); +int smb_ctx_lookup(struct smb_ctx *, int, int); +int smb_ctx_login(struct smb_ctx *); +int smb_ctx_readrc(struct smb_ctx *); +int smb_ctx_resolve(struct smb_ctx *); +int smb_ctx_setflags(struct smb_ctx *, int, int, int); + +int smb_smb_open_print_file(struct smb_ctx *, int, int, const char *, smbfh*); +int smb_smb_close_print_file(struct smb_ctx *, smbfh); + +int smb_read(struct smb_ctx *, smbfh, off_t, size_t, char *); +int smb_write(struct smb_ctx *, smbfh, off_t, size_t, const char *); + +#define smb_rq_getrequest(rqp) (&(rqp)->rq_rq) +#define smb_rq_getreply(rqp) (&(rqp)->rq_rp) + +int smb_rq_init(struct smb_ctx *, u_char, size_t, struct smb_rq **); +void smb_rq_done(struct smb_rq *); +void smb_rq_wend(struct smb_rq *); +int smb_rq_simple(struct smb_rq *); +int smb_rq_dmem(struct mbdata *, const char *, size_t); +int smb_rq_dstring(struct mbdata *, const char *); + +int smb_t2_request(struct smb_ctx *, int, int, const char *, + int, void *, int, void *, int *, void *, int *, void *); + +void smb_simplecrypt(char *dst, const char *src); +int smb_simpledecrypt(char *dst, const char *src); + +int m_getm(struct mbuf *, size_t, struct mbuf **); +int m_lineup(struct mbuf *, struct mbuf **); +int mb_init(struct mbdata *, size_t); +int mb_initm(struct mbdata *, struct mbuf *); +int mb_done(struct mbdata *); +int mb_fit(struct mbdata *mbp, size_t size, char **pp); +int mb_put_uint8(struct mbdata *, u_int8_t); +int mb_put_uint16be(struct mbdata *, u_int16_t); +int mb_put_uint16le(struct mbdata *, u_int16_t); +int mb_put_uint32be(struct mbdata *, u_int32_t); +int mb_put_uint32le(struct mbdata *, u_int32_t); +int mb_put_int64be(struct mbdata *, int64_t); +int mb_put_int64le(struct mbdata *, int64_t); +int mb_put_mem(struct mbdata *, const char *, size_t); +int mb_put_pstring(struct mbdata *mbp, const char *s); +int mb_put_mbuf(struct mbdata *, struct mbuf *); + +int mb_get_uint8(struct mbdata *, u_int8_t *); +int mb_get_uint16(struct mbdata *, u_int16_t *); +int mb_get_uint16le(struct mbdata *, u_int16_t *); +int mb_get_uint16be(struct mbdata *, u_int16_t *); +int mb_get_uint32(struct mbdata *, u_int32_t *); +int mb_get_uint32be(struct mbdata *, u_int32_t *); +int mb_get_uint32le(struct mbdata *, u_int32_t *); +int mb_get_int64(struct mbdata *, int64_t *); +int mb_get_int64be(struct mbdata *, int64_t *); +int mb_get_int64le(struct mbdata *, int64_t *); +int mb_get_mem(struct mbdata *, char *, size_t); + +extern u_char nls_lower[256], nls_upper[256]; + +int nls_setrecode(const char *, const char *); +int nls_setlocale(const char *); +char* nls_str_toext(char *, const char *); +char* nls_str_toloc(char *, const char *); +void* nls_mem_toext(void *, const void *, int); +void* nls_mem_toloc(void *, const void *, int); +char* nls_str_upper(char *, const char *); +char* nls_str_lower(char *, const char *); + +__END_DECLS + +#endif /* _NETSMB_SMB_LIB_H_ */ |