• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org)
2 
3 package org.xbill.DNS;
4 
5 import java.net.*;
6 import java.io.*;
7 import java.util.*;
8 
9 /**
10  * Well Known Services - Lists services offered by this host.
11  *
12  * @author Brian Wellington
13  */
14 
15 public class WKSRecord extends Record {
16 
17 private static final long serialVersionUID = -9104259763909119805L;
18 
19 public static class Protocol {
20 	/**
21 	 * IP protocol identifiers.  This is basically copied out of RFC 1010.
22 	 */
23 
Protocol()24 	private Protocol() {}
25 
26 	/** Internet Control Message */
27 	public static final int ICMP = 1;
28 
29 	/** Internet Group Management */
30 	public static final int IGMP = 2;
31 
32 	/** Gateway-to-Gateway */
33 	public static final int GGP = 3;
34 
35 	/** Stream */
36 	public static final int ST = 5;
37 
38 	/** Transmission Control */
39 	public static final int TCP = 6;
40 
41 	/** UCL */
42 	public static final int UCL = 7;
43 
44 	/** Exterior Gateway Protocol */
45 	public static final int EGP = 8;
46 
47 	/** any private interior gateway */
48 	public static final int IGP = 9;
49 
50 	/** BBN RCC Monitoring */
51 	public static final int BBN_RCC_MON = 10;
52 
53 	/** Network Voice Protocol */
54 	public static final int NVP_II = 11;
55 
56 	/** PUP */
57 	public static final int PUP = 12;
58 
59 	/** ARGUS */
60 	public static final int ARGUS = 13;
61 
62 	/** EMCON */
63 	public static final int EMCON = 14;
64 
65 	/** Cross Net Debugger */
66 	public static final int XNET = 15;
67 
68 	/** Chaos */
69 	public static final int CHAOS = 16;
70 
71 	/** User Datagram */
72 	public static final int UDP = 17;
73 
74 	/** Multiplexing */
75 	public static final int MUX = 18;
76 
77 	/** DCN Measurement Subsystems */
78 	public static final int DCN_MEAS = 19;
79 
80 	/** Host Monitoring */
81 	public static final int HMP = 20;
82 
83 	/** Packet Radio Measurement */
84 	public static final int PRM = 21;
85 
86 	/** XEROX NS IDP */
87 	public static final int XNS_IDP = 22;
88 
89 	/** Trunk-1 */
90 	public static final int TRUNK_1 = 23;
91 
92 	/** Trunk-2 */
93 	public static final int TRUNK_2 = 24;
94 
95 	/** Leaf-1 */
96 	public static final int LEAF_1 = 25;
97 
98 	/** Leaf-2 */
99 	public static final int LEAF_2 = 26;
100 
101 	/** Reliable Data Protocol */
102 	public static final int RDP = 27;
103 
104 	/** Internet Reliable Transaction */
105 	public static final int IRTP = 28;
106 
107 	/** ISO Transport Protocol Class 4 */
108 	public static final int ISO_TP4 = 29;
109 
110 	/** Bulk Data Transfer Protocol */
111 	public static final int NETBLT = 30;
112 
113 	/** MFE Network Services Protocol */
114 	public static final int MFE_NSP = 31;
115 
116 	/** MERIT Internodal Protocol */
117 	public static final int MERIT_INP = 32;
118 
119 	/** Sequential Exchange Protocol */
120 	public static final int SEP = 33;
121 
122 	/** CFTP */
123 	public static final int CFTP = 62;
124 
125 	/** SATNET and Backroom EXPAK */
126 	public static final int SAT_EXPAK = 64;
127 
128 	/** MIT Subnet Support */
129 	public static final int MIT_SUBNET = 65;
130 
131 	/** MIT Remote Virtual Disk Protocol */
132 	public static final int RVD = 66;
133 
134 	/** Internet Pluribus Packet Core */
135 	public static final int IPPC = 67;
136 
137 	/** SATNET Monitoring */
138 	public static final int SAT_MON = 69;
139 
140 	/** Internet Packet Core Utility */
141 	public static final int IPCV = 71;
142 
143 	/** Backroom SATNET Monitoring */
144 	public static final int BR_SAT_MON = 76;
145 
146 	/** WIDEBAND Monitoring */
147 	public static final int WB_MON = 78;
148 
149 	/** WIDEBAND EXPAK */
150 	public static final int WB_EXPAK = 79;
151 
152 	private static Mnemonic protocols = new Mnemonic("IP protocol",
153 							 Mnemonic.CASE_LOWER);
154 
155 	static {
156 		protocols.setMaximum(0xFF);
157 		protocols.setNumericAllowed(true);
158 
protocols.add(ICMP, "icmp")159 		protocols.add(ICMP, "icmp");
protocols.add(IGMP, "igmp")160 		protocols.add(IGMP, "igmp");
protocols.add(GGP, "ggp")161 		protocols.add(GGP, "ggp");
protocols.add(ST, "st")162 		protocols.add(ST, "st");
protocols.add(TCP, "tcp")163 		protocols.add(TCP, "tcp");
protocols.add(UCL, "ucl")164 		protocols.add(UCL, "ucl");
protocols.add(EGP, "egp")165 		protocols.add(EGP, "egp");
protocols.add(IGP, "igp")166 		protocols.add(IGP, "igp");
protocols.add(BBN_RCC_MON, "bbn-rcc-mon")167 		protocols.add(BBN_RCC_MON, "bbn-rcc-mon");
protocols.add(NVP_II, "nvp-ii")168 		protocols.add(NVP_II, "nvp-ii");
protocols.add(PUP, "pup")169 		protocols.add(PUP, "pup");
protocols.add(ARGUS, "argus")170 		protocols.add(ARGUS, "argus");
protocols.add(EMCON, "emcon")171 		protocols.add(EMCON, "emcon");
protocols.add(XNET, "xnet")172 		protocols.add(XNET, "xnet");
protocols.add(CHAOS, "chaos")173 		protocols.add(CHAOS, "chaos");
protocols.add(UDP, "udp")174 		protocols.add(UDP, "udp");
protocols.add(MUX, "mux")175 		protocols.add(MUX, "mux");
protocols.add(DCN_MEAS, "dcn-meas")176 		protocols.add(DCN_MEAS, "dcn-meas");
protocols.add(HMP, "hmp")177 		protocols.add(HMP, "hmp");
protocols.add(PRM, "prm")178 		protocols.add(PRM, "prm");
protocols.add(XNS_IDP, "xns-idp")179 		protocols.add(XNS_IDP, "xns-idp");
protocols.add(TRUNK_1, "trunk-1")180 		protocols.add(TRUNK_1, "trunk-1");
protocols.add(TRUNK_2, "trunk-2")181 		protocols.add(TRUNK_2, "trunk-2");
protocols.add(LEAF_1, "leaf-1")182 		protocols.add(LEAF_1, "leaf-1");
protocols.add(LEAF_2, "leaf-2")183 		protocols.add(LEAF_2, "leaf-2");
protocols.add(RDP, "rdp")184 		protocols.add(RDP, "rdp");
protocols.add(IRTP, "irtp")185 		protocols.add(IRTP, "irtp");
protocols.add(ISO_TP4, "iso-tp4")186 		protocols.add(ISO_TP4, "iso-tp4");
protocols.add(NETBLT, "netblt")187 		protocols.add(NETBLT, "netblt");
protocols.add(MFE_NSP, "mfe-nsp")188 		protocols.add(MFE_NSP, "mfe-nsp");
protocols.add(MERIT_INP, "merit-inp")189 		protocols.add(MERIT_INP, "merit-inp");
protocols.add(SEP, "sep")190 		protocols.add(SEP, "sep");
protocols.add(CFTP, "cftp")191 		protocols.add(CFTP, "cftp");
protocols.add(SAT_EXPAK, "sat-expak")192 		protocols.add(SAT_EXPAK, "sat-expak");
protocols.add(MIT_SUBNET, "mit-subnet")193 		protocols.add(MIT_SUBNET, "mit-subnet");
protocols.add(RVD, "rvd")194 		protocols.add(RVD, "rvd");
protocols.add(IPPC, "ippc")195 		protocols.add(IPPC, "ippc");
protocols.add(SAT_MON, "sat-mon")196 		protocols.add(SAT_MON, "sat-mon");
protocols.add(IPCV, "ipcv")197 		protocols.add(IPCV, "ipcv");
protocols.add(BR_SAT_MON, "br-sat-mon")198 		protocols.add(BR_SAT_MON, "br-sat-mon");
protocols.add(WB_MON, "wb-mon")199 		protocols.add(WB_MON, "wb-mon");
protocols.add(WB_EXPAK, "wb-expak")200 		protocols.add(WB_EXPAK, "wb-expak");
201 	}
202 
203 	/**
204 	 * Converts an IP protocol value into its textual representation
205 	 */
206 	public static String
string(int type)207 	string(int type) {
208 		return protocols.getText(type);
209 	}
210 
211 	/**
212 	 * Converts a textual representation of an IP protocol into its
213 	 * numeric code.  Integers in the range 0..255 are also accepted.
214 	 * @param s The textual representation of the protocol
215 	 * @return The protocol code, or -1 on error.
216 	 */
217 	public static int
value(String s)218 	value(String s) {
219 		return protocols.getValue(s);
220 	}
221 }
222 
223 public static class Service {
224 	/**
225 	 * TCP/UDP services.  This is basically copied out of RFC 1010,
226 	 * with MIT-ML-DEV removed, as it is not unique, and the description
227 	 * of SWIFT-RVF fixed.
228 	 */
229 
Service()230 	private Service() {}
231 
232 	/** Remote Job Entry */
233 	public static final int RJE = 5;
234 
235 	/** Echo */
236 	public static final int ECHO = 7;
237 
238 	/** Discard */
239 	public static final int DISCARD = 9;
240 
241 	/** Active Users */
242 	public static final int USERS = 11;
243 
244 	/** Daytime */
245 	public static final int DAYTIME = 13;
246 
247 	/** Quote of the Day */
248 	public static final int QUOTE = 17;
249 
250 	/** Character Generator */
251 	public static final int CHARGEN = 19;
252 
253 	/** File Transfer [Default Data] */
254 	public static final int FTP_DATA = 20;
255 
256 	/** File Transfer [Control] */
257 	public static final int FTP = 21;
258 
259 	/** Telnet */
260 	public static final int TELNET = 23;
261 
262 	/** Simple Mail Transfer */
263 	public static final int SMTP = 25;
264 
265 	/** NSW User System FE */
266 	public static final int NSW_FE = 27;
267 
268 	/** MSG ICP */
269 	public static final int MSG_ICP = 29;
270 
271 	/** MSG Authentication */
272 	public static final int MSG_AUTH = 31;
273 
274 	/** Display Support Protocol */
275 	public static final int DSP = 33;
276 
277 	/** Time */
278 	public static final int TIME = 37;
279 
280 	/** Resource Location Protocol */
281 	public static final int RLP = 39;
282 
283 	/** Graphics */
284 	public static final int GRAPHICS = 41;
285 
286 	/** Host Name Server */
287 	public static final int NAMESERVER = 42;
288 
289 	/** Who Is */
290 	public static final int NICNAME = 43;
291 
292 	/** MPM FLAGS Protocol */
293 	public static final int MPM_FLAGS = 44;
294 
295 	/** Message Processing Module [recv] */
296 	public static final int MPM = 45;
297 
298 	/** MPM [default send] */
299 	public static final int MPM_SND = 46;
300 
301 	/** NI FTP */
302 	public static final int NI_FTP = 47;
303 
304 	/** Login Host Protocol */
305 	public static final int LOGIN = 49;
306 
307 	/** IMP Logical Address Maintenance */
308 	public static final int LA_MAINT = 51;
309 
310 	/** Domain Name Server */
311 	public static final int DOMAIN = 53;
312 
313 	/** ISI Graphics Language */
314 	public static final int ISI_GL = 55;
315 
316 	/** NI MAIL */
317 	public static final int NI_MAIL = 61;
318 
319 	/** VIA Systems - FTP */
320 	public static final int VIA_FTP = 63;
321 
322 	/** TACACS-Database Service */
323 	public static final int TACACS_DS = 65;
324 
325 	/** Bootstrap Protocol Server */
326 	public static final int BOOTPS = 67;
327 
328 	/** Bootstrap Protocol Client */
329 	public static final int BOOTPC = 68;
330 
331 	/** Trivial File Transfer */
332 	public static final int TFTP = 69;
333 
334 	/** Remote Job Service */
335 	public static final int NETRJS_1 = 71;
336 
337 	/** Remote Job Service */
338 	public static final int NETRJS_2 = 72;
339 
340 	/** Remote Job Service */
341 	public static final int NETRJS_3 = 73;
342 
343 	/** Remote Job Service */
344 	public static final int NETRJS_4 = 74;
345 
346 	/** Finger */
347 	public static final int FINGER = 79;
348 
349 	/** HOSTS2 Name Server */
350 	public static final int HOSTS2_NS = 81;
351 
352 	/** SU/MIT Telnet Gateway */
353 	public static final int SU_MIT_TG = 89;
354 
355 	/** MIT Dover Spooler */
356 	public static final int MIT_DOV = 91;
357 
358 	/** Device Control Protocol */
359 	public static final int DCP = 93;
360 
361 	/** SUPDUP */
362 	public static final int SUPDUP = 95;
363 
364 	/** Swift Remote Virtual File Protocol */
365 	public static final int SWIFT_RVF = 97;
366 
367 	/** TAC News */
368 	public static final int TACNEWS = 98;
369 
370 	/** Metagram Relay */
371 	public static final int METAGRAM = 99;
372 
373 	/** NIC Host Name Server */
374 	public static final int HOSTNAME = 101;
375 
376 	/** ISO-TSAP */
377 	public static final int ISO_TSAP = 102;
378 
379 	/** X400 */
380 	public static final int X400 = 103;
381 
382 	/** X400-SND */
383 	public static final int X400_SND = 104;
384 
385 	/** Mailbox Name Nameserver */
386 	public static final int CSNET_NS = 105;
387 
388 	/** Remote Telnet Service */
389 	public static final int RTELNET = 107;
390 
391 	/** Post Office Protocol - Version 2 */
392 	public static final int POP_2 = 109;
393 
394 	/** SUN Remote Procedure Call */
395 	public static final int SUNRPC = 111;
396 
397 	/** Authentication Service */
398 	public static final int AUTH = 113;
399 
400 	/** Simple File Transfer Protocol */
401 	public static final int SFTP = 115;
402 
403 	/** UUCP Path Service */
404 	public static final int UUCP_PATH = 117;
405 
406 	/** Network News Transfer Protocol */
407 	public static final int NNTP = 119;
408 
409 	/** HYDRA Expedited Remote Procedure */
410 	public static final int ERPC = 121;
411 
412 	/** Network Time Protocol */
413 	public static final int NTP = 123;
414 
415 	/** Locus PC-Interface Net Map Server */
416 	public static final int LOCUS_MAP = 125;
417 
418 	/** Locus PC-Interface Conn Server */
419 	public static final int LOCUS_CON = 127;
420 
421 	/** Password Generator Protocol */
422 	public static final int PWDGEN = 129;
423 
424 	/** CISCO FNATIVE */
425 	public static final int CISCO_FNA = 130;
426 
427 	/** CISCO TNATIVE */
428 	public static final int CISCO_TNA = 131;
429 
430 	/** CISCO SYSMAINT */
431 	public static final int CISCO_SYS = 132;
432 
433 	/** Statistics Service */
434 	public static final int STATSRV = 133;
435 
436 	/** INGRES-NET Service */
437 	public static final int INGRES_NET = 134;
438 
439 	/** Location Service */
440 	public static final int LOC_SRV = 135;
441 
442 	/** PROFILE Naming System */
443 	public static final int PROFILE = 136;
444 
445 	/** NETBIOS Name Service */
446 	public static final int NETBIOS_NS = 137;
447 
448 	/** NETBIOS Datagram Service */
449 	public static final int NETBIOS_DGM = 138;
450 
451 	/** NETBIOS Session Service */
452 	public static final int NETBIOS_SSN = 139;
453 
454 	/** EMFIS Data Service */
455 	public static final int EMFIS_DATA = 140;
456 
457 	/** EMFIS Control Service */
458 	public static final int EMFIS_CNTL = 141;
459 
460 	/** Britton-Lee IDM */
461 	public static final int BL_IDM = 142;
462 
463 	/** Survey Measurement */
464 	public static final int SUR_MEAS = 243;
465 
466 	/** LINK */
467 	public static final int LINK = 245;
468 
469 	private static Mnemonic services = new Mnemonic("TCP/UDP service",
470 							Mnemonic.CASE_LOWER);
471 
472 	static {
473 		services.setMaximum(0xFFFF);
474 		services.setNumericAllowed(true);
475 
services.add(RJE, "rje")476 		services.add(RJE, "rje");
services.add(ECHO, "echo")477 		services.add(ECHO, "echo");
services.add(DISCARD, "discard")478 		services.add(DISCARD, "discard");
services.add(USERS, "users")479 		services.add(USERS, "users");
services.add(DAYTIME, "daytime")480 		services.add(DAYTIME, "daytime");
services.add(QUOTE, "quote")481 		services.add(QUOTE, "quote");
services.add(CHARGEN, "chargen")482 		services.add(CHARGEN, "chargen");
services.add(FTP_DATA, "ftp-data")483 		services.add(FTP_DATA, "ftp-data");
services.add(FTP, "ftp")484 		services.add(FTP, "ftp");
services.add(TELNET, "telnet")485 		services.add(TELNET, "telnet");
services.add(SMTP, "smtp")486 		services.add(SMTP, "smtp");
services.add(NSW_FE, "nsw-fe")487 		services.add(NSW_FE, "nsw-fe");
services.add(MSG_ICP, "msg-icp")488 		services.add(MSG_ICP, "msg-icp");
services.add(MSG_AUTH, "msg-auth")489 		services.add(MSG_AUTH, "msg-auth");
services.add(DSP, "dsp")490 		services.add(DSP, "dsp");
services.add(TIME, "time")491 		services.add(TIME, "time");
services.add(RLP, "rlp")492 		services.add(RLP, "rlp");
services.add(GRAPHICS, "graphics")493 		services.add(GRAPHICS, "graphics");
services.add(NAMESERVER, "nameserver")494 		services.add(NAMESERVER, "nameserver");
services.add(NICNAME, "nicname")495 		services.add(NICNAME, "nicname");
services.add(MPM_FLAGS, "mpm-flags")496 		services.add(MPM_FLAGS, "mpm-flags");
services.add(MPM, "mpm")497 		services.add(MPM, "mpm");
services.add(MPM_SND, "mpm-snd")498 		services.add(MPM_SND, "mpm-snd");
services.add(NI_FTP, "ni-ftp")499 		services.add(NI_FTP, "ni-ftp");
services.add(LOGIN, "login")500 		services.add(LOGIN, "login");
services.add(LA_MAINT, "la-maint")501 		services.add(LA_MAINT, "la-maint");
services.add(DOMAIN, "domain")502 		services.add(DOMAIN, "domain");
services.add(ISI_GL, "isi-gl")503 		services.add(ISI_GL, "isi-gl");
services.add(NI_MAIL, "ni-mail")504 		services.add(NI_MAIL, "ni-mail");
services.add(VIA_FTP, "via-ftp")505 		services.add(VIA_FTP, "via-ftp");
services.add(TACACS_DS, "tacacs-ds")506 		services.add(TACACS_DS, "tacacs-ds");
services.add(BOOTPS, "bootps")507 		services.add(BOOTPS, "bootps");
services.add(BOOTPC, "bootpc")508 		services.add(BOOTPC, "bootpc");
services.add(TFTP, "tftp")509 		services.add(TFTP, "tftp");
services.add(NETRJS_1, "netrjs-1")510 		services.add(NETRJS_1, "netrjs-1");
services.add(NETRJS_2, "netrjs-2")511 		services.add(NETRJS_2, "netrjs-2");
services.add(NETRJS_3, "netrjs-3")512 		services.add(NETRJS_3, "netrjs-3");
services.add(NETRJS_4, "netrjs-4")513 		services.add(NETRJS_4, "netrjs-4");
services.add(FINGER, "finger")514 		services.add(FINGER, "finger");
services.add(HOSTS2_NS, "hosts2-ns")515 		services.add(HOSTS2_NS, "hosts2-ns");
services.add(SU_MIT_TG, "su-mit-tg")516 		services.add(SU_MIT_TG, "su-mit-tg");
services.add(MIT_DOV, "mit-dov")517 		services.add(MIT_DOV, "mit-dov");
services.add(DCP, "dcp")518 		services.add(DCP, "dcp");
services.add(SUPDUP, "supdup")519 		services.add(SUPDUP, "supdup");
services.add(SWIFT_RVF, "swift-rvf")520 		services.add(SWIFT_RVF, "swift-rvf");
services.add(TACNEWS, "tacnews")521 		services.add(TACNEWS, "tacnews");
services.add(METAGRAM, "metagram")522 		services.add(METAGRAM, "metagram");
services.add(HOSTNAME, "hostname")523 		services.add(HOSTNAME, "hostname");
services.add(ISO_TSAP, "iso-tsap")524 		services.add(ISO_TSAP, "iso-tsap");
services.add(X400, "x400")525 		services.add(X400, "x400");
services.add(X400_SND, "x400-snd")526 		services.add(X400_SND, "x400-snd");
services.add(CSNET_NS, "csnet-ns")527 		services.add(CSNET_NS, "csnet-ns");
services.add(RTELNET, "rtelnet")528 		services.add(RTELNET, "rtelnet");
services.add(POP_2, "pop-2")529 		services.add(POP_2, "pop-2");
services.add(SUNRPC, "sunrpc")530 		services.add(SUNRPC, "sunrpc");
services.add(AUTH, "auth")531 		services.add(AUTH, "auth");
services.add(SFTP, "sftp")532 		services.add(SFTP, "sftp");
services.add(UUCP_PATH, "uucp-path")533 		services.add(UUCP_PATH, "uucp-path");
services.add(NNTP, "nntp")534 		services.add(NNTP, "nntp");
services.add(ERPC, "erpc")535 		services.add(ERPC, "erpc");
services.add(NTP, "ntp")536 		services.add(NTP, "ntp");
services.add(LOCUS_MAP, "locus-map")537 		services.add(LOCUS_MAP, "locus-map");
services.add(LOCUS_CON, "locus-con")538 		services.add(LOCUS_CON, "locus-con");
services.add(PWDGEN, "pwdgen")539 		services.add(PWDGEN, "pwdgen");
services.add(CISCO_FNA, "cisco-fna")540 		services.add(CISCO_FNA, "cisco-fna");
services.add(CISCO_TNA, "cisco-tna")541 		services.add(CISCO_TNA, "cisco-tna");
services.add(CISCO_SYS, "cisco-sys")542 		services.add(CISCO_SYS, "cisco-sys");
services.add(STATSRV, "statsrv")543 		services.add(STATSRV, "statsrv");
services.add(INGRES_NET, "ingres-net")544 		services.add(INGRES_NET, "ingres-net");
services.add(LOC_SRV, "loc-srv")545 		services.add(LOC_SRV, "loc-srv");
services.add(PROFILE, "profile")546 		services.add(PROFILE, "profile");
services.add(NETBIOS_NS, "netbios-ns")547 		services.add(NETBIOS_NS, "netbios-ns");
services.add(NETBIOS_DGM, "netbios-dgm")548 		services.add(NETBIOS_DGM, "netbios-dgm");
services.add(NETBIOS_SSN, "netbios-ssn")549 		services.add(NETBIOS_SSN, "netbios-ssn");
services.add(EMFIS_DATA, "emfis-data")550 		services.add(EMFIS_DATA, "emfis-data");
services.add(EMFIS_CNTL, "emfis-cntl")551 		services.add(EMFIS_CNTL, "emfis-cntl");
services.add(BL_IDM, "bl-idm")552 		services.add(BL_IDM, "bl-idm");
services.add(SUR_MEAS, "sur-meas")553 		services.add(SUR_MEAS, "sur-meas");
services.add(LINK, "link")554 		services.add(LINK, "link");
555 	}
556 
557 	/**
558 	 * Converts a TCP/UDP service port number into its textual
559 	 * representation.
560 	 */
561 	public static String
string(int type)562 	string(int type) {
563 		return services.getText(type);
564 	}
565 
566 	/**
567 	 * Converts a textual representation of a TCP/UDP service into its
568 	 * port number.  Integers in the range 0..65535 are also accepted.
569 	 * @param s The textual representation of the service.
570 	 * @return The port number, or -1 on error.
571 	 */
572 	public static int
value(String s)573 	value(String s) {
574 		return services.getValue(s);
575 	}
576 }
577 private byte [] address;
578 private int protocol;
579 private int [] services;
580 
WKSRecord()581 WKSRecord() {}
582 
583 Record
getObject()584 getObject() {
585 	return new WKSRecord();
586 }
587 
588 /**
589  * Creates a WKS Record from the given data
590  * @param address The IP address
591  * @param protocol The IP protocol number
592  * @param services An array of supported services, represented by port number.
593  */
594 public
WKSRecord(Name name, int dclass, long ttl, InetAddress address, int protocol, int [] services)595 WKSRecord(Name name, int dclass, long ttl, InetAddress address, int protocol,
596 	  int [] services)
597 {
598 	super(name, Type.WKS, dclass, ttl);
599 	if (Address.familyOf(address) != Address.IPv4)
600 		throw new IllegalArgumentException("invalid IPv4 address");
601 	this.address = address.getAddress();
602 	this.protocol = checkU8("protocol", protocol);
603 	for (int i = 0; i < services.length; i++) {
604 		checkU16("service", services[i]);
605 	}
606 	this.services = new int[services.length];
607 	System.arraycopy(services, 0, this.services, 0, services.length);
608 	Arrays.sort(this.services);
609 }
610 
611 void
rrFromWire(DNSInput in)612 rrFromWire(DNSInput in) throws IOException {
613 	address = in.readByteArray(4);
614 	protocol = in.readU8();
615 	byte [] array = in.readByteArray();
616 	List list = new ArrayList();
617 	for (int i = 0; i < array.length; i++) {
618 		for (int j = 0; j < 8; j++) {
619 			int octet = array[i] & 0xFF;
620 			if ((octet & (1 << (7 - j))) != 0) {
621 				list.add(new Integer(i * 8 + j));
622 			}
623 		}
624 	}
625 	services = new int[list.size()];
626 	for (int i = 0; i < list.size(); i++) {
627 		services[i] = ((Integer) list.get(i)).intValue();
628 	}
629 }
630 
631 void
rdataFromString(Tokenizer st, Name origin)632 rdataFromString(Tokenizer st, Name origin) throws IOException {
633 	String s = st.getString();
634 	address = Address.toByteArray(s, Address.IPv4);
635 	if (address == null)
636 		throw st.exception("invalid address");
637 
638 	s = st.getString();
639 	protocol = Protocol.value(s);
640 	if (protocol < 0) {
641 		throw st.exception("Invalid IP protocol: " + s);
642 	}
643 
644 	List list = new ArrayList();
645 	while (true) {
646 		Tokenizer.Token t = st.get();
647 		if (!t.isString())
648 			break;
649 		int service = Service.value(t.value);
650 		if (service < 0) {
651 			throw st.exception("Invalid TCP/UDP service: " +
652 					   t.value);
653 		}
654 		list.add(new Integer(service));
655 	}
656 	st.unget();
657 	services = new int[list.size()];
658 	for (int i = 0; i < list.size(); i++) {
659 		services[i] = ((Integer) list.get(i)).intValue();
660 	}
661 }
662 
663 /**
664  * Converts rdata to a String
665  */
666 String
rrToString()667 rrToString() {
668 	StringBuffer sb = new StringBuffer();
669 	sb.append(Address.toDottedQuad(address));
670 	sb.append(" ");
671 	sb.append(protocol);
672 	for (int i = 0; i < services.length; i++) {
673 		sb.append(" " + services[i]);
674 	}
675 	return sb.toString();
676 }
677 
678 /**
679  * Returns the IP address.
680  */
681 public InetAddress
getAddress()682 getAddress() {
683 	try {
684 		return InetAddress.getByAddress(address);
685 	} catch (UnknownHostException e) {
686 		return null;
687 	}
688 }
689 
690 /**
691  * Returns the IP protocol.
692  */
693 public int
getProtocol()694 getProtocol() {
695 	return protocol;
696 }
697 
698 /**
699  * Returns the services provided by the host on the specified address.
700  */
701 public int []
getServices()702 getServices() {
703 	return services;
704 }
705 
706 void
rrToWire(DNSOutput out, Compression c, boolean canonical)707 rrToWire(DNSOutput out, Compression c, boolean canonical) {
708 	out.writeByteArray(address);
709 	out.writeU8(protocol);
710 	int highestPort = services[services.length - 1];
711 	byte [] array = new byte[highestPort / 8 + 1];
712 	for (int i = 0; i < services.length; i++) {
713 		int port = services[i];
714 		array[port / 8] |= (1 << (7 - port % 8));
715 	}
716 	out.writeByteArray(array);
717 }
718 
719 }
720