* the previous (now invalid) one
* @param addr either the previous or the new public IP address
* @param addrlen actual lenght of @a addr
- * @param emsg NULL on success, otherwise an error message
+ * @param ret GNUNET_NAT_ERROR_SUCCESS on success, otherwise an error code
*/
static void
upnp_add (void *cls,
int add_remove,
const struct sockaddr *addr,
socklen_t addrlen,
- const char *emsg)
+ enum GNUNET_NAT_FailureCode ret)
{
struct GNUNET_NAT_Handle *h = cls;
struct LocalAddressList *pos;
struct LocalAddressList *next;
+
+ if (GNUNET_NAT_ERROR_SUCCESS != ret)
+ {
+ /* Error while running upnp client */
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ _("Error while running upnp client:\n"));
+
+ //FIXME: convert error code to string
+
+ return;
+ }
+
if (GNUNET_YES == add_remove)
{
add_to_address_list (h, LAL_UPNP, addr, addrlen);
return;
}
- /* remove address */
- next = h->lal_head;
- while (NULL != (pos = next))
+ else if (GNUNET_NO == add_remove)
{
- next = pos->next;
- if ((pos->source != LAL_UPNP) || (pos->addrlen != addrlen) ||
- (0 != memcmp (&pos[1], addr, addrlen)))
- continue;
- GNUNET_CONTAINER_DLL_remove (h->lal_head, h->lal_tail, pos);
- if (NULL != h->address_callback)
- h->address_callback (h->callback_cls, GNUNET_NO,
- (const struct sockaddr *) &pos[1], pos->addrlen);
- GNUNET_free (pos);
- return; /* only remove once */
+ /* remove address */
+ next = h->lal_head;
+ while (NULL != (pos = next))
+ {
+ next = pos->next;
+ if ((pos->source != LAL_UPNP) || (pos->addrlen != addrlen) ||
+ (0 != memcmp (&pos[1], addr, addrlen)))
+ continue;
+ GNUNET_CONTAINER_DLL_remove (h->lal_head, h->lal_tail, pos);
+ if (NULL != h->address_callback)
+ h->address_callback (h->callback_cls, GNUNET_NO,
+ (const struct sockaddr *) &pos[1], pos->addrlen);
+ GNUNET_free (pos);
+ return; /* only remove once */
+ }
+ /* asked to remove address that does not exist */
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "Asked to remove unkown address `%s'\n",
+ GNUNET_a2s(addr, addrlen));
+ GNUNET_break (0);
}
- /* asked to remove address that does not exist */
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Asked to remove unkown address `%s'\n",
- GNUNET_a2s(addr, addrlen));
- GNUNET_break (0);
+ else
+ {
+ GNUNET_break (0);
+ }
}
return; /* already got this port */
ml = ml->next;
}
+
ml = GNUNET_new (struct MiniList);
ml->port = port;
ml->mini = GNUNET_NAT_mini_map_start (port, h->is_tcp, &upnp_add, h);
+
+ if (NULL == ml->mini)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ _("Failed to run upnp client for port %u\n"), ml->port);
+ GNUNET_free (ml);
+ return;
+ }
+
GNUNET_CONTAINER_DLL_insert (h->mini_head, h->mini_tail, ml);
}
add_to_address_list (h, LAL_BINDTO_ADDRESS, sa,
sizeof (struct sockaddr_in));
if (h->enable_upnp)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Running upnp client for address `%s'\n",
+ GNUNET_a2s (sa,sizeof (struct sockaddr_in)));
add_minis (h, ntohs (v4->sin_port));
+ }
break;
case AF_INET6:
if (sizeof (struct sockaddr_in6) != h->local_addrlens[i])
if (NULL == reversal_callback)
h->enable_nat_server = GNUNET_NO;
+ /* Check for UPnP client, disable immediately if not available */
+ if ( (GNUNET_YES == h->enable_upnp) &&
+ (GNUNET_SYSERR ==
+ GNUNET_OS_check_helper_binary ("upnpc", GNUNET_NO, NULL)) )
+ {
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ _("UPnP enabled in configuration, but UPnP client `upnpc` command not found, disabling UPnP \n"));
+ h->enable_upnp = GNUNET_NO;
+ }
+
/* Check if NAT was hole-punched */
if ((NULL != h->address_callback) &&
(NULL != h->external_address) &&