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