diff options
Diffstat (limited to 'src/nat/natpmp.c')
-rw-r--r-- | src/nat/natpmp.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/src/nat/natpmp.c b/src/nat/natpmp.c index 16d68c702..2a9187295 100644 --- a/src/nat/natpmp.c +++ b/src/nat/natpmp.c | |||
@@ -65,6 +65,7 @@ struct GNUNET_NAT_NATPMP_Handle | |||
65 | { | 65 | { |
66 | const struct sockaddr *addr; | 66 | const struct sockaddr *addr; |
67 | socklen_t addrlen; | 67 | socklen_t addrlen; |
68 | struct sockaddr *ext_addr; | ||
68 | int is_mapped; | 69 | int is_mapped; |
69 | int has_discovered; | 70 | int has_discovered; |
70 | int port; | 71 | int port; |
@@ -107,6 +108,7 @@ GNUNET_NAT_NATPMP_init (const struct sockaddr *addr, socklen_t addrlen, | |||
107 | nat->port = port; | 108 | nat->port = port; |
108 | nat->addr = addr; | 109 | nat->addr = addr; |
109 | nat->addrlen = addrlen; | 110 | nat->addrlen = addrlen; |
111 | nat->ext_addr = NULL; | ||
110 | return nat; | 112 | return nat; |
111 | } | 113 | } |
112 | 114 | ||
@@ -160,10 +162,28 @@ GNUNET_NAT_NATPMP_pulse (struct GNUNET_NAT_NATPMP_Handle *nat, int is_enabled, | |||
160 | log_val ("readnatpmpresponseorretry", val); | 162 | log_val ("readnatpmpresponseorretry", val); |
161 | if (val >= 0) | 163 | if (val >= 0) |
162 | { | 164 | { |
163 | *ext_addr = | 165 | if (nat->ext_addr) |
164 | GNUNET_malloc (sizeof (response.pnu.publicaddress.addr)); | 166 | { |
165 | memcpy (*ext_addr, &response.pnu.publicaddress.addr, | 167 | GNUNET_free (nat->ext_addr); |
166 | (sizeof (response.pnu.publicaddress.addr))); | 168 | nat->ext_addr = NULL; |
169 | } | ||
170 | |||
171 | if (response.pnu.publicaddress.family == AF_INET) | ||
172 | { | ||
173 | nat->ext_addr = | ||
174 | GNUNET_malloc (sizeof (struct in_addr)); | ||
175 | memcpy (nat->ext_addr, &response.pnu.publicaddress.addr, | ||
176 | sizeof (struct in_addr)); | ||
177 | } | ||
178 | else | ||
179 | { | ||
180 | nat->ext_addr = | ||
181 | GNUNET_malloc (sizeof (struct in6_addr)); | ||
182 | memcpy (nat->ext_addr, &response.pnu.publicaddress.addr6, | ||
183 | (sizeof (struct in6_addr))); | ||
184 | } | ||
185 | |||
186 | *ext_addr = nat->ext_addr; | ||
167 | #ifdef DEBUG | 187 | #ifdef DEBUG |
168 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, COMP_NAT_NATPMP, | 188 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, COMP_NAT_NATPMP, |
169 | _("Found public IP address %s\n"), | 189 | _("Found public IP address %s\n"), |