Author: nextgens
Date: 2006-05-17 19:38:46 +0000 (Wed, 17 May 2006)
New Revision: 8748

Modified:
   trunk/freenet/src/freenet/io/comm/UdpSocketManager.java
   trunk/freenet/src/freenet/node/Node.java
Log:
fixes https://bugs.freenetproject.org/view.php?id=195 :

new config setting : node.bindTo

Modified: trunk/freenet/src/freenet/io/comm/UdpSocketManager.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/UdpSocketManager.java     2006-05-17 
18:30:55 UTC (rev 8747)
+++ trunk/freenet/src/freenet/io/comm/UdpSocketManager.java     2006-05-17 
19:38:46 UTC (rev 8748)
@@ -76,14 +76,14 @@
                }
        }

-       public UdpSocketManager(int listenPort) throws SocketException {
+       public UdpSocketManager(int listenPort, InetAddress bindto) throws 
SocketException {
                super("UdpSocketManager sender thread on port " + listenPort);
                    // Keep the Updater code in, just commented out, for now
                    // We may want to be able to do on-line updates.
 //                     if (Updater.hasResource()) {
 //                             _sock = (DatagramSocket) Updater.getResource();
 //                     } else {
-                               _sock = new DatagramSocket(listenPort);
+                               _sock = new DatagramSocket(listenPort, bindto);
 //                     }
                // Only used for debugging, no need to seed from Yarrow
                dropRandom = new Random();
@@ -530,10 +530,10 @@
                return _usm;
        }

-       public static void init(int externalListenPort)
+       public static void init(int externalListenPort, InetAddress bindto)
                throws SocketException
        {
-               _usm = new UdpSocketManager(externalListenPort);
+               _usm = new UdpSocketManager(externalListenPort, bindto);
        }

     public int getPortNumber() {

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2006-05-17 18:30:55 UTC (rev 
8747)
+++ trunk/freenet/src/freenet/node/Node.java    2006-05-17 19:38:46 UTC (rev 
8748)
@@ -86,6 +86,7 @@
 import freenet.keys.NodeSSK;
 import freenet.keys.SSKBlock;
 import freenet.keys.SSKVerifyException;
+import freenet.node.TextModeClientInterfaceServer.TMCIBindtoCallback;
 import freenet.node.fcp.FCPServer;
 import freenet.pluginmanager.PluginManager;
 import freenet.store.BerkeleyDBFreenetStore;
@@ -119,6 +120,27 @@
  */
 public class Node {

+       static class NodeBindtoCallback implements StringCallback {
+       
+       final Node node;
+       
+       NodeBindtoCallback(Node n) {
+               this.node = n;
+       }
+       
+       public String get() {
+               if(node.getBindTo()!=null)
+                       return node.getBindTo();
+               else
+                       return "0.0.0.0";
+       }
+       
+       public void set(String val) throws InvalidConfigValueException {
+               if(val == get()) return;
+               throw new InvalidConfigValueException("Cannot be updated on the 
fly");
+       }
+    }
+       
        public class MyARKInserter implements ClientCallback {

                private ClientPutter inserter;
@@ -507,6 +529,7 @@
     public final ClientRequestScheduler chkPutScheduler;
     public final ClientRequestScheduler sskFetchScheduler;
     public final ClientRequestScheduler sskPutScheduler;
+    final String bindto;
     TextModeClientInterfaceServer tmci;
     TextModeClientInterface directTMCI;
     FCPServer fcpServer;
@@ -856,6 +879,15 @@
                        }
        }

+       // Determine where to bind to
+       
+
+       
+               nodeConfig.register("bindTo", "0.0.0.0", 2, true, "IP address 
to bind to", "IP address to bind to",
+                               new NodeBindtoCallback(this));
+       
+               this.bindto = nodeConfig.getString("bindTo");
+               
        // Determine the port number

        nodeConfig.register("listenPort", -1 /* means random */, 1, true, "FNP 
port number (UDP)", "UDP port for node-to-node communications (Freenet Node 
Protocol)",
@@ -891,10 +923,10 @@
                for(int i=0;i<200000;i++) {
                        int portNo = 1024 + random.nextInt(65535-1024);
                        try {
-                               u = new UdpSocketManager(portNo);
+                               u = new UdpSocketManager(portNo, 
InetAddress.getByName(bindto));
                                port = u.getPortNumber();
                                break;
-                       } catch (SocketException e) {
+                       } catch (Exception e) {
                                Logger.normal(this, "Could not use port: 
"+portNo+": "+e, e);
                                System.err.println("Could not use port: 
"+portNo+": "+e);
                                e.printStackTrace();
@@ -905,8 +937,8 @@
                        throw new 
NodeInitException(EXIT_NO_AVAILABLE_UDP_PORTS, "Could not find an available UDP 
port number for FNP (none specified)");
        } else {
                try {
-                       u = new UdpSocketManager(port);
-               } catch (SocketException e) {
+                       u = new UdpSocketManager(port, 
InetAddress.getByName(bindto));
+               } catch (Exception e) {
                        throw new NodeInitException(EXIT_IMPOSSIBLE_USM_PORT, 
"Could not bind to port: "+port+" (node already running?)");
                }
        }
@@ -2559,4 +2591,8 @@
                if(arkPutter != null)
                        arkPutter.onConnectedPeer();
        }
+       
+       public String getBindTo(){
+               return this.bindto;
+       }
 }


Reply via email to