X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fhello%2Faddress.c;h=9b7bb2019d3894cc394adfc44c009226cbe4121c;hb=094b6d73c32fdaf5749102a653e666ab2e415747;hp=51fb296c3402f766293f1d29ad1bd40fffab57f2;hpb=ea3ff01740cdfd4505503bcff9f5d889ce1b4545;p=oweals%2Fgnunet.git diff --git a/src/hello/address.c b/src/hello/address.c index 51fb296c3..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,30 +66,90 @@ * @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; 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; } + +/** + * Copy an address struct. + * + * @param address address to copy + * @return a copy of the address struct + */ +struct GNUNET_HELLO_Address * +GNUNET_HELLO_address_copy (const struct GNUNET_HELLO_Address *address) +{ + if (NULL == address) + return NULL; + return GNUNET_HELLO_address_allocate (&address->peer, + address->transport_name, + address->address, + address->address_length, + address->local_info); +} + + +/** + * Compare two addresses. Does NOT compare the peer identity, + * that is assumed already to match! + * + * @param a1 first address + * @param a2 second address + * @return 0 if the addresses are equal, -1 if a1a2. + */ +int +GNUNET_HELLO_address_cmp (const struct GNUNET_HELLO_Address *a1, + const struct GNUNET_HELLO_Address *a2) +{ + 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, a2->address, a1->address_length); +} + + /* end of address.c */