X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fhello%2Faddress.c;h=893a6dc9113e4db3ae5b11467d23381f67479cd7;hb=07120d4c0d2ca7d54d20c85e936763675b832c98;hp=51fb296c3402f766293f1d29ad1bd40fffab57f2;hpb=ea3ff01740cdfd4505503bcff9f5d889ce1b4545;p=oweals%2Fgnunet.git diff --git a/src/hello/address.c b/src/hello/address.c index 51fb296c3..893a6dc91 100644 --- a/src/hello/address.c +++ b/src/hello/address.c @@ -39,21 +39,22 @@ */ 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) { 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]; + end = (char *) &addr[1]; memcpy (end, address, address_length); addr->address_length = address_length; addr->transport_name = &end[address_length]; @@ -61,4 +62,59 @@ GNUNET_HELLO_address_allocate (const struct GNUNET_PeerIdentity *peer, 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. + * + * @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) +{ + return GNUNET_HELLO_address_allocate (&address->peer, address->transport_name, + address->address, + address->address_length); +} + + +/** + * 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; + + ret = strcmp (a1->transport_name, a2->transport_name); + if (0 != ret) + return ret; + 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); +} + + /* end of address.c */