1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.aether.named.ipc;
20
21 import java.io.IOException;
22 import java.net.Inet6Address;
23 import java.net.InetAddress;
24 import java.net.InetSocketAddress;
25 import java.net.SocketAddress;
26 import java.net.StandardProtocolFamily;
27 import java.net.UnixDomainSocketAddress;
28 import java.net.UnknownHostException;
29 import java.nio.channels.ServerSocketChannel;
30
31
32
33
34
35
36 public enum SocketFamily {
37 inet,
38 unix;
39
40 public ServerSocketChannel openServerSocket() throws IOException {
41 switch (this) {
42 case inet:
43 return ServerSocketChannel.open().bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0), 0);
44 case unix:
45 return ServerSocketChannel.open(StandardProtocolFamily.UNIX).bind(null, 0);
46 default:
47 throw new IllegalStateException();
48 }
49 }
50
51 public static SocketAddress fromString(String str) {
52 if (str.startsWith("inet:")) {
53 String s = str.substring("inet:".length());
54 int ic = s.lastIndexOf(':');
55 String ia = s.substring(0, ic);
56 int is = ia.indexOf('/');
57 String h = ia.substring(0, is);
58 String a = ia.substring(is + 1);
59 String p = s.substring(ic + 1);
60 InetAddress addr;
61 if ("<unresolved>".equals(a)) {
62 return InetSocketAddress.createUnresolved(h, Integer.parseInt(p));
63 } else {
64 if (a.indexOf('.') > 0) {
65 String[] as = a.split("\\.");
66 if (as.length != 4) {
67 throw new IllegalArgumentException("Unsupported socket address: '" + str + "'");
68 }
69 byte[] ab = new byte[4];
70 for (int i = 0; i < 4; i++) {
71 ab[i] = (byte) Integer.parseInt(as[i]);
72 }
73 try {
74 addr = InetAddress.getByAddress(h.isEmpty() ? null : h, ab);
75 } catch (UnknownHostException e) {
76 throw new IllegalArgumentException("Unsupported address: " + str, e);
77 }
78 } else {
79 throw new IllegalArgumentException("Unsupported address: " + str);
80 }
81 return new InetSocketAddress(addr, Integer.parseInt(p));
82 }
83 } else if (str.startsWith("unix:")) {
84 return UnixDomainSocketAddress.of(str.substring("unix:".length()));
85 } else {
86 throw new IllegalArgumentException("Unsupported socket address: '" + str + "'");
87 }
88 }
89
90 public static String toString(SocketAddress address) {
91 switch (familyOf(address)) {
92 case inet:
93 InetSocketAddress isa = (InetSocketAddress) address;
94 String host = isa.getHostString();
95 InetAddress addr = isa.getAddress();
96 int port = isa.getPort();
97 String formatted;
98 if (addr == null) {
99 formatted = host + "/<unresolved>";
100 } else {
101 formatted = addr.toString();
102 if (addr instanceof Inet6Address) {
103 int i = formatted.lastIndexOf("/");
104 formatted = formatted.substring(0, i + 1) + "[" + formatted.substring(i + 1) + "]";
105 }
106 }
107 return "inet:" + formatted + ":" + port;
108 case unix:
109
110 return "unix:" + address.toString().replace('\\', '/');
111 default:
112 throw new IllegalArgumentException("Unsupported socket address: '" + address + "'");
113 }
114 }
115
116 public static SocketFamily familyOf(SocketAddress address) {
117 if (address instanceof InetSocketAddress) {
118 return SocketFamily.inet;
119 } else if ("java.net.UnixDomainSocketAddress".equals(address.getClass().getName())) {
120 return SocketFamily.unix;
121 } else {
122 throw new IllegalArgumentException("Unsupported socket address '" + address + "'");
123 }
124 }
125 }