1 /*
2  * Copyright (c) 2000, Boris Popov
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *    This product includes software developed by Boris Popov.
16  * 4. Neither the name of the author nor the names of any co-contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  *
32  * $Id: nb_lib.h,v 1.4 2004/12/11 05:23:58 lindak Exp $
33  */
34 
35 #ifndef _NETSMB_NB_LIB_H_
36 #define	_NETSMB_NB_LIB_H_
37 
38 #pragma ident	"%Z%%M%	%I%	%E% SMI"
39 
40 /*
41  * Error codes
42  */
43 #define	NBERR_INVALIDFORMAT	0x0001
44 #define	NBERR_SRVFAILURE	0x0002
45 #define	NBERR_NAMENOTFOUND	0x0003
46 #define	NBERR_IMP		0x0004
47 #define	NBERR_REFUSED		0x0005
48 #define	NBERR_ACTIVE		0x0006
49 #define	NBERR_HOSTNOTFOUND	0x0101
50 #define	NBERR_TOOMANYREDIRECTS	0x0102
51 #define	NBERR_INVALIDRESPONSE	0x0103
52 #define	NBERR_NAMETOOLONG	0x0104
53 #define	NBERR_NOBCASTIFS	0x0105
54 #define	NBERR_MAX		0x0106
55 #define	NBERROR(e)		((e) |  SMB_NB_ERROR)
56 
57 #define	NBCF_RESOLVED	0x0001
58 #define	NBCF_NS_ENABLE	0x0002		/* any NetBIOS lookup */
59 #define	NBCF_BC_ENABLE	0x0004		/* lookup via broadcast */
60 
61 /*
62  * nb environment
63  */
64 struct nb_ctx {
65 	int		nb_flags;
66 	int		nb_timo;
67 	char		*nb_scope;	/* NetBIOS scope */
68 	in_addr_t	nb_wins1;	/* primary WINS */
69 	in_addr_t	nb_wins2;	/* secondary WINS (unused now) */
70 	struct sockaddr_in	nb_lastns; /* see cmd:lookup.c */
71 };
72 typedef struct nb_ctx nb_ctx_t;
73 
74 /*
75  * resource record
76  */
77 struct nbns_rr {
78 	uchar_t		*rr_name;	/* compressed NETBIOS name */
79 	uint16_t	rr_type;
80 	uint16_t	rr_class;
81 	uint32_t	rr_ttl;
82 	uint16_t	rr_rdlength;
83 	uchar_t		*rr_data;
84 };
85 typedef struct nbns_rr nfns_rr_t;
86 
87 /*
88  * NetBIOS name return
89  */
90 struct nbns_nr {
91 	char		ns_name[NB_NAMELEN];
92 	uint16_t	ns_flags;
93 };
94 typedef struct nbns_nr nbns_nr_t;
95 
96 #define	NBRQF_POINT	0x0000
97 #define	NBRQF_BROADCAST	0x0001
98 
99 #define	NBNS_GROUPFLG 0x8000
100 
101 /*
102  * nbns request
103  */
104 struct nbns_rq {
105 	int		nr_opcode;
106 	int		nr_nmflags;
107 	int		nr_rcode;
108 	int		nr_qdcount;
109 	int		nr_ancount;
110 	int		nr_nscount;
111 	int		nr_arcount;
112 	struct nb_name	*nr_qdname;
113 	uint16_t	nr_qdtype;
114 	uint16_t	nr_qdclass;
115 	struct in_addr	nr_dest;	/* receiver of query */
116 	struct sockaddr_in nr_sender;	/* sender of response */
117 	int		nr_rpnmflags;
118 	int		nr_rprcode;
119 	uint16_t	nr_rpancount;
120 	uint16_t	nr_rpnscount;
121 	uint16_t	nr_rparcount;
122 	uint16_t	nr_trnid;
123 	struct nb_ctx	*nr_nbd;
124 	struct mbdata	nr_rq;
125 	struct mbdata	nr_rp;
126 	struct nb_ifdesc *nr_if;
127 	int		nr_flags;
128 	int		nr_fd;
129 	int		nr_maxretry;
130 };
131 typedef struct nbns_rq nbns_rq_t;
132 
133 struct nb_ifdesc {
134 	int		id_flags;
135 	struct in_addr	id_addr;
136 	struct in_addr	id_mask;
137 	char		id_name[16];	/* actually IFNAMSIZ */
138 	struct nb_ifdesc *id_next;
139 };
140 typedef struct nb_ifdesc nb_ifdesc_t;
141 
142 struct sockaddr;
143 
144 #ifdef __cplusplus
145 extern "C" {
146 #endif
147 
148 int nb_name_len(struct nb_name *);
149 /* new flag UCflag. 1=uppercase,0=don't */
150 int nb_name_encode(struct nb_name *, uchar_t *);
151 int nb_encname_len(const uchar_t *);
152 
153 int  nb_snballoc(int namelen, struct sockaddr_nb **);
154 void nb_snbfree(struct sockaddr *);
155 int  nb_sockaddr(struct sockaddr *, struct nb_name *, struct sockaddr_nb **);
156 
157 int  nb_resolvehost_in(const char *, struct sockaddr **);
158 int  nbns_resolvename(const char *, struct nb_ctx *, struct sockaddr **);
159 int  nbns_getnodestatus(struct sockaddr *targethost,
160     struct nb_ctx *ctx, char *system, char *workgroup);
161 int  nb_getlocalname(char *name, size_t maxlen);
162 int  nb_enum_if(struct nb_ifdesc **);
163 
164 const char *nb_strerror(int error);
165 
166 int  nb_ctx_create(struct nb_ctx **);
167 void nb_ctx_done(struct nb_ctx *);
168 int  nb_ctx_setns(struct nb_ctx *, const char *);
169 int  nb_ctx_setscope(struct nb_ctx *, const char *);
170 int  nb_ctx_resolve(struct nb_ctx *);
171 int  nb_ctx_readrcsection(struct rcfile *, struct nb_ctx *, const char *, int);
172 
173 #ifdef __cplusplus
174 }
175 #endif
176 
177 #endif /* !_NETSMB_NB_LIB_H_ */
178