forked from antirez/yaku-ns
-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
htkey.c
78 lines (70 loc) · 1.81 KB
/
htkey.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/* htkey.c
* Translate a Resource Record reference to the hash table key
*
* Copyright (C) 2000 Salvatore Sanfilippo
* Copyright (C) 2001 Salvatore Sanfilippo
* Copyright (C) 2002 Salvatore Sanfilippo
*
* This code is under the GPL license
* See the COPYING file for more information
*/
#include "ens.h"
#include <string.h>
#include <ctype.h>
#include "aht.h"
/* Key format:
*
* [klen][seq][type][class][name]
*
* The key is not nul terminated, fields description:
*
* klen: 2 bytes total key length (including itself)
* seq: 4 bytes sequence number, to distinguish and access to multiple
* entries with the same RR type/class/name.
* type: RR type
* class: RR class
* name: RR name
*
* The format was changed the 2002-09-09. The change was needed to
* support the new AHT hash-table library */
size_t rr_to_key(char *dest, size_t dsize, char *name, u_int16_t type,
u_int16_t class, u_int32_t seq)
{
size_t l = strlen(name);
u_int16_t ltwo;
unsigned int i;
char *p;
yakuns_assert(dsize >= 33);
memcpy(dest+2, &seq, 4);
memcpy(dest+6, &type, 2);
memcpy(dest+8, &class, 2);
l = (l > dsize-10) ? (dsize-10) : l;
memcpy(dest+10, name, l);
p = dest+10;
/* put it lowercase -- but note that we save the resource
* record with the original case to avoid useless information
* leak */
for (i = 0; i < l; i++)
p[i] = tolower(p[i]);
ltwo = l;
memcpy(dest, <wo, 2);
return 10 + l;
}
/* Compare two keys */
int ht_dnskey_compare(void *key1, void *key2)
{
u_int16_t k1l, k2l;
memcpy(&k1l, key1, 2);
memcpy(&k2l, key2, 2);
if (k1l != k2l)
return 0; /* keys of different length can't match */
return !memcmp(key1, key2, k1l);
}
/* Hash a given key */
u_int32_t ht_dnskey_hash(void *key)
{
u_int16_t l;
memcpy(&l, key, 2);
return ht_strong_hash(key, l, 0x11223344);
}