Shuyi Chen | d7955ce | 2013-05-22 14:51:55 -0700 | [diff] [blame] | 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 | |
| 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 | |
| 159 | protocols.add(ICMP, "icmp"); |
| 160 | protocols.add(IGMP, "igmp"); |
| 161 | protocols.add(GGP, "ggp"); |
| 162 | protocols.add(ST, "st"); |
| 163 | protocols.add(TCP, "tcp"); |
| 164 | protocols.add(UCL, "ucl"); |
| 165 | protocols.add(EGP, "egp"); |
| 166 | protocols.add(IGP, "igp"); |
| 167 | protocols.add(BBN_RCC_MON, "bbn-rcc-mon"); |
| 168 | protocols.add(NVP_II, "nvp-ii"); |
| 169 | protocols.add(PUP, "pup"); |
| 170 | protocols.add(ARGUS, "argus"); |
| 171 | protocols.add(EMCON, "emcon"); |
| 172 | protocols.add(XNET, "xnet"); |
| 173 | protocols.add(CHAOS, "chaos"); |
| 174 | protocols.add(UDP, "udp"); |
| 175 | protocols.add(MUX, "mux"); |
| 176 | protocols.add(DCN_MEAS, "dcn-meas"); |
| 177 | protocols.add(HMP, "hmp"); |
| 178 | protocols.add(PRM, "prm"); |
| 179 | protocols.add(XNS_IDP, "xns-idp"); |
| 180 | protocols.add(TRUNK_1, "trunk-1"); |
| 181 | protocols.add(TRUNK_2, "trunk-2"); |
| 182 | protocols.add(LEAF_1, "leaf-1"); |
| 183 | protocols.add(LEAF_2, "leaf-2"); |
| 184 | protocols.add(RDP, "rdp"); |
| 185 | protocols.add(IRTP, "irtp"); |
| 186 | protocols.add(ISO_TP4, "iso-tp4"); |
| 187 | protocols.add(NETBLT, "netblt"); |
| 188 | protocols.add(MFE_NSP, "mfe-nsp"); |
| 189 | protocols.add(MERIT_INP, "merit-inp"); |
| 190 | protocols.add(SEP, "sep"); |
| 191 | protocols.add(CFTP, "cftp"); |
| 192 | protocols.add(SAT_EXPAK, "sat-expak"); |
| 193 | protocols.add(MIT_SUBNET, "mit-subnet"); |
| 194 | protocols.add(RVD, "rvd"); |
| 195 | protocols.add(IPPC, "ippc"); |
| 196 | protocols.add(SAT_MON, "sat-mon"); |
| 197 | protocols.add(IPCV, "ipcv"); |
| 198 | protocols.add(BR_SAT_MON, "br-sat-mon"); |
| 199 | protocols.add(WB_MON, "wb-mon"); |
| 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 |
| 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 |
| 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 | |
| 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 | |
| 476 | services.add(RJE, "rje"); |
| 477 | services.add(ECHO, "echo"); |
| 478 | services.add(DISCARD, "discard"); |
| 479 | services.add(USERS, "users"); |
| 480 | services.add(DAYTIME, "daytime"); |
| 481 | services.add(QUOTE, "quote"); |
| 482 | services.add(CHARGEN, "chargen"); |
| 483 | services.add(FTP_DATA, "ftp-data"); |
| 484 | services.add(FTP, "ftp"); |
| 485 | services.add(TELNET, "telnet"); |
| 486 | services.add(SMTP, "smtp"); |
| 487 | services.add(NSW_FE, "nsw-fe"); |
| 488 | services.add(MSG_ICP, "msg-icp"); |
| 489 | services.add(MSG_AUTH, "msg-auth"); |
| 490 | services.add(DSP, "dsp"); |
| 491 | services.add(TIME, "time"); |
| 492 | services.add(RLP, "rlp"); |
| 493 | services.add(GRAPHICS, "graphics"); |
| 494 | services.add(NAMESERVER, "nameserver"); |
| 495 | services.add(NICNAME, "nicname"); |
| 496 | services.add(MPM_FLAGS, "mpm-flags"); |
| 497 | services.add(MPM, "mpm"); |
| 498 | services.add(MPM_SND, "mpm-snd"); |
| 499 | services.add(NI_FTP, "ni-ftp"); |
| 500 | services.add(LOGIN, "login"); |
| 501 | services.add(LA_MAINT, "la-maint"); |
| 502 | services.add(DOMAIN, "domain"); |
| 503 | services.add(ISI_GL, "isi-gl"); |
| 504 | services.add(NI_MAIL, "ni-mail"); |
| 505 | services.add(VIA_FTP, "via-ftp"); |
| 506 | services.add(TACACS_DS, "tacacs-ds"); |
| 507 | services.add(BOOTPS, "bootps"); |
| 508 | services.add(BOOTPC, "bootpc"); |
| 509 | services.add(TFTP, "tftp"); |
| 510 | services.add(NETRJS_1, "netrjs-1"); |
| 511 | services.add(NETRJS_2, "netrjs-2"); |
| 512 | services.add(NETRJS_3, "netrjs-3"); |
| 513 | services.add(NETRJS_4, "netrjs-4"); |
| 514 | services.add(FINGER, "finger"); |
| 515 | services.add(HOSTS2_NS, "hosts2-ns"); |
| 516 | services.add(SU_MIT_TG, "su-mit-tg"); |
| 517 | services.add(MIT_DOV, "mit-dov"); |
| 518 | services.add(DCP, "dcp"); |
| 519 | services.add(SUPDUP, "supdup"); |
| 520 | services.add(SWIFT_RVF, "swift-rvf"); |
| 521 | services.add(TACNEWS, "tacnews"); |
| 522 | services.add(METAGRAM, "metagram"); |
| 523 | services.add(HOSTNAME, "hostname"); |
| 524 | services.add(ISO_TSAP, "iso-tsap"); |
| 525 | services.add(X400, "x400"); |
| 526 | services.add(X400_SND, "x400-snd"); |
| 527 | services.add(CSNET_NS, "csnet-ns"); |
| 528 | services.add(RTELNET, "rtelnet"); |
| 529 | services.add(POP_2, "pop-2"); |
| 530 | services.add(SUNRPC, "sunrpc"); |
| 531 | services.add(AUTH, "auth"); |
| 532 | services.add(SFTP, "sftp"); |
| 533 | services.add(UUCP_PATH, "uucp-path"); |
| 534 | services.add(NNTP, "nntp"); |
| 535 | services.add(ERPC, "erpc"); |
| 536 | services.add(NTP, "ntp"); |
| 537 | services.add(LOCUS_MAP, "locus-map"); |
| 538 | services.add(LOCUS_CON, "locus-con"); |
| 539 | services.add(PWDGEN, "pwdgen"); |
| 540 | services.add(CISCO_FNA, "cisco-fna"); |
| 541 | services.add(CISCO_TNA, "cisco-tna"); |
| 542 | services.add(CISCO_SYS, "cisco-sys"); |
| 543 | services.add(STATSRV, "statsrv"); |
| 544 | services.add(INGRES_NET, "ingres-net"); |
| 545 | services.add(LOC_SRV, "loc-srv"); |
| 546 | services.add(PROFILE, "profile"); |
| 547 | services.add(NETBIOS_NS, "netbios-ns"); |
| 548 | services.add(NETBIOS_DGM, "netbios-dgm"); |
| 549 | services.add(NETBIOS_SSN, "netbios-ssn"); |
| 550 | services.add(EMFIS_DATA, "emfis-data"); |
| 551 | services.add(EMFIS_CNTL, "emfis-cntl"); |
| 552 | services.add(BL_IDM, "bl-idm"); |
| 553 | services.add(SUR_MEAS, "sur-meas"); |
| 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 |
| 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 |
| 573 | value(String s) { |
| 574 | return services.getValue(s); |
| 575 | } |
| 576 | } |
| 577 | private byte [] address; |
| 578 | private int protocol; |
| 579 | private int [] services; |
| 580 | |
| 581 | WKSRecord() {} |
| 582 | |
| 583 | Record |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 694 | getProtocol() { |
| 695 | return protocol; |
| 696 | } |
| 697 | |
| 698 | /** |
| 699 | * Returns the services provided by the host on the specified address. |
| 700 | */ |
| 701 | public int [] |
| 702 | getServices() { |
| 703 | return services; |
| 704 | } |
| 705 | |
| 706 | void |
| 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 | } |