mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-10-27 18:55:09 +03:00
basic: introduce in_addr_data_hash_ops
This commit is contained in:
parent
1c57fa90be
commit
6c39e02609
@ -571,3 +571,34 @@ int in_addr_prefix_from_string_auto(
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
void in_addr_data_hash_func(const void *p, struct siphash *state) {
|
||||
const struct in_addr_data *a = p;
|
||||
|
||||
siphash24_compress(&a->family, sizeof(a->family), state);
|
||||
|
||||
if (a->family == AF_INET)
|
||||
siphash24_compress(&a->address.in, sizeof(a->address.in), state);
|
||||
else if (a->family == AF_INET6)
|
||||
siphash24_compress(&a->address.in6, sizeof(a->address.in6), state);
|
||||
}
|
||||
|
||||
int in_addr_data_compare_func(const void *a, const void *b) {
|
||||
const struct in_addr_data *x = a, *y = b;
|
||||
|
||||
if (x->family != y->family)
|
||||
return x->family - y->family;
|
||||
|
||||
if (x->family == AF_INET)
|
||||
return memcmp(&x->address.in.s_addr, &y->address.in.s_addr, sizeof(struct in_addr));
|
||||
|
||||
if (x->family == AF_INET6)
|
||||
return memcmp(&x->address.in6.s6_addr, &y->address.in6.s6_addr, sizeof(struct in6_addr));
|
||||
|
||||
return trivial_compare_func(a, b);
|
||||
}
|
||||
|
||||
const struct hash_ops in_addr_data_hash_ops = {
|
||||
.hash = in_addr_data_hash_func,
|
||||
.compare = in_addr_data_compare_func,
|
||||
};
|
||||
|
@ -5,6 +5,7 @@
|
||||
#include <stddef.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include "hash-funcs.h"
|
||||
#include "macro.h"
|
||||
#include "util.h"
|
||||
|
||||
@ -53,3 +54,7 @@ static inline size_t FAMILY_ADDRESS_SIZE(int family) {
|
||||
}
|
||||
|
||||
#define IN_ADDR_NULL ((union in_addr_union) {})
|
||||
|
||||
void in_addr_data_hash_func(const void *p, struct siphash *state);
|
||||
int in_addr_data_compare_func(const void *a, const void *b);
|
||||
extern const struct hash_ops in_addr_data_hash_ops;
|
||||
|
Loading…
Reference in New Issue
Block a user