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 package java.net;
26
27 import java.io.IOException;
28 import java.util.Set;
29 import java.util.HashSet;
30 import java.util.Collections;
31 import jdk.net.*;
32 import static sun.net.ExtendedOptionsImpl.*;
33
34 /*
35 * On Unix systems we simply delegate to native methods.
36 *
37 * @author Chris Hegarty
38 */
39
40 class PlainDatagramSocketImpl extends AbstractPlainDatagramSocketImpl
41 {
42 static {
43 init();
44 }
45
46 protected <T> void setOption(SocketOption<T> name, T value) throws IOException {
47 if (!name.equals(ExtendedSocketOptions.SO_FLOW_SLA)) {
48 if (!name.equals(StandardSocketOptions.SO_REUSEPORT)) {
49 super.setOption(name, value);
50 } else {
51 if (supportedOptions().contains(name)) {
52 super.setOption(name, value);
53 } else {
54 throw new UnsupportedOperationException("unsupported option");
55 }
56 }
57 } else {
58 if (!flowSupported()) {
59 throw new UnsupportedOperationException("unsupported option");
60 }
61 if (isClosed()) {
62 throw new SocketException("Socket closed");
63 }
64 checkSetOptionPermission(name);
65 checkValueType(value, SocketFlow.class);
66 setFlowOption(getFileDescriptor(), (SocketFlow)value);
67 }
68 }
69
70 @SuppressWarnings("unchecked")
71 protected <T> T getOption(SocketOption<T> name) throws IOException {
72 if (!name.equals(ExtendedSocketOptions.SO_FLOW_SLA)) {
73 if (!name.equals(StandardSocketOptions.SO_REUSEPORT)) {
74 return super.getOption(name);
75 } else {
76 if (supportedOptions().contains(name)) {
77 return super.getOption(name);
78 } else {
79 throw new UnsupportedOperationException("unsupported option");
80 }
81 }
82 }
83 if (!flowSupported()) {
84 throw new UnsupportedOperationException("unsupported option");
85 }
86 if (isClosed()) {
87 throw new SocketException("Socket closed");
88 }
89 checkGetOptionPermission(name);
90 SocketFlow flow = SocketFlow.create();
91 getFlowOption(getFileDescriptor(), flow);
92 return (T)flow;
93 }
94
95 protected Set<SocketOption<?>> supportedOptions() {
96 HashSet<SocketOption<?>> options = new HashSet<>(
97 super.supportedOptions());
98
99 if (flowSupported()) {
100 options.add(ExtendedSocketOptions.SO_FLOW_SLA);
101 }
102 return options;
103 }
104
105 protected void socketSetOption(int opt, Object val) throws SocketException {
106 if (opt == SocketOptions.SO_REUSEPORT && !supportedOptions().contains(StandardSocketOptions.SO_REUSEPORT)) {
107 throw new UnsupportedOperationException("unsupported option");
108 }
109 try {
110 socketSetOption0(opt, val);
111 } catch (SocketException se) {
112 if (!connected)
113 throw se;
114 }
115 }
116
117 protected synchronized native void bind0(int lport, InetAddress laddr)
118 throws SocketException;
119
120 protected native void send(DatagramPacket p) throws IOException;
121
122 protected synchronized native int peek(InetAddress i) throws IOException;
123
124 protected synchronized native int peekData(DatagramPacket p) throws IOException;
125
126 protected synchronized native void receive0(DatagramPacket p)
|
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 package java.net;
26
27 import java.io.IOException;
28 import java.util.Set;
29 import java.util.HashSet;
30 import sun.net.ext.ExtendedSocketOptions;
31
32 /*
33 * On Unix systems we simply delegate to native methods.
34 *
35 * @author Chris Hegarty
36 */
37
38 class PlainDatagramSocketImpl extends AbstractPlainDatagramSocketImpl
39 {
40 static {
41 init();
42 }
43
44 static final ExtendedSocketOptions extendedOptions =
45 ExtendedSocketOptions.getInstance();
46
47 protected <T> void setOption(SocketOption<T> name, T value) throws IOException {
48 if (!extendedOptions.isOptionSupported(name)) {
49 if (!name.equals(StandardSocketOptions.SO_REUSEPORT)) {
50 super.setOption(name, value);
51 } else {
52 if (supportedOptions().contains(name)) {
53 super.setOption(name, value);
54 } else {
55 throw new UnsupportedOperationException("unsupported option");
56 }
57 }
58 } else {
59 if (isClosed()) {
60 throw new SocketException("Socket closed");
61 }
62 extendedOptions.setOption(fd, name, value);
63 }
64 }
65
66 @SuppressWarnings("unchecked")
67 protected <T> T getOption(SocketOption<T> name) throws IOException {
68 if (!extendedOptions.isOptionSupported(name)) {
69 if (!name.equals(StandardSocketOptions.SO_REUSEPORT)) {
70 return super.getOption(name);
71 } else {
72 if (supportedOptions().contains(name)) {
73 return super.getOption(name);
74 } else {
75 throw new UnsupportedOperationException("unsupported option");
76 }
77 }
78 } else {
79 if (isClosed()) {
80 throw new SocketException("Socket closed");
81 }
82 return (T) extendedOptions.getOption(fd, name);
83 }
84 }
85
86 protected Set<SocketOption<?>> supportedOptions() {
87 HashSet<SocketOption<?>> options = new HashSet<>(super.supportedOptions());
88 options.addAll(extendedOptions.options());
89 return options;
90 }
91
92 protected void socketSetOption(int opt, Object val) throws SocketException {
93 if (opt == SocketOptions.SO_REUSEPORT &&
94 !supportedOptions().contains(StandardSocketOptions.SO_REUSEPORT)) {
95 throw new UnsupportedOperationException("unsupported option");
96 }
97 try {
98 socketSetOption0(opt, val);
99 } catch (SocketException se) {
100 if (!connected)
101 throw se;
102 }
103 }
104
105 protected synchronized native void bind0(int lport, InetAddress laddr)
106 throws SocketException;
107
108 protected native void send(DatagramPacket p) throws IOException;
109
110 protected synchronized native int peek(InetAddress i) throws IOException;
111
112 protected synchronized native int peekData(DatagramPacket p) throws IOException;
113
114 protected synchronized native void receive0(DatagramPacket p)
|