patch for extended autnum
S.P.Zeidler
spz at serpens.de
Wed Jun 13 05:13:53 UTC 2007
Hi,
while we're at sending around patches:
The following has been created by Michael van Elst (mlelstv at serpens.de)
who I'd asked to help with the lex&yacc. It works on the NetBSD systems
I tested, I'd like to hear if there's a problem on other systems.
My test candidate is AS3.3 btw, who caused me to look at extended autnums
in the first place (and has been making JTAC extra happy, too :-P).
regards,
spz
--------- snip ---------
$NetBSD$
--- ./src/normalform/SetOfSymbol.cc.orig 2006-06-08 17:16:26.000000000 +0200
+++ ./src/normalform/SetOfSymbol.cc
@@ -271,7 +275,7 @@ void SetOfSymbol::operator = (const Set
void SetOfSymbol::add(ASt as) {
char buffer[64];
- sprintf(buffer, "AS%d", as);
+ asnum_string(buffer, as);
add(symbols.symID(buffer));
}
--- ./src/rpsl/rpsl/rpsl_item.cc.orig 2006-06-08 17:16:26.000000000 +0200
+++ ./src/rpsl/rpsl/rpsl_item.cc
@@ -67,14 +67,18 @@ ostream &Item::print(ostream &out) const
}
ostream &ItemASNO::print(ostream &out) const {
- out << "AS" << asno;
+ char buffer[64];
+ asnum_string(buffer, asno);
+ out << "AS" << buffer;
return out;
}
Buffer *ItemASNO::bufferize(Buffer *buf, bool lcase) const {
+ char buffer[64];
+ asnum_string(buffer, asno);
if (!buf)
buf = new Buffer;
- buf->appendf("as%d", asno);
+ buf->appendf(buffer);
return buf;
}
--- ./src/rpsl/rpsl/rpsl.y.orig 2006-06-08 17:16:26.000000000 +0200
+++ ./src/rpsl/rpsl/rpsl.y
@@ -755,7 +755,7 @@ tkn_word: TKN_WORD {
}
| TKN_ASNO {
char buffer[64];
- sprintf(buffer, "AS%d", $1);
+ asnum_string(buffer, $1);
$$ = strdup(buffer);
}
| TKN_ASNAME {
--- ./src/rpsl/rpsl/rpsl_item.hh.orig 2007-02-09 20:46:31.000000000 +0100
+++ ./src/rpsl/rpsl/rpsl_item.hh
@@ -127,6 +127,9 @@ public:
&& asno <= ((ItemASNO&) b).asno;
}
virtual Buffer *bufferize(Buffer *buf = NULL, bool lcase = false) const;
+ virtual const char *sprint(char *buf) {
+ asnum_string(buf, asno);
+ }
#ifdef DEBUG
virtual const char *className(void) const {
return "ItemASNO";
--- ./src/aoe/aoe.cc.orig 2002-04-09 13:48:46.000000000 +0200
+++ ./src/aoe/aoe.cc
@@ -275,7 +275,7 @@ TclList &operator<<(TclList &tl, List<AS
pcASPeer;
pcASPeer = lh.next(pcASPeer))
{
- sprintf(pzcASPeerNo, "AS%d", pcASPeer->getNo());
+ asnum_string(pzcASPeerNo, pcASPeer->getNo());
switch (pcASPeer->getType())
{
case dASPeerFromIRR:
@@ -662,8 +662,8 @@ int ListPeer::command(int argc, char *ar
ASt tPeerAS = pcApp->getASPeerNo(iPeerASIndex);
char pzcMyAS[16], pzcPeerAS[16];
- sprintf(pzcMyAS, "AS%d", tMyAS);
- sprintf(pzcPeerAS, "AS%d", tPeerAS);
+ asnum_string(pzcMyAS, tMyAS);
+ asnum_string(pzcPeerAS, tPeerAS);
// Setup $PeerAS properly
if (!pcApp->evalf("set PeerAS %s", pzcPeerAS)) return TCL_ERROR;
@@ -1093,7 +1093,7 @@ AoeApplication::AoeApplication(char *pzc
pcPolicyShowButton(NULL),
pcStatusLine(NULL)
{
- sprintf(pzcASNo, "AS%d", tASNo);
+ asnum_string(pzcASNo, tASNo);
if (!(pcIrr = IRR::newClient()))
{
usage();
--- ./src/aoe/bgp_aspath.cc.orig 2002-04-09 13:48:46.000000000 +0200
+++ ./src/aoe/bgp_aspath.cc
@@ -110,11 +110,15 @@ void BgpASPath::print(void)
pcFirstAndLastAS;
pcFirstAndLastAS = cFirstAndLastASes.next(pcFirstAndLastAS))
{
- printf("AS%d --", pcFirstAndLastAS->getFirst());
+ char buf[64];
+ asnum_string(buf, pcFirstAndLastAS->getFirst());
+ printf("%s --", buf);
for (int i = pcFirstAndLastAS->getLast().first();
i >= 0;
- i = pcFirstAndLastAS->getLast().next(i))
- printf(" AS%d", i);
+ i = pcFirstAndLastAS->getLast().next(i)) {
+ asnum_string(buf, i);
+ printf(" %s", buf);
+ }
printf("\n");
}
}
--- ./src/irr/irr.cc.orig 2006-10-01 13:23:32.000000000 +0200
+++ ./src/irr/irr.cc
@@ -312,7 +312,7 @@ const AutNum *IRR::getAutNum(ASt as) {
AutNum *result = NULL;
if (! AutNumCache.query(as, result)) {
- sprintf(buffer, "AS%d", as);
+ asnum_string(buffer, as);
if (getAutNum(buffer, text, len)) {
Buffer b(text, len);
result = new AutNum(b);
@@ -365,7 +365,7 @@ void IRR::getRoute(Route *&route, Prefix
char *text;
int len;
- sprintf(buffer, "AS%d", as);
+ asnum_string(buffer, as);
if (getRoute(rt->get_text(), buffer, text, len)) {
Buffer b(text, len);
route = new Route(b);
@@ -379,7 +379,7 @@ void IRR::getRoute(Route *&route, char *
char *text;
int len;
- sprintf(buffer, "AS%d", as);
+ asnum_string(buffer, as);
if (getRoute(rt, buffer, text, len)) {
Buffer b(text, len);
route = new Route(b);
@@ -419,7 +419,7 @@ const MPPrefixRanges *IRR::expandAS(ASt
// we insert the set to the cache before expanding
// this is needed to avoid recursion if sets are recursively defined
expandASCache.add(as, result);
- sprintf(buffer, "AS%d", as);
+ asnum_string(buffer, as);
if (!expandAS(buffer, result)) {
expandASCache.nullify(as);
delete result;
--- ./src/roe/schedule.cc.orig 2002-04-09 13:48:48.000000000 +0200
+++ ./src/roe/schedule.cc
@@ -177,7 +177,8 @@ void Schedule::add_selected(char *select
for (char *s = strtok(selection, " \t"); s; s = strtok(NULL, " \t")) {
r = routelist(atoi(s));
- tcl_Eval("set AS AS%d", routelist.as);
+ asnum_string(buffer, routelist.as);
+ tcl_Eval("set AS %s", buffer);
tcl_Eval("set ROUTE %s", r->route.get_text(buffer));
tcl_Eval("set DATE %s", configure.date);
tcl_Eval("subst \"%s\"", configure.add_template);
@@ -190,6 +191,7 @@ void Schedule::del_selected(char *select
RouteList::Route *r;
RouteList::Route::db_as *p;
Route *route = NULL;
+ char buffer[64];
for (char *s = strtok(selection, " \t"); s; s = strtok(NULL, " \t")) {
r = routelist(atoi(s));
@@ -213,7 +215,8 @@ void Schedule::del_selected(char *select
// Modified by wlee at isi.edu
// if (code)
if (route) {
- tcl_Eval("set AS AS%d", routelist.as);
+ asnum_string(buffer, routelist.as);
+ tcl_Eval("set AS %s", buffer);
tcl_Eval("set ROUTE %s", r->route.get_text());
tcl_Eval("set DATE %s", configure.date);
tcl_Eval("subst \"%.*s%s\"",
@@ -231,6 +234,7 @@ void Schedule::del_selected_matching_sou
RouteList::Route *r;
RouteList::Route::db_as *p;
Route *route = NULL;
+ char buffer[64];
for (char *s = strtok(selection, " \t"); s; s = strtok(NULL, " \t")) {
r = routelist(atoi(s));
@@ -254,7 +258,8 @@ void Schedule::del_selected_matching_sou
// Modified by wlee at isi.edu
if (route) {
- tcl_Eval("set AS AS%d", routelist.as);
+ asnum_string(buffer, routelist.as);
+ tcl_Eval("set AS %s", buffer);
tcl_Eval("set ROUTE %s", r->route.get_text());
tcl_Eval("set DATE %s", configure.date);
tcl_Eval("subst \"%.*s%s\"",
--- ./src/roe/route-list.cc.orig 2002-06-18 13:00:11.000000000 +0200
+++ ./src/roe/route-list.cc
@@ -67,6 +67,7 @@ extern IRR *RLWhois;
char *RouteList::format(RouteList::Route *vr) {
static char line[256];
+ char buf[64];
char *c;
for (c = line; c < line + vr->indentation; ++c)
@@ -108,8 +109,10 @@ char *RouteList::format(RouteList::Route
strcat(line, " ");
RouteList::Route::db_as* p;
- for (p = vr->db_as_l.head(); p; p = vr->db_as_l.next(p))
- sprintf(line + strlen(line), " %s:AS%d", p->db, p->as);
+ for (p = vr->db_as_l.head(); p; p = vr->db_as_l.next(p)) {
+ asnum_string(buf, p->as);
+ sprintf(line + strlen(line), " %s:%s", p->db, buf);
+ }
return line;
}
@@ -497,13 +500,17 @@ void RouteList::load(ASt _as) {
const PrefixRanges *registered_routes = whois->expandAS(as);
if (!registered_routes) {
- tcl_Eval("showWarning { No object for AS%d}", as);
+ char buf[64];
+ asnum_string(buf, as);
+ tcl_Eval("showWarning { No object for %s}", buf);
return;
}
// Added by wlee
if (registered_routes->isEmpty()) {
- tcl_Eval("showWarning { No route for AS%d}", as);
+ char buf[64];
+ asnum_string(buf, as);
+ tcl_Eval("showWarning { No route for %s}", buf);
return;
}
--- ./src/roe/object.cc.orig 2002-04-09 13:48:48.000000000 +0200
+++ ./src/roe/object.cc
@@ -107,7 +107,8 @@ void RoeObject::del(int index) {
RouteList::Route *vr = routelist(index);
// Modified by wlee at isi.edu
- tcl_Eval("set AS AS%d", routelist.as);
+ asnum_string(buffer, routelist.as);
+ tcl_Eval("set AS %s", buffer);
// tcl_Eval("set AS %s", routelist.as);
tcl_Eval("set ROUTE %s", vr->route.get_text(buffer));
tcl_Eval("set DATE %s", configure.date);
@@ -123,7 +124,8 @@ void RoeObject::add(int index) {
RouteList::Route *vr = routelist(index);
// Modified by wlee at isi.edu
- tcl_Eval("set AS AS%d", routelist.as);
+ asnum_string(buffer, routelist.as);
+ tcl_Eval("set AS %s", buffer);
// tcl_Eval("set AS %s", routelist.as);
tcl_Eval("set ROUTE %s", vr->route.get_text(buffer));
tcl_Eval("set DATE %s", configure.date);
@@ -140,7 +142,8 @@ void RoeObject::upd(int index) {
RouteList::Route *vr = routelist(index);
// Modified by wlee at isi.edu
- tcl_Eval("set AS AS%d", routelist.as);
+ asnum_string(buffer, routelist.as);
+ tcl_Eval("set AS %s", buffer);
// tcl_Eval("set AS %s", routelist.as);
tcl_Eval("set ROUTE %s", vr->route.get_text(buffer));
tcl_Eval("set DATE %s", configure.date);
--- ./src/prtraceroute/prtraceroute.cc.orig 2002-04-09 13:48:47.000000000 +0200
+++ ./src/prtraceroute/prtraceroute.cc
@@ -171,6 +171,7 @@ main (int argc, char **argv, char **envp
ICMPProbeReply reply; // wait for incoming icmp's
Timer t1, t2;
int ttl, got_there = 0, unreachable = 0;
+ char buf[64];
printf ("prtraceroute to %s (%s), %d hops max, %d byte packets\n",
dst, dstip->getIpaddr(), max_ttl, datalen);
@@ -192,7 +193,8 @@ main (int argc, char **argv, char **envp
ipAddr *ipaddr = new ipAddr (newaddr);
if (policy_flag) {
path.addHop(ipaddr, ttl);
- printf (" [AS%d]", path.getHopAS(ttl));
+ asnum_string(buf, path.getHopAS(ttl));
+ printf (" [%s]", buf);
}
if (!nflag) {
printf (" %s (%s)", ipaddr->getName(),
@@ -690,6 +692,7 @@ Path::process_policies() {
const AutNum * autnum;
char test[80];
+ char buf[64];
actiondictionary = new ActionDictionary;
@@ -796,7 +799,8 @@ Path::process_policies() {
for (i = last_ttl; i >= 0; i--) {
if (hops[i] != NULL) {
//cout << i << " AS" << getHopAS(i) << " ";
- printf ("%3d AS%d", i, getHopAS(i));
+ asnum_string(buf, getHopAS(i));
+ printf ("%3d %s", i, buf);
if (nflag) // XXX, this is a global, and is bad!!!
//cout << hops[i]->ipaddr->getIpaddr();
printf (" %-35s", hops[i]->ipaddr->getIpaddr());
--- src/irr/irr.hh.orig 2006-06-08 17:16:26.000000000 +0200
+++ src/irr/irr.hh
@@ -59,6 +59,7 @@
#include "gnug++/SetOfUInt.hh"
#include "gnu/prefixranges.hh"
#include "rpsl/prefix.hh"
+#include "rpsl/rpsl_asnum.hh"
#include "classes.hh"
class AutNum;
--- src/rpsl/rpsl/rpsl_asnum.hh.orig 2007-06-05 15:03:07.000000000 +0200
+++ src/rpsl/rpsl/rpsl_asnum.hh
@@ -0,0 +1,12 @@
+#ifndef ASNUM_HH
+#define ASNUM_HH 1
+
+inline int asnum_string(char *buf, unsigned int asno)
+{
+ if (asno > 65535)
+ return sprintf(buf, "AS%d.%d", asno>>16, asno&0xffff);
+ else
+ return sprintf(buf, "AS%d", asno);
+}
+
+#endif
+++ src/rpsl/rpsl/symbols.hh
@@ -58,6 +58,7 @@
#include "util/Allocator.hh"
#include "gnu/SetOfSymID.hh"
#include "util/xstring.h"
+#include "rpsl/rpsl_asnum.hh"
#include <cstdio>
typedef unsigned int ASt;
@@ -114,7 +115,7 @@ public:
}
SymID resolvePeerAS(SymID sid, ASt peerAS) {
- char *buffer = (char *) malloc(strlen(sid) * 2);
+ char *buffer = (char *) malloc(strlen(sid) * 3);
char *head, *tail, *ptr;
int written;
ptr = buffer;
@@ -123,7 +124,7 @@ public:
tail = head + 6, head++, head = strstr(head, "PEERAS")) {
strncpy(ptr, tail, head - tail);
ptr += (head - tail);
- sprintf(ptr, "AS%d", peerAS);
+ asnum_string(ptr, peerAS);
written = strlen(ptr);
ptr += written;
}
--- src/irr/birdwhoisc.cc.orig 2006-10-09 18:05:14.000000000 +0200
+++ src/irr/birdwhoisc.cc
@@ -429,7 +429,11 @@ int BirdWhoisClient::getSourceOrigin(cha
AttrGenericIterator<ItemASNO> itrOrigin(itrObject, "origin");
AttrGenericIterator<ItemWORD> itrSource(itrObject, "source");
if (itrOrigin && itrSource)
- cBuffer.append("%s AS%d\n", itrSource()->word, itrOrigin()->asno);
+ {
+ char buf[64];
+ asnum_string(buf, itrOrigin()->asno);
+ cBuffer.append("%s %s\n", itrSource()->word, buf);
+ }
}
}
if (cBuffer.empty())
--- src/rpsl/rpsl/rpsl.l.orig 2006-10-01 13:23:32.000000000 +0200
+++ src/rpsl/rpsl/rpsl.l
@@ -74,7 +74,7 @@ INT [[:digit:]]+
SINT [+-]?{INT}
REAL [+-]?{INT}?\.{INT}({WS}*E{WS}*[+-]?{INT})?
NAME [[:alpha:]]([[:alnum:]_-]*[[:alnum:]])?
-ASNO AS{INT}
+ASNO AS{INT}\.{INT}|AS{INT}
ASNAME AS-[[:alnum:]_-]*[[:alnum:]]
RSNAME RS-[[:alnum:]_-]*[[:alnum:]]
RTRSNAME RTRS-[[:alnum:]_-]*[[:alnum:]]
@@ -455,7 +455,11 @@ extern void atollRA(...);
/* The order of these rules are important */
{ASNO} {
- yylval.i = atoi(yytext+2);
+ const char *dot = strchr(yytext,'.');
+ if (dot)
+ yylval.i = atoi(yytext+2)<<16 | atoi(dot+1);
+ else
+ yylval.i = atoi(yytext+2);
LEXER_RETURN(TKN_ASNO);
}
@@ -751,7 +755,7 @@ void yy_scan_object(Object *o) {
if (rpsl_buffer)
yy_delete_buffer(rpsl_buffer);
- rpsl_buffer = yy_scan_bytes(o->contents, o->size);
+ rpsl_buffer = yy_scan_bytes(o->contents, (yy_size_t)o->size);
BEGIN(INITIAL);
}
--------- snip ---------
--
spz at serpens.de (S.P.Zeidler)
More information about the irrtoolset
mailing list