X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fhello%2Faddress.c;h=9b7bb2019d3894cc394adfc44c009226cbe4121c;hb=094b6d73c32fdaf5749102a653e666ab2e415747;hp=893a6dc9113e4db3ae5b11467d23381f67479cd7;hpb=31b3cceaa950713ede6a69b1ccb52a298ed54a08;p=oweals%2Fgnunet.git diff --git a/src/hello/address.c b/src/hello/address.c index 893a6dc91..9b7bb2019 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 Christian Grothoff (and other contributing authors) 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,37 @@ #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. + * + * @param address address + * @return the size + */ +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; +} + + /** * Allocate an address struct. * @@ -35,48 +66,39 @@ * @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); + memcpy (end, + address, + address_length); + memcpy (&end[address_length], + transport_name, + slen); return addr; } -/** - * Get the size of an address struct. - * - * @param address address - * @return the size - */ -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; -} - - /** * Copy an address struct. * @@ -86,9 +108,13 @@ GNUNET_HELLO_address_get_size (const struct GNUNET_HELLO_Address * address) 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,23 @@ 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); if (a1->address_length < a2->address_length) return -1; if (a1->address_length > a2->address_length) return 1; - return memcmp (a1->address, a1->address, a1->address_length); + return memcmp (a1->address, a2->address, a1->address_length); }