2 |
- |
1 |
enum {
|
|
|
2 |
NbNameLen = 16,
|
|
|
3 |
NbnsTimeoutBroadcast = 1000,
|
|
|
4 |
NbnsRetryBroadcast = 3,
|
|
|
5 |
NbnsPort = 137,
|
|
|
6 |
NbDgramMaxLen = 576,
|
|
|
7 |
};
|
|
|
8 |
|
|
|
9 |
typedef struct NbnsHdr {
|
|
|
10 |
uchar name_trn_id[2];
|
|
|
11 |
uchar ctrl[2];
|
|
|
12 |
uchar qdcount[2];
|
|
|
13 |
uchar ancount[2];
|
|
|
14 |
uchar nscount[2];
|
|
|
15 |
uchar arcount[2];
|
|
|
16 |
} NbnsHdr;
|
|
|
17 |
|
|
|
18 |
enum {
|
|
|
19 |
NbnsResponse = 1 << 15
|
|
|
20 |
};
|
|
|
21 |
|
|
|
22 |
enum {
|
|
|
23 |
NbnsOpShift = 11,
|
|
|
24 |
NbnsOpMask = 0xf,
|
|
|
25 |
NbnsOpQuery = 0,
|
|
|
26 |
NbnsOpRegistration = 5,
|
|
|
27 |
NbnsOpRelease = 6,
|
|
|
28 |
NbnsOpWack = 7,
|
|
|
29 |
NbnsOpRefresh = 8
|
|
|
30 |
};
|
|
|
31 |
|
|
|
32 |
enum {
|
|
|
33 |
NbnsFlagBroadcast = (1 << 4),
|
|
|
34 |
NbnsFlagRecursionAvailable = (1 << 7),
|
|
|
35 |
NbnsFlagRecursionDesired = (1 << 8),
|
|
|
36 |
NbnsFlagTruncation = (1 << 9),
|
|
|
37 |
NbnsFlagAuthoritativeAnswer = (1 << 10),
|
|
|
38 |
};
|
|
|
39 |
|
|
|
40 |
enum {
|
|
|
41 |
NbnsRcodeShift = 0,
|
|
|
42 |
NbnsRcodeMask = 0xf,
|
|
|
43 |
};
|
|
|
44 |
|
|
|
45 |
enum {
|
|
|
46 |
NbnsQuestionTypeNb = 0x0020,
|
|
|
47 |
NbnsQuestionTypeNbStat = 0x0021,
|
|
|
48 |
NbnsQuestionClassIn = 0x0001,
|
|
|
49 |
};
|
|
|
50 |
|
|
|
51 |
enum {
|
|
|
52 |
NbnsResourceTypeA = 0x0001,
|
|
|
53 |
NbnsResourceTypeNs = 0x0002,
|
|
|
54 |
NbnsResourceTypeNull = 0x000a,
|
|
|
55 |
NbnsResourceTypeNb = 0x0020,
|
|
|
56 |
NbnsResourceTypeNbStat = 0x0021,
|
|
|
57 |
NbnsResourceClassIn = 0x0001,
|
|
|
58 |
};
|
|
|
59 |
|
|
|
60 |
typedef struct NbnsMessageQuestion NbnsMessageQuestion;
|
|
|
61 |
typedef struct NbnsMessageResource NbnsMessageResource;
|
|
|
62 |
|
|
|
63 |
typedef uchar NbName[NbNameLen];
|
|
|
64 |
int nbnamedecode(uchar *base, uchar *p, uchar *ep, NbName name);
|
|
|
65 |
int nbnameencode(uchar *p, uchar *ep, NbName name);
|
|
|
66 |
int nbnameequal(NbName name1, NbName name2);
|
|
|
67 |
void nbnamecpy(NbName n1, NbName n2);
|
|
|
68 |
void nbmknamefromstring(NbName nbname, char *string);
|
|
|
69 |
void nbmknamefromstringandtype(NbName nbname, char *string, uchar type);
|
|
|
70 |
void nbmkstringfromname(char *buf, int buflen, NbName name);
|
|
|
71 |
#pragma varargck type "B" uchar *
|
|
|
72 |
|
|
|
73 |
int nbnamefmt(Fmt *);
|
|
|
74 |
|
|
|
75 |
struct NbnsMessageQuestion {
|
|
|
76 |
NbName name;
|
|
|
77 |
ushort type;
|
|
|
78 |
ushort class;
|
|
|
79 |
NbnsMessageQuestion *next;
|
|
|
80 |
};
|
|
|
81 |
|
|
|
82 |
NbnsMessageQuestion *nbnsmessagequestionnew(NbName name, ushort type, ushort class);
|
|
|
83 |
|
|
|
84 |
struct NbnsMessageResource {
|
|
|
85 |
NbName name;
|
|
|
86 |
ushort type;
|
|
|
87 |
ushort class;
|
|
|
88 |
ulong ttl;
|
|
|
89 |
ushort rdlength;
|
|
|
90 |
uchar *rdata;
|
|
|
91 |
NbnsMessageResource *next;
|
|
|
92 |
};
|
|
|
93 |
NbnsMessageResource *nbnsmessageresourcenew(NbName name, ushort type, ushort class, ulong ttl, int rdcount, uchar *rdata);
|
|
|
94 |
|
|
|
95 |
typedef struct NbnsMessage {
|
|
|
96 |
ushort id;
|
|
|
97 |
int response;
|
|
|
98 |
int opcode;
|
|
|
99 |
int broadcast;
|
|
|
100 |
int recursionavailable;
|
|
|
101 |
int recursiondesired;
|
|
|
102 |
int truncation;
|
|
|
103 |
int authoritativeanswer;
|
|
|
104 |
int rcode;
|
|
|
105 |
NbnsMessageQuestion *q;
|
|
|
106 |
NbnsMessageResource *an;
|
|
|
107 |
NbnsMessageResource *ns;
|
|
|
108 |
NbnsMessageResource *ar;
|
|
|
109 |
} NbnsMessage;
|
|
|
110 |
|
|
|
111 |
NbnsMessage *nbnsmessagenew(void);
|
|
|
112 |
void nbnsmessageaddquestion(NbnsMessage *s, NbnsMessageQuestion *q);
|
|
|
113 |
void nbnsmessageaddresource(NbnsMessageResource **rp, NbnsMessageResource *r);
|
|
|
114 |
NbnsMessage *nbnsconvM2S(uchar *ap, int nap);
|
|
|
115 |
void nbnsmessagefree(NbnsMessage **sp);
|
|
|
116 |
void nbnsdumpmessage(NbnsMessage *s);
|
|
|
117 |
int nbnsconvS2M(NbnsMessage *s, uchar *ap, int nap);
|
|
|
118 |
|
|
|
119 |
|
|
|
120 |
NbnsMessage *nbnsmessagenamequeryrequestnew(ushort id, int broadcast, NbName name);
|
|
|
121 |
NbnsMessage *nbnsmessagenameregistrationrequestnew(ushort id, int broadcast, NbName name, ulong ttl, uchar *ipaddr);
|
|
|
122 |
|
|
|
123 |
typedef struct NbnsTransaction NbnsTransaction;
|
|
|
124 |
|
|
|
125 |
struct NbnsTransaction {
|
|
|
126 |
ushort id;
|
|
|
127 |
Channel *c;
|
|
|
128 |
NbnsTransaction *next;
|
|
|
129 |
};
|
|
|
130 |
ushort nbnsnextid(void);
|
|
|
131 |
|
|
|
132 |
int nbnsfindname(uchar *serveripaddr, NbName name, uchar *ipaddr, ulong *ttlp);
|
|
|
133 |
int nbnsaddname(uchar *serveripaddr, NbName name, ulong ttl, uchar *ipaddr);
|
|
|
134 |
|
|
|
135 |
NbnsTransaction *nbnstransactionnew(NbnsMessage *request, uchar *ipaddr);
|
|
|
136 |
void nbnstransactionfree(NbnsTransaction **tp);
|
|
|
137 |
|
|
|
138 |
typedef struct NbnsAlarm NbnsAlarm;
|
|
|
139 |
|
|
|
140 |
struct NbnsAlarm {
|
|
|
141 |
Channel *c;
|
|
|
142 |
vlong expirems;
|
|
|
143 |
NbnsAlarm *next;
|
|
|
144 |
};
|
|
|
145 |
|
|
|
146 |
void nbnsalarmset(NbnsAlarm *a, ulong millisec);
|
|
|
147 |
void nbnsalarmcancel(NbnsAlarm *a);
|
|
|
148 |
void nbnsalarmfree(NbnsAlarm **ap);
|
|
|
149 |
NbnsAlarm *nbnsalarmnew(void);
|
|
|
150 |
void nbnsalarmend(void);
|
|
|
151 |
|
|
|
152 |
typedef struct NbSession NbSession;
|
|
|
153 |
typedef int NBSSWRITEFN(NbSession *s, void *buf, long n);
|
|
|
154 |
|
|
|
155 |
struct NbSession {
|
|
|
156 |
int fd;
|
|
|
157 |
void *magic;
|
|
|
158 |
NbName from;
|
|
|
159 |
NbName to;
|
|
|
160 |
};
|
|
|
161 |
|
|
|
162 |
int nbsslisten(NbName to, NbName from, int (*accept)(void *magic, NbSession *s, NBSSWRITEFN **write), void *magic);
|
|
|
163 |
NbSession *nbssconnect(NbName to, NbName from);
|
|
|
164 |
void nbssfree(NbSession *s);
|
|
|
165 |
|
|
|
166 |
typedef struct NbScatterGather NbScatterGather;
|
|
|
167 |
|
|
|
168 |
struct NbScatterGather {
|
|
|
169 |
void *p;
|
|
|
170 |
long l;
|
|
|
171 |
};
|
|
|
172 |
|
|
|
173 |
int nbssgatherwrite(NbSession *s, NbScatterGather *a);
|
|
|
174 |
long nbssscatterread(NbSession *, NbScatterGather *a);
|
|
|
175 |
int nbsswrite(NbSession *s, void *buf, long n);
|
|
|
176 |
long nbssread(NbSession *s, void *buf, long n);
|
|
|
177 |
void *nbemalloc(ulong);
|
|
|
178 |
|
|
|
179 |
int nbnameresolve(NbName name, uchar *ipaddr);
|
|
|
180 |
|
|
|
181 |
void nbdumpdata(void *data, long datalen);
|
|
|
182 |
|
|
|
183 |
typedef struct NbDgram {
|
|
|
184 |
uchar type;
|
|
|
185 |
uchar flags;
|
|
|
186 |
ushort id;
|
|
|
187 |
uchar srcip[IPaddrlen];
|
|
|
188 |
ushort srcport;
|
|
|
189 |
union {
|
|
|
190 |
struct {
|
|
|
191 |
ushort length;
|
|
|
192 |
ushort offset;
|
|
|
193 |
NbName srcname;
|
|
|
194 |
NbName dstname;
|
|
|
195 |
uchar *data;
|
|
|
196 |
} datagram;
|
|
|
197 |
struct {
|
|
|
198 |
uchar code;
|
|
|
199 |
} error;
|
|
|
200 |
struct {
|
|
|
201 |
NbName dstname;
|
|
|
202 |
} query;
|
|
|
203 |
};
|
|
|
204 |
} NbDgram;
|
|
|
205 |
|
|
|
206 |
enum {
|
|
|
207 |
NbDgramDirectUnique = 0x10,
|
|
|
208 |
NbDgramDirectGroup,
|
|
|
209 |
NbDgramBroadcast,
|
|
|
210 |
NbDgramError,
|
|
|
211 |
NbDgramQueryRequest,
|
|
|
212 |
NbDgramPositiveQueryResponse,
|
|
|
213 |
NbDgramNegativeQueryResponse,
|
|
|
214 |
NbDgramMore = 1,
|
|
|
215 |
NbDgramFirst = 2,
|
|
|
216 |
NbDgramPort = 138,
|
|
|
217 |
NbDgramErrorDestinationNameNotPresent = 0x82,
|
|
|
218 |
NbDgramMaxPacket = 576,
|
|
|
219 |
};
|
|
|
220 |
|
|
|
221 |
typedef struct NbDgramSendParameters {
|
|
|
222 |
NbName to;
|
|
|
223 |
uchar type;
|
|
|
224 |
} NbDgramSendParameters;
|
|
|
225 |
|
|
|
226 |
int nbdgramconvM2S(NbDgram *s, uchar *p, uchar *ep);
|
|
|
227 |
int nbdgramconvS2M(uchar *p, uchar *ep, NbDgram *s);
|
|
|
228 |
void nbdgramdump(NbDgram *s);
|
|
|
229 |
int nbdgramsendto(uchar *ipaddr, ushort port, NbDgram *s);
|
|
|
230 |
int nbdgramsend(NbDgramSendParameters *p, unsigned char *data, long datalen);
|
|
|
231 |
char *nbdgramlisten(NbName to, int (*deliver)(void *magic, NbDgram *s), void *magic);
|
|
|
232 |
|
|
|
233 |
int nbnametablefind(NbName name, int add);
|
|
|
234 |
int nbnameisany(NbName name);
|
|
|
235 |
|
|
|
236 |
int nbremotenametablefind(NbName name, uchar *ipaddr);
|
|
|
237 |
int nbremotenametableadd(NbName name, uchar *ipaddr, ulong ttl);
|
|
|
238 |
|
|
|
239 |
typedef struct NbGlobals {
|
|
|
240 |
uchar myipaddr[IPaddrlen];
|
|
|
241 |
uchar bcastaddr[IPaddrlen];
|
|
|
242 |
NbName myname;
|
|
|
243 |
} NbGlobals;
|
|
|
244 |
|
|
|
245 |
extern NbGlobals nbglobals;
|
|
|
246 |
extern NbName nbnameany;
|
|
|
247 |
|
|
|
248 |
int nbinit(void);
|
|
|
249 |
char *nbudpannounce(ushort port, int *fdp);
|
|
|
250 |
|
|
|
251 |
extern int nbudphdrsize;
|