X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fhello%2Faddress.c;h=7819c2806fee8995189e3ae4a5d157c7760f684e;hb=d0701eb6315fc3f5aca74415bbf0ff7418409f87;hp=ae839155c988807a3afbfb0c3173d545acb0f9e9;hpb=a37183bb1f137d8a0457fc9c2428219e337cd6a7;p=oweals%2Fgnunet.git diff --git a/src/hello/address.c b/src/hello/address.c index ae839155c..7819c2806 100644 --- a/src/hello/address.c +++ b/src/hello/address.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - (C) 2009 Christian Grothoff (and other contributing authors) + Copyright (C) 2009 GNUnet e.V. GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -14,8 +14,8 @@ You should have received a copy of the GNU General Public License along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ /** @@ -28,6 +28,23 @@ #include "gnunet_util_lib.h" +/** + * Check if an address has a local option set + * + * @param address the address to check + * @param option the respective option to check for + * @return #GNUNET_YES or #GNUNET_NO + */ +int +GNUNET_HELLO_address_check_option (const struct GNUNET_HELLO_Address * address, + enum GNUNET_HELLO_AddressInfo option) +{ + if (option == (address->local_info & option)) + return GNUNET_YES; + return GNUNET_NO; +} + + /** * Get the size of an address struct. * @@ -38,7 +55,7 @@ size_t GNUNET_HELLO_address_get_size (const struct GNUNET_HELLO_Address * address) { return sizeof (struct GNUNET_HELLO_Address) + address->address_length + - strlen (address->transport_name) + 1; + strlen (address->transport_name) + 1; } @@ -49,30 +66,35 @@ GNUNET_HELLO_address_get_size (const struct GNUNET_HELLO_Address * address) * @param transport_name plugin name * @param address binary address * @param address_length number of bytes in 'address' + * @param local_info additional local information for the address * @return the address struct */ struct GNUNET_HELLO_Address * GNUNET_HELLO_address_allocate (const struct GNUNET_PeerIdentity *peer, - const char *transport_name, const void *address, - size_t address_length) + const char *transport_name, + const void *address, + size_t address_length, + enum GNUNET_HELLO_AddressInfo local_info) { struct GNUNET_HELLO_Address *addr; size_t slen; char *end; - GNUNET_assert (transport_name != NULL); - slen = strlen (transport_name) + 1; - addr = - GNUNET_malloc (sizeof (struct GNUNET_HELLO_Address) + address_length + - slen); + addr = GNUNET_malloc (sizeof (struct GNUNET_HELLO_Address) + + address_length + slen); addr->peer = *peer; addr->address = &addr[1]; - end = (char *) &addr[1]; - memcpy (end, address, address_length); addr->address_length = address_length; + addr->local_info = local_info; + end = (char *) &addr[1]; addr->transport_name = &end[address_length]; - memcpy (&end[address_length], transport_name, slen); + GNUNET_memcpy (end, + address, + address_length); + GNUNET_memcpy (&end[address_length], + transport_name, + slen); return addr; } @@ -86,9 +108,13 @@ GNUNET_HELLO_address_allocate (const struct GNUNET_PeerIdentity *peer, struct GNUNET_HELLO_Address * GNUNET_HELLO_address_copy (const struct GNUNET_HELLO_Address *address) { - return GNUNET_HELLO_address_allocate (&address->peer, address->transport_name, + if (NULL == address) + return NULL; + return GNUNET_HELLO_address_allocate (&address->peer, + address->transport_name, address->address, - address->address_length); + address->address_length, + address->local_info); } @@ -106,14 +132,25 @@ GNUNET_HELLO_address_cmp (const struct GNUNET_HELLO_Address *a1, { int ret; + if ( (NULL == a1) && + (NULL == a2) ) + return 0; + if (NULL == a1) + return 1; + if (NULL == a2) + return -1; ret = strcmp (a1->transport_name, a2->transport_name); if (0 != ret) return ret; + if (a1->local_info != a2->local_info) + return (((int) a1->local_info) < ((int) a2->local_info)) ? -1 : 1; if (a1->address_length < a2->address_length) return -1; if (a1->address_length > a2->address_length) return 1; - return memcmp (a1->address, a2->address, a1->address_length); + return memcmp (a1->address, + a2->address, + a1->address_length); }