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