"David Reid" <dreid@xxxxxxxxxxxx> wrote:
>> struct sockaddr {
>> uint8 sa_len;
>> uint8 sa_family;
>> uint8 sa_data[30];
>> };
>What happens if it's an ipv6 address?
Than it should work just fine, only the ipv4 is broken.
Because sa_data is of uint8 type, not uint32, and = does not compare, and
memcmp results are different from == results.
This is wrong:
int compare_sockaddr(struct sockaddr *a, struct sockaddr *b)
{
if (a->sa_len == 4) /* IPv4 address, basically a uint32 */
return (*(a->sa_data) = *(b->sa_data));
return memcmp((void*)a->sa_data, (void*)b->sa_data, a->sa_len);
}
This should work:
int compare_sockaddr(struct sockaddr *a, struct sockaddr *b)
{
if (a->sa_len == 4) /* IPv4 address, basically a uint32 */
return (*(uint32*)(a->sa_data) == *(uint32 *)(b->sa_data)) ? 1
: 0;
return memcmp((void*)a->sa_data, (void*)b->sa_data, a->sa_len);
}
located in
net_kit/source/server/util/misc.c
and
net_kit/source/server/net_server/misc.c
>(not sure how good it'll be after the drink though :))
Don't drink and code :)
regards
Marcus