summaryrefslogtreecommitdiffstats
path: root/usr.sbin/bgpctl/parser.c
diff options
context:
space:
mode:
authorclaudio <claudio@openbsd.org>2007-04-23 13:05:35 +0000
committerclaudio <claudio@openbsd.org>2007-04-23 13:05:35 +0000
commitd18b99bc689cf997c6c69cb1692b79f4fce29501 (patch)
treebc4738b6a820ea9baee88c052e05c029e3ca7c0a /usr.sbin/bgpctl/parser.c
parentMake bgpd 4-byte AS compatible. All internal representations of AS numbers (diff)
downloadwireguard-openbsd-d18b99bc689cf997c6c69cb1692b79f4fce29501.tar.xz
wireguard-openbsd-d18b99bc689cf997c6c69cb1692b79f4fce29501.zip
bgpctl needs to know about 4-byte AS numbers as well.
Diffstat (limited to 'usr.sbin/bgpctl/parser.c')
-rw-r--r--usr.sbin/bgpctl/parser.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/usr.sbin/bgpctl/parser.c b/usr.sbin/bgpctl/parser.c
index 1e63514c73e..08059eb10dd 100644
--- a/usr.sbin/bgpctl/parser.c
+++ b/usr.sbin/bgpctl/parser.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: parser.c,v 1.43 2007/04/06 18:36:32 claudio Exp $ */
+/* $OpenBSD: parser.c,v 1.44 2007/04/23 13:05:35 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -302,7 +302,7 @@ void show_valid_args(const struct token []);
int parse_addr(const char *, struct bgpd_addr *);
int parse_prefix(const char *, struct bgpd_addr *,
u_int8_t *);
-int parse_asnum(const char *, u_int16_t *);
+int parse_asnum(const char *, u_int32_t *);
int parse_number(const char *, struct parse_result *,
enum token_type);
int getcommunity(const char *);
@@ -636,19 +636,30 @@ parse_prefix(const char *word, struct bgpd_addr *addr, u_int8_t *prefixlen)
}
int
-parse_asnum(const char *word, u_int16_t *asnum)
+parse_asnum(const char *word, u_int32_t *asnum)
{
const char *errstr;
- u_int16_t uval;
+ char *dot;
+ u_int32_t uval, uvalh = 0;
if (word == NULL)
return (0);
- uval = strtonum(word, 0, USHRT_MAX - 1, &errstr);
- if (errstr)
- errx(1, "AS number is %s: %s", errstr, word);
+ if ((dot = strchr(word,'.')) != NULL) {
+ *dot++ = '\0';
+ uvalh = strtonum(word, 0, USHRT_MAX, &errstr);
+ if (errstr)
+ errx(1, "AS number is %s: %s", errstr, word);
+ uval = strtonum(dot, 0, USHRT_MAX, &errstr);
+ if (errstr)
+ errx(1, "AS number is %s: %s", errstr, word);
+ } else {
+ uval = strtonum(word, 0, USHRT_MAX - 1, &errstr);
+ if (errstr)
+ errx(1, "AS number is %s: %s", errstr, word);
+ }
- *asnum = uval;
+ *asnum = uval | (uvalh << 16);
return (1);
}