[Top][All Lists]
[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 *
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [microdc-devel] microdc2: add an ability to set external address [patch],
Панков Павел <=