1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) 2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.xbill.DNS; 4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.io.*; 6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Server Selection Record - finds hosts running services in a domain. An 9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * SRV record will normally be named _<service>._<protocol>.domain 10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * - examples would be _sips._tcp.example.org (for the secure SIP protocol) and 11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * _http._tcp.example.com (if HTTP used SRV records) 12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Brian Wellington 14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class SRVRecord extends Record { 17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate static final long serialVersionUID = -3886460132387522052L; 19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate int priority, weight, port; 21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate Name target; 22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 23d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenSRVRecord() {} 24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 25d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenRecord 26d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetObject() { 27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return new SRVRecord(); 28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Creates an SRV Record from the given data 32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param priority The priority of this SRV. Records with lower priority 33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * are preferred. 34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param weight The weight, used to select between records at the same 35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * priority. 36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param port The TCP/UDP port that the service uses 37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param target The host running the service 38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic 40d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenSRVRecord(Name name, int dclass, long ttl, int priority, 41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen int weight, int port, Name target) 42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen{ 43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen super(name, Type.SRV, dclass, ttl); 44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.priority = checkU16("priority", priority); 45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.weight = checkU16("weight", weight); 46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.port = checkU16("port", port); 47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.target = checkName("target", target); 48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid 51d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrrFromWire(DNSInput in) throws IOException { 52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen priority = in.readU16(); 53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen weight = in.readU16(); 54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen port = in.readU16(); 55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen target = new Name(in); 56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid 59d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrdataFromString(Tokenizer st, Name origin) throws IOException { 60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen priority = st.getUInt16(); 61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen weight = st.getUInt16(); 62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen port = st.getUInt16(); 63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen target = st.getName(origin); 64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Converts rdata to a String */ 67d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenString 68d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrrToString() { 69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen StringBuffer sb = new StringBuffer(); 70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(priority + " "); 71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(weight + " "); 72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(port + " "); 73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(target); 74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return sb.toString(); 75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the priority */ 78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic int 79d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetPriority() { 80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return priority; 81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the weight */ 84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic int 85d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetWeight() { 86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return weight; 87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the port that the service runs on */ 90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic int 91d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetPort() { 92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return port; 93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the host running that the service */ 96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic Name 97d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetTarget() { 98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return target; 99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid 102d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenrrToWire(DNSOutput out, Compression c, boolean canonical) { 103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen out.writeU16(priority); 104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen out.writeU16(weight); 105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen out.writeU16(port); 106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen target.toWire(out, null, canonical); 107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic Name 110d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetAdditionalName() { 111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return target; 112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 115