diff options
Diffstat (limited to 'stun/stunmessage.c')
-rw-r--r-- | stun/stunmessage.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/stun/stunmessage.c b/stun/stunmessage.c index 48e817f..289d3b4 100644 --- a/stun/stunmessage.c +++ b/stun/stunmessage.c @@ -266,7 +266,19 @@ stun_message_find_xor_addr (const StunMessage *msg, stun_attr_type_t type, if (val) return val; - return stun_xor_address (msg, addr, *addrlen); + return stun_xor_address (msg, addr, *addrlen, STUN_MAGIC_COOKIE); +} + +int +stun_message_find_xor_addr_full (const StunMessage *msg, stun_attr_type_t type, + struct sockaddr *restrict addr, socklen_t *restrict addrlen, + uint32_t magic_cookie) +{ + int val = stun_message_find_addr (msg, type, addr, addrlen); + if (val) + return val; + + return stun_xor_address (msg, addr, *addrlen, magic_cookie); } int stun_message_find_error (const StunMessage *msg, int *restrict code) @@ -444,7 +456,28 @@ int stun_message_append_xor_addr (StunMessage *msg, stun_attr_type_t type, addrlen = sizeof (xor); memcpy (&xor, addr, addrlen); - val = stun_xor_address (msg, (struct sockaddr *)&xor, addrlen); + val = stun_xor_address (msg, (struct sockaddr *)&xor, addrlen, + STUN_MAGIC_COOKIE); + if (val) + return val; + + return stun_message_append_addr (msg, type, (struct sockaddr *)&xor, + addrlen); +} + +int stun_message_append_xor_addr_full (StunMessage *msg, stun_attr_type_t type, + const struct sockaddr *restrict addr, socklen_t addrlen, + uint32_t magic_cookie) +{ + int val; + /* Must be big enough to hold any supported address: */ + struct sockaddr_storage xor; + + if (addrlen > sizeof (xor)) + addrlen = sizeof (xor); + memcpy (&xor, addr, addrlen); + + val = stun_xor_address (msg, (struct sockaddr *)&xor, addrlen, magic_cookie); if (val) return val; |