mirror of
https://github.com/bgp/bgpq4
synced 2025-02-28 08:53:11 +00:00
Remove superfluous semi-colon after closing brace
This commit is contained in:
126
bgpq4.c
126
bgpq4.c
@@ -72,7 +72,7 @@ usage(int ecode)
|
|||||||
printf(" -X : generate Cisco IOS XR output\n");
|
printf(" -X : generate Cisco IOS XR output\n");
|
||||||
printf("\n" PACKAGE_NAME " version: " PACKAGE_VERSION "\n");
|
printf("\n" PACKAGE_NAME " version: " PACKAGE_VERSION "\n");
|
||||||
exit(ecode);
|
exit(ecode);
|
||||||
};
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
exclusive()
|
exclusive()
|
||||||
@@ -80,7 +80,7 @@ exclusive()
|
|||||||
fprintf(stderr,"-E, -f <asnum>, -G <asnum>, and -t are mutually "
|
fprintf(stderr,"-E, -f <asnum>, -G <asnum>, and -t are mutually "
|
||||||
"exclusive\n");
|
"exclusive\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
vendor_exclusive()
|
vendor_exclusive()
|
||||||
@@ -89,7 +89,7 @@ vendor_exclusive()
|
|||||||
" -j (JSON), -N (Nokia SR OS Classic), -n (Nokia SR OS MD-CLI),"
|
" -j (JSON), -N (Nokia SR OS Classic), -n (Nokia SR OS MD-CLI),"
|
||||||
" -U (Huawei) and -X (IOS XR) options are mutually exclusive\n");
|
" -U (Huawei) and -X (IOS XR) options are mutually exclusive\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
parseasnumber(struct bgpq_expander* expander, char* optarg)
|
parseasnumber(struct bgpq_expander* expander, char* optarg)
|
||||||
@@ -99,7 +99,7 @@ parseasnumber(struct bgpq_expander* expander, char* optarg)
|
|||||||
if (expander->asnumber < 1 || expander->asnumber > (65535ul * 65535)) {
|
if (expander->asnumber < 1 || expander->asnumber > (65535ul * 65535)) {
|
||||||
sx_report(SX_FATAL,"Invalid AS number: %s\n", optarg);
|
sx_report(SX_FATAL,"Invalid AS number: %s\n", optarg);
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
if(eon && *eon == '.') {
|
if(eon && *eon == '.') {
|
||||||
/* -f 3.3, for example */
|
/* -f 3.3, for example */
|
||||||
uint32_t loas = strtoul(eon+1, &eon, 10);
|
uint32_t loas = strtoul(eon+1, &eon, 10);
|
||||||
@@ -107,24 +107,24 @@ parseasnumber(struct bgpq_expander* expander, char* optarg)
|
|||||||
/* should prevent incorrect numbers like 65537.1 */
|
/* should prevent incorrect numbers like 65537.1 */
|
||||||
sx_report(SX_FATAL,"Invalid AS number: %s\n", optarg);
|
sx_report(SX_FATAL,"Invalid AS number: %s\n", optarg);
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
if(loas < 1 || loas > 65535) {
|
if(loas < 1 || loas > 65535) {
|
||||||
sx_report(SX_FATAL,"Invalid AS number: %s\n", optarg);
|
sx_report(SX_FATAL,"Invalid AS number: %s\n", optarg);
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
if (eon && *eon) {
|
if (eon && *eon) {
|
||||||
sx_report(SX_FATAL,"Invalid symbol in AS number: "
|
sx_report(SX_FATAL,"Invalid symbol in AS number: "
|
||||||
"%c (%s)\n", *eon, optarg);
|
"%c (%s)\n", *eon, optarg);
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
expander->asnumber=(expander->asnumber << 16) + loas;
|
expander->asnumber=(expander->asnumber << 16) + loas;
|
||||||
} else if (eon && *eon) {
|
} else if (eon && *eon) {
|
||||||
sx_report(SX_FATAL,"Invalid symbol in AS number: %c (%s)\n",
|
sx_report(SX_FATAL,"Invalid symbol in AS number: %c (%s)\n",
|
||||||
*eon, optarg);
|
*eon, optarg);
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char* argv[])
|
main(int argc, char* argv[])
|
||||||
@@ -159,7 +159,7 @@ main(int argc, char* argv[])
|
|||||||
sx_report(SX_FATAL, "-4 and -6 are mutually "
|
sx_report(SX_FATAL, "-4 and -6 are mutually "
|
||||||
"exclusive\n");
|
"exclusive\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
selectedipv4=1;
|
selectedipv4=1;
|
||||||
break;
|
break;
|
||||||
case '6':
|
case '6':
|
||||||
@@ -167,7 +167,7 @@ main(int argc, char* argv[])
|
|||||||
sx_report(SX_FATAL, "-4 and -6 are mutually "
|
sx_report(SX_FATAL, "-4 and -6 are mutually "
|
||||||
"exclusive\n");
|
"exclusive\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
af = AF_INET6;
|
af = AF_INET6;
|
||||||
expander.family = AF_INET6;
|
expander.family = AF_INET6;
|
||||||
expander.tree->family = AF_INET6;
|
expander.tree->family = AF_INET6;
|
||||||
@@ -224,8 +224,8 @@ main(int argc, char* argv[])
|
|||||||
if (d) {
|
if (d) {
|
||||||
*d = 0;
|
*d = 0;
|
||||||
expander.port = d + 1;
|
expander.port = d + 1;
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
break;
|
break;
|
||||||
case 'J':
|
case 'J':
|
||||||
if (expander.vendor)
|
if (expander.vendor)
|
||||||
@@ -251,7 +251,7 @@ main(int argc, char* argv[])
|
|||||||
sx_report(SX_FATAL, "Invalid refineLow value:"
|
sx_report(SX_FATAL, "Invalid refineLow value:"
|
||||||
" %s\n", optarg);
|
" %s\n", optarg);
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
break;
|
break;
|
||||||
case 'R':
|
case 'R':
|
||||||
refine = strtoul(optarg, NULL, 10);
|
refine = strtoul(optarg, NULL, 10);
|
||||||
@@ -259,7 +259,7 @@ main(int argc, char* argv[])
|
|||||||
sx_report(SX_FATAL,"Invalid refine length:"
|
sx_report(SX_FATAL,"Invalid refine length:"
|
||||||
" %s\n", optarg);
|
" %s\n", optarg);
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
break;
|
break;
|
||||||
case 'l':
|
case 'l':
|
||||||
expander.name = optarg;
|
expander.name = optarg;
|
||||||
@@ -270,7 +270,7 @@ main(int argc, char* argv[])
|
|||||||
sx_report(SX_FATAL, "Invalid maximum recursion"
|
sx_report(SX_FATAL, "Invalid maximum recursion"
|
||||||
" (-L): %s\n", optarg);
|
" (-L): %s\n", optarg);
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
break;
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
maxlen=strtoul(optarg, NULL, 10);
|
maxlen=strtoul(optarg, NULL, 10);
|
||||||
@@ -278,7 +278,7 @@ main(int argc, char* argv[])
|
|||||||
sx_report(SX_FATAL, "Invalid maxlen (-m): %s\n",
|
sx_report(SX_FATAL, "Invalid maxlen (-m): %s\n",
|
||||||
optarg);
|
optarg);
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
break;
|
break;
|
||||||
case 'M':
|
case 'M':
|
||||||
{
|
{
|
||||||
@@ -310,17 +310,17 @@ main(int argc, char* argv[])
|
|||||||
isprint(*c) ? *c : 20,
|
isprint(*c) ? *c : 20,
|
||||||
*c, optarg);
|
*c, optarg);
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
} else {
|
} else {
|
||||||
if (c != d) {
|
if (c != d) {
|
||||||
*d = *c;
|
*d = *c;
|
||||||
};
|
}
|
||||||
d++;
|
d++;
|
||||||
c++;
|
c++;
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
*d = 0;
|
*d = 0;
|
||||||
};
|
}
|
||||||
break;
|
break;
|
||||||
case 'N':
|
case 'N':
|
||||||
if (expander.vendor)
|
if (expander.vendor)
|
||||||
@@ -357,7 +357,7 @@ main(int argc, char* argv[])
|
|||||||
sx_report(SX_FATAL,"Invalid as-width: %s\n",
|
sx_report(SX_FATAL,"Invalid as-width: %s\n",
|
||||||
optarg);
|
optarg);
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
widthSet = 1;
|
widthSet = 1;
|
||||||
break;
|
break;
|
||||||
case 'w':
|
case 'w':
|
||||||
@@ -375,8 +375,8 @@ main(int argc, char* argv[])
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
usage(1);
|
usage(1);
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
argc -= optind;
|
argc -= optind;
|
||||||
argv += optind;
|
argv += optind;
|
||||||
@@ -396,7 +396,7 @@ main(int argc, char* argv[])
|
|||||||
} else if (expander.vendor == V_NOKIA ||
|
} else if (expander.vendor == V_NOKIA ||
|
||||||
expander.vendor == V_NOKIA_MD) {
|
expander.vendor == V_NOKIA_MD) {
|
||||||
expander.aswidth = 8;
|
expander.aswidth = 8;
|
||||||
};
|
}
|
||||||
} else if (expander.generation == T_OASPATH) {
|
} else if (expander.generation == T_OASPATH) {
|
||||||
if (expander.vendor == V_CISCO) {
|
if (expander.vendor == V_CISCO) {
|
||||||
expander.aswidth = 5;
|
expander.aswidth = 5;
|
||||||
@@ -407,29 +407,29 @@ main(int argc, char* argv[])
|
|||||||
} else if (expander.vendor == V_NOKIA ||
|
} else if (expander.vendor == V_NOKIA ||
|
||||||
expander.vendor == V_NOKIA_MD) {
|
expander.vendor == V_NOKIA_MD) {
|
||||||
expander.aswidth = 8;
|
expander.aswidth = 8;
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
if (!expander.generation) {
|
if (!expander.generation) {
|
||||||
expander.generation = T_PREFIXLIST;
|
expander.generation = T_PREFIXLIST;
|
||||||
};
|
}
|
||||||
|
|
||||||
if (expander.generation != (T_PREFIXLIST & T_ASPATH & T_OASPATH) &&
|
if (expander.generation != (T_PREFIXLIST & T_ASPATH & T_OASPATH) &&
|
||||||
expander.vendor == V_CISCO_XR) {
|
expander.vendor == V_CISCO_XR) {
|
||||||
sx_report(SX_FATAL, "Sorry, only prefix-sets and as-paths "
|
sx_report(SX_FATAL, "Sorry, only prefix-sets and as-paths "
|
||||||
"supported for IOS XR\n");
|
"supported for IOS XR\n");
|
||||||
};
|
}
|
||||||
if (expander.vendor == V_BIRD && expander.generation != T_PREFIXLIST &&
|
if (expander.vendor == V_BIRD && expander.generation != T_PREFIXLIST &&
|
||||||
expander.generation != T_ASPATH && expander.generation != T_ASSET) {
|
expander.generation != T_ASPATH && expander.generation != T_ASSET) {
|
||||||
sx_report(SX_FATAL, "Sorry, only prefix-lists and as-paths/as-sets "
|
sx_report(SX_FATAL, "Sorry, only prefix-lists and as-paths/as-sets "
|
||||||
"supported for BIRD output\n");
|
"supported for BIRD output\n");
|
||||||
};
|
}
|
||||||
if (expander.vendor == V_JSON && expander.generation != T_PREFIXLIST &&
|
if (expander.vendor == V_JSON && expander.generation != T_PREFIXLIST &&
|
||||||
expander.generation != T_ASPATH && expander.generation != T_ASSET) {
|
expander.generation != T_ASPATH && expander.generation != T_ASSET) {
|
||||||
sx_report(SX_FATAL, "Sorry, only prefix-lists and as-paths/as-sets "
|
sx_report(SX_FATAL, "Sorry, only prefix-lists and as-paths/as-sets "
|
||||||
"supported for JSON output\n");
|
"supported for JSON output\n");
|
||||||
};
|
}
|
||||||
|
|
||||||
if (expander.vendor == V_FORMAT && expander.generation != T_PREFIXLIST)
|
if (expander.vendor == V_FORMAT && expander.generation != T_PREFIXLIST)
|
||||||
sx_report(SX_FATAL, "Sorry, only prefix-lists supported in formatted "
|
sx_report(SX_FATAL, "Sorry, only prefix-lists supported in formatted "
|
||||||
@@ -439,7 +439,7 @@ main(int argc, char* argv[])
|
|||||||
sx_report(SX_FATAL, "Sorry, formatted output (-F <fmt>) in not "
|
sx_report(SX_FATAL, "Sorry, formatted output (-F <fmt>) in not "
|
||||||
"compatible with -R/-r options\n");
|
"compatible with -R/-r options\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
|
|
||||||
if (expander.vendor == V_HUAWEI && expander.generation != T_ASPATH &&
|
if (expander.vendor == V_HUAWEI && expander.generation != T_ASPATH &&
|
||||||
expander.generation != T_OASPATH && expander.generation != T_PREFIXLIST)
|
expander.generation != T_OASPATH && expander.generation != T_PREFIXLIST)
|
||||||
@@ -463,64 +463,64 @@ main(int argc, char* argv[])
|
|||||||
" Juniper prefix-lists\nYou can try route-filters (-E) "
|
" Juniper prefix-lists\nYou can try route-filters (-E) "
|
||||||
"or route-filter-lists (-z) instead of prefix-lists\n.");
|
"or route-filter-lists (-z) instead of prefix-lists\n.");
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
|
|
||||||
if(aggregate && expander.vendor == V_FORMAT) {
|
if(aggregate && expander.vendor == V_FORMAT) {
|
||||||
sx_report(SX_FATAL, "Sorry, aggregation (-A) is not compatible with "
|
sx_report(SX_FATAL, "Sorry, aggregation (-A) is not compatible with "
|
||||||
"formatted output (-F <fmt>)\n");
|
"formatted output (-F <fmt>)\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
|
|
||||||
if (aggregate && (expander.vendor == V_NOKIA_MD || expander.vendor == V_NOKIA)
|
if (aggregate && (expander.vendor == V_NOKIA_MD || expander.vendor == V_NOKIA)
|
||||||
&& expander.generation != T_PREFIXLIST) {
|
&& expander.generation != T_PREFIXLIST) {
|
||||||
sx_report(SX_FATAL, "Sorry, aggregation (-A) is not supported with "
|
sx_report(SX_FATAL, "Sorry, aggregation (-A) is not supported with "
|
||||||
"ip-prefix-lists (-E) on Nokia.\n");
|
"ip-prefix-lists (-E) on Nokia.\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
|
|
||||||
if (refine && (expander.vendor == V_NOKIA_MD || expander.vendor == V_NOKIA)
|
if (refine && (expander.vendor == V_NOKIA_MD || expander.vendor == V_NOKIA)
|
||||||
&& expander.generation != T_PREFIXLIST) {
|
&& expander.generation != T_PREFIXLIST) {
|
||||||
sx_report(SX_FATAL, "Sorry, more-specifics (-R) is not supported with "
|
sx_report(SX_FATAL, "Sorry, more-specifics (-R) is not supported with "
|
||||||
"ip-prefix-lists (-E) on Nokia.\n");
|
"ip-prefix-lists (-E) on Nokia.\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
|
|
||||||
if (refineLow && (expander.vendor == V_NOKIA_MD || expander.vendor == V_NOKIA)
|
if (refineLow && (expander.vendor == V_NOKIA_MD || expander.vendor == V_NOKIA)
|
||||||
&& expander.generation != T_PREFIXLIST) {
|
&& expander.generation != T_PREFIXLIST) {
|
||||||
sx_report(SX_FATAL, "Sorry, more-specifics (-r) is not supported with "
|
sx_report(SX_FATAL, "Sorry, more-specifics (-r) is not supported with "
|
||||||
"ip-prefix-lists (-E) on Nokia.\n");
|
"ip-prefix-lists (-E) on Nokia.\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
|
|
||||||
if (aggregate && expander.generation < T_PREFIXLIST) {
|
if (aggregate && expander.generation < T_PREFIXLIST) {
|
||||||
sx_report(SX_FATAL, "Sorry, aggregation (-A) used only for prefix-"
|
sx_report(SX_FATAL, "Sorry, aggregation (-A) used only for prefix-"
|
||||||
"lists, extended access-lists and route-filters\n");
|
"lists, extended access-lists and route-filters\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
|
|
||||||
if (expander.sequence && expander.vendor != V_CISCO) {
|
if (expander.sequence && expander.vendor != V_CISCO) {
|
||||||
sx_report(SX_FATAL, "Sorry, prefix-lists sequencing (-s) supported"
|
sx_report(SX_FATAL, "Sorry, prefix-lists sequencing (-s) supported"
|
||||||
" only for IOS\n");
|
" only for IOS\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
|
|
||||||
if (expander.sequence && expander.generation < T_PREFIXLIST) {
|
if (expander.sequence && expander.generation < T_PREFIXLIST) {
|
||||||
sx_report(SX_FATAL, "Sorry, prefix-lists sequencing (-s) can't be "
|
sx_report(SX_FATAL, "Sorry, prefix-lists sequencing (-s) can't be "
|
||||||
" used for non prefix-list\n");
|
" used for non prefix-list\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
|
|
||||||
if (refineLow && !refine) {
|
if (refineLow && !refine) {
|
||||||
if (expander.family == AF_INET)
|
if (expander.family == AF_INET)
|
||||||
refine = 32;
|
refine = 32;
|
||||||
else
|
else
|
||||||
refine = 128;
|
refine = 128;
|
||||||
};
|
}
|
||||||
|
|
||||||
if (refineLow && refineLow > refine) {
|
if (refineLow && refineLow > refine) {
|
||||||
sx_report(SX_FATAL, "Incompatible values for -r %u and -R %u\n",
|
sx_report(SX_FATAL, "Incompatible values for -r %u and -R %u\n",
|
||||||
refineLow, refine);
|
refineLow, refine);
|
||||||
};
|
}
|
||||||
|
|
||||||
if (refine || refineLow) {
|
if (refine || refineLow) {
|
||||||
if (expander.family == AF_INET6 && refine > 128) {
|
if (expander.family == AF_INET6 && refine > 128) {
|
||||||
@@ -535,7 +535,7 @@ main(int argc, char* argv[])
|
|||||||
} else if (expander.family == AF_INET && refineLow > 32) {
|
} else if (expander.family == AF_INET && refineLow > 32) {
|
||||||
sx_report(SX_FATAL, "Invalid value for refineLow(-r): %u (1-32 for"
|
sx_report(SX_FATAL, "Invalid value for refineLow(-r): %u (1-32 for"
|
||||||
" IPv4)\n", refineLow);
|
" IPv4)\n", refineLow);
|
||||||
};
|
}
|
||||||
|
|
||||||
if (expander.vendor == V_JUNIPER && expander.generation == T_PREFIXLIST) {
|
if (expander.vendor == V_JUNIPER && expander.generation == T_PREFIXLIST) {
|
||||||
if (refine) {
|
if (refine) {
|
||||||
@@ -548,8 +548,8 @@ main(int argc, char* argv[])
|
|||||||
"is not supported for Juniper prefix-lists.\n"
|
"is not supported for Juniper prefix-lists.\n"
|
||||||
"Use route-filters (-E) or route-filter-lists (-z) "
|
"Use route-filters (-E) or route-filter-lists (-z) "
|
||||||
"instead\n", refineLow);
|
"instead\n", refineLow);
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
if (expander.generation < T_PREFIXLIST) {
|
if (expander.generation < T_PREFIXLIST) {
|
||||||
if (refine) {
|
if (refine) {
|
||||||
@@ -558,9 +558,9 @@ main(int argc, char* argv[])
|
|||||||
} else {
|
} else {
|
||||||
sx_report(SX_FATAL, "Sorry, more-specific filter (-r %u) "
|
sx_report(SX_FATAL, "Sorry, more-specific filter (-r %u) "
|
||||||
"supported only with prefix-list generation\n", refineLow);
|
"supported only with prefix-list generation\n", refineLow);
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
if (maxlen) {
|
if (maxlen) {
|
||||||
if ((expander.family == AF_INET6 && maxlen > 128)
|
if ((expander.family == AF_INET6 && maxlen > 128)
|
||||||
@@ -575,36 +575,36 @@ main(int argc, char* argv[])
|
|||||||
* routes will be accepted, so save some CPU cycles :)
|
* routes will be accepted, so save some CPU cycles :)
|
||||||
*/
|
*/
|
||||||
expander.maxlen = maxlen;
|
expander.maxlen = maxlen;
|
||||||
};
|
}
|
||||||
} else if (expander.family == AF_INET) {
|
} else if (expander.family == AF_INET) {
|
||||||
expander.maxlen = 32;
|
expander.maxlen = 32;
|
||||||
} else if (expander.family == AF_INET6) {
|
} else if (expander.family == AF_INET6) {
|
||||||
expander.maxlen = 128;
|
expander.maxlen = 128;
|
||||||
};
|
}
|
||||||
|
|
||||||
if (expander.generation == T_EACL && expander.vendor == V_CISCO
|
if (expander.generation == T_EACL && expander.vendor == V_CISCO
|
||||||
&& expander.family == AF_INET6) {
|
&& expander.family == AF_INET6) {
|
||||||
sx_report(SX_FATAL,"Sorry, ipv6 access-lists not supported "
|
sx_report(SX_FATAL,"Sorry, ipv6 access-lists not supported "
|
||||||
"for Cisco yet.\n");
|
"for Cisco yet.\n");
|
||||||
};
|
}
|
||||||
|
|
||||||
if (expander.match != NULL
|
if (expander.match != NULL
|
||||||
&& (expander.vendor != V_JUNIPER || expander.generation != T_EACL)) {
|
&& (expander.vendor != V_JUNIPER || expander.generation != T_EACL)) {
|
||||||
sx_report(SX_FATAL, "Sorry, extra match conditions (-M) can be used "
|
sx_report(SX_FATAL, "Sorry, extra match conditions (-M) can be used "
|
||||||
"only with Juniper route-filters\n");
|
"only with Juniper route-filters\n");
|
||||||
};
|
}
|
||||||
|
|
||||||
if ((expander.generation == T_ASPATH || expander.generation == T_OASPATH)
|
if ((expander.generation == T_ASPATH || expander.generation == T_OASPATH)
|
||||||
&& af != AF_INET && !expander.validate_asns) {
|
&& af != AF_INET && !expander.validate_asns) {
|
||||||
sx_report(SX_FATAL, "Sorry, -6 makes no sense with as-path (-f/-G) "
|
sx_report(SX_FATAL, "Sorry, -6 makes no sense with as-path (-f/-G) "
|
||||||
"generation\n");
|
"generation\n");
|
||||||
};
|
}
|
||||||
|
|
||||||
if (expander.validate_asns && expander.generation != T_ASPATH
|
if (expander.validate_asns && expander.generation != T_ASPATH
|
||||||
&& expander.generation != T_OASPATH) {
|
&& expander.generation != T_OASPATH) {
|
||||||
sx_report(SX_FATAL, "Sorry, -w makes sense only for as-path "
|
sx_report(SX_FATAL, "Sorry, -w makes sense only for as-path "
|
||||||
"(-f/-G) generation\n");
|
"(-f/-G) generation\n");
|
||||||
};
|
}
|
||||||
|
|
||||||
if (!argv[0])
|
if (!argv[0])
|
||||||
usage(1);
|
usage(1);
|
||||||
@@ -628,10 +628,10 @@ main(int argc, char* argv[])
|
|||||||
} else {
|
} else {
|
||||||
SX_DEBUG(debug_expander,"Unknown sub-as"
|
SX_DEBUG(debug_expander,"Unknown sub-as"
|
||||||
" object %s\n", argv[0]);
|
" object %s\n", argv[0]);
|
||||||
};
|
}
|
||||||
} else {
|
} else {
|
||||||
bgpq_expander_add_as(&expander,argv[0]);
|
bgpq_expander_add_as(&expander,argv[0]);
|
||||||
};
|
}
|
||||||
} else {
|
} else {
|
||||||
char* c = strchr(argv[0], '^');
|
char* c = strchr(argv[0], '^');
|
||||||
if (!c && !bgpq_expander_add_prefix(&expander, argv[0])) {
|
if (!c && !bgpq_expander_add_prefix(&expander, argv[0])) {
|
||||||
@@ -643,11 +643,11 @@ main(int argc, char* argv[])
|
|||||||
"%s (bad range or address-family)\n",
|
"%s (bad range or address-family)\n",
|
||||||
argv[0]);
|
argv[0]);
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
argv++;
|
argv++;
|
||||||
argc--;
|
argc--;
|
||||||
};
|
}
|
||||||
|
|
||||||
if (!bgpq_expand(&expander))
|
if (!bgpq_expand(&expander))
|
||||||
exit(1);
|
exit(1);
|
||||||
@@ -683,9 +683,9 @@ main(int argc, char* argv[])
|
|||||||
case T_ROUTE_FILTER_LIST:
|
case T_ROUTE_FILTER_LIST:
|
||||||
bgpq4_print_route_filter_list(stdout, &expander);
|
bgpq4_print_route_filter_list(stdout, &expander);
|
||||||
break;
|
break;
|
||||||
};
|
}
|
||||||
|
|
||||||
expander_freeall(&expander);
|
expander_freeall(&expander);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|||||||
388
bgpq4_printer.c
388
bgpq4_printer.c
File diff suppressed because it is too large
Load Diff
184
bgpq_expander.c
184
bgpq_expander.c
@@ -35,7 +35,7 @@ static inline int
|
|||||||
tentry_cmp(struct sx_tentry* a, struct sx_tentry* b)
|
tentry_cmp(struct sx_tentry* a, struct sx_tentry* b)
|
||||||
{
|
{
|
||||||
return strcasecmp(a->text, b->text);
|
return strcasecmp(a->text, b->text);
|
||||||
};
|
}
|
||||||
|
|
||||||
RB_GENERATE(tentree, sx_tentry, entry, tentry_cmp);
|
RB_GENERATE(tentree, sx_tentry, entry, tentry_cmp);
|
||||||
|
|
||||||
@@ -64,7 +64,7 @@ bgpq_expander_init(struct bgpq_expander* b, int af)
|
|||||||
sx_report(SX_FATAL,"Unable to allocate 8192 bytes: %s\n",
|
sx_report(SX_FATAL,"Unable to allocate 8192 bytes: %s\n",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
memset(b->asn32s[0], 0, 8192);
|
memset(b->asn32s[0], 0, 8192);
|
||||||
b->identify = 1;
|
b->identify = 1;
|
||||||
b->server = "rr.ntt.net";
|
b->server = "rr.ntt.net";
|
||||||
@@ -90,7 +90,7 @@ fixups:
|
|||||||
free(b);
|
free(b);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
bgpq_expander_add_asset(struct bgpq_expander* b, char* as)
|
bgpq_expander_add_asset(struct bgpq_expander* b, char* as)
|
||||||
@@ -105,7 +105,7 @@ bgpq_expander_add_asset(struct bgpq_expander* b, char* as)
|
|||||||
STAILQ_INSERT_TAIL(&b->macroses, le, next);
|
STAILQ_INSERT_TAIL(&b->macroses, le, next);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
bgpq_expander_add_rset(struct bgpq_expander* b, char* rs)
|
bgpq_expander_add_rset(struct bgpq_expander* b, char* rs)
|
||||||
@@ -123,7 +123,7 @@ bgpq_expander_add_rset(struct bgpq_expander* b, char* rs)
|
|||||||
STAILQ_INSERT_TAIL(&b->rsets, le, next);
|
STAILQ_INSERT_TAIL(&b->rsets, le, next);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
bgpq_expander_add_already(struct bgpq_expander* b, char* rs)
|
bgpq_expander_add_already(struct bgpq_expander* b, char* rs)
|
||||||
@@ -139,7 +139,7 @@ bgpq_expander_add_already(struct bgpq_expander* b, char* rs)
|
|||||||
RB_INSERT(tentree, &b->already, le);
|
RB_INSERT(tentree, &b->already, le);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
bgpq_expander_add_stop(struct bgpq_expander* b, char* rs)
|
bgpq_expander_add_stop(struct bgpq_expander* b, char* rs)
|
||||||
@@ -155,7 +155,7 @@ bgpq_expander_add_stop(struct bgpq_expander* b, char* rs)
|
|||||||
RB_INSERT(tentree, &b->stoplist, le);
|
RB_INSERT(tentree, &b->stoplist, le);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
bgpq_expander_add_as(struct bgpq_expander* b, char* as)
|
bgpq_expander_add_as(struct bgpq_expander* b, char* as)
|
||||||
@@ -171,7 +171,7 @@ bgpq_expander_add_as(struct bgpq_expander* b, char* as)
|
|||||||
sx_report(SX_ERROR,"Invalid symbol in AS number: '%c' in %s\n",
|
sx_report(SX_ERROR,"Invalid symbol in AS number: '%c' in %s\n",
|
||||||
*eoa, as);
|
*eoa, as);
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
if (*eoa == '.' || asno > 65535) {
|
if (*eoa == '.' || asno > 65535) {
|
||||||
if (b->asn32 || b->generation >= T_PREFIXLIST) {
|
if (b->asn32 || b->generation >= T_PREFIXLIST) {
|
||||||
@@ -184,7 +184,7 @@ bgpq_expander_add_as(struct bgpq_expander* b, char* as)
|
|||||||
} else {
|
} else {
|
||||||
sx_report(SX_ERROR, "Invalid AS number: '%s'\n", as);
|
sx_report(SX_ERROR, "Invalid AS number: '%s'\n", as);
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
if (eoa && *eoa!=0)
|
if (eoa && *eoa!=0)
|
||||||
sx_report(SX_ERROR,"Invalid symbol in AS number: '%c' in %s\n",
|
sx_report(SX_ERROR,"Invalid symbol in AS number: '%c' in %s\n",
|
||||||
@@ -194,7 +194,7 @@ bgpq_expander_add_as(struct bgpq_expander* b, char* as)
|
|||||||
if (asn1 > 65535) {
|
if (asn1 > 65535) {
|
||||||
sx_report(SX_ERROR, "Invalid AS number in %s\n", as);
|
sx_report(SX_ERROR, "Invalid AS number in %s\n", as);
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
if (!expand_special_asn && (((asno * 65536 + asn1) >= 4200000000ul) ||
|
if (!expand_special_asn && (((asno * 65536 + asn1) >= 4200000000ul) ||
|
||||||
((asno * 65536 + asn1) >= 64496 && (asno * 65536 + asn1) <= 65551)))
|
((asno * 65536 + asn1) >= 64496 && (asno * 65536 + asn1) <= 65551)))
|
||||||
@@ -207,23 +207,23 @@ bgpq_expander_add_as(struct bgpq_expander* b, char* as)
|
|||||||
" Unable to add asn32 %s to future expansion\n",
|
" Unable to add asn32 %s to future expansion\n",
|
||||||
strerror(errno), as);
|
strerror(errno), as);
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
memset(b->asn32s[asno], 0, 8192);
|
memset(b->asn32s[asno], 0, 8192);
|
||||||
};
|
}
|
||||||
|
|
||||||
b->asn32s[asno][asn1/8] |= (0x80 >> (asn1 % 8));
|
b->asn32s[asno][asn1/8] |= (0x80 >> (asn1 % 8));
|
||||||
|
|
||||||
} else if (!b->asn32) {
|
} else if (!b->asn32) {
|
||||||
b->asn32s[0][23456/8] |= (0x80 >> (23456 % 8));
|
b->asn32s[0][23456/8] |= (0x80 >> (23456 % 8));
|
||||||
};
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
};
|
}
|
||||||
|
|
||||||
if (asno < 1 || asno > 65535) {
|
if (asno < 1 || asno > 65535) {
|
||||||
sx_report(SX_ERROR,"Invalid AS number in %s\n", as);
|
sx_report(SX_ERROR,"Invalid AS number in %s\n", as);
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
if (!expand_special_asn && (asno >= 64496 && asno <= 65536))
|
if (!expand_special_asn && (asno >= 64496 && asno <= 65536))
|
||||||
return 0;
|
return 0;
|
||||||
@@ -231,7 +231,7 @@ bgpq_expander_add_as(struct bgpq_expander* b, char* as)
|
|||||||
b->asn32s[0][asno / 8] |= (0x80 >> (asno % 8));
|
b->asn32s[0][asno / 8] |= (0x80 >> (asno % 8));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
bgpq_expander_add_prefix(struct bgpq_expander* b, char* prefix)
|
bgpq_expander_add_prefix(struct bgpq_expander* b, char* prefix)
|
||||||
@@ -244,25 +244,25 @@ bgpq_expander_add_prefix(struct bgpq_expander* b, char* prefix)
|
|||||||
SX_DEBUG(debug_expander, "Ignoring prefix %s with wrong "
|
SX_DEBUG(debug_expander, "Ignoring prefix %s with wrong "
|
||||||
"address family\n", prefix);
|
"address family\n", prefix);
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
if (b->maxlen && p->masklen>b->maxlen) {
|
if (b->maxlen && p->masklen>b->maxlen) {
|
||||||
SX_DEBUG(debug_expander, "Ignoring prefix %s: masklen %i > max"
|
SX_DEBUG(debug_expander, "Ignoring prefix %s: masklen %i > max"
|
||||||
" masklen %u\n", prefix, p->masklen, b->maxlen);
|
" masklen %u\n", prefix, p->masklen, b->maxlen);
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
sx_radix_tree_insert(b->tree,p);
|
sx_radix_tree_insert(b->tree,p);
|
||||||
|
|
||||||
if (p)
|
if (p)
|
||||||
sx_prefix_destroy(p);
|
sx_prefix_destroy(p);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
bgpq_expander_add_prefix_range(struct bgpq_expander* b, char* prefix)
|
bgpq_expander_add_prefix_range(struct bgpq_expander* b, char* prefix)
|
||||||
{
|
{
|
||||||
return sx_prefix_range_parse(b->tree, b->family, b->maxlen, prefix);
|
return sx_prefix_range_parse(b->tree, b->family, b->maxlen, prefix);
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
bgpq_expanded_macro(char* as, struct bgpq_expander* ex,
|
bgpq_expanded_macro(char* as, struct bgpq_expander* ex,
|
||||||
@@ -271,7 +271,7 @@ bgpq_expanded_macro(char* as, struct bgpq_expander* ex,
|
|||||||
bgpq_expander_add_as(ex, as);
|
bgpq_expander_add_as(ex, as);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
};
|
}
|
||||||
|
|
||||||
struct bgpq_request* bgpq_pipeline(struct bgpq_expander* b,
|
struct bgpq_request* bgpq_pipeline(struct bgpq_expander* b,
|
||||||
int (*callback)(char*, struct bgpq_expander* b, struct bgpq_request* req),
|
int (*callback)(char*, struct bgpq_expander* b, struct bgpq_request* req),
|
||||||
@@ -291,13 +291,13 @@ bgpq_expanded_macro_limit(char* as, struct bgpq_expander* b,
|
|||||||
SX_DEBUG(debug_expander>2, "%s is already expanding, "
|
SX_DEBUG(debug_expander>2, "%s is already expanding, "
|
||||||
"ignore\n", as);
|
"ignore\n", as);
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
if (RB_FIND(tentree, &b->stoplist, &tkey)) {
|
if (RB_FIND(tentree, &b->stoplist, &tkey)) {
|
||||||
SX_DEBUG(debug_expander>2, "%s is in the stoplist, "
|
SX_DEBUG(debug_expander>2, "%s is in the stoplist, "
|
||||||
"ignore\n", as);
|
"ignore\n", as);
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
if (!b->maxdepth ||
|
if (!b->maxdepth ||
|
||||||
(b->cdepth + 1 < b->maxdepth &&
|
(b->cdepth + 1 < b->maxdepth &&
|
||||||
@@ -313,12 +313,12 @@ bgpq_expanded_macro_limit(char* as, struct bgpq_expander* b,
|
|||||||
bgpq_expand_irrd(b, bgpq_expanded_macro_limit,
|
bgpq_expand_irrd(b, bgpq_expanded_macro_limit,
|
||||||
NULL, "!i%s\n", as);
|
NULL, "!i%s\n", as);
|
||||||
b->cdepth--;
|
b->cdepth--;
|
||||||
};
|
}
|
||||||
} else {
|
} else {
|
||||||
SX_DEBUG(debug_expander>2, "ignoring %s at depth %i\n",
|
SX_DEBUG(debug_expander>2, "ignoring %s at depth %i\n",
|
||||||
as,
|
as,
|
||||||
b->cdepth ? (b->cdepth + 1) : (req->depth + 1));
|
b->cdepth ? (b->cdepth + 1) : (req->depth + 1));
|
||||||
};
|
}
|
||||||
} else if (!strncasecmp(as, "AS", 2)) {
|
} else if (!strncasecmp(as, "AS", 2)) {
|
||||||
struct sx_tentry tkey = { .text = as };
|
struct sx_tentry tkey = { .text = as };
|
||||||
|
|
||||||
@@ -326,7 +326,7 @@ bgpq_expanded_macro_limit(char* as, struct bgpq_expander* b,
|
|||||||
SX_DEBUG(debug_expander > 2,
|
SX_DEBUG(debug_expander > 2,
|
||||||
"%s is in the stoplist, ignore\n", as);
|
"%s is in the stoplist, ignore\n", as);
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
if (bgpq_expander_add_as(b, as)) {
|
if (bgpq_expander_add_as(b, as)) {
|
||||||
SX_DEBUG(debug_expander > 2, ".. added asn %s\n", as);
|
SX_DEBUG(debug_expander > 2, ".. added asn %s\n", as);
|
||||||
@@ -343,7 +343,7 @@ bgpq_expanded_macro_limit(char* as, struct bgpq_expander* b,
|
|||||||
req->request);
|
req->request);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
bgpq_expanded_prefix(char* as, struct bgpq_expander* ex,
|
bgpq_expanded_prefix(char* as, struct bgpq_expander* ex,
|
||||||
@@ -357,7 +357,7 @@ bgpq_expanded_prefix(char* as, struct bgpq_expander* ex,
|
|||||||
bgpq_expander_add_prefix_range(ex, as);
|
bgpq_expander_add_prefix_range(ex, as);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
bgpq_expanded_v6prefix(char* prefix, struct bgpq_expander* ex,
|
bgpq_expanded_v6prefix(char* prefix, struct bgpq_expander* ex,
|
||||||
@@ -371,7 +371,7 @@ bgpq_expanded_v6prefix(char* prefix, struct bgpq_expander* ex,
|
|||||||
bgpq_expander_add_prefix_range(ex, prefix);
|
bgpq_expander_add_prefix_range(ex, prefix);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
};
|
}
|
||||||
|
|
||||||
int bgpq_pipeline_dequeue(int fd, struct bgpq_expander* b);
|
int bgpq_pipeline_dequeue(int fd, struct bgpq_expander* b);
|
||||||
|
|
||||||
@@ -392,7 +392,7 @@ bgpq_request_alloc(char* request, int (*callback)(char*, struct bgpq_expander*,
|
|||||||
bp->udata = udata;
|
bp->udata = udata;
|
||||||
|
|
||||||
return bp;
|
return bp;
|
||||||
};
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bgpq_request_free(struct bgpq_request* req)
|
bgpq_request_free(struct bgpq_request* req)
|
||||||
@@ -401,7 +401,7 @@ bgpq_request_free(struct bgpq_request* req)
|
|||||||
free(req->request);
|
free(req->request);
|
||||||
|
|
||||||
free(req);
|
free(req);
|
||||||
};
|
}
|
||||||
|
|
||||||
struct bgpq_request*
|
struct bgpq_request*
|
||||||
bgpq_pipeline(struct bgpq_expander* b,
|
bgpq_pipeline(struct bgpq_expander* b,
|
||||||
@@ -426,7 +426,7 @@ bgpq_pipeline(struct bgpq_expander* b,
|
|||||||
(unsigned long)sizeof(struct bgpq_request),
|
(unsigned long)sizeof(struct bgpq_request),
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
|
|
||||||
if (STAILQ_EMPTY(&b->wq)) {
|
if (STAILQ_EMPTY(&b->wq)) {
|
||||||
ret = write(b->fd, request, bp->size);
|
ret = write(b->fd, request, bp->size);
|
||||||
@@ -434,21 +434,21 @@ bgpq_pipeline(struct bgpq_expander* b,
|
|||||||
if (errno == EAGAIN) {
|
if (errno == EAGAIN) {
|
||||||
STAILQ_INSERT_TAIL(&b->wq, bp, next);
|
STAILQ_INSERT_TAIL(&b->wq, bp, next);
|
||||||
return bp;
|
return bp;
|
||||||
};
|
}
|
||||||
sx_report(SX_FATAL, "Error writing request: %s\n",
|
sx_report(SX_FATAL, "Error writing request: %s\n",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
};
|
}
|
||||||
bp->offset=ret;
|
bp->offset=ret;
|
||||||
if (ret == bp->size) {
|
if (ret == bp->size) {
|
||||||
STAILQ_INSERT_TAIL(&b->rq, bp, next);
|
STAILQ_INSERT_TAIL(&b->rq, bp, next);
|
||||||
} else {
|
} else {
|
||||||
STAILQ_INSERT_TAIL(&b->wq, bp, next);
|
STAILQ_INSERT_TAIL(&b->wq, bp, next);
|
||||||
};
|
}
|
||||||
} else
|
} else
|
||||||
STAILQ_INSERT_TAIL(&b->wq, bp, next);
|
STAILQ_INSERT_TAIL(&b->wq, bp, next);
|
||||||
|
|
||||||
return bp;
|
return bp;
|
||||||
};
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bgpq_expander_invalidate_asn(struct bgpq_expander* b, const char* q)
|
bgpq_expander_invalidate_asn(struct bgpq_expander* b, const char* q)
|
||||||
@@ -461,7 +461,7 @@ bgpq_expander_invalidate_asn(struct bgpq_expander* b, const char* q)
|
|||||||
sx_report(SX_ERROR, "some problem invalidating asn"
|
sx_report(SX_ERROR, "some problem invalidating asn"
|
||||||
" %s\n", q);
|
" %s\n", q);
|
||||||
return;
|
return;
|
||||||
};
|
}
|
||||||
asn1 = asn % 65536;
|
asn1 = asn % 65536;
|
||||||
asn0 = asn / 65536;
|
asn0 = asn / 65536;
|
||||||
if (!b->asn32s[asn0] ||
|
if (!b->asn32s[asn0] ||
|
||||||
@@ -470,9 +470,9 @@ bgpq_expander_invalidate_asn(struct bgpq_expander* b, const char* q)
|
|||||||
"asn %lu(%s)\n", asn, q);
|
"asn %lu(%s)\n", asn, q);
|
||||||
} else {
|
} else {
|
||||||
b->asn32s[asn0][asn1 / 8] &= ~(0x80 >> (asn1 % 8));
|
b->asn32s[asn0][asn1 / 8] &= ~(0x80 >> (asn1 % 8));
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bgpq_write(struct bgpq_expander* b)
|
bgpq_write(struct bgpq_expander* b)
|
||||||
@@ -488,7 +488,7 @@ bgpq_write(struct bgpq_expander* b)
|
|||||||
return;
|
return;
|
||||||
sx_report(SX_FATAL, "error writing data: %s\n",
|
sx_report(SX_FATAL, "error writing data: %s\n",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
};
|
}
|
||||||
|
|
||||||
if (ret == req->size - req->offset) {
|
if (ret == req->size - req->offset) {
|
||||||
/* this request was dequeued */
|
/* this request was dequeued */
|
||||||
@@ -497,9 +497,9 @@ bgpq_write(struct bgpq_expander* b)
|
|||||||
} else {
|
} else {
|
||||||
req->offset += ret;
|
req->offset += ret;
|
||||||
break;
|
break;
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
bgpq_selread(struct bgpq_expander* b, char* buffer, int size)
|
bgpq_selread(struct bgpq_expander* b, char* buffer, int size)
|
||||||
@@ -533,7 +533,7 @@ repeat:
|
|||||||
return read(b->fd, buffer, size);
|
return read(b->fd, buffer, size);
|
||||||
|
|
||||||
goto repeat;
|
goto repeat;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
bgpq_read(struct bgpq_expander* b)
|
bgpq_read(struct bgpq_expander* b)
|
||||||
@@ -563,7 +563,7 @@ repeat:
|
|||||||
"%s (dequeue)\n", strerror(errno));
|
"%s (dequeue)\n", strerror(errno));
|
||||||
} else if (ret == 0) {
|
} else if (ret == 0) {
|
||||||
sx_report(SX_FATAL,"EOF from IRRd (dequeue)\n");
|
sx_report(SX_FATAL,"EOF from IRRd (dequeue)\n");
|
||||||
};
|
}
|
||||||
off += ret;
|
off += ret;
|
||||||
|
|
||||||
if (!(cres = strchr(response, '\n')))
|
if (!(cres = strchr(response, '\n')))
|
||||||
@@ -582,7 +582,7 @@ have:
|
|||||||
if (!recvbuffer) {
|
if (!recvbuffer) {
|
||||||
sx_report(SX_FATAL, "error allocating %lu "
|
sx_report(SX_FATAL, "error allocating %lu "
|
||||||
"bytes: %s\n", togot + 2, strerror(errno));
|
"bytes: %s\n", togot + 2, strerror(errno));
|
||||||
};
|
}
|
||||||
|
|
||||||
memset(recvbuffer,0,togot+2);
|
memset(recvbuffer,0,togot+2);
|
||||||
|
|
||||||
@@ -591,7 +591,7 @@ have:
|
|||||||
" char '%c'(%s)\n", eon ? *eon : '0',
|
" char '%c'(%s)\n", eon ? *eon : '0',
|
||||||
response);
|
response);
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
|
|
||||||
if (off - ((eon + 1) - response) > togot) {
|
if (off - ((eon + 1) - response) > togot) {
|
||||||
// full response and more data is already in buffer
|
// full response and more data is already in buffer
|
||||||
@@ -609,7 +609,7 @@ have:
|
|||||||
offset = off - ((eon+1) - response);
|
offset = off - ((eon+1) - response);
|
||||||
memset(response, 0, sizeof(response));
|
memset(response, 0, sizeof(response));
|
||||||
off = 0;
|
off = 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
SX_DEBUG(debug_expander>5,
|
SX_DEBUG(debug_expander>5,
|
||||||
"starting read with ready '%.*s', waiting for "
|
"starting read with ready '%.*s', waiting for "
|
||||||
@@ -631,7 +631,7 @@ reread:
|
|||||||
} else if (ret == 0) {
|
} else if (ret == 0) {
|
||||||
sx_report(SX_FATAL,"EOF from IRRd (dequeue, "
|
sx_report(SX_FATAL,"EOF from IRRd (dequeue, "
|
||||||
"result)\n");
|
"result)\n");
|
||||||
};
|
}
|
||||||
SX_DEBUG(debug_expander > 5,
|
SX_DEBUG(debug_expander > 5,
|
||||||
"Read1: got '%.*s'\n", ret,
|
"Read1: got '%.*s'\n", ret,
|
||||||
recvbuffer + offset);
|
recvbuffer + offset);
|
||||||
@@ -641,7 +641,7 @@ reread:
|
|||||||
"%lu expanding %s", togot,
|
"%lu expanding %s", togot,
|
||||||
strlen(recvbuffer), req->request);
|
strlen(recvbuffer), req->request);
|
||||||
goto reread;
|
goto reread;
|
||||||
};
|
}
|
||||||
|
|
||||||
reread2:
|
reread2:
|
||||||
ret = bgpq_selread(b, response + off,
|
ret = bgpq_selread(b, response + off,
|
||||||
@@ -655,7 +655,7 @@ reread2:
|
|||||||
} else if (ret == 0) {
|
} else if (ret == 0) {
|
||||||
sx_report(SX_FATAL,"EOF from IRRd (dequeue,"
|
sx_report(SX_FATAL,"EOF from IRRd (dequeue,"
|
||||||
"final)\n");
|
"final)\n");
|
||||||
};
|
}
|
||||||
|
|
||||||
SX_DEBUG(debug_expander > 5,
|
SX_DEBUG(debug_expander > 5,
|
||||||
"Read2: got '%.*s'\n", ret, response + off);
|
"Read2: got '%.*s'\n", ret, response + off);
|
||||||
@@ -679,7 +679,7 @@ have3:
|
|||||||
break;
|
break;
|
||||||
req->callback(c, b, req);
|
req->callback(c, b, req);
|
||||||
c += spn+1;
|
c += spn+1;
|
||||||
};
|
}
|
||||||
assert(c == recvbuffer + togot);
|
assert(c == recvbuffer + togot);
|
||||||
memset(recvbuffer, 0, togot + 2);
|
memset(recvbuffer, 0, togot + 2);
|
||||||
free(recvbuffer);
|
free(recvbuffer);
|
||||||
@@ -705,7 +705,7 @@ have3:
|
|||||||
sx_report(SX_ERROR,"Wrong reply: %s to %s\n", response,
|
sx_report(SX_ERROR,"Wrong reply: %s to %s\n", response,
|
||||||
req->request);
|
req->request);
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
|
|
||||||
memmove(response, cres + 1, off - ((cres + 1) - response));
|
memmove(response, cres + 1, off - ((cres + 1) - response));
|
||||||
off -= (cres+1) - response;
|
off -= (cres+1) - response;
|
||||||
@@ -717,10 +717,10 @@ have3:
|
|||||||
b->piped--;
|
b->piped--;
|
||||||
|
|
||||||
bgpq_request_free(req);
|
bgpq_request_free(req);
|
||||||
};
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
bgpq_expand_irrd(struct bgpq_expander* b,
|
bgpq_expand_irrd(struct bgpq_expander* b,
|
||||||
@@ -745,7 +745,7 @@ bgpq_expand_irrd(struct bgpq_expander* b,
|
|||||||
sx_report(SX_FATAL,"Partial write to IRRd, only %i bytes "
|
sx_report(SX_FATAL,"Partial write to IRRd, only %i bytes "
|
||||||
"written: %s\n", ret, strerror(errno));
|
"written: %s\n", ret, strerror(errno));
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
memset(response, 0, sizeof(response));
|
memset(response, 0, sizeof(response));
|
||||||
|
|
||||||
repeat:
|
repeat:
|
||||||
@@ -757,7 +757,7 @@ repeat:
|
|||||||
} else if (ret == 0) {
|
} else if (ret == 0) {
|
||||||
sx_report(SX_FATAL, "EOF reading IRRd\n");
|
sx_report(SX_FATAL, "EOF reading IRRd\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
|
|
||||||
off += ret;
|
off += ret;
|
||||||
|
|
||||||
@@ -776,13 +776,13 @@ repeat:
|
|||||||
if (!recvbuffer) {
|
if (!recvbuffer) {
|
||||||
sx_report(SX_FATAL, "Error allocating %lu bytes: %s\n",
|
sx_report(SX_FATAL, "Error allocating %lu bytes: %s\n",
|
||||||
togot + 2, strerror(errno));
|
togot + 2, strerror(errno));
|
||||||
};
|
}
|
||||||
|
|
||||||
if (eon && *eon != '\n') {
|
if (eon && *eon != '\n') {
|
||||||
sx_report(SX_ERROR,"A-code finised with wrong char "
|
sx_report(SX_ERROR,"A-code finised with wrong char "
|
||||||
"'%c' (%s)\n", *eon,response);
|
"'%c' (%s)\n", *eon,response);
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
|
|
||||||
if (off - ((eon + 1)-response) > togot) {
|
if (off - ((eon + 1)-response) > togot) {
|
||||||
memcpy(recvbuffer, eon+1, togot);
|
memcpy(recvbuffer, eon+1, togot);
|
||||||
@@ -797,7 +797,7 @@ repeat:
|
|||||||
offset = off - ((eon + 1) - response);
|
offset = off - ((eon + 1) - response);
|
||||||
memset(response, 0, sizeof(response));
|
memset(response, 0, sizeof(response));
|
||||||
off = 0;
|
off = 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
if (off > 0)
|
if (off > 0)
|
||||||
goto have3;
|
goto have3;
|
||||||
@@ -811,7 +811,7 @@ reread:
|
|||||||
} else if (ret < 0) {
|
} else if (ret < 0) {
|
||||||
sx_report(SX_FATAL,"Error reading IRRd: %s "
|
sx_report(SX_FATAL,"Error reading IRRd: %s "
|
||||||
"(expand,result)\n", strerror(errno));
|
"(expand,result)\n", strerror(errno));
|
||||||
};
|
}
|
||||||
offset += ret;
|
offset += ret;
|
||||||
if (offset < togot)
|
if (offset < togot)
|
||||||
goto reread;
|
goto reread;
|
||||||
@@ -825,7 +825,7 @@ reread2:
|
|||||||
} else if (ret == 0) {
|
} else if (ret == 0) {
|
||||||
sx_report(SX_FATAL, "eof reading IRRd\n");
|
sx_report(SX_FATAL, "eof reading IRRd\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
off += ret;
|
off += ret;
|
||||||
|
|
||||||
have3:
|
have3:
|
||||||
@@ -846,7 +846,7 @@ have3:
|
|||||||
if (callback)
|
if (callback)
|
||||||
callback(c, b, req);
|
callback(c, b, req);
|
||||||
c += spn + 1;
|
c += spn + 1;
|
||||||
};
|
}
|
||||||
memset(recvbuffer, 0, togot + 2);
|
memset(recvbuffer, 0, togot + 2);
|
||||||
free(recvbuffer);
|
free(recvbuffer);
|
||||||
} else if (response[0] == 'C') {
|
} else if (response[0] == 'C') {
|
||||||
@@ -864,11 +864,11 @@ have3:
|
|||||||
} else {
|
} else {
|
||||||
sx_report(SX_ERROR,"Wrong reply: %s\n", response);
|
sx_report(SX_ERROR,"Wrong reply: %s\n", response);
|
||||||
exit(0);
|
exit(0);
|
||||||
};
|
}
|
||||||
bgpq_request_free(req);
|
bgpq_request_free(req);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
bgpq_expand(struct bgpq_expander* b)
|
bgpq_expand(struct bgpq_expander* b)
|
||||||
@@ -890,7 +890,7 @@ bgpq_expand(struct bgpq_expander* b)
|
|||||||
sx_report(SX_ERROR,"Unable to resolve %s: %s\n", b->server,
|
sx_report(SX_ERROR,"Unable to resolve %s: %s\n", b->server,
|
||||||
gai_strerror(err));
|
gai_strerror(err));
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
|
|
||||||
for (rp=res; rp; rp = rp->ai_next) {
|
for (rp=res; rp; rp = rp->ai_next) {
|
||||||
fd = socket(rp->ai_family, rp->ai_socktype, 0);
|
fd = socket(rp->ai_family, rp->ai_socktype, 0);
|
||||||
@@ -900,7 +900,7 @@ bgpq_expand(struct bgpq_expander* b)
|
|||||||
sx_report(SX_ERROR,"Unable to create socket: %s\n",
|
sx_report(SX_ERROR,"Unable to create socket: %s\n",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
if (setsockopt(fd, SOL_SOCKET, SO_LINGER, &sl,
|
if (setsockopt(fd, SOL_SOCKET, SO_LINGER, &sl,
|
||||||
sizeof(struct linger))) {
|
sizeof(struct linger))) {
|
||||||
sx_report(SX_ERROR,"Unable to set linger on socket: "
|
sx_report(SX_ERROR,"Unable to set linger on socket: "
|
||||||
@@ -908,14 +908,14 @@ bgpq_expand(struct bgpq_expander* b)
|
|||||||
shutdown(fd, SHUT_RDWR);
|
shutdown(fd, SHUT_RDWR);
|
||||||
close(fd);
|
close(fd);
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
err = connect(fd, rp->ai_addr, rp->ai_addrlen);
|
err = connect(fd, rp->ai_addr, rp->ai_addrlen);
|
||||||
if (err) {
|
if (err) {
|
||||||
shutdown(fd, SHUT_RDWR);
|
shutdown(fd, SHUT_RDWR);
|
||||||
close(fd);
|
close(fd);
|
||||||
fd = -1;
|
fd = -1;
|
||||||
continue;
|
continue;
|
||||||
};
|
}
|
||||||
err = sx_maxsockbuf(fd, SO_SNDBUF);
|
err = sx_maxsockbuf(fd, SO_SNDBUF);
|
||||||
if (err > 0) {
|
if (err > 0) {
|
||||||
SX_DEBUG(debug_expander, "Acquired sendbuf of %i "
|
SX_DEBUG(debug_expander, "Acquired sendbuf of %i "
|
||||||
@@ -925,9 +925,9 @@ bgpq_expand(struct bgpq_expander* b)
|
|||||||
close(fd);
|
close(fd);
|
||||||
fd = -1;
|
fd = -1;
|
||||||
continue;
|
continue;
|
||||||
};
|
}
|
||||||
break;
|
break;
|
||||||
};
|
}
|
||||||
|
|
||||||
freeaddrinfo(res);
|
freeaddrinfo(res);
|
||||||
|
|
||||||
@@ -936,7 +936,7 @@ bgpq_expand(struct bgpq_expander* b)
|
|||||||
sx_report(SX_ERROR,"All attempts to connect %s failed, last"
|
sx_report(SX_ERROR,"All attempts to connect %s failed, last"
|
||||||
" error: %s\n", b->server, strerror(errno));
|
" error: %s\n", b->server, strerror(errno));
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
|
|
||||||
b->fd = fd;
|
b->fd = fd;
|
||||||
|
|
||||||
@@ -944,14 +944,14 @@ bgpq_expand(struct bgpq_expander* b)
|
|||||||
sx_report(SX_ERROR,"Partial write to IRRd: %i bytes, %s\n",
|
sx_report(SX_ERROR,"Partial write to IRRd: %i bytes, %s\n",
|
||||||
ret, strerror(errno));
|
ret, strerror(errno));
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
|
|
||||||
if (b->identify) {
|
if (b->identify) {
|
||||||
char ident[128];
|
char ident[128];
|
||||||
snprintf(ident, sizeof(ident), "!n" PACKAGE_STRING "\n");
|
snprintf(ident, sizeof(ident), "!n" PACKAGE_STRING "\n");
|
||||||
write(fd, ident, strlen(ident));
|
write(fd, ident, strlen(ident));
|
||||||
read(fd, ident, sizeof(ident));
|
read(fd, ident, sizeof(ident));
|
||||||
};
|
}
|
||||||
|
|
||||||
/* Test whether the server has support for the A query */
|
/* Test whether the server has support for the A query */
|
||||||
if (b->generation >= T_PREFIXLIST) {
|
if (b->generation >= T_PREFIXLIST) {
|
||||||
@@ -983,8 +983,8 @@ bgpq_expand(struct bgpq_expander* b)
|
|||||||
sx_report(SX_ERROR, "Invalid source(s) '%s': %s\n",
|
sx_report(SX_ERROR, "Invalid source(s) '%s': %s\n",
|
||||||
b->sources, sources);
|
b->sources, sources);
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
if (pipelining)
|
if (pipelining)
|
||||||
fcntl(fd, F_SETFL, O_NONBLOCK|(fcntl(fd, F_GETFL)));
|
fcntl(fd, F_SETFL, O_NONBLOCK|(fcntl(fd, F_GETFL)));
|
||||||
@@ -1007,15 +1007,15 @@ bgpq_expand(struct bgpq_expander* b)
|
|||||||
else
|
else
|
||||||
bgpq_expand_irrd(b, bgpq_expanded_macro_limit,
|
bgpq_expand_irrd(b, bgpq_expanded_macro_limit,
|
||||||
NULL, "!i%s\n", mc->text);
|
NULL, "!i%s\n", mc->text);
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
if (pipelining) {
|
if (pipelining) {
|
||||||
if (!STAILQ_EMPTY(&b->wq))
|
if (!STAILQ_EMPTY(&b->wq))
|
||||||
bgpq_write(b);
|
bgpq_write(b);
|
||||||
if (!STAILQ_EMPTY(&b->rq))
|
if (!STAILQ_EMPTY(&b->rq))
|
||||||
bgpq_read(b);
|
bgpq_read(b);
|
||||||
};
|
}
|
||||||
|
|
||||||
if (b->generation >= T_PREFIXLIST || b->validate_asns) {
|
if (b->generation >= T_PREFIXLIST || b->validate_asns) {
|
||||||
uint32_t i, j, k;
|
uint32_t i, j, k;
|
||||||
@@ -1026,7 +1026,7 @@ bgpq_expand(struct bgpq_expander* b)
|
|||||||
else
|
else
|
||||||
bgpq_expand_irrd(b, bgpq_expanded_v6prefix,
|
bgpq_expand_irrd(b, bgpq_expanded_v6prefix,
|
||||||
NULL, "!i%s,1\n", mc->text);
|
NULL, "!i%s,1\n", mc->text);
|
||||||
};
|
}
|
||||||
for (k=0; k < sizeof(b->asn32s) / sizeof(unsigned char*); k++) {
|
for (k=0; k < sizeof(b->asn32s) / sizeof(unsigned char*); k++) {
|
||||||
if (!b->asn32s[k])
|
if (!b->asn32s[k])
|
||||||
continue;
|
continue;
|
||||||
@@ -1040,7 +1040,7 @@ bgpq_expand(struct bgpq_expander* b)
|
|||||||
} else {
|
} else {
|
||||||
bgpq_pipeline(b, bgpq_expanded_v6prefix,
|
bgpq_pipeline(b, bgpq_expanded_v6prefix,
|
||||||
NULL, "!6as%" PRIu32 "\n", (k << 16) + i * 8 + j);
|
NULL, "!6as%" PRIu32 "\n", (k << 16) + i * 8 + j);
|
||||||
};
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!pipelining) {
|
if (!pipelining) {
|
||||||
bgpq_expand_irrd(b, bgpq_expanded_prefix,
|
bgpq_expand_irrd(b, bgpq_expanded_prefix,
|
||||||
@@ -1048,29 +1048,29 @@ bgpq_expand(struct bgpq_expander* b)
|
|||||||
} else {
|
} else {
|
||||||
bgpq_pipeline(b, bgpq_expanded_prefix,
|
bgpq_pipeline(b, bgpq_expanded_prefix,
|
||||||
NULL, "!gas%" PRIu32 "\n", ( k<< 16) + i* 8 + j);
|
NULL, "!gas%" PRIu32 "\n", ( k<< 16) + i* 8 + j);
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
if (pipelining) {
|
if (pipelining) {
|
||||||
if (!STAILQ_EMPTY(&b->wq))
|
if (!STAILQ_EMPTY(&b->wq))
|
||||||
bgpq_write(b);
|
bgpq_write(b);
|
||||||
if (!STAILQ_EMPTY(&b->rq))
|
if (!STAILQ_EMPTY(&b->rq))
|
||||||
bgpq_read(b);
|
bgpq_read(b);
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
write(fd, "!q\n",3);
|
write(fd, "!q\n",3);
|
||||||
if (pipelining) {
|
if (pipelining) {
|
||||||
int fl = fcntl(fd, F_GETFL);
|
int fl = fcntl(fd, F_GETFL);
|
||||||
fl &= ~O_NONBLOCK;
|
fl &= ~O_NONBLOCK;
|
||||||
fcntl(fd, F_SETFL, fl);
|
fcntl(fd, F_SETFL, fl);
|
||||||
};
|
}
|
||||||
shutdown(fd, SHUT_RDWR);
|
shutdown(fd, SHUT_RDWR);
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
};
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ sx_maxsockbuf(int s, int dir)
|
|||||||
sx_report(SX_FATAL,"Unable to maximize sockbuf on invalid "
|
sx_report(SX_FATAL,"Unable to maximize sockbuf on invalid "
|
||||||
"socket %i\n", s);
|
"socket %i\n", s);
|
||||||
exit(1);
|
exit(1);
|
||||||
};
|
}
|
||||||
|
|
||||||
voptlen = sizeof(optval);
|
voptlen = sizeof(optval);
|
||||||
|
|
||||||
@@ -35,7 +35,7 @@ sx_maxsockbuf(int s, int dir)
|
|||||||
sx_report(SX_ERROR,"initial getsockopt failed: %s\n",
|
sx_report(SX_ERROR,"initial getsockopt failed: %s\n",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
};
|
}
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
iterations++;
|
iterations++;
|
||||||
@@ -46,7 +46,7 @@ sx_maxsockbuf(int s, int dir)
|
|||||||
if (optval == (hiconf + loconf) / 2)
|
if (optval == (hiconf + loconf) / 2)
|
||||||
break;
|
break;
|
||||||
optval = (hiconf + loconf) / 2;
|
optval = (hiconf + loconf) / 2;
|
||||||
};
|
}
|
||||||
|
|
||||||
if (optval > SX_MAXSOCKBUF_MAX && phase == 0)
|
if (optval > SX_MAXSOCKBUF_MAX && phase == 0)
|
||||||
break;
|
break;
|
||||||
@@ -62,7 +62,7 @@ sx_maxsockbuf(int s, int dir)
|
|||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
loconf = optval;
|
loconf = optval;
|
||||||
};
|
}
|
||||||
|
|
||||||
voptlen = sizeof(voptval);
|
voptlen = sizeof(voptval);
|
||||||
|
|
||||||
@@ -89,8 +89,8 @@ sx_maxsockbuf(int s, int dir)
|
|||||||
* case OS permits it
|
* case OS permits it
|
||||||
*/
|
*/
|
||||||
break;
|
break;
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
voptlen = sizeof(voptval);
|
voptlen = sizeof(voptval);
|
||||||
if (getsockopt(s, SOL_SOCKET, dir, (void*)&voptval,
|
if (getsockopt(s, SOL_SOCKET, dir, (void*)&voptval,
|
||||||
@@ -103,7 +103,7 @@ sx_maxsockbuf(int s, int dir)
|
|||||||
printf("Finally got %i bytes of recvspace in %i interations\n",
|
printf("Finally got %i bytes of recvspace in %i interations\n",
|
||||||
voptval, iterations);
|
voptval, iterations);
|
||||||
*/
|
*/
|
||||||
};
|
}
|
||||||
|
|
||||||
return voptval;
|
return voptval;
|
||||||
};
|
}
|
||||||
|
|||||||
226
sx_prefix.c
226
sx_prefix.c
@@ -29,14 +29,14 @@ sx_prefix_alloc(struct sx_prefix* p)
|
|||||||
memset(sp, 0, sizeof(struct sx_prefix));
|
memset(sp, 0, sizeof(struct sx_prefix));
|
||||||
|
|
||||||
return sp;
|
return sp;
|
||||||
};
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
sx_prefix_destroy(struct sx_prefix* p)
|
sx_prefix_destroy(struct sx_prefix* p)
|
||||||
{
|
{
|
||||||
if (p)
|
if (p)
|
||||||
free(p);
|
free(p);
|
||||||
};
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
sx_radix_node_destroy(struct sx_radix_node *n)
|
sx_radix_node_destroy(struct sx_radix_node *n)
|
||||||
@@ -50,7 +50,7 @@ sx_radix_node_destroy(struct sx_radix_node *n)
|
|||||||
|
|
||||||
free(n);
|
free(n);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
sx_prefix_adjust_masklen(struct sx_prefix* p)
|
sx_prefix_adjust_masklen(struct sx_prefix* p)
|
||||||
@@ -63,12 +63,12 @@ sx_prefix_adjust_masklen(struct sx_prefix* p)
|
|||||||
|
|
||||||
for (i = nbytes -1; i > p->masklen / 8; i--) {
|
for (i = nbytes -1; i > p->masklen / 8; i--) {
|
||||||
p->addr.addrs[i]=0;
|
p->addr.addrs[i]=0;
|
||||||
};
|
}
|
||||||
|
|
||||||
for (i = 1; i <= 8 - p->masklen % 8; i++) {
|
for (i = 1; i <= 8 - p->masklen % 8; i++) {
|
||||||
p->addr.addrs[p->masklen / 8] &= (0xff << i);
|
p->addr.addrs[p->masklen / 8] &= (0xff << i);
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
sx_prefix_mask(struct sx_prefix* p, struct sx_prefix* q)
|
sx_prefix_mask(struct sx_prefix* p, struct sx_prefix* q)
|
||||||
@@ -85,7 +85,7 @@ sx_prefix_mask(struct sx_prefix* p, struct sx_prefix* q)
|
|||||||
|
|
||||||
for (i = 1; i <= p->masklen % 8; i++)
|
for (i = 1; i <= p->masklen % 8; i++)
|
||||||
q->addr.addrs[p->masklen / 8] |= (1 << (8 - i));
|
q->addr.addrs[p->masklen / 8] |= (1 << (8 - i));
|
||||||
};
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
sx_prefix_imask(struct sx_prefix* p, struct sx_prefix* q)
|
sx_prefix_imask(struct sx_prefix* p, struct sx_prefix* q)
|
||||||
@@ -102,7 +102,7 @@ sx_prefix_imask(struct sx_prefix* p, struct sx_prefix* q)
|
|||||||
|
|
||||||
for (i = 1;i <= p->masklen % 8; i++)
|
for (i = 1;i <= p->masklen % 8; i++)
|
||||||
q->addr.addrs[p->masklen / 8] &= ~(1 <<(8 - i));
|
q->addr.addrs[p->masklen / 8] &= ~(1 <<(8 - i));
|
||||||
};
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
@@ -125,17 +125,17 @@ sx_prefix_parse(struct sx_prefix* p, int af, char* text)
|
|||||||
sx_report(SX_ERROR, "Invalid masklen in prefix %s\n",
|
sx_report(SX_ERROR, "Invalid masklen in prefix %s\n",
|
||||||
text);
|
text);
|
||||||
goto fixups;
|
goto fixups;
|
||||||
};
|
}
|
||||||
} else {
|
} else {
|
||||||
masklen = -1;
|
masklen = -1;
|
||||||
};
|
}
|
||||||
|
|
||||||
if (!af) {
|
if (!af) {
|
||||||
if (strchr(mtext, ':'))
|
if (strchr(mtext, ':'))
|
||||||
af = AF_INET6;
|
af = AF_INET6;
|
||||||
else
|
else
|
||||||
af = AF_INET;
|
af = AF_INET;
|
||||||
};
|
}
|
||||||
|
|
||||||
ret = inet_pton(af, mtext, &p->addr);
|
ret = inet_pton(af, mtext, &p->addr);
|
||||||
|
|
||||||
@@ -162,8 +162,8 @@ sx_prefix_parse(struct sx_prefix* p, int af, char* text)
|
|||||||
" (%s), ret=%i\n", mtext, af,
|
" (%s), ret=%i\n", mtext, af,
|
||||||
af == AF_INET ? "inet" : "inet6", ret);
|
af == AF_INET ? "inet" : "inet6", ret);
|
||||||
goto fixups;
|
goto fixups;
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
if (af == AF_INET) {
|
if (af == AF_INET) {
|
||||||
if (masklen == -1)
|
if (masklen == -1)
|
||||||
@@ -173,8 +173,8 @@ sx_prefix_parse(struct sx_prefix* p, int af, char* text)
|
|||||||
p->masklen = 32;
|
p->masklen = 32;
|
||||||
} else {
|
} else {
|
||||||
p->masklen = masklen;
|
p->masklen = masklen;
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
} else if (af == AF_INET6) {
|
} else if (af == AF_INET6) {
|
||||||
if (masklen == -1)
|
if (masklen == -1)
|
||||||
p->masklen = 128;
|
p->masklen = 128;
|
||||||
@@ -183,12 +183,12 @@ sx_prefix_parse(struct sx_prefix* p, int af, char* text)
|
|||||||
p->masklen = 128;
|
p->masklen = 128;
|
||||||
} else {
|
} else {
|
||||||
p->masklen = masklen;
|
p->masklen = masklen;
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
} else {
|
} else {
|
||||||
sx_report(SX_ERROR, "Invalid address family %i\n", af);
|
sx_report(SX_ERROR, "Invalid address family %i\n", af);
|
||||||
goto fixups;
|
goto fixups;
|
||||||
};
|
}
|
||||||
|
|
||||||
p->family = af;
|
p->family = af;
|
||||||
sx_prefix_adjust_masklen(p);
|
sx_prefix_adjust_masklen(p);
|
||||||
@@ -200,7 +200,7 @@ sx_prefix_parse(struct sx_prefix* p, int af, char* text)
|
|||||||
|
|
||||||
fixups:
|
fixups:
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sx_prefix_isbitset(struct sx_prefix* p, int n)
|
sx_prefix_isbitset(struct sx_prefix* p, int n)
|
||||||
@@ -215,7 +215,7 @@ sx_prefix_isbitset(struct sx_prefix* p, int n)
|
|||||||
s = p->addr.addrs[(n - 1) / 8];
|
s = p->addr.addrs[(n - 1) / 8];
|
||||||
|
|
||||||
return (s & (0x80 >> ((n - 1) % 8))) ? 1 : 0;
|
return (s & (0x80 >> ((n - 1) % 8))) ? 1 : 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
sx_prefix_setbit(struct sx_prefix* p, int n)
|
sx_prefix_setbit(struct sx_prefix* p, int n)
|
||||||
@@ -230,7 +230,7 @@ sx_prefix_setbit(struct sx_prefix* p, int n)
|
|||||||
s = p->addr.addrs + (n - 1) / 8;
|
s = p->addr.addrs + (n - 1) / 8;
|
||||||
|
|
||||||
(*s) |= 0x80 >> ((n - 1) % 8);
|
(*s) |= 0x80 >> ((n - 1) % 8);
|
||||||
};
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
@@ -255,7 +255,7 @@ sx_radix_tree_insert_specifics(struct sx_radix_tree* t, struct sx_prefix *p,
|
|||||||
sx_radix_tree_insert_specifics(t, np, min, max);
|
sx_radix_tree_insert_specifics(t, np, min, max);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sx_prefix_range_parse(struct sx_radix_tree* tree, int af, int maxlen,
|
sx_prefix_range_parse(struct sx_radix_tree* tree, int af, int maxlen,
|
||||||
@@ -276,7 +276,7 @@ sx_prefix_range_parse(struct sx_radix_tree* tree, int af, int maxlen,
|
|||||||
sx_report(SX_ERROR, "Unable to parse prefix %s^%s\n", text,
|
sx_report(SX_ERROR, "Unable to parse prefix %s^%s\n", text,
|
||||||
d+1);
|
d+1);
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
*d = '^';
|
*d = '^';
|
||||||
|
|
||||||
@@ -284,13 +284,13 @@ sx_prefix_range_parse(struct sx_radix_tree* tree, int af, int maxlen,
|
|||||||
sx_report(SX_ERROR, "Ignoring prefix %s, wrong af %i\n", text,
|
sx_report(SX_ERROR, "Ignoring prefix %s, wrong af %i\n", text,
|
||||||
p->family);
|
p->family);
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
if (maxlen && p->masklen > maxlen) {
|
if (maxlen && p->masklen > maxlen) {
|
||||||
SX_DEBUG(debug_expander, "Ignoring prefix %s, masklen %i > max"
|
SX_DEBUG(debug_expander, "Ignoring prefix %s, masklen %i > max"
|
||||||
" masklen %u\n", text, p->masklen, maxlen);
|
" masklen %u\n", text, p->masklen, maxlen);
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
if (d[1] == '-') {
|
if (d[1] == '-') {
|
||||||
min = p->masklen + 1;
|
min = p->masklen + 1;
|
||||||
@@ -307,17 +307,17 @@ sx_prefix_range_parse(struct sx_radix_tree* tree, int af, int maxlen,
|
|||||||
sx_report(SX_ERROR, "Unable to parse prefix-range "
|
sx_report(SX_ERROR, "Unable to parse prefix-range "
|
||||||
"%s\n", text);
|
"%s\n", text);
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
} else {
|
} else {
|
||||||
sx_report(SX_ERROR, "Invalid prefix-range %s\n", text);
|
sx_report(SX_ERROR, "Invalid prefix-range %s\n", text);
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
if (min < p->masklen) {
|
if (min < p->masklen) {
|
||||||
sx_report(SX_ERROR, "Invalid prefix-range %s: min %lu < "
|
sx_report(SX_ERROR, "Invalid prefix-range %s: min %lu < "
|
||||||
"masklen %u\n", text, min, p->masklen);
|
"masklen %u\n", text, min, p->masklen);
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
if (af == AF_INET && max > 32) {
|
if (af == AF_INET && max > 32) {
|
||||||
sx_report(SX_ERROR, "Invalid prefix-range %s: max %lu > "
|
sx_report(SX_ERROR, "Invalid prefix-range %s: max %lu > "
|
||||||
@@ -327,7 +327,7 @@ sx_prefix_range_parse(struct sx_radix_tree* tree, int af, int maxlen,
|
|||||||
sx_report(SX_ERROR, "Invalid ipv6 prefix-range %s: max %lu > "
|
sx_report(SX_ERROR, "Invalid ipv6 prefix-range %s: max %lu > "
|
||||||
"128\n", text, max);
|
"128\n", text, max);
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
if (max > maxlen)
|
if (max > maxlen)
|
||||||
max = maxlen;
|
max = maxlen;
|
||||||
@@ -338,7 +338,7 @@ sx_prefix_range_parse(struct sx_radix_tree* tree, int af, int maxlen,
|
|||||||
sx_radix_tree_insert_specifics(tree, p, min, max);
|
sx_radix_tree_insert_specifics(tree, p, min, max);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
};
|
}
|
||||||
|
|
||||||
struct sx_prefix*
|
struct sx_prefix*
|
||||||
sx_prefix_new(int af, char* text)
|
sx_prefix_new(int af, char* text)
|
||||||
@@ -356,10 +356,10 @@ sx_prefix_new(int af, char* text)
|
|||||||
if (!sx_prefix_parse(p, af, text)) {
|
if (!sx_prefix_parse(p, af, text)) {
|
||||||
sx_prefix_destroy(p);
|
sx_prefix_destroy(p);
|
||||||
return NULL;
|
return NULL;
|
||||||
};
|
}
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sx_prefix_fprint(FILE* f, struct sx_prefix* p)
|
sx_prefix_fprint(FILE* f, struct sx_prefix* p)
|
||||||
@@ -369,11 +369,11 @@ sx_prefix_fprint(FILE* f, struct sx_prefix* p)
|
|||||||
if (!p) {
|
if (!p) {
|
||||||
fprintf(f?f:stdout,"(null)");
|
fprintf(f?f:stdout,"(null)");
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
inet_ntop(p->family, &p->addr, buffer, sizeof(buffer));
|
inet_ntop(p->family, &p->addr, buffer, sizeof(buffer));
|
||||||
return fprintf( f ? f : stdout, "%s/%i", buffer, p->masklen);
|
return fprintf( f ? f : stdout, "%s/%i", buffer, p->masklen);
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sx_prefix_snprintf_sep(struct sx_prefix* p, char* rbuffer, int srb, char* sep)
|
sx_prefix_snprintf_sep(struct sx_prefix* p, char* rbuffer, int srb, char* sep)
|
||||||
@@ -386,18 +386,18 @@ sx_prefix_snprintf_sep(struct sx_prefix* p, char* rbuffer, int srb, char* sep)
|
|||||||
if (!p) {
|
if (!p) {
|
||||||
snprintf(rbuffer, srb, "(null)");
|
snprintf(rbuffer, srb, "(null)");
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
inet_ntop(p->family, &p->addr, buffer, sizeof(buffer));
|
inet_ntop(p->family, &p->addr, buffer, sizeof(buffer));
|
||||||
|
|
||||||
return snprintf(rbuffer, srb, "%s%s%i", buffer, sep, p->masklen);
|
return snprintf(rbuffer, srb, "%s%s%i", buffer, sep, p->masklen);
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sx_prefix_snprintf(struct sx_prefix* p, char* rbuffer, int srb)
|
sx_prefix_snprintf(struct sx_prefix* p, char* rbuffer, int srb)
|
||||||
{
|
{
|
||||||
return sx_prefix_snprintf_sep(p, rbuffer, srb, "/");
|
return sx_prefix_snprintf_sep(p, rbuffer, srb, "/");
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sx_prefix_snprintf_fmt(struct sx_prefix* p, char* buffer, int size,
|
sx_prefix_snprintf_fmt(struct sx_prefix* p, char* buffer, int size,
|
||||||
@@ -442,7 +442,7 @@ sx_prefix_snprintf_fmt(struct sx_prefix* p, char* buffer, int size,
|
|||||||
sx_report(SX_ERROR, "Unknown format char "
|
sx_report(SX_ERROR, "Unknown format char "
|
||||||
"'%c'\n", *(c + 1));
|
"'%c'\n", *(c + 1));
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
c += 2;
|
c += 2;
|
||||||
} else if (*c == '\\') {
|
} else if (*c == '\\') {
|
||||||
switch(*(c+1)) {
|
switch(*(c+1)) {
|
||||||
@@ -458,16 +458,16 @@ sx_prefix_snprintf_fmt(struct sx_prefix* p, char* buffer, int size,
|
|||||||
default:
|
default:
|
||||||
buffer[off++] = *(c + 1);
|
buffer[off++] = *(c + 1);
|
||||||
break;
|
break;
|
||||||
};
|
}
|
||||||
c += 2;
|
c += 2;
|
||||||
} else {
|
} else {
|
||||||
buffer[off++] = *c;
|
buffer[off++] = *c;
|
||||||
c++;
|
c++;
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
return strlen(buffer);
|
return strlen(buffer);
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sx_prefix_jsnprintf(struct sx_prefix* p, char* rbuffer, int srb)
|
sx_prefix_jsnprintf(struct sx_prefix* p, char* rbuffer, int srb)
|
||||||
@@ -477,11 +477,11 @@ sx_prefix_jsnprintf(struct sx_prefix* p, char* rbuffer, int srb)
|
|||||||
if (!p) {
|
if (!p) {
|
||||||
snprintf(rbuffer, srb, "(null)");
|
snprintf(rbuffer, srb, "(null)");
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
inet_ntop(p->family, &p->addr, buffer, sizeof(buffer));
|
inet_ntop(p->family, &p->addr, buffer, sizeof(buffer));
|
||||||
|
|
||||||
return snprintf(rbuffer, srb, "%s\\/%i", buffer, p->masklen);
|
return snprintf(rbuffer, srb, "%s\\/%i", buffer, p->masklen);
|
||||||
};
|
}
|
||||||
|
|
||||||
struct sx_radix_tree*
|
struct sx_radix_tree*
|
||||||
sx_radix_tree_new(int af)
|
sx_radix_tree_new(int af)
|
||||||
@@ -495,13 +495,13 @@ sx_radix_tree_new(int af)
|
|||||||
rt->family = af;
|
rt->family = af;
|
||||||
|
|
||||||
return rt;
|
return rt;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sx_radix_tree_empty(struct sx_radix_tree* t)
|
sx_radix_tree_empty(struct sx_radix_tree* t)
|
||||||
{
|
{
|
||||||
return t->head == NULL;
|
return t->head == NULL;
|
||||||
};
|
}
|
||||||
|
|
||||||
struct sx_radix_node*
|
struct sx_radix_node*
|
||||||
sx_radix_node_new(struct sx_prefix* prefix)
|
sx_radix_node_new(struct sx_prefix* prefix)
|
||||||
@@ -517,7 +517,7 @@ sx_radix_node_new(struct sx_prefix* prefix)
|
|||||||
rn->prefix = sx_prefix_alloc(prefix);
|
rn->prefix = sx_prefix_alloc(prefix);
|
||||||
|
|
||||||
return rn;
|
return rn;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sx_prefix_eqbits(struct sx_prefix* a, struct sx_prefix* b)
|
sx_prefix_eqbits(struct sx_prefix* a, struct sx_prefix* b)
|
||||||
@@ -536,15 +536,15 @@ sx_prefix_eqbits(struct sx_prefix* a, struct sx_prefix* b)
|
|||||||
if ((a->addr.addrs[i] & (0x80 >> j))
|
if ((a->addr.addrs[i] & (0x80 >> j))
|
||||||
!= (b->addr.addrs[i] & (0x80 >> j)))
|
!= (b->addr.addrs[i] & (0x80 >> j)))
|
||||||
return i * 8 + j;
|
return i * 8 + j;
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
if (a->masklen < b->masklen)
|
if (a->masklen < b->masklen)
|
||||||
return a->masklen;
|
return a->masklen;
|
||||||
|
|
||||||
return b->masklen;
|
return b->masklen;
|
||||||
};
|
}
|
||||||
|
|
||||||
struct sx_prefix*
|
struct sx_prefix*
|
||||||
sx_prefix_overlay(struct sx_prefix* p, int n)
|
sx_prefix_overlay(struct sx_prefix* p, int n)
|
||||||
@@ -554,7 +554,7 @@ sx_prefix_overlay(struct sx_prefix* p, int n)
|
|||||||
sx_prefix_adjust_masklen(sp);
|
sx_prefix_adjust_masklen(sp);
|
||||||
|
|
||||||
return sp;
|
return sp;
|
||||||
};
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
sx_radix_tree_unlink(struct sx_radix_tree* tree, struct sx_radix_node* node)
|
sx_radix_tree_unlink(struct sx_radix_tree* tree, struct sx_radix_node* node)
|
||||||
@@ -573,7 +573,7 @@ next:
|
|||||||
} else {
|
} else {
|
||||||
sx_report(SX_ERROR,"Unlinking node which is "
|
sx_report(SX_ERROR,"Unlinking node which is "
|
||||||
"not descendant of its parent\n");
|
"not descendant of its parent\n");
|
||||||
};
|
}
|
||||||
} else if (tree->head == node) {
|
} else if (tree->head == node) {
|
||||||
/* only one case, really */
|
/* only one case, really */
|
||||||
tree->head = node->r;
|
tree->head = node->r;
|
||||||
@@ -581,7 +581,7 @@ next:
|
|||||||
} else {
|
} else {
|
||||||
sx_report(SX_ERROR,"Unlinking node with no parent and"
|
sx_report(SX_ERROR,"Unlinking node with no parent and"
|
||||||
" not root\n");
|
" not root\n");
|
||||||
};
|
}
|
||||||
sx_radix_node_destroy(node);
|
sx_radix_node_destroy(node);
|
||||||
return;
|
return;
|
||||||
} else if (node->l) {
|
} else if (node->l) {
|
||||||
@@ -595,13 +595,13 @@ next:
|
|||||||
} else {
|
} else {
|
||||||
sx_report(SX_ERROR,"Unlinking node which is not descendant "
|
sx_report(SX_ERROR,"Unlinking node which is not descendant "
|
||||||
"of its parent\n");
|
"of its parent\n");
|
||||||
};
|
}
|
||||||
} else if(tree->head==node) {
|
} else if(tree->head==node) {
|
||||||
tree->head=node->l;
|
tree->head=node->l;
|
||||||
node->l->parent=NULL;
|
node->l->parent=NULL;
|
||||||
} else {
|
} else {
|
||||||
sx_report(SX_ERROR,"Unlinking node with no parent and not root\n");
|
sx_report(SX_ERROR,"Unlinking node with no parent and not root\n");
|
||||||
};
|
}
|
||||||
sx_radix_node_destroy(node);
|
sx_radix_node_destroy(node);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
@@ -614,22 +614,22 @@ next:
|
|||||||
else {
|
else {
|
||||||
sx_report(SX_ERROR,"Unlinking node which is "
|
sx_report(SX_ERROR,"Unlinking node which is "
|
||||||
"not descendant of its parent\n");
|
"not descendant of its parent\n");
|
||||||
};
|
}
|
||||||
|
|
||||||
if (node->parent->isGlue) {
|
if (node->parent->isGlue) {
|
||||||
node = node->parent;
|
node = node->parent;
|
||||||
goto next;
|
goto next;
|
||||||
};
|
}
|
||||||
} else if (tree->head==node) {
|
} else if (tree->head==node) {
|
||||||
tree->head = NULL;
|
tree->head = NULL;
|
||||||
} else {
|
} else {
|
||||||
sx_report(SX_ERROR, "Unlinking node with no parent and"
|
sx_report(SX_ERROR, "Unlinking node with no parent and"
|
||||||
" not root\n");
|
" not root\n");
|
||||||
};
|
}
|
||||||
sx_radix_node_destroy(node);
|
sx_radix_node_destroy(node);
|
||||||
return;
|
return;
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
|
|
||||||
struct sx_radix_node*
|
struct sx_radix_node*
|
||||||
@@ -664,27 +664,27 @@ next:
|
|||||||
if (chead->r) {
|
if (chead->r) {
|
||||||
if (!chead->isGlue) {
|
if (!chead->isGlue) {
|
||||||
candidate = chead;
|
candidate = chead;
|
||||||
};
|
}
|
||||||
chead = chead->r;
|
chead = chead->r;
|
||||||
goto next;
|
goto next;
|
||||||
} else {
|
} else {
|
||||||
if (chead->isGlue)
|
if (chead->isGlue)
|
||||||
return candidate;
|
return candidate;
|
||||||
return chead;
|
return chead;
|
||||||
};
|
}
|
||||||
} else {
|
} else {
|
||||||
if (chead->l) {
|
if (chead->l) {
|
||||||
if (!chead->isGlue) {
|
if (!chead->isGlue) {
|
||||||
candidate = chead;
|
candidate = chead;
|
||||||
};
|
}
|
||||||
chead = chead->l;
|
chead = chead->l;
|
||||||
goto next;
|
goto next;
|
||||||
} else {
|
} else {
|
||||||
if (chead->isGlue)
|
if (chead->isGlue)
|
||||||
return candidate;
|
return candidate;
|
||||||
return chead;
|
return chead;
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
} else {
|
} else {
|
||||||
char pbuffer[128], cbuffer[128];
|
char pbuffer[128], cbuffer[128];
|
||||||
sx_prefix_snprintf(prefix, pbuffer, sizeof(pbuffer));
|
sx_prefix_snprintf(prefix, pbuffer, sizeof(pbuffer));
|
||||||
@@ -692,8 +692,8 @@ next:
|
|||||||
printf("Unreachible point... eb=%i, prefix=%s, chead=%s\n",
|
printf("Unreachible point... eb=%i, prefix=%s, chead=%s\n",
|
||||||
eb, pbuffer, cbuffer);
|
eb, pbuffer, cbuffer);
|
||||||
abort();
|
abort();
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
|
|
||||||
struct sx_radix_node*
|
struct sx_radix_node*
|
||||||
@@ -711,7 +711,7 @@ sx_radix_tree_insert(struct sx_radix_tree* tree, struct sx_prefix* prefix)
|
|||||||
if (!tree->head) {
|
if (!tree->head) {
|
||||||
tree->head=sx_radix_node_new(prefix);
|
tree->head=sx_radix_node_new(prefix);
|
||||||
return tree->head;
|
return tree->head;
|
||||||
};
|
}
|
||||||
|
|
||||||
candidate = &tree->head;
|
candidate = &tree->head;
|
||||||
chead = tree->head;
|
chead = tree->head;
|
||||||
@@ -731,7 +731,7 @@ next:
|
|||||||
sx_report(SX_ERROR,"Unable to create node: %s\n",
|
sx_report(SX_ERROR,"Unable to create node: %s\n",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
return NULL;
|
return NULL;
|
||||||
};
|
}
|
||||||
|
|
||||||
if (sx_prefix_isbitset(prefix, eb + 1)) {
|
if (sx_prefix_isbitset(prefix, eb + 1)) {
|
||||||
rn->l = chead;
|
rn->l = chead;
|
||||||
@@ -739,7 +739,7 @@ next:
|
|||||||
} else {
|
} else {
|
||||||
rn->l = ret;
|
rn->l = ret;
|
||||||
rn->r = chead;
|
rn->r = chead;
|
||||||
};
|
}
|
||||||
|
|
||||||
rn->parent = chead->parent;
|
rn->parent = chead->parent;
|
||||||
chead->parent = rn;
|
chead->parent = rn;
|
||||||
@@ -753,7 +753,7 @@ next:
|
|||||||
ret->r = chead;
|
ret->r = chead;
|
||||||
} else {
|
} else {
|
||||||
ret->l = chead;
|
ret->l = chead;
|
||||||
};
|
}
|
||||||
ret->parent = chead->parent;
|
ret->parent = chead->parent;
|
||||||
chead->parent = ret;
|
chead->parent = ret;
|
||||||
*candidate = ret;
|
*candidate = ret;
|
||||||
@@ -768,7 +768,7 @@ next:
|
|||||||
chead->r = sx_radix_node_new(prefix);
|
chead->r = sx_radix_node_new(prefix);
|
||||||
chead->r->parent = chead;
|
chead->r->parent = chead;
|
||||||
return chead->r;
|
return chead->r;
|
||||||
};
|
}
|
||||||
} else {
|
} else {
|
||||||
if (chead->l) {
|
if (chead->l) {
|
||||||
candidate = &chead->l;
|
candidate = &chead->l;
|
||||||
@@ -778,13 +778,13 @@ next:
|
|||||||
chead->l = sx_radix_node_new(prefix);
|
chead->l = sx_radix_node_new(prefix);
|
||||||
chead->l->parent = chead;
|
chead->l->parent = chead;
|
||||||
return chead->l;
|
return chead->l;
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
} else if (eb == chead->prefix->masklen && eb == prefix->masklen) {
|
} else if (eb == chead->prefix->masklen && eb == prefix->masklen) {
|
||||||
/* equal routes... */
|
/* equal routes... */
|
||||||
if (chead->isGlue) {
|
if (chead->isGlue) {
|
||||||
chead->isGlue = 0;
|
chead->isGlue = 0;
|
||||||
};
|
}
|
||||||
return chead;
|
return chead;
|
||||||
} else {
|
} else {
|
||||||
char pbuffer[128], cbuffer[128];
|
char pbuffer[128], cbuffer[128];
|
||||||
@@ -793,7 +793,7 @@ next:
|
|||||||
printf("Unreachible point... eb=%i, prefix=%s, chead=%s\n", eb,
|
printf("Unreachible point... eb=%i, prefix=%s, chead=%s\n", eb,
|
||||||
pbuffer, cbuffer);
|
pbuffer, cbuffer);
|
||||||
abort();
|
abort();
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -806,8 +806,8 @@ sx_radix_node_fprintf(struct sx_radix_node* node, void* udata)
|
|||||||
} else {
|
} else {
|
||||||
sx_prefix_snprintf(node->prefix, buffer, sizeof(buffer));
|
sx_prefix_snprintf(node->prefix, buffer, sizeof(buffer));
|
||||||
fprintf(out, "%s %s\n", buffer, node->isGlue ? "(glue)" : "");
|
fprintf(out, "%s %s\n", buffer, node->isGlue ? "(glue)" : "");
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sx_radix_node_foreach(struct sx_radix_node* node,
|
sx_radix_node_foreach(struct sx_radix_node* node,
|
||||||
@@ -822,7 +822,7 @@ sx_radix_node_foreach(struct sx_radix_node* node,
|
|||||||
sx_radix_node_foreach(node->r, func, udata);
|
sx_radix_node_foreach(node->r, func, udata);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sx_radix_tree_foreach(struct sx_radix_tree* tree,
|
sx_radix_tree_foreach(struct sx_radix_tree* tree,
|
||||||
@@ -831,7 +831,7 @@ sx_radix_tree_foreach(struct sx_radix_tree* tree,
|
|||||||
if(!func || !tree || !tree->head) return 0;
|
if(!func || !tree || !tree->head) return 0;
|
||||||
sx_radix_node_foreach(tree->head,func,udata);
|
sx_radix_node_foreach(tree->head,func,udata);
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sx_radix_node_aggregate(struct sx_radix_node* node)
|
sx_radix_node_aggregate(struct sx_radix_node* node)
|
||||||
@@ -862,8 +862,8 @@ sx_radix_node_aggregate(struct sx_radix_node* node)
|
|||||||
node->r->son->isAggregate ? "Aggregate " : "",
|
node->r->son->isAggregate ? "Aggregate " : "",
|
||||||
node->r->son->aggregateLow,
|
node->r->son->aggregateLow,
|
||||||
node->r->son->aggregateHi);
|
node->r->son->aggregateHi);
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
if (node->l) {
|
if (node->l) {
|
||||||
printf("L-Tree: ");
|
printf("L-Tree: ");
|
||||||
sx_prefix_fprint(stdout, node->l->prefix);
|
sx_prefix_fprint(stdout, node->l->prefix);
|
||||||
@@ -878,9 +878,9 @@ sx_radix_node_aggregate(struct sx_radix_node* node)
|
|||||||
node->l->son->isAggregate ? "Aggregate " : "",
|
node->l->son->isAggregate ? "Aggregate " : "",
|
||||||
node->l->son->aggregateLow,
|
node->l->son->aggregateLow,
|
||||||
node->l->son->aggregateHi);
|
node->l->son->aggregateHi);
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
if (node->r && node->l) {
|
if (node->r && node->l) {
|
||||||
if (!node->r->isAggregate && !node->l->isAggregate
|
if (!node->r->isAggregate && !node->l->isAggregate
|
||||||
@@ -896,8 +896,8 @@ sx_radix_node_aggregate(struct sx_radix_node* node)
|
|||||||
node->aggregateLow = node->r->prefix->masklen;
|
node->aggregateLow = node->r->prefix->masklen;
|
||||||
} else {
|
} else {
|
||||||
node->aggregateLow = node->prefix->masklen;
|
node->aggregateLow = node->prefix->masklen;
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
if (node->r->son && node->l->son
|
if (node->r->son && node->l->son
|
||||||
&& node->r->son->isAggregate
|
&& node->r->son->isAggregate
|
||||||
&& node->l->son->isAggregate
|
&& node->l->son->isAggregate
|
||||||
@@ -912,7 +912,7 @@ sx_radix_node_aggregate(struct sx_radix_node* node)
|
|||||||
node->son->aggregateLow = node->r->son->aggregateLow;
|
node->son->aggregateLow = node->r->son->aggregateLow;
|
||||||
node->r->son->isGlue = 1;
|
node->r->son->isGlue = 1;
|
||||||
node->l->son->isGlue = 1;
|
node->l->son->isGlue = 1;
|
||||||
};
|
}
|
||||||
} else if (node->r->isAggregate && node->l->isAggregate
|
} else if (node->r->isAggregate && node->l->isAggregate
|
||||||
&& node->r->aggregateHi == node->l->aggregateHi
|
&& node->r->aggregateHi == node->l->aggregateHi
|
||||||
&& node->r->aggregateLow==node->l->aggregateLow) {
|
&& node->r->aggregateLow==node->l->aggregateLow) {
|
||||||
@@ -949,9 +949,9 @@ sx_radix_node_aggregate(struct sx_radix_node* node)
|
|||||||
node->son->son->aggregateLow = node->r->son->aggregateLow;
|
node->son->son->aggregateLow = node->r->son->aggregateLow;
|
||||||
node->r->son->isGlue = 1;
|
node->r->son->isGlue = 1;
|
||||||
node->l->son->isGlue = 1;
|
node->l->son->isGlue = 1;
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
} else if (node->l->son && node->r->isAggregate
|
} else if (node->l->son && node->r->isAggregate
|
||||||
&& node->l->son->isAggregate
|
&& node->l->son->isAggregate
|
||||||
&& node->r->aggregateHi == node->l->son->aggregateHi
|
&& node->r->aggregateHi == node->l->son->aggregateHi
|
||||||
@@ -973,8 +973,8 @@ sx_radix_node_aggregate(struct sx_radix_node* node)
|
|||||||
node->son->aggregateLow = node->r->aggregateLow;
|
node->son->aggregateLow = node->r->aggregateLow;
|
||||||
node->r->isGlue = 1;
|
node->r->isGlue = 1;
|
||||||
node->l->son->isGlue = 1;
|
node->l->son->isGlue = 1;
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
} else if (node->r->son && node->l->isAggregate
|
} else if (node->r->son && node->l->isAggregate
|
||||||
&& node->r->son->isAggregate
|
&& node->r->son->isAggregate
|
||||||
&& node->l->aggregateHi == node->r->son->aggregateHi
|
&& node->l->aggregateHi == node->r->son->aggregateHi
|
||||||
@@ -996,13 +996,13 @@ sx_radix_node_aggregate(struct sx_radix_node* node)
|
|||||||
node->son->aggregateLow = node->l->aggregateLow;
|
node->son->aggregateLow = node->l->aggregateLow;
|
||||||
node->l->isGlue = 1;
|
node->l->isGlue = 1;
|
||||||
node->r->son->isGlue = 1;
|
node->r->son->isGlue = 1;
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sx_radix_tree_aggregate(struct sx_radix_tree* tree)
|
sx_radix_tree_aggregate(struct sx_radix_tree* tree)
|
||||||
@@ -1011,7 +1011,7 @@ sx_radix_tree_aggregate(struct sx_radix_tree* tree)
|
|||||||
return sx_radix_node_aggregate(tree->head);
|
return sx_radix_node_aggregate(tree->head);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
setGlueUpTo(struct sx_radix_node* node, void* udata)
|
setGlueUpTo(struct sx_radix_node* node, void* udata)
|
||||||
@@ -1020,7 +1020,7 @@ setGlueUpTo(struct sx_radix_node* node, void* udata)
|
|||||||
|
|
||||||
if (node && node->prefix->masklen <= refine)
|
if (node && node->prefix->masklen <= refine)
|
||||||
node->isGlue = 1;
|
node->isGlue = 1;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sx_radix_node_refine(struct sx_radix_node* node, unsigned refine)
|
sx_radix_node_refine(struct sx_radix_node* node, unsigned refine)
|
||||||
@@ -1032,11 +1032,11 @@ sx_radix_node_refine(struct sx_radix_node* node, unsigned refine)
|
|||||||
if (node->l) {
|
if (node->l) {
|
||||||
sx_radix_node_foreach(node->l, setGlueUpTo, &refine);
|
sx_radix_node_foreach(node->l, setGlueUpTo, &refine);
|
||||||
sx_radix_node_refine(node->l, refine);
|
sx_radix_node_refine(node->l, refine);
|
||||||
};
|
}
|
||||||
if (node->r) {
|
if (node->r) {
|
||||||
sx_radix_node_foreach(node->r, setGlueUpTo, &refine);
|
sx_radix_node_foreach(node->r, setGlueUpTo, &refine);
|
||||||
sx_radix_node_refine(node->r, refine);
|
sx_radix_node_refine(node->r, refine);
|
||||||
};
|
}
|
||||||
} else if (!node->isGlue && node->prefix->masklen == refine) {
|
} else if (!node->isGlue && node->prefix->masklen == refine) {
|
||||||
/* not setting aggregate in this case */
|
/* not setting aggregate in this case */
|
||||||
if (node->l)
|
if (node->l)
|
||||||
@@ -1060,9 +1060,9 @@ sx_radix_node_refine(struct sx_radix_node* node, unsigned refine)
|
|||||||
if (node->r)
|
if (node->r)
|
||||||
sx_radix_node_foreach(node->r, setGlue, NULL);
|
sx_radix_node_foreach(node->r, setGlue, NULL);
|
||||||
*/
|
*/
|
||||||
};
|
}
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sx_radix_tree_refine(struct sx_radix_tree* tree, unsigned refine)
|
sx_radix_tree_refine(struct sx_radix_tree* tree, unsigned refine)
|
||||||
@@ -1071,7 +1071,7 @@ sx_radix_tree_refine(struct sx_radix_tree* tree, unsigned refine)
|
|||||||
return sx_radix_node_refine(tree->head, refine);
|
return sx_radix_node_refine(tree->head, refine);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
setGlueFrom(struct sx_radix_node* node, void* udata)
|
setGlueFrom(struct sx_radix_node* node, void* udata)
|
||||||
@@ -1080,7 +1080,7 @@ setGlueFrom(struct sx_radix_node* node, void* udata)
|
|||||||
|
|
||||||
if (node && node->prefix->masklen <= refine)
|
if (node && node->prefix->masklen <= refine)
|
||||||
node->isGlue=1;
|
node->isGlue=1;
|
||||||
};
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
sx_radix_node_refineLow(struct sx_radix_node* node, unsigned refineLow)
|
sx_radix_node_refineLow(struct sx_radix_node* node, unsigned refineLow)
|
||||||
@@ -1100,12 +1100,12 @@ sx_radix_node_refineLow(struct sx_radix_node* node, unsigned refineLow)
|
|||||||
if (node->l) {
|
if (node->l) {
|
||||||
sx_radix_node_foreach(node->l, setGlueFrom, &refineLow);
|
sx_radix_node_foreach(node->l, setGlueFrom, &refineLow);
|
||||||
sx_radix_node_refineLow(node->l, refineLow);
|
sx_radix_node_refineLow(node->l, refineLow);
|
||||||
};
|
}
|
||||||
|
|
||||||
if (node->r) {
|
if (node->r) {
|
||||||
sx_radix_node_foreach(node->r, setGlueFrom, &refineLow);
|
sx_radix_node_foreach(node->r, setGlueFrom, &refineLow);
|
||||||
sx_radix_node_refineLow(node->r, refineLow);
|
sx_radix_node_refineLow(node->r, refineLow);
|
||||||
};
|
}
|
||||||
|
|
||||||
} else if (!node->isGlue && node->prefix->masklen == refineLow) {
|
} else if (!node->isGlue && node->prefix->masklen == refineLow) {
|
||||||
/* not setting aggregate in this case */
|
/* not setting aggregate in this case */
|
||||||
@@ -1128,10 +1128,10 @@ sx_radix_node_refineLow(struct sx_radix_node* node, unsigned refineLow)
|
|||||||
if (node->r)
|
if (node->r)
|
||||||
sx_radix_node_foreach(node->r, setGlue, NULL);
|
sx_radix_node_foreach(node->r, setGlue, NULL);
|
||||||
*/
|
*/
|
||||||
};
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sx_radix_tree_refineLow(struct sx_radix_tree* tree, unsigned refineLow)
|
sx_radix_tree_refineLow(struct sx_radix_tree* tree, unsigned refineLow)
|
||||||
@@ -1140,7 +1140,7 @@ sx_radix_tree_refineLow(struct sx_radix_tree* tree, unsigned refineLow)
|
|||||||
return sx_radix_node_refineLow(tree->head, refineLow);
|
return sx_radix_node_refineLow(tree->head, refineLow);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
#if SX_PTREE_TEST
|
#if SX_PTREE_TEST
|
||||||
int
|
int
|
||||||
@@ -1310,6 +1310,6 @@ main() {
|
|||||||
sx_radix_tree_foreach(tree, sx_radix_node_fprintf, NULL);
|
sx_radix_tree_foreach(tree, sx_radix_node_fprintf, NULL);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
16
sx_report.c
16
sx_report.c
@@ -29,10 +29,10 @@ sx_report_name(sx_report_t t)
|
|||||||
return "Notice:";
|
return "Notice:";
|
||||||
case SX_DEBUG:
|
case SX_DEBUG:
|
||||||
return "Debug:";
|
return "Debug:";
|
||||||
};
|
}
|
||||||
|
|
||||||
return "...... HMMMMM.... ERROR... \n";
|
return "...... HMMMMM.... ERROR... \n";
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sx_report(sx_report_t t, char* fmt, ...)
|
sx_report(sx_report_t t, char* fmt, ...)
|
||||||
@@ -62,14 +62,14 @@ sx_report(sx_report_t t, char* fmt, ...)
|
|||||||
case SX_DEBUG:
|
case SX_DEBUG:
|
||||||
syslog(LOG_DEBUG,"Debug: %s", buffer);
|
syslog(LOG_DEBUG,"Debug: %s", buffer);
|
||||||
break;
|
break;
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
if (t == SX_FATAL)
|
if (t == SX_FATAL)
|
||||||
exit(-1);
|
exit(-1);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sx_debug(char const* const file, char const* const func, int const line,
|
sx_debug(char const* const file, char const* const func, int const line,
|
||||||
@@ -90,15 +90,15 @@ sx_debug(char const* const file, char const* const func, int const line,
|
|||||||
fputs(buffer, stderr);
|
fputs(buffer, stderr);
|
||||||
} else {
|
} else {
|
||||||
syslog(LOG_DEBUG,"%s %s", bline, buffer);
|
syslog(LOG_DEBUG,"%s %s", bline, buffer);
|
||||||
};
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
sx_openlog(char* progname)
|
sx_openlog(char* progname)
|
||||||
{
|
{
|
||||||
openlog(progname ? progname : "<unknown>", LOG_PID, LOG_DAEMON);
|
openlog(progname ? progname : "<unknown>", LOG_PID, LOG_DAEMON);
|
||||||
reportStderr = 0;
|
reportStderr = 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ sx_slentry_new(char* t)
|
|||||||
e->text = strdup(t);
|
e->text = strdup(t);
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
};
|
}
|
||||||
|
|
||||||
struct sx_tentry*
|
struct sx_tentry*
|
||||||
sx_tentry_new(char* t)
|
sx_tentry_new(char* t)
|
||||||
@@ -33,4 +33,4 @@ sx_tentry_new(char* t)
|
|||||||
te->text = strdup(t);
|
te->text = strdup(t);
|
||||||
|
|
||||||
return te;
|
return te;
|
||||||
};
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user