int main(int argc, char** argv) { char* s; char* e; char* f; unsigned char b; unsigned char a[IP6ADDR]; int c; int r; int all = 1; while (s = *++argv) { if (*s == '-' && !*(s + 1)) { all = !all; continue; } r = strtoip6(s, &e, a, &b); f = fmtip6(a, b); c = *e; *e = 0; if (r || all || strcmp(s, f)) { *e = c; printf("%d %32s %32s %s\n", r, s, e, f); } } return 0; }
int ivstr(Iv_t* iv, const char* s, char** e, unsigned char* addr, unsigned char* bits) { int c; int i; int n; int r; if (iv->size == 16) return strtoip6(s, e, addr, bits); r = -1; i = 0; do { n = 0; while ((c = *s++) >= '0' && c <= '9') n = n * 10 + (c - '0'); if (n > 0xff) goto done; addr[i++] = n; } while (c == '.' && i < iv->size); if (bits) { if (c == '/') { n = 0; while ((c = *s++) >= '0' && c <= '9') n = n * 10 + (c - '0'); c = (n + 7) / 8; if (i > c) i = c; } else n = i * 8; *bits = n; } while (i < iv->size) addr[i++] = 0; r = 0; done: if (e) *e = (char*)(s - 1); return r; }
static int tableident(Dssfile_t* file, void* buf, size_t n, Dssdisc_t* disc) { register char* s; register char* e; register char* f; register int c; unsigned char prefix[IP6PREFIX]; Bgpnum_t addr; unsigned char bits; s = (char*)buf; e = s + n; for (;;) { for (;;) { if (s >= e) return 0; c = *s++; if (!isascii(c)) return 0; if (!isspace(c)) break; } f = s - 1; for (;;) { if (s >= e) return 0; c = *s++; if (!isascii(c)) return 0; if (c == '\n') break; } if (isdigit(*f) && !strtoip4(f, NiL, &addr, &bits) || !strtoip6(f, NiL, prefix, prefix + IP6BITS) && (file->caller = file)) break; } return 1; }
int main(int argc, char** argv) { char* file; char* s; Ptv_t* ptv; Ptvprefix_t* pp; Sfio_t* sp; unsigned char prefix[IP6PREFIX]; unsigned char addr[IP6ADDR]; Ptvdisc_t ptvdisc; int dump = 0; error_info.id = "testptv"; ptvinit(&ptvdisc); ptvdisc.errorf = errorf; for (;;) { switch (optget(argv, usage)) { case 'd': dump = 1; continue; case '?': error(ERROR_USAGE|4, "%s", opt_info.arg); continue; case ':': error(2, "%s", opt_info.arg); continue; } break; } argv += opt_info.index; if (!(file = *argv++)) error(ERROR_USAGE|4, "%s", optusage(0)); if (!(sp = sfopen(0, file, "r"))) error(ERROR_SYSTEM|3, "%s: cannot read prefix file", file); if (!(ptv = ptvopen(&ptvdisc, 16))) error(3, "cannot open ptv table"); while (s = sfgetr(sp, '\n', 1)) if (strtoip6(s, 0, prefix, prefix + IP6BITS)) error(1, "%s: invalid prefix", s); else { if (dump) sfprintf(sfstderr, "insert %s %s\n", fmtip6(ptvmin(ptv->size, ptv->r[0], prefix, prefix[IP6BITS]), prefix[IP6BITS]), fmtip6(ptvmax(ptv->size, ptv->r[1], prefix, prefix[IP6BITS]), prefix[IP6BITS])); if (!ptvinsert(ptv, ptvmin(ptv->size, ptv->r[0], prefix, prefix[IP6BITS]), ptvmax(ptv->size, ptv->r[1], prefix, prefix[IP6BITS]))) { error(2, "%s: ptv insertion error", s); break; } } sfclose(sp); if (dump) ptvdump(ptv, sfstdout); file = *argv++; do { if (!file || streq(file, "-")) sp = sfstdin; else if (!(sp = sfopen(0, file, "r"))) error(ERROR_SYSTEM|3, "%s: cannot read address file", file); while (s = sfgetr(sp, '\n', 1)) if (strtoip6(s, 0, addr, 0)) error(1, "%s: invalid address", s); else if (pp = ptvmatch(ptv, addr)) sfprintf(sfstdout, "%-38s %-38s %-38s\n", fmtip6(addr, -1), fmtip6(pp->min, -1), fmtip6(pp->max, -1)); else sfprintf(sfstdout, "%-38s -\n", fmtip6(addr, -1)); if (sp != sfstdin) sfclose(sp); } while (file && (file = *argv++)); ptvclose(ptv); return 0; }
static int tableread(Dssfile_t* file, Dssrecord_t* record, Dssdisc_t* disc) { register Tablestate_t* state = (Tablestate_t*)file->data; register Bgproute_t* rp; register char* s; char* p; char* e; Bgproute_t* op; for (;;) { op = &state->route[state->index]; rp = &state->route[state->index = !state->index]; if (!(s = sfgetr(file->io, '\n', 1))) return 0; while (*s == ' ' || *s == '\t' || *s == '\r') s++; if (*s == 0 || *s == '#' || *s == '\n') continue; rp->set = 0; rp->type = BGP_TYPE_withdraw; rp->attr = BGP_valid; rp->origin = BGP_ORIGIN_incomplete; if (state->v6) { rp->addr.v4 = 0; rp->bits = 0; if (strtoip6(s, &p, rp->prefixv6, rp->prefixv6 + IP6BITS)) break; rp->set |= BGP_SET_prefixv6; for (s = p; *s == ' ' || *s == '\t'; s++); rp->hop.v4 = strtoul(s, &p, 0); switch (*p) { case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case ':': rp->hop.v4 = 0; if (!strtoip6(s, &e, rp->hop.v6, NiL) && e > p) { rp->type = BGP_TYPE_announce; rp->attr |= BGP_slot; rp->set |= BGP_SET_hopv6; } break; case '.': if (strtoip4(s, &e, &rp->hop.v4, NiL) || e <= p) break; /*FALLTHROUGH*/ default: if (rp->hop.v4) { rp->type = BGP_TYPE_announce; rp->attr |= BGP_slot; } break; } if ((rp->set & BGP_SET_prefixv6) && memcmp(rp->prefixv6, op->prefixv6, sizeof(rp->prefixv6))) rp->attr |= BGP_best; else if ((rp->set & BGP_SET_hopv6) && !memcmp(rp->hop.v6, op->hop.v6, sizeof(rp->hop.v6))) continue; else if (rp->hop.v4 && op->hop.v4 && rp->hop.v4 == op->hop.v4) continue; } else { if (strtoip4(s, &p, &rp->addr.v4, &rp->bits)) break; for (s = p; *s == ' ' || *s == '\t'; s++); rp->hop.v4 = strtoul(s, &p, 0); if (p > s && (*p != '.' || !strtoip4(s, NiL, &rp->hop.v4, NiL)) && rp->hop.v4) { rp->type = BGP_TYPE_announce; rp->attr |= BGP_slot; } if (rp->addr.v4 != op->addr.v4 || rp->bits != op->bits) rp->attr |= BGP_best; else if (rp->hop.v4 == op->hop.v4) continue; } record->data = rp; record->size = BGP_FIXED; return 1; } return 0; }