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