aboutsummaryrefslogtreecommitdiff
path: root/src/org/xbill/DNS/WKSRecord.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/xbill/DNS/WKSRecord.java')
-rw-r--r--src/org/xbill/DNS/WKSRecord.java719
1 files changed, 719 insertions, 0 deletions
diff --git a/src/org/xbill/DNS/WKSRecord.java b/src/org/xbill/DNS/WKSRecord.java
new file mode 100644
index 0000000..10b61be
--- /dev/null
+++ b/src/org/xbill/DNS/WKSRecord.java
@@ -0,0 +1,719 @@
+// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org)
+
+package org.xbill.DNS;
+
+import java.net.*;
+import java.io.*;
+import java.util.*;
+
+/**
+ * Well Known Services - Lists services offered by this host.
+ *
+ * @author Brian Wellington
+ */
+
+public class WKSRecord extends Record {
+
+private static final long serialVersionUID = -9104259763909119805L;
+
+public static class Protocol {
+ /**
+ * IP protocol identifiers. This is basically copied out of RFC 1010.
+ */
+
+ private Protocol() {}
+
+ /** Internet Control Message */
+ public static final int ICMP = 1;
+
+ /** Internet Group Management */
+ public static final int IGMP = 2;
+
+ /** Gateway-to-Gateway */
+ public static final int GGP = 3;
+
+ /** Stream */
+ public static final int ST = 5;
+
+ /** Transmission Control */
+ public static final int TCP = 6;
+
+ /** UCL */
+ public static final int UCL = 7;
+
+ /** Exterior Gateway Protocol */
+ public static final int EGP = 8;
+
+ /** any private interior gateway */
+ public static final int IGP = 9;
+
+ /** BBN RCC Monitoring */
+ public static final int BBN_RCC_MON = 10;
+
+ /** Network Voice Protocol */
+ public static final int NVP_II = 11;
+
+ /** PUP */
+ public static final int PUP = 12;
+
+ /** ARGUS */
+ public static final int ARGUS = 13;
+
+ /** EMCON */
+ public static final int EMCON = 14;
+
+ /** Cross Net Debugger */
+ public static final int XNET = 15;
+
+ /** Chaos */
+ public static final int CHAOS = 16;
+
+ /** User Datagram */
+ public static final int UDP = 17;
+
+ /** Multiplexing */
+ public static final int MUX = 18;
+
+ /** DCN Measurement Subsystems */
+ public static final int DCN_MEAS = 19;
+
+ /** Host Monitoring */
+ public static final int HMP = 20;
+
+ /** Packet Radio Measurement */
+ public static final int PRM = 21;
+
+ /** XEROX NS IDP */
+ public static final int XNS_IDP = 22;
+
+ /** Trunk-1 */
+ public static final int TRUNK_1 = 23;
+
+ /** Trunk-2 */
+ public static final int TRUNK_2 = 24;
+
+ /** Leaf-1 */
+ public static final int LEAF_1 = 25;
+
+ /** Leaf-2 */
+ public static final int LEAF_2 = 26;
+
+ /** Reliable Data Protocol */
+ public static final int RDP = 27;
+
+ /** Internet Reliable Transaction */
+ public static final int IRTP = 28;
+
+ /** ISO Transport Protocol Class 4 */
+ public static final int ISO_TP4 = 29;
+
+ /** Bulk Data Transfer Protocol */
+ public static final int NETBLT = 30;
+
+ /** MFE Network Services Protocol */
+ public static final int MFE_NSP = 31;
+
+ /** MERIT Internodal Protocol */
+ public static final int MERIT_INP = 32;
+
+ /** Sequential Exchange Protocol */
+ public static final int SEP = 33;
+
+ /** CFTP */
+ public static final int CFTP = 62;
+
+ /** SATNET and Backroom EXPAK */
+ public static final int SAT_EXPAK = 64;
+
+ /** MIT Subnet Support */
+ public static final int MIT_SUBNET = 65;
+
+ /** MIT Remote Virtual Disk Protocol */
+ public static final int RVD = 66;
+
+ /** Internet Pluribus Packet Core */
+ public static final int IPPC = 67;
+
+ /** SATNET Monitoring */
+ public static final int SAT_MON = 69;
+
+ /** Internet Packet Core Utility */
+ public static final int IPCV = 71;
+
+ /** Backroom SATNET Monitoring */
+ public static final int BR_SAT_MON = 76;
+
+ /** WIDEBAND Monitoring */
+ public static final int WB_MON = 78;
+
+ /** WIDEBAND EXPAK */
+ public static final int WB_EXPAK = 79;
+
+ private static Mnemonic protocols = new Mnemonic("IP protocol",
+ Mnemonic.CASE_LOWER);
+
+ static {
+ protocols.setMaximum(0xFF);
+ protocols.setNumericAllowed(true);
+
+ protocols.add(ICMP, "icmp");
+ protocols.add(IGMP, "igmp");
+ protocols.add(GGP, "ggp");
+ protocols.add(ST, "st");
+ protocols.add(TCP, "tcp");
+ protocols.add(UCL, "ucl");
+ protocols.add(EGP, "egp");
+ protocols.add(IGP, "igp");
+ protocols.add(BBN_RCC_MON, "bbn-rcc-mon");
+ protocols.add(NVP_II, "nvp-ii");
+ protocols.add(PUP, "pup");
+ protocols.add(ARGUS, "argus");
+ protocols.add(EMCON, "emcon");
+ protocols.add(XNET, "xnet");
+ protocols.add(CHAOS, "chaos");
+ protocols.add(UDP, "udp");
+ protocols.add(MUX, "mux");
+ protocols.add(DCN_MEAS, "dcn-meas");
+ protocols.add(HMP, "hmp");
+ protocols.add(PRM, "prm");
+ protocols.add(XNS_IDP, "xns-idp");
+ protocols.add(TRUNK_1, "trunk-1");
+ protocols.add(TRUNK_2, "trunk-2");
+ protocols.add(LEAF_1, "leaf-1");
+ protocols.add(LEAF_2, "leaf-2");
+ protocols.add(RDP, "rdp");
+ protocols.add(IRTP, "irtp");
+ protocols.add(ISO_TP4, "iso-tp4");
+ protocols.add(NETBLT, "netblt");
+ protocols.add(MFE_NSP, "mfe-nsp");
+ protocols.add(MERIT_INP, "merit-inp");
+ protocols.add(SEP, "sep");
+ protocols.add(CFTP, "cftp");
+ protocols.add(SAT_EXPAK, "sat-expak");
+ protocols.add(MIT_SUBNET, "mit-subnet");
+ protocols.add(RVD, "rvd");
+ protocols.add(IPPC, "ippc");
+ protocols.add(SAT_MON, "sat-mon");
+ protocols.add(IPCV, "ipcv");
+ protocols.add(BR_SAT_MON, "br-sat-mon");
+ protocols.add(WB_MON, "wb-mon");
+ protocols.add(WB_EXPAK, "wb-expak");
+ }
+
+ /**
+ * Converts an IP protocol value into its textual representation
+ */
+ public static String
+ string(int type) {
+ return protocols.getText(type);
+ }
+
+ /**
+ * Converts a textual representation of an IP protocol into its
+ * numeric code. Integers in the range 0..255 are also accepted.
+ * @param s The textual representation of the protocol
+ * @return The protocol code, or -1 on error.
+ */
+ public static int
+ value(String s) {
+ return protocols.getValue(s);
+ }
+}
+
+public static class Service {
+ /**
+ * TCP/UDP services. This is basically copied out of RFC 1010,
+ * with MIT-ML-DEV removed, as it is not unique, and the description
+ * of SWIFT-RVF fixed.
+ */
+
+ private Service() {}
+
+ /** Remote Job Entry */
+ public static final int RJE = 5;
+
+ /** Echo */
+ public static final int ECHO = 7;
+
+ /** Discard */
+ public static final int DISCARD = 9;
+
+ /** Active Users */
+ public static final int USERS = 11;
+
+ /** Daytime */
+ public static final int DAYTIME = 13;
+
+ /** Quote of the Day */
+ public static final int QUOTE = 17;
+
+ /** Character Generator */
+ public static final int CHARGEN = 19;
+
+ /** File Transfer [Default Data] */
+ public static final int FTP_DATA = 20;
+
+ /** File Transfer [Control] */
+ public static final int FTP = 21;
+
+ /** Telnet */
+ public static final int TELNET = 23;
+
+ /** Simple Mail Transfer */
+ public static final int SMTP = 25;
+
+ /** NSW User System FE */
+ public static final int NSW_FE = 27;
+
+ /** MSG ICP */
+ public static final int MSG_ICP = 29;
+
+ /** MSG Authentication */
+ public static final int MSG_AUTH = 31;
+
+ /** Display Support Protocol */
+ public static final int DSP = 33;
+
+ /** Time */
+ public static final int TIME = 37;
+
+ /** Resource Location Protocol */
+ public static final int RLP = 39;
+
+ /** Graphics */
+ public static final int GRAPHICS = 41;
+
+ /** Host Name Server */
+ public static final int NAMESERVER = 42;
+
+ /** Who Is */
+ public static final int NICNAME = 43;
+
+ /** MPM FLAGS Protocol */
+ public static final int MPM_FLAGS = 44;
+
+ /** Message Processing Module [recv] */
+ public static final int MPM = 45;
+
+ /** MPM [default send] */
+ public static final int MPM_SND = 46;
+
+ /** NI FTP */
+ public static final int NI_FTP = 47;
+
+ /** Login Host Protocol */
+ public static final int LOGIN = 49;
+
+ /** IMP Logical Address Maintenance */
+ public static final int LA_MAINT = 51;
+
+ /** Domain Name Server */
+ public static final int DOMAIN = 53;
+
+ /** ISI Graphics Language */
+ public static final int ISI_GL = 55;
+
+ /** NI MAIL */
+ public static final int NI_MAIL = 61;
+
+ /** VIA Systems - FTP */
+ public static final int VIA_FTP = 63;
+
+ /** TACACS-Database Service */
+ public static final int TACACS_DS = 65;
+
+ /** Bootstrap Protocol Server */
+ public static final int BOOTPS = 67;
+
+ /** Bootstrap Protocol Client */
+ public static final int BOOTPC = 68;
+
+ /** Trivial File Transfer */
+ public static final int TFTP = 69;
+
+ /** Remote Job Service */
+ public static final int NETRJS_1 = 71;
+
+ /** Remote Job Service */
+ public static final int NETRJS_2 = 72;
+
+ /** Remote Job Service */
+ public static final int NETRJS_3 = 73;
+
+ /** Remote Job Service */
+ public static final int NETRJS_4 = 74;
+
+ /** Finger */
+ public static final int FINGER = 79;
+
+ /** HOSTS2 Name Server */
+ public static final int HOSTS2_NS = 81;
+
+ /** SU/MIT Telnet Gateway */
+ public static final int SU_MIT_TG = 89;
+
+ /** MIT Dover Spooler */
+ public static final int MIT_DOV = 91;
+
+ /** Device Control Protocol */
+ public static final int DCP = 93;
+
+ /** SUPDUP */
+ public static final int SUPDUP = 95;
+
+ /** Swift Remote Virtual File Protocol */
+ public static final int SWIFT_RVF = 97;
+
+ /** TAC News */
+ public static final int TACNEWS = 98;
+
+ /** Metagram Relay */
+ public static final int METAGRAM = 99;
+
+ /** NIC Host Name Server */
+ public static final int HOSTNAME = 101;
+
+ /** ISO-TSAP */
+ public static final int ISO_TSAP = 102;
+
+ /** X400 */
+ public static final int X400 = 103;
+
+ /** X400-SND */
+ public static final int X400_SND = 104;
+
+ /** Mailbox Name Nameserver */
+ public static final int CSNET_NS = 105;
+
+ /** Remote Telnet Service */
+ public static final int RTELNET = 107;
+
+ /** Post Office Protocol - Version 2 */
+ public static final int POP_2 = 109;
+
+ /** SUN Remote Procedure Call */
+ public static final int SUNRPC = 111;
+
+ /** Authentication Service */
+ public static final int AUTH = 113;
+
+ /** Simple File Transfer Protocol */
+ public static final int SFTP = 115;
+
+ /** UUCP Path Service */
+ public static final int UUCP_PATH = 117;
+
+ /** Network News Transfer Protocol */
+ public static final int NNTP = 119;
+
+ /** HYDRA Expedited Remote Procedure */
+ public static final int ERPC = 121;
+
+ /** Network Time Protocol */
+ public static final int NTP = 123;
+
+ /** Locus PC-Interface Net Map Server */
+ public static final int LOCUS_MAP = 125;
+
+ /** Locus PC-Interface Conn Server */
+ public static final int LOCUS_CON = 127;
+
+ /** Password Generator Protocol */
+ public static final int PWDGEN = 129;
+
+ /** CISCO FNATIVE */
+ public static final int CISCO_FNA = 130;
+
+ /** CISCO TNATIVE */
+ public static final int CISCO_TNA = 131;
+
+ /** CISCO SYSMAINT */
+ public static final int CISCO_SYS = 132;
+
+ /** Statistics Service */
+ public static final int STATSRV = 133;
+
+ /** INGRES-NET Service */
+ public static final int INGRES_NET = 134;
+
+ /** Location Service */
+ public static final int LOC_SRV = 135;
+
+ /** PROFILE Naming System */
+ public static final int PROFILE = 136;
+
+ /** NETBIOS Name Service */
+ public static final int NETBIOS_NS = 137;
+
+ /** NETBIOS Datagram Service */
+ public static final int NETBIOS_DGM = 138;
+
+ /** NETBIOS Session Service */
+ public static final int NETBIOS_SSN = 139;
+
+ /** EMFIS Data Service */
+ public static final int EMFIS_DATA = 140;
+
+ /** EMFIS Control Service */
+ public static final int EMFIS_CNTL = 141;
+
+ /** Britton-Lee IDM */
+ public static final int BL_IDM = 142;
+
+ /** Survey Measurement */
+ public static final int SUR_MEAS = 243;
+
+ /** LINK */
+ public static final int LINK = 245;
+
+ private static Mnemonic services = new Mnemonic("TCP/UDP service",
+ Mnemonic.CASE_LOWER);
+
+ static {
+ services.setMaximum(0xFFFF);
+ services.setNumericAllowed(true);
+
+ services.add(RJE, "rje");
+ services.add(ECHO, "echo");
+ services.add(DISCARD, "discard");
+ services.add(USERS, "users");
+ services.add(DAYTIME, "daytime");
+ services.add(QUOTE, "quote");
+ services.add(CHARGEN, "chargen");
+ services.add(FTP_DATA, "ftp-data");
+ services.add(FTP, "ftp");
+ services.add(TELNET, "telnet");
+ services.add(SMTP, "smtp");
+ services.add(NSW_FE, "nsw-fe");
+ services.add(MSG_ICP, "msg-icp");
+ services.add(MSG_AUTH, "msg-auth");
+ services.add(DSP, "dsp");
+ services.add(TIME, "time");
+ services.add(RLP, "rlp");
+ services.add(GRAPHICS, "graphics");
+ services.add(NAMESERVER, "nameserver");
+ services.add(NICNAME, "nicname");
+ services.add(MPM_FLAGS, "mpm-flags");
+ services.add(MPM, "mpm");
+ services.add(MPM_SND, "mpm-snd");
+ services.add(NI_FTP, "ni-ftp");
+ services.add(LOGIN, "login");
+ services.add(LA_MAINT, "la-maint");
+ services.add(DOMAIN, "domain");
+ services.add(ISI_GL, "isi-gl");
+ services.add(NI_MAIL, "ni-mail");
+ services.add(VIA_FTP, "via-ftp");
+ services.add(TACACS_DS, "tacacs-ds");
+ services.add(BOOTPS, "bootps");
+ services.add(BOOTPC, "bootpc");
+ services.add(TFTP, "tftp");
+ services.add(NETRJS_1, "netrjs-1");
+ services.add(NETRJS_2, "netrjs-2");
+ services.add(NETRJS_3, "netrjs-3");
+ services.add(NETRJS_4, "netrjs-4");
+ services.add(FINGER, "finger");
+ services.add(HOSTS2_NS, "hosts2-ns");
+ services.add(SU_MIT_TG, "su-mit-tg");
+ services.add(MIT_DOV, "mit-dov");
+ services.add(DCP, "dcp");
+ services.add(SUPDUP, "supdup");
+ services.add(SWIFT_RVF, "swift-rvf");
+ services.add(TACNEWS, "tacnews");
+ services.add(METAGRAM, "metagram");
+ services.add(HOSTNAME, "hostname");
+ services.add(ISO_TSAP, "iso-tsap");
+ services.add(X400, "x400");
+ services.add(X400_SND, "x400-snd");
+ services.add(CSNET_NS, "csnet-ns");
+ services.add(RTELNET, "rtelnet");
+ services.add(POP_2, "pop-2");
+ services.add(SUNRPC, "sunrpc");
+ services.add(AUTH, "auth");
+ services.add(SFTP, "sftp");
+ services.add(UUCP_PATH, "uucp-path");
+ services.add(NNTP, "nntp");
+ services.add(ERPC, "erpc");
+ services.add(NTP, "ntp");
+ services.add(LOCUS_MAP, "locus-map");
+ services.add(LOCUS_CON, "locus-con");
+ services.add(PWDGEN, "pwdgen");
+ services.add(CISCO_FNA, "cisco-fna");
+ services.add(CISCO_TNA, "cisco-tna");
+ services.add(CISCO_SYS, "cisco-sys");
+ services.add(STATSRV, "statsrv");
+ services.add(INGRES_NET, "ingres-net");
+ services.add(LOC_SRV, "loc-srv");
+ services.add(PROFILE, "profile");
+ services.add(NETBIOS_NS, "netbios-ns");
+ services.add(NETBIOS_DGM, "netbios-dgm");
+ services.add(NETBIOS_SSN, "netbios-ssn");
+ services.add(EMFIS_DATA, "emfis-data");
+ services.add(EMFIS_CNTL, "emfis-cntl");
+ services.add(BL_IDM, "bl-idm");
+ services.add(SUR_MEAS, "sur-meas");
+ services.add(LINK, "link");
+ }
+
+ /**
+ * Converts a TCP/UDP service port number into its textual
+ * representation.
+ */
+ public static String
+ string(int type) {
+ return services.getText(type);
+ }
+
+ /**
+ * Converts a textual representation of a TCP/UDP service into its
+ * port number. Integers in the range 0..65535 are also accepted.
+ * @param s The textual representation of the service.
+ * @return The port number, or -1 on error.
+ */
+ public static int
+ value(String s) {
+ return services.getValue(s);
+ }
+}
+private byte [] address;
+private int protocol;
+private int [] services;
+
+WKSRecord() {}
+
+Record
+getObject() {
+ return new WKSRecord();
+}
+
+/**
+ * Creates a WKS Record from the given data
+ * @param address The IP address
+ * @param protocol The IP protocol number
+ * @param services An array of supported services, represented by port number.
+ */
+public
+WKSRecord(Name name, int dclass, long ttl, InetAddress address, int protocol,
+ int [] services)
+{
+ super(name, Type.WKS, dclass, ttl);
+ if (Address.familyOf(address) != Address.IPv4)
+ throw new IllegalArgumentException("invalid IPv4 address");
+ this.address = address.getAddress();
+ this.protocol = checkU8("protocol", protocol);
+ for (int i = 0; i < services.length; i++) {
+ checkU16("service", services[i]);
+ }
+ this.services = new int[services.length];
+ System.arraycopy(services, 0, this.services, 0, services.length);
+ Arrays.sort(this.services);
+}
+
+void
+rrFromWire(DNSInput in) throws IOException {
+ address = in.readByteArray(4);
+ protocol = in.readU8();
+ byte [] array = in.readByteArray();
+ List list = new ArrayList();
+ for (int i = 0; i < array.length; i++) {
+ for (int j = 0; j < 8; j++) {
+ int octet = array[i] & 0xFF;
+ if ((octet & (1 << (7 - j))) != 0) {
+ list.add(new Integer(i * 8 + j));
+ }
+ }
+ }
+ services = new int[list.size()];
+ for (int i = 0; i < list.size(); i++) {
+ services[i] = ((Integer) list.get(i)).intValue();
+ }
+}
+
+void
+rdataFromString(Tokenizer st, Name origin) throws IOException {
+ String s = st.getString();
+ address = Address.toByteArray(s, Address.IPv4);
+ if (address == null)
+ throw st.exception("invalid address");
+
+ s = st.getString();
+ protocol = Protocol.value(s);
+ if (protocol < 0) {
+ throw st.exception("Invalid IP protocol: " + s);
+ }
+
+ List list = new ArrayList();
+ while (true) {
+ Tokenizer.Token t = st.get();
+ if (!t.isString())
+ break;
+ int service = Service.value(t.value);
+ if (service < 0) {
+ throw st.exception("Invalid TCP/UDP service: " +
+ t.value);
+ }
+ list.add(new Integer(service));
+ }
+ st.unget();
+ services = new int[list.size()];
+ for (int i = 0; i < list.size(); i++) {
+ services[i] = ((Integer) list.get(i)).intValue();
+ }
+}
+
+/**
+ * Converts rdata to a String
+ */
+String
+rrToString() {
+ StringBuffer sb = new StringBuffer();
+ sb.append(Address.toDottedQuad(address));
+ sb.append(" ");
+ sb.append(protocol);
+ for (int i = 0; i < services.length; i++) {
+ sb.append(" " + services[i]);
+ }
+ return sb.toString();
+}
+
+/**
+ * Returns the IP address.
+ */
+public InetAddress
+getAddress() {
+ try {
+ return InetAddress.getByAddress(address);
+ } catch (UnknownHostException e) {
+ return null;
+ }
+}
+
+/**
+ * Returns the IP protocol.
+ */
+public int
+getProtocol() {
+ return protocol;
+}
+
+/**
+ * Returns the services provided by the host on the specified address.
+ */
+public int []
+getServices() {
+ return services;
+}
+
+void
+rrToWire(DNSOutput out, Compression c, boolean canonical) {
+ out.writeByteArray(address);
+ out.writeU8(protocol);
+ int highestPort = services[services.length - 1];
+ byte [] array = new byte[highestPort / 8 + 1];
+ for (int i = 0; i < services.length; i++) {
+ int port = services[i];
+ array[port / 8] |= (1 << (7 - port % 8));
+ }
+ out.writeByteArray(array);
+}
+
+}