undns 0.4.0a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/bin/undns_decode +29 -0
- data/ext/undns/buffer.c +247 -0
- data/ext/undns/buffer.h +59 -0
- data/ext/undns/config.h +2 -0
- data/ext/undns/conventions.c +1813 -0
- data/ext/undns/conventions.h +89 -0
- data/ext/undns/conventlex.c +2808 -0
- data/ext/undns/earth.c +180 -0
- data/ext/undns/earth.h +4 -0
- data/ext/undns/exception.h +12 -0
- data/ext/undns/extconf.rb +44 -0
- data/ext/undns/filetest.c +90 -0
- data/ext/undns/filetest.h +7 -0
- data/ext/undns/hashes.c +104 -0
- data/ext/undns/hashes.h +48 -0
- data/ext/undns/hashtable.c +518 -0
- data/ext/undns/hashtable.h +103 -0
- data/ext/undns/my_ruby.h +3 -0
- data/ext/undns/nscommon.h +207 -0
- data/ext/undns/originAS.c +134 -0
- data/ext/undns/originAS.h +17 -0
- data/ext/undns/progress.c +285 -0
- data/ext/undns/progress.h +45 -0
- data/ext/undns/queue.c +346 -0
- data/ext/undns/queue.h +70 -0
- data/ext/undns/radix.c +517 -0
- data/ext/undns/radix.h +72 -0
- data/ext/undns/ruleset.c +603 -0
- data/ext/undns/ruleset.h +108 -0
- data/ext/undns/swig-undns_wrap-rb.c +2995 -0
- data/ext/undns/typed_hashtable.h +158 -0
- data/ext/undns/typed_queue.h +112 -0
- data/ext/undns/xmalloc.c +153 -0
- data/ext/undns/xmalloc.h +14 -0
- data/lib/undns.rb +5 -0
- metadata +84 -0
@@ -0,0 +1,103 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2002
|
3
|
+
* Neil Spring and the University of Washington.
|
4
|
+
* All rights reserved.
|
5
|
+
*
|
6
|
+
* Redistribution and use in source and binary forms, with or without
|
7
|
+
* modification, are permitted provided that the following conditions
|
8
|
+
* are met:
|
9
|
+
* 1. Redistributions of source code must retain the above copyright
|
10
|
+
* notice, this list of conditions and the following disclaimer.
|
11
|
+
* 2. Redistributions in binary form must reproduce the above copyright
|
12
|
+
* notice, this list of conditions and the following disclaimer in the
|
13
|
+
* documentation and/or other materials provided with the distribution.
|
14
|
+
* 3. The name of the author(s) may not be used to endorse or promote
|
15
|
+
* products derived from this software without specific prior
|
16
|
+
* written permission.
|
17
|
+
*
|
18
|
+
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
|
19
|
+
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
20
|
+
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
21
|
+
* IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
22
|
+
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
23
|
+
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
24
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
25
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
26
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
27
|
+
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
28
|
+
*/
|
29
|
+
|
30
|
+
#ifndef _hashtable_h
|
31
|
+
#define _hashtable_h
|
32
|
+
|
33
|
+
#include "nscommon.h"
|
34
|
+
|
35
|
+
NS_BEGIN_DECLS
|
36
|
+
|
37
|
+
struct hashtable_struct;
|
38
|
+
typedef struct hashtable_struct *hashtable;
|
39
|
+
|
40
|
+
void ht_delete(/*@only@*/ hashtable deleteme, boolean show_progress);
|
41
|
+
|
42
|
+
typedef unsigned int (*hash_cb)(const void *key);
|
43
|
+
typedef boolean (*isequal_cb)(const void *key1, const void *key2);
|
44
|
+
typedef void (*delete_cb)(void *key);
|
45
|
+
hashtable ht_new(unsigned int size,
|
46
|
+
hash_cb hash,
|
47
|
+
isequal_cb isequal,
|
48
|
+
/*@null@*/ delete_cb free_keyval);
|
49
|
+
void ht_insert(hashtable ht, /*@owned@*/const void *keyval);
|
50
|
+
/* true if found and removed */
|
51
|
+
boolean ht_remove(hashtable ht, const void *key);
|
52
|
+
typedef boolean (*ht_delete_if_cb)(void *keyval, void *user);
|
53
|
+
unsigned int ht_delete_if(hashtable ht,
|
54
|
+
ht_delete_if_cb callback,
|
55
|
+
/*@null@*/ void *user);
|
56
|
+
void ht_free_entry(hashtable ht, const void *keyval);
|
57
|
+
/*@dependent@*/ /*@null@*/
|
58
|
+
void *ht_lookup(hashtable ht, const void *key);
|
59
|
+
|
60
|
+
typedef void * (*ht_constructor_cb)(const void *key);
|
61
|
+
/*@dependent@*/
|
62
|
+
void *ht_lookup_nofail(hashtable ht,
|
63
|
+
const void *key,
|
64
|
+
ht_constructor_cb constructor);
|
65
|
+
|
66
|
+
/* returns true if it should continue to be called */
|
67
|
+
typedef boolean (*ht_iterator_cb)(const void *keyval, void *user);
|
68
|
+
boolean ht_iterate(hashtable ht,
|
69
|
+
ht_iterator_cb callback,
|
70
|
+
void *user);
|
71
|
+
|
72
|
+
typedef boolean (*ht_iterator_pair_cb)(const void *keyval, const void *keyval2);
|
73
|
+
boolean ht_iterate_pairs(hashtable ht, unsigned int nThreads, unsigned int chunkSize,
|
74
|
+
ht_iterator_pair_cb callback);
|
75
|
+
|
76
|
+
/* not-const version of the above; differs only in type. */
|
77
|
+
typedef boolean (*ht_iterator_cb_nc)(void *keyval, void *user);
|
78
|
+
boolean ht_iterate_nc(hashtable ht,
|
79
|
+
ht_iterator_cb_nc callback,
|
80
|
+
void *user);
|
81
|
+
|
82
|
+
unsigned long ht_count(hashtable ht);
|
83
|
+
|
84
|
+
void ht_occupancyjgr(const hashtable ht, const char *fname);
|
85
|
+
|
86
|
+
/* works if you're storing ints, or if the key is
|
87
|
+
already generated and the first int in the structure */
|
88
|
+
unsigned int hash_8byte(const void *k);
|
89
|
+
boolean isequal_8byte(const void *ia, const void *ib);
|
90
|
+
unsigned int hash_k_int(const int *k);
|
91
|
+
boolean isequal_k_int(const int *ia, const int *ib);
|
92
|
+
struct in_addr;
|
93
|
+
unsigned int hash_k_saddr(const struct in_addr *k);
|
94
|
+
boolean isequal_k_saddr(const struct in_addr *ia, const struct in_addr *ib);
|
95
|
+
unsigned int hash_k_uint(const unsigned int *k);
|
96
|
+
boolean isequal_k_uint(const unsigned int *ia, const unsigned int *ib);
|
97
|
+
unsigned int hash_int(const void *k);
|
98
|
+
boolean isequal_int(const void *ia, const void *ib);
|
99
|
+
unsigned int hash_ushort(const void *k);
|
100
|
+
boolean isequal_ushort(const void *ia, const void *ib);
|
101
|
+
|
102
|
+
NS_END_DECLS
|
103
|
+
#endif
|
data/ext/undns/my_ruby.h
ADDED
@@ -0,0 +1,207 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2002
|
3
|
+
* Neil Spring and the University of Washington.
|
4
|
+
* All rights reserved.
|
5
|
+
*
|
6
|
+
* Redistribution and use in source and binary forms, with or without
|
7
|
+
* modification, are permitted provided that the following conditions
|
8
|
+
* are met:
|
9
|
+
* 1. Redistributions of source code must retain the above copyright
|
10
|
+
* notice, this list of conditions and the following disclaimer.
|
11
|
+
* 2. Redistributions in binary form must reproduce the above copyright
|
12
|
+
* notice, this list of conditions and the following disclaimer in the
|
13
|
+
* documentation and/or other materials provided with the distribution.
|
14
|
+
* 3. The name of the author(s) may not be used to endorse or promote
|
15
|
+
* products derived from this software without specific prior
|
16
|
+
* written permission.
|
17
|
+
*
|
18
|
+
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
|
19
|
+
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
20
|
+
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
21
|
+
* IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
22
|
+
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
23
|
+
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
24
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
25
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
26
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
27
|
+
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
28
|
+
*/
|
29
|
+
|
30
|
+
#ifndef _NS_COMMON_H
|
31
|
+
#define _NS_COMMON_H
|
32
|
+
|
33
|
+
#ifdef HAVE_CONFIG_H
|
34
|
+
#include <config.h>
|
35
|
+
#endif
|
36
|
+
|
37
|
+
#ifdef HAVE_SYS_TIME_H
|
38
|
+
#include <sys/time.h>
|
39
|
+
#endif
|
40
|
+
|
41
|
+
#ifdef __cplusplus
|
42
|
+
# define NS_BEGIN_DECLS extern "C" {
|
43
|
+
# define NS_END_DECLS }
|
44
|
+
#else
|
45
|
+
# define NS_BEGIN_DECLS /* empty */
|
46
|
+
# define NS_END_DECLS /* empty */
|
47
|
+
#endif
|
48
|
+
|
49
|
+
NS_BEGIN_DECLS
|
50
|
+
|
51
|
+
#ifdef __LCLINT__
|
52
|
+
#define UNUSED(x) /*@unused@*/ ##x
|
53
|
+
typedef unsigned char u_int8_t;
|
54
|
+
typedef unsigned short u_int16_t;
|
55
|
+
typedef unsigned int u_int32_t;
|
56
|
+
typedef unsigned long long u_int64_t;
|
57
|
+
#else
|
58
|
+
#define UNUSED(x) x __attribute__((unused))
|
59
|
+
#endif
|
60
|
+
|
61
|
+
#ifdef __LCLINT__
|
62
|
+
#define __STDC__
|
63
|
+
char *rindex(const char *s, char c); /* not really true; it's an int */
|
64
|
+
/*@dependent@*/char *index(const char *s, char c); /* not really true; it's an int */
|
65
|
+
char *strdup(const char *s); /* probably a good annotation here */
|
66
|
+
/*@printflike@*/
|
67
|
+
int /*@alt void@*/ snprintf(/*@out@*/char *s, size_t x, const char *fmt, ...);
|
68
|
+
#endif
|
69
|
+
|
70
|
+
typedef unsigned char boolean;
|
71
|
+
|
72
|
+
#ifndef FALSE
|
73
|
+
#define FALSE 0
|
74
|
+
#endif
|
75
|
+
#ifndef TRUE
|
76
|
+
#define TRUE (!FALSE)
|
77
|
+
#endif
|
78
|
+
|
79
|
+
#ifdef __LCLINT__
|
80
|
+
/* lclint doesn't do typeof */
|
81
|
+
#define min(x,y) ((x > y) ? x : y)
|
82
|
+
#define max(x,y) ((x > y) ? x : y)
|
83
|
+
#else
|
84
|
+
/* from linux/kernel.h */
|
85
|
+
#define min(x,y) ({ \
|
86
|
+
const typeof(x) _xi = (x); \
|
87
|
+
const typeof(y) _yi = (y); \
|
88
|
+
(void) (&_xi == &_yi); \
|
89
|
+
_xi < _yi ? _xi : _yi; })
|
90
|
+
#define max(x,y) ({ \
|
91
|
+
const typeof(x) _xa = (x); \
|
92
|
+
const typeof(y) _ya = (y); \
|
93
|
+
(void) (&_xa == &_ya); \
|
94
|
+
_xa > _ya ? _xa : _ya; })
|
95
|
+
#endif
|
96
|
+
|
97
|
+
#define DEBUG_PRINT(x...) do { } while (0)
|
98
|
+
// #define DEBUG_PRINT(x) fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, x);
|
99
|
+
#define DEBUG_PRINTL(x) fprintf(stderr, "%s:%d: %s", __FILE__, __LINE__, x);
|
100
|
+
|
101
|
+
#ifdef HAVE_STDINT_H
|
102
|
+
/* a linux-y thing */
|
103
|
+
#include <stdint.h>
|
104
|
+
#endif
|
105
|
+
#ifdef HAVE_SYS_TYPES_H
|
106
|
+
#include <sys/types.h>
|
107
|
+
#endif
|
108
|
+
/* kludgy fix for solaris. cygwin suggests u_int64_t is more portable,
|
109
|
+
solaris suggests the opposite. */
|
110
|
+
typedef u_int64_t macaddress;
|
111
|
+
|
112
|
+
#ifdef VERBOSE
|
113
|
+
#define VERBAL printf
|
114
|
+
#else
|
115
|
+
#define VERBAL(X...) do { if(want_debug) fprintf(stderr, X); } while(0);
|
116
|
+
|
117
|
+
#if defined(__linux__) && !defined(__cplusplus)
|
118
|
+
/*@unused@*/
|
119
|
+
static __inline void nullie(/*@unused@*/ const char *fmt __attribute__ ((unused)), ...) {
|
120
|
+
return;
|
121
|
+
}
|
122
|
+
#else
|
123
|
+
#define nullie(x...) do {} while(0)
|
124
|
+
#endif
|
125
|
+
|
126
|
+
#endif
|
127
|
+
|
128
|
+
#include<stdlib.h>
|
129
|
+
#include<stdio.h>
|
130
|
+
/*@unused@*/
|
131
|
+
static __inline /*@out@*/ void *malloc_ordie(size_t len) {
|
132
|
+
void *ret = malloc(len);
|
133
|
+
if(ret == NULL) {
|
134
|
+
fprintf(stderr, "unable to allocate %d bytes\n", (int)len);
|
135
|
+
abort();
|
136
|
+
}
|
137
|
+
return(ret);
|
138
|
+
}
|
139
|
+
|
140
|
+
#include <string.h>
|
141
|
+
/*@unused@*/
|
142
|
+
static __inline char *strdup_ordie(const char *str) /*@*/ {
|
143
|
+
char *ret = strdup(str);
|
144
|
+
if(ret == NULL) {
|
145
|
+
fprintf(stderr, "unable to duplicate %s\n", str);
|
146
|
+
abort();
|
147
|
+
}
|
148
|
+
return(ret);
|
149
|
+
}
|
150
|
+
|
151
|
+
#define NEWPTR(type, name) type *name = (type *)malloc_ordie(sizeof(type))
|
152
|
+
#define NEWPTRX(type, name) type *name = (type *)malloc_ordie(sizeof(type))
|
153
|
+
#define NEWPTRZ(type, name) type *name = (type *)memset(malloc_ordie(sizeof(type)), 0, sizeof(type))
|
154
|
+
|
155
|
+
/* means nscommon must be included after sys/time */
|
156
|
+
#ifndef timersub
|
157
|
+
# define timersub(a, b, result) \
|
158
|
+
do { \
|
159
|
+
(result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \
|
160
|
+
(result)->tv_usec = (a)->tv_usec - (b)->tv_usec;\
|
161
|
+
if ((result)->tv_usec < 0) { \
|
162
|
+
--(result)->tv_sec; \
|
163
|
+
(result)->tv_usec += 1000000; \
|
164
|
+
} \
|
165
|
+
} while (0)
|
166
|
+
#endif
|
167
|
+
|
168
|
+
#ifdef HAVE_CHECK_H
|
169
|
+
#include <check.h>
|
170
|
+
#ifdef HAVE__ck_assert_msg
|
171
|
+
/* newer check library, still seems to lack the obvious function. */
|
172
|
+
#define fail_expect_int(result,expect,msg) do { \
|
173
|
+
char buf[255]; \
|
174
|
+
int r = result; \
|
175
|
+
sprintf(buf, "%s (got %d, expected %d)", msg, (r), (expect)); \
|
176
|
+
_ck_assert_msg((r)==(expect),__FILE__,__LINE__,buf, NULL); \
|
177
|
+
}while(0)
|
178
|
+
#define fail_expect_voidp(result,expect,msg) do { \
|
179
|
+
char buf[255]; \
|
180
|
+
void *r = result; \
|
181
|
+
sprintf(buf, "%s (got %p, expected %p)", msg, (r), (expect)); \
|
182
|
+
_ck_assert_msg((r)==((void *)expect),__FILE__,__LINE__,buf, NULL); \
|
183
|
+
} while(0)
|
184
|
+
#else
|
185
|
+
#define fail_expect_int(result,expect,msg) do { \
|
186
|
+
char buf[255]; \
|
187
|
+
int r = result; \
|
188
|
+
sprintf(buf, "%s (got %d, expected %d)", msg, (r), (expect)); \
|
189
|
+
_fail_unless((r)==(expect),__FILE__,__LINE__,buf); \
|
190
|
+
} while(0)
|
191
|
+
#define fail_expect_voidp(result,expect,msg) do { \
|
192
|
+
char buf[255]; \
|
193
|
+
void *r = result; \
|
194
|
+
sprintf(buf, "%s (got %p, expected %p)", msg, (r), (expect)); \
|
195
|
+
_fail_unless((r)==((void *)expect),__FILE__,__LINE__,buf); \
|
196
|
+
} while(0)
|
197
|
+
|
198
|
+
#endif
|
199
|
+
#endif
|
200
|
+
|
201
|
+
|
202
|
+
NS_END_DECLS
|
203
|
+
|
204
|
+
#endif
|
205
|
+
/*
|
206
|
+
vi:ts=2
|
207
|
+
*/
|
@@ -0,0 +1,134 @@
|
|
1
|
+
/* (c) neil spring 2002 */
|
2
|
+
#ifdef HAVE_CONFIG_H
|
3
|
+
#include "config.h"
|
4
|
+
#endif
|
5
|
+
#include <sys/types.h>
|
6
|
+
#include <sys/socket.h>
|
7
|
+
#include <netinet/in.h>
|
8
|
+
#include <arpa/inet.h>
|
9
|
+
#include <assert.h>
|
10
|
+
#include <stdlib.h>
|
11
|
+
#include <errno.h>
|
12
|
+
#include <string.h>
|
13
|
+
#include "nscommon.h"
|
14
|
+
#include "originAS.h"
|
15
|
+
#include "radix.h"
|
16
|
+
#include "exception.h"
|
17
|
+
#include "ruleset.h" /* fopen_path_r */
|
18
|
+
|
19
|
+
static struct patricia_table *origins;
|
20
|
+
static in_addr_t addr_from_octets(unsigned int o1, unsigned int o2,
|
21
|
+
unsigned int o3, unsigned int o4){
|
22
|
+
return (htonl((o1<<24) + (o2<<16) + (o3<<8) + o4));
|
23
|
+
}
|
24
|
+
|
25
|
+
void
|
26
|
+
origins_init(const char *origins_dat) {
|
27
|
+
char linebuf[60];
|
28
|
+
// FILE *in = popen("./show_origins.pl | sort -u", "r");
|
29
|
+
const char *filename = (origins_dat != NULL) ? origins_dat : "origins.dat";
|
30
|
+
FILE *in = fopen_path_r(filename);
|
31
|
+
if(in == NULL) {
|
32
|
+
char buf[255];
|
33
|
+
sprintf(buf, "can't open origins.dat(%s): %s", filename, strerror(errno));
|
34
|
+
throw_void(buf);
|
35
|
+
}
|
36
|
+
origins = patricia_new();
|
37
|
+
while(!feof(in) && fgets(linebuf, sizeof(linebuf), in) != NULL) {
|
38
|
+
unsigned int o1, o2, o3, o4, len, as;
|
39
|
+
if(sscanf(linebuf, "%u.%u.%u.%u/%u %u",
|
40
|
+
&o1, &o2, &o3, &o4, &len, &as) == 6) {
|
41
|
+
patricia_insert(origins, addr_from_octets(o1,o2,o3,o4), len, (void *)as);
|
42
|
+
} else if(sscanf(linebuf, "%u.%u.%u.%u/%u {%u",
|
43
|
+
&o1, &o2, &o3, &o4, &len, &as) == 6) {
|
44
|
+
/* pick the first one from a multiple-origins line */
|
45
|
+
patricia_insert(origins, addr_from_octets(o1,o2,o3,o4), len, (void *)as);
|
46
|
+
} else {
|
47
|
+
/* this has never forced me to actually address this issue, it just clouds
|
48
|
+
up the output file.
|
49
|
+
printf("originAS: recoverable error parsing '%s' in origins.dat\n", linebuf);
|
50
|
+
*/
|
51
|
+
}
|
52
|
+
}
|
53
|
+
fclose(in);
|
54
|
+
}
|
55
|
+
|
56
|
+
unsigned short origin_for_address(in_addr_t a) {
|
57
|
+
if ( origins == NULL ) {
|
58
|
+
origins_init(NULL);
|
59
|
+
}
|
60
|
+
if ( origins != NULL ) {
|
61
|
+
return((unsigned short)(unsigned int)patricia_lookup(origins, a));
|
62
|
+
} else {
|
63
|
+
fprintf(stderr, "Origins failed to initialize\n"); /* shouldn't get here. */
|
64
|
+
return(0);
|
65
|
+
}
|
66
|
+
}
|
67
|
+
|
68
|
+
unsigned short origin_for_address_str(const char *addrstring) {
|
69
|
+
struct in_addr a;
|
70
|
+
if(inet_aton(addrstring, &a)) {
|
71
|
+
return(origin_for_address(a.s_addr));
|
72
|
+
}
|
73
|
+
return 0;
|
74
|
+
}
|
75
|
+
|
76
|
+
boolean origin_prefix_for_address(in_addr_t a, /*@out@*/ unsigned short *as,
|
77
|
+
/*@out@*/ in_addr_t *addr, /*@out@*/ unsigned char *prefixlen) {
|
78
|
+
if ( origins == NULL ) {
|
79
|
+
origins_init(NULL);
|
80
|
+
}
|
81
|
+
if ( origins != NULL ) {
|
82
|
+
void *data;
|
83
|
+
// unsigned short oas;
|
84
|
+
boolean ret = patricia_lookup_all(origins, a, addr, prefixlen, &data);
|
85
|
+
// printf("a=%x *addr=%x, *prefixlen=%d\n", a, *addr, *prefixlen);
|
86
|
+
*as = (unsigned short)(unsigned int)data;
|
87
|
+
// oas = ((unsigned short)(unsigned int)patricia_lookup(origins, a));
|
88
|
+
// assert(oas == *as);
|
89
|
+
return(ret);
|
90
|
+
} else {
|
91
|
+
fprintf(stderr, "Origins failed to initialize\n"); /* shouldn't get here. */
|
92
|
+
return(FALSE);
|
93
|
+
}
|
94
|
+
}
|
95
|
+
|
96
|
+
|
97
|
+
void
|
98
|
+
origins_regression_test(const char *origins_dat) {
|
99
|
+
FILE *in;
|
100
|
+
char linebuf[60];
|
101
|
+
origins_init(origins_dat);
|
102
|
+
in = fopen_path_r(origins_dat);
|
103
|
+
while(!feof(in) && fgets(linebuf, sizeof(linebuf), in) != NULL) {
|
104
|
+
unsigned int o1, o2, o3, o4, len, as;
|
105
|
+
if(sscanf(linebuf, "%u.%u.%u.%u/%u %u",
|
106
|
+
&o1, &o2, &o3, &o4, &len, &as) == 6) {
|
107
|
+
if(len < 32 && o1 < 256 && o2 < 256 && o3 < 256 && o4 < 256) {
|
108
|
+
struct patricia_entry *pe =
|
109
|
+
radix_resolve_route(origins->routes,addr_from_octets(o1,o2,o3,o4+1));
|
110
|
+
if((unsigned int)pe->data != as && pe->position <= len) {
|
111
|
+
/* not the same and not a more specific */
|
112
|
+
fprintf(stderr, "failed to verify %u == %u on line:\n%s",
|
113
|
+
as, (unsigned int) pe->data, linebuf);
|
114
|
+
if(pe->prefixlen > len) {
|
115
|
+
fprintf(stderr, " -- because a more specific was matched. (%d > %d)\n", pe->prefixlen, len);
|
116
|
+
} else {
|
117
|
+
#if !defined(CHECK_ORIGINS_SHOULD_FAIL) || CHECK_ORIGINS_SHOULD_FAIL == 0
|
118
|
+
abort();
|
119
|
+
#else
|
120
|
+
exit(EXIT_SUCCESS);
|
121
|
+
#endif
|
122
|
+
}
|
123
|
+
}
|
124
|
+
// unsigned int stored_as = (unsigned int) patricia_lookup(origins, addr_from_octets(o1,o2,o3,o4+1));
|
125
|
+
// if( stored_as != as) {
|
126
|
+
// fprintf(stderr, "failed to verify %u == %u on line:\n%s",
|
127
|
+
// as, stored_as, linebuf);
|
128
|
+
// abort();
|
129
|
+
// }
|
130
|
+
}
|
131
|
+
}
|
132
|
+
}
|
133
|
+
fclose(in);
|
134
|
+
}
|