summaryrefslogtreecommitdiff
path: root/net/irrtoolset-nox11/patches/patch-dj
blob: ca7b48a815e9f4ef3e79a834055f1ba65ff5387b (plain)
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
$NetBSD: patch-dj,v 1.2 2008/01/05 14:35:22 spz Exp $

--- src/irr/rawhoisc.cc.orig	2007-02-13 01:25:01.000000000 +0100
+++ src/irr/rawhoisc.cc
@@ -516,6 +516,12 @@ bool RAWhoisClient::getAutNum(char *as, 
    return len;
 }
 
+// get asset or rsset
+bool RAWhoisClient::getASSet(SymID sname, char *&text, int &len) {
+   len = QueryResponse(text, "!i%s,1", sname);
+   return len;
+}
+
 bool RAWhoisClient::getSet(SymID sname, char *clss, char *&text, int &len) {
    len = QueryResponse(text, "!m%s,%s", clss, sname);
    return len;
@@ -557,26 +563,58 @@ bool RAWhoisClient::expandAS(char *as,  
 }
 
 bool RAWhoisClient::expandASSet(SymID asset, SetOfUInt *result) {
-  char *response;
-  if (!QueryResponse(response, "!i%s,1", asset)) return false;
-  for (char *word = strtok(response, " \t\n"); 
-       word; 
-       word = strtok(NULL, " \t\n"))
-    result->add(atoi(word+2));
-  if (response)
-     delete [] response;
+  Set *set = NULL;
+
+  if (queryCache(asset, set)) {
+    AttrGenericIterator<Item> itr(set, "members");
+    for (Item *pt = itr.first(); pt; pt = itr.next())
+      if (typeid(*pt) == typeid(ItemASNAME)) { // ASNAME (aka as-set)
+        const SetOfUInt *tmp = IRR::expandASSet(((ItemASNAME *)pt)->name);
+        if (tmp)
+          *result |= *(SetOfUInt *) tmp;
+      } else if (typeid(*pt) == typeid(ItemASNO)) {
+         result->add(((ItemASNO *)pt)->asno);
+      } else {
+        cerr << "WARNING: irrd/rawhoisd cannot resolve as-set " << asset << "!";
+        cerr << "Unknown element found in as-set definition!\n";
+      }
+    if (set != NULL) free (set);
+  } else {
+    char *text;
+    int  len;
+    if (getASSet(asset, text, len)) {
+      for (char *word = strtok(text, " \t\n"); word; word = strtok(NULL, "\t\n"))
+        result->add(atoi(word+2));
+    }
+    if (text != NULL) free(text);
+  }
+
   return true;
 }
 
 bool RAWhoisClient::expandRSSet(SymID rsset, MPPrefixRanges *result) {
-  char *response;
-  if (!QueryResponse(response, "!i%s,1", rsset)) return false;
-  for (char *word = strtok(response, " \t\n"); 
-       word; 
-       word = strtok(NULL, " \t\n"))
-    result->push_back(MPPrefix(word));
-  if (response)
-     delete [] response;
+  Set *set = NULL;
+
+  if (queryCache(rsset, set)) {
+    AttrGenericIterator<Item> itr(set, "members");
+    for (Item *pt = itr.first(); pt; pt = itr.next()) {
+      expandItem(pt, result);
+    }
+    AttrGenericIterator<Item> itr1(set, "mp-members");
+    for (Item *pt = itr1.first(); pt; pt = itr1.next()) {
+      expandItem(pt, result);
+    }
+    if (set != NULL) free (set);
+  } else {
+    char *text;
+    int  len;
+    if (getASSet(rsset, text, len)) {
+      for (char *word = strtok(text, " \t\n"); word; word = strtok(NULL, "\t\n"))
+        result->push_back(MPPrefix(word));
+    }
+    if (text != NULL) free(text);
+  }
+
   return true;
 }