microdc-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[microdc-devel] microdc2: add an ability to set external address [patch]


From: Панков Павел
Subject: [microdc-devel] microdc2: add an ability to set external address [patch]
Date: Sat, 03 Mar 2007 17:14:30 +0300
User-agent: Thunderbird 1.5.0.9 (Windows/20061207)

Hello, list.

I have to connect to my city LAN through NAT router. I have set up port forwarding on this router, so all incoming packets on some port come to my computer. Such setup perfectly works with DC++-based clients, as they have the ability to set external address sent to other clients. In microdc2 I couldn't found such feature and created a small patch (attached) to fix it. It adds new variable externaladdr, which controls the address sent to peers.
diff -ruN microdc2-0.15.6/src/hub.c microdc2-0.15.6-external-address/src/hub.c
--- microdc2-0.15.6/src/hub.c   Sun Dec 24 21:41:44 2006
+++ microdc2-0.15.6-external-address/src/hub.c  Sat Mar  3 16:33:13 2007
@@ -1092,7 +1092,7 @@
                connect =  true;
                goto cleanup;
         }
-       if (!hub_putf("$ConnectToMe %s %s:%u|", hub_ui_nick, 
inet_ntoa(local_addr.sin_addr), listen_port))
+       if (!hub_putf("$ConnectToMe %s %s:%u|", hub_ui_nick, inet_ntoa( 
(external_addr.s_addr == INADDR_NONE) ? local_addr.sin_addr : external_addr ), 
listen_port))
                goto cleanup;
         ui->active_state = DC_ACTIVE_SENT_ACTIVE;
     } else {
diff -ruN microdc2-0.15.6/src/microdc.h 
microdc2-0.15.6-external-address/src/microdc.h
--- microdc2-0.15.6/src/microdc.h       Sun Dec 24 21:27:15 2006
+++ microdc2-0.15.6-external-address/src/microdc.h      Sat Mar  3 15:57:56 2007
@@ -371,6 +371,7 @@
 extern uint32_t log_flags;
 
 extern uint16_t listen_port;
+extern struct in_addr external_addr;
 extern char *my_tag;
 extern char *my_nick;
 extern char *my_description;
diff -ruN microdc2-0.15.6/src/search.c 
microdc2-0.15.6-external-address/src/search.c
--- microdc2-0.15.6/src/search.c        Fri Dec  1 22:37:37 2006
+++ microdc2-0.15.6-external-address/src/search.c       Sat Mar  3 15:59:34 2007
@@ -689,7 +689,7 @@
     hub_args = main_to_hub_string(args);
 
     if (is_active) {
-        hub_putf("$Search %s:%u F?F?0?1?%s|", inet_ntoa(local_addr.sin_addr), 
listen_port, hub_args);
+        hub_putf("$Search %s:%u F?F?0?1?%s|", inet_ntoa( (external_addr.s_addr 
== INADDR_NONE) ? local_addr.sin_addr : external_addr ), listen_port, hub_args);
     } else {
         char *hub_my_nick;
         hub_my_nick = main_to_hub_string(my_nick);
diff -ruN microdc2-0.15.6/src/variables.c 
microdc2-0.15.6-external-address/src/variables.c
--- microdc2-0.15.6/src/variables.c     Sun Dec 24 21:42:07 2006
+++ microdc2-0.15.6-external-address/src/variables.c    Sat Mar  3 16:13:17 2007
@@ -79,6 +79,8 @@
 static void var_set_auto_reconnect(DCVariable *var, int argc, char **argv);
 static char *var_get_listen_addr(DCVariable *var);
 static void var_set_listen_addr(DCVariable *var, int argc, char **argv);
+static char *var_get_external_addr(DCVariable *var);
+static void var_set_external_addr(DCVariable *var, int argc, char **argv);
 static char *var_get_listen_port(DCVariable *var);
 static void var_set_listen_port(DCVariable *var, int argc, char **argv);
 static char *var_get_display_flags(DCVariable *var);
@@ -120,6 +122,7 @@
 uint32_t display_flags = ~(DC_DF_DEBUG); /* All flags except debug set */
 uint32_t log_flags = ~(DC_DF_DEBUG);
 struct in_addr force_listen_addr = { INADDR_NONE };
+struct in_addr external_addr = { INADDR_NONE };
 
 /* This list must be sorted according to strcmp. */
 DCDisplayFlagDetails display_flag_details[] =  {
@@ -217,6 +220,13 @@
       var_get_listen_addr, var_set_listen_addr, &force_listen_addr,
       NULL,
       NULL,
+      "Address to bind to"
+    },
+    {
+      "externaladdr",
+      var_get_external_addr, var_set_external_addr, &external_addr,
+      NULL,
+      NULL,
       "Address to send to clients"
     },
     {
@@ -633,6 +643,48 @@
 
     force_listen_addr = addr.sin_addr;
     screen_putf(_("Listening address set to %s.\n"), 
inet_ntoa(force_listen_addr));
+}
+
+static char *
+var_get_external_addr(DCVariable *var)
+{
+    if (external_addr.s_addr == INADDR_NONE)
+        return NULL;
+    return xstrdup(in_addr_str(external_addr));
+}
+
+static void
+var_set_external_addr(DCVariable *var, int argc, char **argv)
+{
+    struct sockaddr_in addr;
+
+    if (argc > 2) {
+        warn(_("too many arguments\n"));
+        return;
+    }
+    if (argv[1][0] == '\0') {
+        external_addr.s_addr = INADDR_NONE;
+        screen_putf(_("Removing external address.\n"));
+        return;
+    }
+
+    if (!inet_aton(argv[1], &addr.sin_addr)) {
+        screen_putf(_("%s: Specify external address as an IP address\n"), 
quotearg(argv[1]));
+        /* XXX: fix this in the future... */
+       /*struct hostent *he;
+
+       screen_putf(_("Looking up IP address for %s\n"), quotearg(argv[1]));
+       he = gethostbyname(argv[1]);
+       if (he == NULL) {
+           screen_putf(_("%s: Cannot look up address - %s\n"), 
quotearg(argv[1]), hstrerror(h_errno));
+           return;
+       }
+
+       addr.sin_addr = *(struct in_addr *) he->h_addr;*/
+    }
+
+    external_addr = addr.sin_addr;
+    screen_putf(_("External address set to %s.\n"), inet_ntoa(external_addr));
 }
 
 static char *

reply via email to

[Prev in Thread] Current Thread [Next in Thread]