diff --git a/CHANGES b/CHANGES index 95c1e32..fc4c50c 100644 --- a/CHANGES +++ b/CHANGES @@ -1,12 +1,17 @@ -untagged yet (2015-07-13) +untagged yet (2015-09-23) - bugfix: stoplist shall be able to catch AS numbers as promised. - bugfix: bgpq3 shall not hang at unknown escapes in -M.. - gotcha: "ANY" object in recursive mode ignored: shut complaints on "ERROR:unexpected object 'ANY' in expanded_macro_limit (in response to !iAS-SET-SCOPESKY)" (object contains mbrs-by-ref: ANY). (additions from 2015-08-30) - - bugfix: OpenBSD sys/queue.h does not have STAILQ_ interface. Untested yet. + - bugfix: OpenBSD sys/queue.h does not have STAILQ_ interface. + Thanks to Pedro Caetano for reporting and testing. - feature: alternate whois port can be configured with -h host[:port] + - feature: new format char %N (object name) in formatted output. + Thanks to Denis Fondras. + - feature: new format chars %m (prefix mask) and %i (inverse mask) in + formatted output. 0.1.32-rc5 (2015-07-12) - feature: -L : limit recursion depth when expanding as-sets diff --git a/README.md b/README.md index 8939aed..5013c9c 100644 --- a/README.md +++ b/README.md @@ -271,7 +271,8 @@ example below: ipfw add pass all from 91.219.30.0/24 to any ipfw add pass all from 193.193.192.0/19 to any -Recognized format characters: '%n' - network, '%l' - mask length. +Recognized format characters: '%n' - network, '%l' - mask length, +'%N' - object name, '%m' - object mask and '%i' - inversed mask. Recognized escape characters: '\n' - new line, '\t' - tabulation. Please note that no new lines inserted automatically after each sentence, you have to add them into format string manually, elsewhere output will diff --git a/bgpq3_printer.c b/bgpq3_printer.c index 85bbf52..5b4618d 100644 --- a/bgpq3_printer.c +++ b/bgpq3_printer.c @@ -646,7 +646,8 @@ bgpq3_print_format_prefix(struct sx_radix_node* n, void* ff) if(!f) f=stdout; memset(prefix, 0, sizeof(prefix)); - sx_prefix_snprintf_fmt(&n->prefix, prefix, sizeof(prefix), b->format); + sx_prefix_snprintf_fmt(&n->prefix, prefix, sizeof(prefix), + b->name?b->name:"NN", b->format); fprintf(f, "%s", prefix); }; diff --git a/sx_prefix.c b/sx_prefix.c index 718b003..f98c79b 100644 --- a/sx_prefix.c +++ b/sx_prefix.c @@ -47,6 +47,33 @@ sx_prefix_adjust_masklen(struct sx_prefix* p) }; }; +void +sx_prefix_mask(struct sx_prefix* p, struct sx_prefix* q) +{ + int i; + memset(q->addr.addrs, 0, sizeof(q->addr.addrs)); + q->family=p->family; + q->masklen=p->masklen; + for(i=0;imasklen/8;i++) + q->addr.addrs[i]=0xff; + for(i=1;i<=p->masklen%8;i++) + q->addr.addrs[p->masklen/8]|=(1<<(8-i)); +}; + +void +sx_prefix_imask(struct sx_prefix* p, struct sx_prefix* q) +{ + int i; + memset(q->addr.addrs, 0xff, sizeof(q->addr.addrs)); + q->family=p->family; + q->masklen=p->masklen; + for(i=0;imasklen/8;i++) + q->addr.addrs[i]=0; + for(i=1;i<=p->masklen%8;i++) + q->addr.addrs[p->masklen/8]&=~(1<<(8-i)); +}; + + int sx_prefix_parse(struct sx_prefix* p, int af, char* text) { @@ -266,10 +293,11 @@ sx_prefix_snprintf(struct sx_prefix* p, char* rbuffer, int srb) int sx_prefix_snprintf_fmt(struct sx_prefix* p, char* buffer, int size, - const char* format) + const char* name, const char* format) { unsigned off=0; const char* c=format; + struct sx_prefix q; while(*c) { if(*c=='%') { switch(*(c+1)) { @@ -284,6 +312,19 @@ sx_prefix_snprintf_fmt(struct sx_prefix* p, char* buffer, int size, case '%': buffer[off++]='%'; break; + case 'N': + off+=snprintf(buffer+off,size-off,"%s",name); + break; + case 'm': + sx_prefix_mask(p, &q); + inet_ntop(p->family,&q.addr,buffer+off,size-off); + off=strlen(buffer); + break; + case 'i': + sx_prefix_imask(p, &q); + inet_ntop(p->family,&q.addr,buffer+off,size-off); + off=strlen(buffer); + break; default : sx_report(SX_ERROR, "Unknown format char '%c'\n", *(c+1)); return 0; diff --git a/sx_prefix.h b/sx_prefix.h index 5701a2b..51278a4 100644 --- a/sx_prefix.h +++ b/sx_prefix.h @@ -50,7 +50,7 @@ int sx_prefix_range_parse(struct sx_radix_tree* t, int af, int ml, char* text); int sx_prefix_fprint(FILE* f, struct sx_prefix* p); int sx_prefix_snprintf(struct sx_prefix* p, char* rbuffer, int srb); int sx_prefix_snprintf_fmt(struct sx_prefix* p, char* rbuffer, int srb, - const char* fmt); + const char* name, const char* fmt); int sx_prefix_jsnprintf(struct sx_prefix* p, char* rbuffer, int srb); struct sx_radix_tree* sx_radix_tree_new(int af); struct sx_radix_node* sx_radix_node_new(struct sx_prefix* prefix);