Author: nextgens
Date: 2006-05-18 09:37:33 +0000 (Thu, 18 May 2006)
New Revision: 8757

Modified:
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/TestnetHandler.java
Log:
Should fix https://bugs.freenetproject.org/view.php?id=227

        * Testnet port is now updatable on the fly

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2006-05-18 04:49:13 UTC (rev 
8756)
+++ trunk/freenet/src/freenet/node/Node.java    2006-05-18 09:37:33 UTC (rev 
8757)
@@ -1840,7 +1840,7 @@
         fs.put("testnet", Boolean.toString(testnetEnabled));
         fs.put("lastGoodVersion", Version.getLastGoodVersionString());
         if(testnetEnabled)
-               fs.put("testnetPort", 
Integer.toString(testnetHandler.testnetPort));
+               fs.put("testnetPort", 
Integer.toString(testnetHandler.getPort()));
         fs.put("myName", myName);
         fs.put("dsaGroup", myCryptoGroup.asFieldSet());
         fs.put("dsaPubKey", myPubKey.asFieldSet());

Modified: trunk/freenet/src/freenet/node/TestnetHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/TestnetHandler.java  2006-05-18 04:49:13 UTC 
(rev 8756)
+++ trunk/freenet/src/freenet/node/TestnetHandler.java  2006-05-18 09:37:33 UTC 
(rev 8757)
@@ -40,7 +40,7 @@
  * The idea is that this should be as simple as possible...
  */
 public class TestnetHandler implements Runnable {
-
+       
        private final TestnetStatusUploader uploader;

        public TestnetHandler(Node node2, int testnetPort) {
@@ -67,30 +67,50 @@

        private final Node node;
        private Thread serverThread;
-       final int testnetPort;
+       private ServerSocket server;
+       private int testnetPort;

        public void run() {
-               // Set up server socket
-               ServerSocket server;
-               try {
-                       server = new ServerSocket(testnetPort);
-               } catch (IOException e) {
-                       Logger.error(this, "Could not bind to testnet port: 
"+testnetPort);
-                       System.err.println("Could not bind to testnet port: 
"+testnetPort);
-                       System.exit(Node.EXIT_TESTNET_FAILED);
-                       return;
-               }
-               while(true) {
+               while(true){
+                       // Set up server socket
                        try {
-                               Socket s = server.accept();
-                               new TestnetSocketHandler(s);
+                               server = new ServerSocket(testnetPort);
+                               Logger.normal(this,"Starting testnet server on 
port"+testnetPort);
                        } catch (IOException e) {
-                               Logger.error(this, "Testnet failed to accept 
socket: "+e, e);
+                               Logger.error(this, "Could not bind to testnet 
port: "+testnetPort);
+                               System.exit(Node.EXIT_TESTNET_FAILED);
+                               return;
                        }
-                       
+                       while(!server.isClosed()) {
+                               try {
+                                       Socket s = server.accept();
+                                       new TestnetSocketHandler(s);
+                               } catch (IOException e) {
+                                       Logger.error(this, "Testnet failed to 
accept socket: "+e, e);
+                               }       
+                       }
+                       Logger.normal(this, "Testnet handler has been stopped : 
restarting");
                }
        }

+       public void rebind(int port){
+               synchronized(server) {
+                       try{
+                               if(!server.isClosed()&&server.isBound())
+                                       server.close();
+                               this.testnetPort=port;
+                       }catch( IOException e){
+                               Logger.error(this, "Error while stopping the 
testnet handler.");
+                               System.exit(Node.EXIT_TESTNET_FAILED);
+                               return;
+                       }
+               }
+       }
+       
+       public int getPort(){
+               return testnetPort;
+       }
+       
        public class TestnetSocketHandler implements Runnable {

                private Socket s;
@@ -197,31 +217,20 @@

        }

-       private static class TestnetPortNumberCallback implements IntCallback {
+       
+       class TestnetPortNumberCallback implements IntCallback {

-               final Node node;
-               
-               TestnetPortNumberCallback(Node node) {
-                       this.node = node;
-               }
-               
                public int get() {
-                       TestnetHandler th = node.testnetHandler;
-                       if(th == null)
-                               return node.portNumber+1000;
-                       else
-                               return th.testnetPort;
+                       return getPort();
                }

                public void set(int val) throws InvalidConfigValueException {
-                       TestnetHandler th = node.testnetHandler;
-                       if(th == null)
-                               return;
-                       if(val == th.testnetPort) return;
-                       throw new InvalidConfigValueException("Changing testnet 
port number on the fly not yet supported");
+                       if(val == get()) return;
+                       rebind(val);
                }
-       }
+       }       

+       
        public static TestnetHandler maybeCreate(Node node, Config config) 
throws NodeInitException {
         SubConfig testnetConfig = new SubConfig("node.testnet", config);

@@ -233,18 +242,13 @@

         if(enabled) {
                // Get the testnet port
+
+               testnetConfig.register("port", node.portNumber+1000, 2, true, 
"Testnet port", "Testnet port number (-1 = listenPort+1000)",
+                               new TestnetPortNumberCallback());

-               // Default to node port plus 1000
-               
-               int defaultPort = 1024 + (node.portNumber-1024+1000) % (65536 - 
1024);
-               
-               testnetConfig.register("port", defaultPort, 2, true, "Testnet 
port", "Testnet port number (-1 = listenPort+1000)",
-                               new TestnetPortNumberCallback(node));
-               
                testnetConfig.finishedInitialization();

                int port = testnetConfig.getInt("port");
-               if(port == -1) port = defaultPort;
                return new TestnetHandler(node, port);
         } else return null;
        }


Reply via email to