Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/classes/sun/nio/ch/SocketAdaptor.java
38918 views
1
/*
2
* Copyright (c) 2000, 2021, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation. Oracle designates this
8
* particular file as subject to the "Classpath" exception as provided
9
* by Oracle in the LICENSE file that accompanied this code.
10
*
11
* This code is distributed in the hope that it will be useful, but WITHOUT
12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14
* version 2 for more details (a copy is included in the LICENSE file that
15
* accompanied this code).
16
*
17
* You should have received a copy of the GNU General Public License version
18
* 2 along with this work; if not, write to the Free Software Foundation,
19
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20
*
21
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22
* or visit www.oracle.com if you need additional information or have any
23
* questions.
24
*/
25
26
package sun.nio.ch;
27
28
import java.io.IOException;
29
import java.io.InputStream;
30
import java.io.OutputStream;
31
import java.net.InetAddress;
32
import java.net.InetSocketAddress;
33
import java.net.Socket;
34
import java.net.SocketAddress;
35
import java.net.SocketException;
36
import java.net.SocketImpl;
37
import java.net.SocketOption;
38
import java.net.SocketTimeoutException;
39
import java.net.StandardSocketOptions;
40
import java.nio.ByteBuffer;
41
import java.nio.channels.Channels;
42
import java.nio.channels.ClosedChannelException;
43
import java.nio.channels.IllegalBlockingModeException;
44
import java.nio.channels.SocketChannel;
45
import java.security.AccessController;
46
import java.security.PrivilegedExceptionAction;
47
import java.util.*;
48
49
50
// Make a socket channel look like a socket.
51
//
52
// The only aspects of java.net.Socket-hood that we don't attempt to emulate
53
// here are the interrupted-I/O exceptions (which our Solaris implementations
54
// attempt to support) and the sending of urgent data. Otherwise an adapted
55
// socket should look enough like a real java.net.Socket to fool most of the
56
// developers most of the time, right down to the exception message strings.
57
//
58
// The methods in this class are defined in exactly the same order as in
59
// java.net.Socket so as to simplify tracking future changes to that class.
60
//
61
62
class SocketAdaptor
63
extends Socket
64
{
65
66
// The channel being adapted
67
private final SocketChannelImpl sc;
68
69
// Timeout "option" value for reads
70
private volatile int timeout = 0;
71
72
private SocketAdaptor(SocketChannelImpl sc) throws SocketException {
73
super((SocketImpl) null);
74
this.sc = sc;
75
}
76
77
public static Socket create(SocketChannelImpl sc) {
78
try {
79
return new SocketAdaptor(sc);
80
} catch (SocketException e) {
81
throw new InternalError("Should not reach here");
82
}
83
}
84
85
public SocketChannel getChannel() {
86
return sc;
87
}
88
89
// Override this method just to protect against changes in the superclass
90
//
91
public void connect(SocketAddress remote) throws IOException {
92
connect(remote, 0);
93
}
94
95
public void connect(SocketAddress remote, int timeout) throws IOException {
96
if (remote == null)
97
throw new IllegalArgumentException("connect: The address can't be null");
98
if (timeout < 0)
99
throw new IllegalArgumentException("connect: timeout can't be negative");
100
101
synchronized (sc.blockingLock()) {
102
if (!sc.isBlocking())
103
throw new IllegalBlockingModeException();
104
105
try {
106
if (timeout == 0) {
107
sc.connect(remote);
108
return;
109
}
110
111
sc.configureBlocking(false);
112
try {
113
if (sc.connect(remote))
114
return;
115
long to = timeout;
116
for (;;) {
117
if (!sc.isOpen())
118
throw new ClosedChannelException();
119
long st = System.currentTimeMillis();
120
121
int result = sc.poll(Net.POLLCONN, to);
122
if (result > 0 && sc.finishConnect())
123
break;
124
to -= System.currentTimeMillis() - st;
125
if (to <= 0) {
126
try {
127
sc.close();
128
} catch (IOException x) { }
129
throw new SocketTimeoutException();
130
}
131
}
132
} finally {
133
try {
134
sc.configureBlocking(true);
135
} catch (ClosedChannelException e) { }
136
}
137
138
} catch (Exception x) {
139
Net.translateException(x, true);
140
}
141
}
142
143
}
144
145
public void bind(SocketAddress local) throws IOException {
146
try {
147
sc.bind(local);
148
} catch (Exception x) {
149
Net.translateException(x);
150
}
151
}
152
153
public InetAddress getInetAddress() {
154
SocketAddress remote = sc.remoteAddress();
155
if (remote == null) {
156
return null;
157
} else {
158
return ((InetSocketAddress)remote).getAddress();
159
}
160
}
161
162
public InetAddress getLocalAddress() {
163
if (sc.isOpen()) {
164
InetSocketAddress local = sc.localAddress();
165
if (local != null) {
166
return Net.getRevealedLocalAddress(local).getAddress();
167
}
168
}
169
return new InetSocketAddress(0).getAddress();
170
}
171
172
public int getPort() {
173
SocketAddress remote = sc.remoteAddress();
174
if (remote == null) {
175
return 0;
176
} else {
177
return ((InetSocketAddress)remote).getPort();
178
}
179
}
180
181
public int getLocalPort() {
182
SocketAddress local = sc.localAddress();
183
if (local == null) {
184
return -1;
185
} else {
186
return ((InetSocketAddress)local).getPort();
187
}
188
}
189
190
private class SocketInputStream
191
extends ChannelInputStream
192
{
193
private SocketInputStream() {
194
super(sc);
195
}
196
197
protected int read(ByteBuffer bb)
198
throws IOException
199
{
200
synchronized (sc.blockingLock()) {
201
if (!sc.isOpen()) {
202
throw new ClosedChannelException();
203
}
204
if (!sc.isBlocking())
205
throw new IllegalBlockingModeException();
206
207
if (timeout == 0)
208
return sc.read(bb);
209
210
sc.configureBlocking(false);
211
try {
212
int n;
213
if ((n = sc.read(bb)) != 0)
214
return n;
215
long to = timeout;
216
for (;;) {
217
if (!sc.isOpen())
218
throw new ClosedChannelException();
219
long st = System.currentTimeMillis();
220
int result = sc.poll(Net.POLLIN, to);
221
if (result > 0) {
222
if ((n = sc.read(bb)) != 0)
223
return n;
224
}
225
to -= System.currentTimeMillis() - st;
226
if (to <= 0)
227
throw new SocketTimeoutException();
228
}
229
} finally {
230
try {
231
sc.configureBlocking(true);
232
} catch (ClosedChannelException e) { }
233
}
234
}
235
}
236
}
237
238
private InputStream socketInputStream = null;
239
240
public InputStream getInputStream() throws IOException {
241
if (!sc.isOpen())
242
throw new SocketException("Socket is closed");
243
if (!sc.isConnected())
244
throw new SocketException("Socket is not connected");
245
if (!sc.isInputOpen())
246
throw new SocketException("Socket input is shutdown");
247
if (socketInputStream == null) {
248
try {
249
socketInputStream = AccessController.doPrivileged(
250
new PrivilegedExceptionAction<InputStream>() {
251
public InputStream run() throws IOException {
252
return new SocketInputStream();
253
}
254
});
255
} catch (java.security.PrivilegedActionException e) {
256
throw (IOException)e.getException();
257
}
258
}
259
return socketInputStream;
260
}
261
262
public OutputStream getOutputStream() throws IOException {
263
if (!sc.isOpen())
264
throw new SocketException("Socket is closed");
265
if (!sc.isConnected())
266
throw new SocketException("Socket is not connected");
267
if (!sc.isOutputOpen())
268
throw new SocketException("Socket output is shutdown");
269
OutputStream os = null;
270
try {
271
os = AccessController.doPrivileged(
272
new PrivilegedExceptionAction<OutputStream>() {
273
public OutputStream run() throws IOException {
274
return Channels.newOutputStream(sc);
275
}
276
});
277
} catch (java.security.PrivilegedActionException e) {
278
throw (IOException)e.getException();
279
}
280
return os;
281
}
282
283
private void setBooleanOption(SocketOption<Boolean> name, boolean value)
284
throws SocketException
285
{
286
try {
287
sc.setOption(name, value);
288
} catch (IOException x) {
289
Net.translateToSocketException(x);
290
}
291
}
292
293
private void setIntOption(SocketOption<Integer> name, int value)
294
throws SocketException
295
{
296
try {
297
sc.setOption(name, value);
298
} catch (IOException x) {
299
Net.translateToSocketException(x);
300
}
301
}
302
303
private boolean getBooleanOption(SocketOption<Boolean> name) throws SocketException {
304
try {
305
return sc.getOption(name).booleanValue();
306
} catch (IOException x) {
307
Net.translateToSocketException(x);
308
return false; // keep compiler happy
309
}
310
}
311
312
private int getIntOption(SocketOption<Integer> name) throws SocketException {
313
try {
314
return sc.getOption(name).intValue();
315
} catch (IOException x) {
316
Net.translateToSocketException(x);
317
return -1; // keep compiler happy
318
}
319
}
320
321
public void setTcpNoDelay(boolean on) throws SocketException {
322
setBooleanOption(StandardSocketOptions.TCP_NODELAY, on);
323
}
324
325
public boolean getTcpNoDelay() throws SocketException {
326
return getBooleanOption(StandardSocketOptions.TCP_NODELAY);
327
}
328
329
public void setSoLinger(boolean on, int linger) throws SocketException {
330
if (!on)
331
linger = -1;
332
setIntOption(StandardSocketOptions.SO_LINGER, linger);
333
}
334
335
public int getSoLinger() throws SocketException {
336
return getIntOption(StandardSocketOptions.SO_LINGER);
337
}
338
339
public void sendUrgentData(int data) throws IOException {
340
int n = sc.sendOutOfBandData((byte) data);
341
if (n == 0)
342
throw new IOException("Socket buffer full");
343
}
344
345
public void setOOBInline(boolean on) throws SocketException {
346
setBooleanOption(ExtendedSocketOption.SO_OOBINLINE, on);
347
}
348
349
public boolean getOOBInline() throws SocketException {
350
return getBooleanOption(ExtendedSocketOption.SO_OOBINLINE);
351
}
352
353
public void setSoTimeout(int timeout) throws SocketException {
354
if (timeout < 0)
355
throw new IllegalArgumentException("timeout can't be negative");
356
this.timeout = timeout;
357
}
358
359
public int getSoTimeout() throws SocketException {
360
return timeout;
361
}
362
363
public void setSendBufferSize(int size) throws SocketException {
364
// size 0 valid for SocketChannel, invalid for Socket
365
if (size <= 0)
366
throw new IllegalArgumentException("Invalid send size");
367
setIntOption(StandardSocketOptions.SO_SNDBUF, size);
368
}
369
370
public int getSendBufferSize() throws SocketException {
371
return getIntOption(StandardSocketOptions.SO_SNDBUF);
372
}
373
374
public void setReceiveBufferSize(int size) throws SocketException {
375
// size 0 valid for SocketChannel, invalid for Socket
376
if (size <= 0)
377
throw new IllegalArgumentException("Invalid receive size");
378
setIntOption(StandardSocketOptions.SO_RCVBUF, size);
379
}
380
381
public int getReceiveBufferSize() throws SocketException {
382
return getIntOption(StandardSocketOptions.SO_RCVBUF);
383
}
384
385
public void setKeepAlive(boolean on) throws SocketException {
386
setBooleanOption(StandardSocketOptions.SO_KEEPALIVE, on);
387
}
388
389
public boolean getKeepAlive() throws SocketException {
390
return getBooleanOption(StandardSocketOptions.SO_KEEPALIVE);
391
}
392
393
public void setTrafficClass(int tc) throws SocketException {
394
setIntOption(StandardSocketOptions.IP_TOS, tc);
395
}
396
397
public int getTrafficClass() throws SocketException {
398
return getIntOption(StandardSocketOptions.IP_TOS);
399
}
400
401
public void setReuseAddress(boolean on) throws SocketException {
402
setBooleanOption(StandardSocketOptions.SO_REUSEADDR, on);
403
}
404
405
public boolean getReuseAddress() throws SocketException {
406
return getBooleanOption(StandardSocketOptions.SO_REUSEADDR);
407
}
408
409
public void close() throws IOException {
410
sc.close();
411
}
412
413
public void shutdownInput() throws IOException {
414
try {
415
sc.shutdownInput();
416
} catch (Exception x) {
417
Net.translateException(x);
418
}
419
}
420
421
public void shutdownOutput() throws IOException {
422
try {
423
sc.shutdownOutput();
424
} catch (Exception x) {
425
Net.translateException(x);
426
}
427
}
428
429
public String toString() {
430
if (sc.isConnected())
431
return "Socket[addr=" + getInetAddress() +
432
",port=" + getPort() +
433
",localport=" + getLocalPort() + "]";
434
return "Socket[unconnected]";
435
}
436
437
public boolean isConnected() {
438
return sc.isConnected();
439
}
440
441
public boolean isBound() {
442
return sc.localAddress() != null;
443
}
444
445
public boolean isClosed() {
446
return !sc.isOpen();
447
}
448
449
public boolean isInputShutdown() {
450
return !sc.isInputOpen();
451
}
452
453
public boolean isOutputShutdown() {
454
return !sc.isOutputOpen();
455
}
456
457
}
458
459