1 /*
2  * Copyright (c) 2013, 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.net;
27 
28 import java.security.AccessController;
29 
30 /**
31  * Determines the ephemeral port range in use on this system.
32  * If this cannot be determined, then the default settings
33  * of the OS are returned.
34  */
35 
36 public final class PortConfig {
37 
38     private static int defaultUpper, defaultLower;
39     private final static int upper, lower;
40 
PortConfig()41     private PortConfig() {}
42 
43     static {
AccessController.doPrivileged( new java.security.PrivilegedAction<Void>() { public Void run() { System.loadLibrary(R); String os = System.getProperty(R); if (os.startsWith(R)) { defaultLower = 32768; defaultUpper = 61000; } else if (os.startsWith(R)) { defaultLower = 32768; defaultUpper = 65535; } else if (os.endsWith(R) || os.contains(R)) { defaultLower = 49152; defaultUpper = 65535; } else if (os.startsWith(R)) { defaultLower = 32768; defaultUpper = 65535; } else { throw new InternalError( R); } return null; } })44         AccessController.doPrivileged(
45             new java.security.PrivilegedAction<Void>() {
46                 public Void run() {
47                     System.loadLibrary("net");
48                     String os = System.getProperty("os.name");
49                     if (os.startsWith("Linux")) {
50                         defaultLower = 32768;
51                         defaultUpper = 61000;
52                     } else if (os.startsWith("SunOS")) {
53                         defaultLower = 32768;
54                         defaultUpper = 65535;
55                     } else if (os.endsWith("BSD") || os.contains("OS X")) {
56                         defaultLower = 49152;
57                         defaultUpper = 65535;
58                     } else if (os.startsWith("AIX")) {
59                         // The ephemeral port is OS version dependent on AIX:
60                         // http://publib.boulder.ibm.com/infocenter/aix/v7r1/topic/com.ibm.aix.rsct315.admin/bl503_ephport.htm
61                         // However, on AIX 5.3 / 6.1 / 7.1 we always see the
62                         // settings below by using:
63                         // /usr/sbin/no -a | fgrep ephemeral
64                         defaultLower = 32768;
65                         defaultUpper = 65535;
66                     } else {
67                         throw new InternalError(
68                             "sun.net.PortConfig: unknown OS");
69                     }
70                     return null;
71                 }
72             });
73 
74         int v = getLower0();
75         if (v == -1) {
76             v = defaultLower;
77         }
78         lower = v;
79 
80         v = getUpper0();
81         if (v == -1) {
82             v = defaultUpper;
83         }
84         upper = v;
85     }
86 
getLower0()87     static native int getLower0();
getUpper0()88     static native int getUpper0();
89 
getLower()90     public static int getLower() {
91         return lower;
92     }
93 
getUpper()94     public static int getUpper() {
95         return upper;
96     }
97 }
98