X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fhello%2Faddress.c;h=9b7bb2019d3894cc394adfc44c009226cbe4121c;hb=094b6d73c32fdaf5749102a653e666ab2e415747;hp=b763414d2145bde418dbe27ec5a65af8d87f9944;hpb=78c8e788303f3c1dc35037b29dd3ed264306e0cc;p=oweals%2Fgnunet.git diff --git a/src/hello/address.c b/src/hello/address.c index b763414d2..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. */ /** @@ -33,17 +33,18 @@ * * @param address the address to check * @param option the respective option to check for - * @return GNUNET_YES or GNUNET_NO + * @return #GNUNET_YES or #GNUNET_NO */ int GNUNET_HELLO_address_check_option (const struct GNUNET_HELLO_Address * address, - enum GNUNET_HELLO_AddressInfo option) + enum GNUNET_HELLO_AddressInfo option) { if (option == (address->local_info & option)) return GNUNET_YES; return GNUNET_NO; } + /** * Get the size of an address struct. * @@ -54,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; } @@ -65,11 +66,13 @@ 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, + const char *transport_name, + const void *address, size_t address_length, enum GNUNET_HELLO_AddressInfo local_info) { @@ -77,20 +80,21 @@ GNUNET_HELLO_address_allocate (const struct GNUNET_PeerIdentity *peer, 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->transport_name = &end[address_length]; addr->local_info = local_info; - memcpy (&end[address_length], transport_name, slen); + end = (char *) &addr[1]; + addr->transport_name = &end[address_length]; + memcpy (end, + address, + address_length); + memcpy (&end[address_length], + transport_name, + slen); return addr; } @@ -104,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, 0); + address->address_length, + address->local_info); } @@ -124,9 +132,18 @@ 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)