forked from I2P_Developers/i2p.i2p
propagate from branch 'i2p.i2p' (head 2da3b585b42d058e25909bc303d72277ae2463b5)
to branch 'i2p.i2p.zzz.test' (head 2785f3832a7d1b8adb2f106d049949beb9b88838)
This commit is contained in:
@@ -215,7 +215,7 @@ class PeerCoordinator implements PeerListener
|
|||||||
|
|
||||||
public Storage getStorage() { return storage; }
|
public Storage getStorage() { return storage; }
|
||||||
|
|
||||||
// for web page detailed stats
|
/** for web page detailed stats */
|
||||||
public List<Peer> peerList()
|
public List<Peer> peerList()
|
||||||
{
|
{
|
||||||
return new ArrayList(peers);
|
return new ArrayList(peers);
|
||||||
@@ -446,6 +446,12 @@ class PeerCoordinator implements PeerListener
|
|||||||
synchronized (downloaded_old) {
|
synchronized (downloaded_old) {
|
||||||
Arrays.fill(downloaded_old, 0);
|
Arrays.fill(downloaded_old, 0);
|
||||||
}
|
}
|
||||||
|
// failsafe
|
||||||
|
synchronized(wantedPieces) {
|
||||||
|
for (Piece pc : wantedPieces) {
|
||||||
|
pc.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
timer.schedule((CHECK_PERIOD / 2) + _random.nextInt((int) CHECK_PERIOD));
|
timer.schedule((CHECK_PERIOD / 2) + _random.nextInt((int) CHECK_PERIOD));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -750,8 +756,12 @@ class PeerCoordinator implements PeerListener
|
|||||||
// AND if there are almost no wanted pieces left (real end game).
|
// AND if there are almost no wanted pieces left (real end game).
|
||||||
// If we do end game all the time, we generate lots of extra traffic
|
// If we do end game all the time, we generate lots of extra traffic
|
||||||
// when the seeder is super-slow and all the peers are "caught up"
|
// when the seeder is super-slow and all the peers are "caught up"
|
||||||
if (wantedSize > END_GAME_THRESHOLD)
|
if (wantedSize > END_GAME_THRESHOLD) {
|
||||||
|
if (_log.shouldLog(Log.INFO))
|
||||||
|
_log.info("Nothing to request, " + requested.size() + " being requested and " +
|
||||||
|
wantedSize + " still wanted");
|
||||||
return null; // nothing to request and not in end game
|
return null; // nothing to request and not in end game
|
||||||
|
}
|
||||||
// let's not all get on the same piece
|
// let's not all get on the same piece
|
||||||
// Even better would be to sort by number of requests
|
// Even better would be to sort by number of requests
|
||||||
if (record)
|
if (record)
|
||||||
@@ -1078,10 +1088,11 @@ class PeerCoordinator implements PeerListener
|
|||||||
/** Called when a peer is removed, to prevent it from being used in
|
/** Called when a peer is removed, to prevent it from being used in
|
||||||
* rarest-first calculations.
|
* rarest-first calculations.
|
||||||
*/
|
*/
|
||||||
public void removePeerFromPieces(Peer peer) {
|
private void removePeerFromPieces(Peer peer) {
|
||||||
synchronized(wantedPieces) {
|
synchronized(wantedPieces) {
|
||||||
for (Piece piece : wantedPieces) {
|
for (Piece piece : wantedPieces) {
|
||||||
piece.removePeer(peer);
|
piece.removePeer(peer);
|
||||||
|
piece.setRequested(peer, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -682,6 +682,7 @@ class PeerState implements DataLoader
|
|||||||
_log.debug(peer + " addRequest() we are choked, delaying requestNextPiece()");
|
_log.debug(peer + " addRequest() we are choked, delaying requestNextPiece()");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// huh? rv unused
|
||||||
more_pieces = requestNextPiece();
|
more_pieces = requestNextPiece();
|
||||||
} else if (more_pieces) // We want something
|
} else if (more_pieces) // We want something
|
||||||
{
|
{
|
||||||
@@ -711,6 +712,8 @@ class PeerState implements DataLoader
|
|||||||
}
|
}
|
||||||
|
|
||||||
// failsafe
|
// failsafe
|
||||||
|
// However this is bad as it thrashes the peer when we change our mind
|
||||||
|
// Ticket 691 cause here?
|
||||||
if (interesting && lastRequest == null && outstandingRequests.isEmpty())
|
if (interesting && lastRequest == null && outstandingRequests.isEmpty())
|
||||||
setInteresting(false);
|
setInteresting(false);
|
||||||
|
|
||||||
@@ -784,6 +787,8 @@ class PeerState implements DataLoader
|
|||||||
}
|
}
|
||||||
|
|
||||||
// failsafe
|
// failsafe
|
||||||
|
// However this is bad as it thrashes the peer when we change our mind
|
||||||
|
// Ticket 691 cause here?
|
||||||
if (outstandingRequests.isEmpty())
|
if (outstandingRequests.isEmpty())
|
||||||
lastRequest = null;
|
lastRequest = null;
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ class Piece implements Comparable {
|
|||||||
private final int id;
|
private final int id;
|
||||||
private final Set<PeerID> peers;
|
private final Set<PeerID> peers;
|
||||||
/** @since 0.8.3 */
|
/** @since 0.8.3 */
|
||||||
private Set<PeerID> requests;
|
private volatile Set<PeerID> requests;
|
||||||
/** @since 0.8.1 */
|
/** @since 0.8.1 */
|
||||||
private int priority;
|
private int priority;
|
||||||
|
|
||||||
@@ -54,7 +54,10 @@ class Piece implements Comparable {
|
|||||||
/** caller must synchronize */
|
/** caller must synchronize */
|
||||||
public boolean addPeer(Peer peer) { return this.peers.add(peer.getPeerID()); }
|
public boolean addPeer(Peer peer) { return this.peers.add(peer.getPeerID()); }
|
||||||
|
|
||||||
/** caller must synchronize */
|
/**
|
||||||
|
* Caller must synchronize.
|
||||||
|
* @return true if removed
|
||||||
|
*/
|
||||||
public boolean removePeer(Peer peer) { return this.peers.remove(peer.getPeerID()); }
|
public boolean removePeer(Peer peer) { return this.peers.remove(peer.getPeerID()); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -104,6 +107,17 @@ class Piece implements Comparable {
|
|||||||
public int getRequestCount() {
|
public int getRequestCount() {
|
||||||
return this.requests == null ? 0 : this.requests.size();
|
return this.requests == null ? 0 : this.requests.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear all knowledge of peers
|
||||||
|
* Caller must synchronize
|
||||||
|
* @since 0.9.3
|
||||||
|
*/
|
||||||
|
public void clear() {
|
||||||
|
peers.clear();
|
||||||
|
if (requests != null)
|
||||||
|
requests.clear();
|
||||||
|
}
|
||||||
|
|
||||||
/** @return default 0 @since 0.8.1 */
|
/** @return default 0 @since 0.8.1 */
|
||||||
public int getPriority() { return this.priority; }
|
public int getPriority() { return this.priority; }
|
||||||
|
|||||||
@@ -38,11 +38,14 @@ import net.i2p.util.PortMapper;
|
|||||||
import net.i2p.util.SecureDirectory;
|
import net.i2p.util.SecureDirectory;
|
||||||
import net.i2p.util.SecureFileOutputStream;
|
import net.i2p.util.SecureFileOutputStream;
|
||||||
import net.i2p.util.ShellCommand;
|
import net.i2p.util.ShellCommand;
|
||||||
|
import net.i2p.util.SystemVersion;
|
||||||
import net.i2p.util.VersionComparator;
|
import net.i2p.util.VersionComparator;
|
||||||
|
|
||||||
|
import org.mortbay.jetty.AbstractConnector;
|
||||||
import org.mortbay.jetty.Connector;
|
import org.mortbay.jetty.Connector;
|
||||||
import org.mortbay.jetty.NCSARequestLog;
|
import org.mortbay.jetty.NCSARequestLog;
|
||||||
import org.mortbay.jetty.Server;
|
import org.mortbay.jetty.Server;
|
||||||
|
import org.mortbay.jetty.bio.SocketConnector;
|
||||||
import org.mortbay.jetty.handler.ContextHandlerCollection;
|
import org.mortbay.jetty.handler.ContextHandlerCollection;
|
||||||
import org.mortbay.jetty.handler.DefaultHandler;
|
import org.mortbay.jetty.handler.DefaultHandler;
|
||||||
import org.mortbay.jetty.handler.HandlerCollection;
|
import org.mortbay.jetty.handler.HandlerCollection;
|
||||||
@@ -54,6 +57,7 @@ import org.mortbay.jetty.security.HashUserRealm;
|
|||||||
import org.mortbay.jetty.security.Constraint;
|
import org.mortbay.jetty.security.Constraint;
|
||||||
import org.mortbay.jetty.security.ConstraintMapping;
|
import org.mortbay.jetty.security.ConstraintMapping;
|
||||||
import org.mortbay.jetty.security.SecurityHandler;
|
import org.mortbay.jetty.security.SecurityHandler;
|
||||||
|
import org.mortbay.jetty.security.SslSocketConnector;
|
||||||
import org.mortbay.jetty.security.SslSelectChannelConnector;
|
import org.mortbay.jetty.security.SslSelectChannelConnector;
|
||||||
import org.mortbay.jetty.servlet.ServletHandler;
|
import org.mortbay.jetty.servlet.ServletHandler;
|
||||||
import org.mortbay.jetty.servlet.ServletHolder;
|
import org.mortbay.jetty.servlet.ServletHolder;
|
||||||
@@ -240,8 +244,7 @@ public class RouterConsoleRunner implements RouterApp {
|
|||||||
try {
|
try {
|
||||||
//TODO: move away from routerconsole into a separate application.
|
//TODO: move away from routerconsole into a separate application.
|
||||||
//ApplicationManager?
|
//ApplicationManager?
|
||||||
VersionComparator v = new VersionComparator();
|
boolean recentJava = SystemVersion.isJava6();
|
||||||
boolean recentJava = v.compare(System.getProperty("java.runtime.version"), "1.6") >= 0;
|
|
||||||
// default false for now
|
// default false for now
|
||||||
boolean desktopguiEnabled = ctx.getBooleanProperty("desktopgui.enabled");
|
boolean desktopguiEnabled = ctx.getBooleanProperty("desktopgui.enabled");
|
||||||
if (recentJava && desktopguiEnabled) {
|
if (recentJava && desktopguiEnabled) {
|
||||||
@@ -397,12 +400,22 @@ public class RouterConsoleRunner implements RouterApp {
|
|||||||
// _server.addListener('[' + host + "]:" + _listenPort);
|
// _server.addListener('[' + host + "]:" + _listenPort);
|
||||||
//else
|
//else
|
||||||
// _server.addListener(host + ':' + _listenPort);
|
// _server.addListener(host + ':' + _listenPort);
|
||||||
SelectChannelConnector lsnr = new SelectChannelConnector();
|
AbstractConnector lsnr;
|
||||||
|
if (SystemVersion.isJava6() && !SystemVersion.isGNU()) {
|
||||||
|
SelectChannelConnector slsnr = new SelectChannelConnector();
|
||||||
|
slsnr.setUseDirectBuffers(false); // default true seems to be leaky
|
||||||
|
lsnr = slsnr;
|
||||||
|
} else {
|
||||||
|
// Jetty 6 and NIO on Java 5 don't get along that well
|
||||||
|
// Also: http://jira.codehaus.org/browse/JETTY-1238
|
||||||
|
// "Do not use GCJ with Jetty, it will not work."
|
||||||
|
// Actually it does if you don't use NIO
|
||||||
|
lsnr = new SocketConnector();
|
||||||
|
}
|
||||||
lsnr.setHost(host);
|
lsnr.setHost(host);
|
||||||
lsnr.setPort(lport);
|
lsnr.setPort(lport);
|
||||||
lsnr.setMaxIdleTime(90*1000); // default 10 sec
|
lsnr.setMaxIdleTime(90*1000); // default 10 sec
|
||||||
lsnr.setName("ConsoleSocket"); // all with same name will use the same thread pool
|
lsnr.setName("ConsoleSocket"); // all with same name will use the same thread pool
|
||||||
lsnr.setUseDirectBuffers(false); // default true seems to be leaky
|
|
||||||
//_server.addConnector(lsnr);
|
//_server.addConnector(lsnr);
|
||||||
connectors.add(lsnr);
|
connectors.add(lsnr);
|
||||||
boundAddresses++;
|
boundAddresses++;
|
||||||
@@ -451,22 +464,37 @@ public class RouterConsoleRunner implements RouterApp {
|
|||||||
}
|
}
|
||||||
// TODO if class not found use SslChannelConnector
|
// TODO if class not found use SslChannelConnector
|
||||||
// Sadly there's no common base class with the ssl methods in it
|
// Sadly there's no common base class with the ssl methods in it
|
||||||
SslSelectChannelConnector ssll = new SslSelectChannelConnector();
|
AbstractConnector ssll;
|
||||||
|
if (SystemVersion.isJava6() && !SystemVersion.isGNU()) {
|
||||||
|
SslSelectChannelConnector sssll = new SslSelectChannelConnector();
|
||||||
|
// the keystore path and password
|
||||||
|
sssll.setKeystore(keyStore.getAbsolutePath());
|
||||||
|
sssll.setPassword(ctx.getProperty(PROP_KEYSTORE_PASSWORD, DEFAULT_KEYSTORE_PASSWORD));
|
||||||
|
// the X.509 cert password (if not present, verifyKeyStore() returned false)
|
||||||
|
sssll.setKeyPassword(ctx.getProperty(PROP_KEY_PASSWORD, "thisWontWork"));
|
||||||
|
sssll.setUseDirectBuffers(false); // default true seems to be leaky
|
||||||
|
ssll = sssll;
|
||||||
|
} else {
|
||||||
|
// Jetty 6 and NIO on Java 5 don't get along that well
|
||||||
|
SslSocketConnector sssll = new SslSocketConnector();
|
||||||
|
// the keystore path and password
|
||||||
|
sssll.setKeystore(keyStore.getAbsolutePath());
|
||||||
|
sssll.setPassword(ctx.getProperty(PROP_KEYSTORE_PASSWORD, DEFAULT_KEYSTORE_PASSWORD));
|
||||||
|
// the X.509 cert password (if not present, verifyKeyStore() returned false)
|
||||||
|
sssll.setKeyPassword(ctx.getProperty(PROP_KEY_PASSWORD, "thisWontWork"));
|
||||||
|
ssll = sssll;
|
||||||
|
}
|
||||||
ssll.setHost(host);
|
ssll.setHost(host);
|
||||||
ssll.setPort(sslPort);
|
ssll.setPort(sslPort);
|
||||||
// the keystore path and password
|
|
||||||
ssll.setKeystore(keyStore.getAbsolutePath());
|
|
||||||
ssll.setPassword(_context.getProperty(PROP_KEYSTORE_PASSWORD, DEFAULT_KEYSTORE_PASSWORD));
|
|
||||||
// the X.509 cert password (if not present, verifyKeyStore() returned false)
|
|
||||||
ssll.setKeyPassword(_context.getProperty(PROP_KEY_PASSWORD, "thisWontWork"));
|
|
||||||
ssll.setMaxIdleTime(90*1000); // default 10 sec
|
ssll.setMaxIdleTime(90*1000); // default 10 sec
|
||||||
ssll.setName("ConsoleSocket"); // all with same name will use the same thread pool
|
ssll.setName("ConsoleSocket"); // all with same name will use the same thread pool
|
||||||
ssll.setUseDirectBuffers(false); // default true seems to be leaky
|
|
||||||
//_server.addConnector(ssll);
|
//_server.addConnector(ssll);
|
||||||
connectors.add(ssll);
|
connectors.add(ssll);
|
||||||
boundAddresses++;
|
boundAddresses++;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
System.err.println("Unable to bind routerconsole to " + host + " port " + sslPort + " for SSL: " + e);
|
System.err.println("Unable to bind routerconsole to " + host + " port " + sslPort + " for SSL: " + e);
|
||||||
|
if (SystemVersion.isGNU())
|
||||||
|
System.err.println("Probably because GNU classpath does not support Sun keystores");
|
||||||
System.err.println("You may ignore this warning if the console is still available at https://localhost:" + sslPort);
|
System.err.println("You may ignore this warning if the console is still available at https://localhost:" + sslPort);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,12 +67,10 @@ public class StatSummarizer implements Runnable {
|
|||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
// JRobin 1.5.9 crashes these JVMs
|
// JRobin 1.5.9 crashes these JVMs
|
||||||
String vendor = System.getProperty("java.vendor");
|
if (SystemVersion.isApache() || // Harmony
|
||||||
if (vendor.startsWith("Apache") || // Harmony
|
SystemVersion.isGNU()) { // JamVM or gij
|
||||||
vendor.startsWith("GNU Classpath") || // JamVM
|
|
||||||
vendor.startsWith("Free Software Foundation")) { // gij
|
|
||||||
_log.logAlways(Log.WARN, "Graphing not supported with this JVM: " +
|
_log.logAlways(Log.WARN, "Graphing not supported with this JVM: " +
|
||||||
vendor + ' ' +
|
System.getProperty("java.vendor") + ' ' +
|
||||||
System.getProperty("java.version") + " (" +
|
System.getProperty("java.version") + " (" +
|
||||||
System.getProperty("java.runtime.name") + ' ' +
|
System.getProperty("java.runtime.name") + ' ' +
|
||||||
System.getProperty("java.runtime.version") + ')');
|
System.getProperty("java.runtime.version") + ')');
|
||||||
|
|||||||
@@ -456,10 +456,11 @@ public class SummaryHelper extends HelperBase {
|
|||||||
|
|
||||||
/** compare translated nicknames - put "shared clients" first in the sort */
|
/** compare translated nicknames - put "shared clients" first in the sort */
|
||||||
private class AlphaComparator implements Comparator<Destination> {
|
private class AlphaComparator implements Comparator<Destination> {
|
||||||
|
private final String xsc = _("shared clients");
|
||||||
|
|
||||||
public int compare(Destination lhs, Destination rhs) {
|
public int compare(Destination lhs, Destination rhs) {
|
||||||
String lname = getName(lhs);
|
String lname = getName(lhs);
|
||||||
String rname = getName(rhs);
|
String rname = getName(rhs);
|
||||||
String xsc = _("shared clients");
|
|
||||||
if (lname.equals(xsc))
|
if (lname.equals(xsc))
|
||||||
return -1;
|
return -1;
|
||||||
if (rname.equals(xsc))
|
if (rname.equals(xsc))
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ import java.security.DigestException;
|
|||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
|
||||||
|
import net.i2p.util.SystemVersion;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NOTE: As of 0.8.7, use getInstance() instead of new SHA1(), which will
|
* NOTE: As of 0.8.7, use getInstance() instead of new SHA1(), which will
|
||||||
* return the JVM's MessageDigest if it is faster.
|
* return the JVM's MessageDigest if it is faster.
|
||||||
@@ -94,10 +96,8 @@ public final class SHA1 extends MessageDigest implements Cloneable {
|
|||||||
static {
|
static {
|
||||||
// oddly, Bitzi is faster than Oracle - see test results below
|
// oddly, Bitzi is faster than Oracle - see test results below
|
||||||
boolean useBitzi = true;
|
boolean useBitzi = true;
|
||||||
String vendor = System.getProperty("java.vendor");
|
if (SystemVersion.isApache() || // Harmony
|
||||||
if (vendor.startsWith("Apache") || // Harmony
|
SystemVersion.isGNU()) { // JamVM or gij
|
||||||
vendor.startsWith("GNU Classpath") || // JamVM
|
|
||||||
vendor.startsWith("Free Software Foundation")) { // gij
|
|
||||||
try {
|
try {
|
||||||
MessageDigest.getInstance("SHA-1");
|
MessageDigest.getInstance("SHA-1");
|
||||||
useBitzi = false;
|
useBitzi = false;
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import java.util.concurrent.LinkedBlockingQueue;
|
|||||||
public class ReusableGZIPInputStream extends ResettableGZIPInputStream {
|
public class ReusableGZIPInputStream extends ResettableGZIPInputStream {
|
||||||
// Apache Harmony 5.0M13 Deflater doesn't work after reset()
|
// Apache Harmony 5.0M13 Deflater doesn't work after reset()
|
||||||
// Neither does Android
|
// Neither does Android
|
||||||
private static final boolean ENABLE_CACHING = !(System.getProperty("java.vendor").startsWith("Apache") ||
|
private static final boolean ENABLE_CACHING = !(SystemVersion.isApache() ||
|
||||||
SystemVersion.isAndroid());
|
SystemVersion.isAndroid());
|
||||||
private static final LinkedBlockingQueue<ReusableGZIPInputStream> _available;
|
private static final LinkedBlockingQueue<ReusableGZIPInputStream> _available;
|
||||||
static {
|
static {
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import net.i2p.data.DataHelper;
|
|||||||
public class ReusableGZIPOutputStream extends ResettableGZIPOutputStream {
|
public class ReusableGZIPOutputStream extends ResettableGZIPOutputStream {
|
||||||
// Apache Harmony 5.0M13 Deflater doesn't work after reset()
|
// Apache Harmony 5.0M13 Deflater doesn't work after reset()
|
||||||
// Neither does Android
|
// Neither does Android
|
||||||
private static final boolean ENABLE_CACHING = !(System.getProperty("java.vendor").startsWith("Apache") ||
|
private static final boolean ENABLE_CACHING = !(SystemVersion.isApache() ||
|
||||||
SystemVersion.isAndroid());
|
SystemVersion.isAndroid());
|
||||||
private static final LinkedBlockingQueue<ReusableGZIPOutputStream> _available;
|
private static final LinkedBlockingQueue<ReusableGZIPOutputStream> _available;
|
||||||
static {
|
static {
|
||||||
|
|||||||
@@ -15,14 +15,23 @@ public abstract class SystemVersion {
|
|||||||
|
|
||||||
private static final boolean _isWin = System.getProperty("os.name").startsWith("Win");
|
private static final boolean _isWin = System.getProperty("os.name").startsWith("Win");
|
||||||
private static final boolean _isMac = System.getProperty("os.name").startsWith("Mac");
|
private static final boolean _isMac = System.getProperty("os.name").startsWith("Mac");
|
||||||
private static final boolean _isAndroid = System.getProperty("java.vendor").contains("Android");
|
private static final boolean _isAndroid;
|
||||||
|
private static final boolean _isApache;
|
||||||
|
private static final boolean _isGNU;
|
||||||
private static final boolean _is64 = "64".equals(System.getProperty("sun.arch.data.model")) ||
|
private static final boolean _is64 = "64".equals(System.getProperty("sun.arch.data.model")) ||
|
||||||
System.getProperty("os.arch").contains("64");
|
System.getProperty("os.arch").contains("64");
|
||||||
|
private static final boolean _hasWrapper = System.getProperty("wrapper.version") != null;
|
||||||
|
|
||||||
private static final boolean _oneDotSix;
|
private static final boolean _oneDotSix;
|
||||||
private static final int _androidSDK;
|
private static final int _androidSDK;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
|
String vendor = System.getProperty("java.vendor");
|
||||||
|
_isAndroid = vendor.contains("Android");
|
||||||
|
_isApache = vendor.startsWith("Apache");
|
||||||
|
_isGNU = vendor.startsWith("GNU Classpath") || // JamVM
|
||||||
|
vendor.startsWith("Free Software Foundation"); // gij
|
||||||
|
|
||||||
int sdk = 0;
|
int sdk = 0;
|
||||||
if (_isAndroid) {
|
if (_isAndroid) {
|
||||||
try {
|
try {
|
||||||
@@ -52,6 +61,20 @@ public abstract class SystemVersion {
|
|||||||
return _isAndroid;
|
return _isAndroid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apache Harmony JVM, or Android
|
||||||
|
*/
|
||||||
|
public static boolean isApache() {
|
||||||
|
return _isApache || _isAndroid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gij or JamVM with GNU Classpath
|
||||||
|
*/
|
||||||
|
public static boolean isGNU() {
|
||||||
|
return _isGNU;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Better than (new VersionComparator()).compare(System.getProperty("java.version"), "1.6") >= 0
|
* Better than (new VersionComparator()).compare(System.getProperty("java.version"), "1.6") >= 0
|
||||||
* as it handles Android also, where java.version = "0".
|
* as it handles Android also, where java.version = "0".
|
||||||
@@ -90,6 +113,6 @@ public abstract class SystemVersion {
|
|||||||
* Same as I2PAppContext.hasWrapper()
|
* Same as I2PAppContext.hasWrapper()
|
||||||
*/
|
*/
|
||||||
public static boolean hasWrapper() {
|
public static boolean hasWrapper() {
|
||||||
return System.getProperty("wrapper.version") != null;
|
return _hasWrapper;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
2012-10-14 zzz
|
||||||
|
* Console: Use non-nio connector for Java 5 and JamVM/gij
|
||||||
|
(tickets #715 and #743)
|
||||||
|
* i2psnark: Fix request tracking bug preventing piece requests
|
||||||
|
|
||||||
2012-10-11 kytv
|
2012-10-11 kytv
|
||||||
* Italian translation updates from Transifex
|
* Italian translation updates from Transifex
|
||||||
* i2prouter:
|
* i2prouter:
|
||||||
|
|||||||
@@ -90,7 +90,9 @@
|
|||||||
|
|
||||||
<!-- Use this connector for many frequently idle connections
|
<!-- Use this connector for many frequently idle connections
|
||||||
and for threadless continuations.
|
and for threadless continuations.
|
||||||
Not recommended on Java 5 - comment out and uncomment the
|
Not recommended on Java 5 - comment this out, and uncomment the
|
||||||
|
SocketConnector below.
|
||||||
|
Do not use for gij or JamVM - comment this out, and uncomment the
|
||||||
SocketConnector below.
|
SocketConnector below.
|
||||||
-->
|
-->
|
||||||
<Call name="addConnector">
|
<Call name="addConnector">
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ GETTEXT=$(which gettext > /dev/null 2>&1)
|
|||||||
|
|
||||||
# Where to install the systemd service
|
# Where to install the systemd service
|
||||||
SYSTEMD_SERVICE="/etc/systemd/system/${APP_NAME}.service"
|
SYSTEMD_SERVICE="/etc/systemd/system/${APP_NAME}.service"
|
||||||
if grep -q systemd /proc/cmdline; then
|
if grep -q systemd /proc/1/comm ; then
|
||||||
USE_SYSTEMD=1
|
USE_SYSTEMD=1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -1321,6 +1321,8 @@ installdaemon() {
|
|||||||
echo "esac" >> /etc/rc.d/${APP_NAME}
|
echo "esac" >> /etc/rc.d/${APP_NAME}
|
||||||
chmod 755 /etc/rc.d/${APP_NAME}
|
chmod 755 /etc/rc.d/${APP_NAME}
|
||||||
chown root:root /etc/rc.d/${APP_NAME}
|
chown root:root /etc/rc.d/${APP_NAME}
|
||||||
|
eval echo `gettext ' The $APP_LONG_NAME daemon has been installed.'`
|
||||||
|
eval echo `gettext ' Add \"i2p\" to the DAEMONS variable in /etc/rc.conf to enable.'`
|
||||||
else
|
else
|
||||||
# We'll end up here if systemd is enabled.
|
# We'll end up here if systemd is enabled.
|
||||||
# If systemd is enabled we don't need the initscript
|
# If systemd is enabled we don't need the initscript
|
||||||
@@ -1330,10 +1332,6 @@ installdaemon() {
|
|||||||
if [ ! -f "${SYSTEMD_SERVICE}" ]; then
|
if [ ! -f "${SYSTEMD_SERVICE}" ]; then
|
||||||
installsystemd
|
installsystemd
|
||||||
fi
|
fi
|
||||||
if ! grep -q systemd /proc/cmdline; then
|
|
||||||
eval echo `gettext ' The $APP_LONG_NAME daemon has been installed.'`
|
|
||||||
eval echo `gettext ' Add \"i2p\" to the DAEMONS variable in /etc/rc.conf to enable.'`
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
elif [ -f /etc/SuSE-release ] ; then
|
elif [ -f /etc/SuSE-release ] ; then
|
||||||
eval echo `gettext 'Detected SuSE or SLES:'`
|
eval echo `gettext 'Detected SuSE or SLES:'`
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ public class RouterVersion {
|
|||||||
/** deprecated */
|
/** deprecated */
|
||||||
public final static String ID = "Monotone";
|
public final static String ID = "Monotone";
|
||||||
public final static String VERSION = CoreVersion.VERSION;
|
public final static String VERSION = CoreVersion.VERSION;
|
||||||
public final static long BUILD = 14;
|
public final static long BUILD = 15;
|
||||||
|
|
||||||
/** for example "-test" */
|
/** for example "-test" */
|
||||||
public final static String EXTRA = "";
|
public final static String EXTRA = "";
|
||||||
|
|||||||
Reference in New Issue
Block a user