xref: /freebsd/contrib/smbfs/include/netsmb/smb_lib.h (revision 416ba5c74546f32a993436a99516d35008e9f384)
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