1 1.1 mycroft %{ 2 1.16 lukem /* $NetBSD: cfparse.y,v 1.16 2009/04/17 16:05:43 lukem Exp $ */ 3 1.3 thorpej 4 1.1 mycroft /* 5 1.1 mycroft * Configuration file parser for mrouted. 6 1.1 mycroft * 7 1.1 mycroft * Written by Bill Fenner, NRL, 1994 8 1.7 itojun * Copyright (c) 1994 9 1.7 itojun * Naval Research Laboratory (NRL/CCS) 10 1.7 itojun * and the 11 1.7 itojun * Defense Advanced Research Projects Agency (DARPA) 12 1.7 itojun * 13 1.7 itojun * All Rights Reserved. 14 1.7 itojun * 15 1.7 itojun * Permission to use, copy, modify and distribute this software and its 16 1.7 itojun * documentation is hereby granted, provided that both the copyright notice and 17 1.7 itojun * this permission notice appear in all copies of the software, derivative 18 1.7 itojun * works or modified versions, and any portions thereof, and that both notices 19 1.7 itojun * appear in supporting documentation. 20 1.7 itojun * 21 1.7 itojun * NRL AND DARPA ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND 22 1.7 itojun * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM 23 1.7 itojun * THE USE OF THIS SOFTWARE. 24 1.1 mycroft */ 25 1.1 mycroft #include <stdio.h> 26 1.4 mycroft #include <stdarg.h> 27 1.1 mycroft #include "defs.h" 28 1.4 mycroft #include <netdb.h> 29 1.15 itojun #include <ifaddrs.h> 30 1.4 mycroft 31 1.4 mycroft /* 32 1.4 mycroft * Local function declarations 33 1.4 mycroft */ 34 1.16 lukem static void fatal(const char *fmt, ...) 35 1.6 is __attribute__((__format__(__printf__, 1, 2))); 36 1.16 lukem static void warn(const char *fmt, ...) 37 1.6 is __attribute__((__format__(__printf__, 1, 2))); 38 1.16 lukem static void yyerror(const char *s); 39 1.8 wiz static char * next_word(void); 40 1.8 wiz static int yylex(void); 41 1.8 wiz static u_int32_t valid_if(char *s); 42 1.15 itojun static const char * ifconfaddr(u_int32_t a); 43 1.8 wiz int yyparse(void); 44 1.1 mycroft 45 1.5 mrg static FILE *f __attribute__((__unused__)); /* XXX egcs */ 46 1.1 mycroft extern int udp_socket; 47 1.16 lukem const char *configfilename = _PATH_MROUTED_CONF; 48 1.1 mycroft 49 1.1 mycroft extern int cache_lifetime; 50 1.1 mycroft extern int max_prune_lifetime; 51 1.1 mycroft 52 1.1 mycroft static int lineno; 53 1.1 mycroft 54 1.1 mycroft static struct uvif *v; 55 1.1 mycroft 56 1.1 mycroft static int order; 57 1.1 mycroft 58 1.1 mycroft struct addrmask { 59 1.1 mycroft u_int32_t addr; 60 1.1 mycroft int mask; 61 1.1 mycroft }; 62 1.1 mycroft 63 1.1 mycroft struct boundnam { 64 1.1 mycroft char *name; 65 1.1 mycroft struct addrmask bound; 66 1.1 mycroft }; 67 1.1 mycroft 68 1.1 mycroft #define MAXBOUNDS 20 69 1.1 mycroft 70 1.1 mycroft struct boundnam boundlist[MAXBOUNDS]; /* Max. of 20 named boundaries */ 71 1.1 mycroft int numbounds = 0; /* Number of named boundaries */ 72 1.1 mycroft 73 1.1 mycroft %} 74 1.1 mycroft 75 1.1 mycroft %union 76 1.1 mycroft { 77 1.1 mycroft int num; 78 1.1 mycroft char *ptr; 79 1.1 mycroft struct addrmask addrmask; 80 1.1 mycroft u_int32_t addr; 81 1.1 mycroft }; 82 1.1 mycroft 83 1.1 mycroft %token CACHE_LIFETIME PRUNING 84 1.1 mycroft %token PHYINT TUNNEL NAME 85 1.4 mycroft %token DISABLE IGMPV1 SRCRT 86 1.4 mycroft %token METRIC THRESHOLD RATE_LIMIT BOUNDARY NETMASK ALTNET 87 1.4 mycroft %token SYSNAM SYSCONTACT SYSVERSION SYSLOCATION 88 1.1 mycroft %token <num> BOOLEAN 89 1.1 mycroft %token <num> NUMBER 90 1.1 mycroft %token <ptr> STRING 91 1.1 mycroft %token <addrmask> ADDRMASK 92 1.1 mycroft %token <addr> ADDR 93 1.1 mycroft 94 1.4 mycroft %type <addr> interface addrname 95 1.1 mycroft %type <addrmask> bound boundary addrmask 96 1.1 mycroft 97 1.1 mycroft %start conf 98 1.1 mycroft 99 1.1 mycroft %% 100 1.1 mycroft 101 1.1 mycroft conf : stmts 102 1.1 mycroft ; 103 1.1 mycroft 104 1.1 mycroft stmts : /* Empty */ 105 1.1 mycroft | stmts stmt 106 1.1 mycroft ; 107 1.1 mycroft 108 1.1 mycroft stmt : error 109 1.1 mycroft | PHYINT interface { 110 1.1 mycroft 111 1.1 mycroft vifi_t vifi; 112 1.1 mycroft 113 1.1 mycroft if (order) 114 1.1 mycroft fatal("phyints must appear before tunnels"); 115 1.1 mycroft 116 1.1 mycroft for (vifi = 0, v = uvifs; 117 1.1 mycroft vifi < numvifs; 118 1.1 mycroft ++vifi, ++v) 119 1.1 mycroft if (!(v->uv_flags & VIFF_TUNNEL) && 120 1.1 mycroft $2 == v->uv_lcl_addr) 121 1.1 mycroft break; 122 1.1 mycroft 123 1.1 mycroft if (vifi == numvifs) 124 1.1 mycroft fatal("%s is not a configured interface", 125 1.13 dsl inet_fmt($2)); 126 1.1 mycroft 127 1.1 mycroft } 128 1.1 mycroft ifmods 129 1.4 mycroft | TUNNEL interface addrname { 130 1.15 itojun const char *ifname; 131 1.1 mycroft struct ifreq ffr; 132 1.1 mycroft vifi_t vifi; 133 1.1 mycroft 134 1.1 mycroft order++; 135 1.1 mycroft 136 1.15 itojun ifname = ifconfaddr($2); 137 1.15 itojun if (ifname == 0) 138 1.1 mycroft fatal("Tunnel local address %s is not mine", 139 1.13 dsl inet_fmt($2)); 140 1.1 mycroft 141 1.15 itojun strncpy(ffr.ifr_name, ifname, sizeof(ffr.ifr_name)); 142 1.1 mycroft if (ioctl(udp_socket, SIOCGIFFLAGS, (char *)&ffr)<0) 143 1.1 mycroft fatal("ioctl SIOCGIFFLAGS on %s",ffr.ifr_name); 144 1.1 mycroft if (ffr.ifr_flags & IFF_LOOPBACK) 145 1.1 mycroft fatal("Tunnel local address %s is a loopback interface", 146 1.13 dsl inet_fmt($2)); 147 1.1 mycroft 148 1.15 itojun if (ifconfaddr($3) != 0) 149 1.1 mycroft fatal("Tunnel remote address %s is one of mine", 150 1.13 dsl inet_fmt($3)); 151 1.1 mycroft 152 1.1 mycroft for (vifi = 0, v = uvifs; 153 1.1 mycroft vifi < numvifs; 154 1.1 mycroft ++vifi, ++v) 155 1.1 mycroft if (v->uv_flags & VIFF_TUNNEL) { 156 1.1 mycroft if ($3 == v->uv_rmt_addr) 157 1.1 mycroft fatal("Duplicate tunnel to %s", 158 1.13 dsl inet_fmt($3)); 159 1.1 mycroft } else if (!(v->uv_flags & VIFF_DISABLED)) { 160 1.1 mycroft if (($3 & v->uv_subnetmask) == v->uv_subnet) 161 1.1 mycroft fatal("Unnecessary tunnel to %s", 162 1.13 dsl inet_fmt($3)); 163 1.1 mycroft } 164 1.1 mycroft 165 1.1 mycroft if (numvifs == MAXVIFS) 166 1.1 mycroft fatal("too many vifs"); 167 1.1 mycroft 168 1.1 mycroft v = &uvifs[numvifs]; 169 1.1 mycroft v->uv_flags = VIFF_TUNNEL; 170 1.1 mycroft v->uv_metric = DEFAULT_METRIC; 171 1.1 mycroft v->uv_rate_limit= DEFAULT_TUN_RATE_LIMIT; 172 1.1 mycroft v->uv_threshold = DEFAULT_THRESHOLD; 173 1.1 mycroft v->uv_lcl_addr = $2; 174 1.1 mycroft v->uv_rmt_addr = $3; 175 1.1 mycroft v->uv_subnet = 0; 176 1.1 mycroft v->uv_subnetmask= 0; 177 1.1 mycroft v->uv_subnetbcast= 0; 178 1.1 mycroft strncpy(v->uv_name, ffr.ifr_name, IFNAMSIZ); 179 1.1 mycroft v->uv_groups = NULL; 180 1.1 mycroft v->uv_neighbors = NULL; 181 1.1 mycroft v->uv_acl = NULL; 182 1.1 mycroft v->uv_addrs = NULL; 183 1.1 mycroft 184 1.1 mycroft if (!(ffr.ifr_flags & IFF_UP)) { 185 1.1 mycroft v->uv_flags |= VIFF_DOWN; 186 1.1 mycroft vifs_down = TRUE; 187 1.1 mycroft } 188 1.1 mycroft } 189 1.1 mycroft tunnelmods 190 1.1 mycroft { 191 1.10 wiz logit(LOG_INFO, 0, 192 1.1 mycroft "installing tunnel from %s to %s as vif #%u - rate=%d", 193 1.13 dsl inet_fmt($2), 194 1.13 dsl inet_fmt($3), 195 1.1 mycroft numvifs, v->uv_rate_limit); 196 1.1 mycroft 197 1.1 mycroft ++numvifs; 198 1.1 mycroft } 199 1.1 mycroft | PRUNING BOOLEAN { pruning = $2; } 200 1.1 mycroft | CACHE_LIFETIME NUMBER { cache_lifetime = $2; 201 1.1 mycroft max_prune_lifetime = cache_lifetime * 2; 202 1.1 mycroft } 203 1.1 mycroft | NAME STRING boundary { if (numbounds >= MAXBOUNDS) { 204 1.1 mycroft fatal("Too many named boundaries (max %d)", MAXBOUNDS); 205 1.1 mycroft } 206 1.1 mycroft 207 1.14 itojun boundlist[numbounds].name = strdup($2); 208 1.1 mycroft boundlist[numbounds++].bound = $3; 209 1.1 mycroft } 210 1.4 mycroft | SYSNAM STRING { 211 1.4 mycroft #ifdef SNMP 212 1.4 mycroft set_sysName($2); 213 1.4 mycroft #endif /* SNMP */ 214 1.4 mycroft } 215 1.4 mycroft | SYSCONTACT STRING { 216 1.4 mycroft #ifdef SNMP 217 1.4 mycroft set_sysContact($2); 218 1.4 mycroft #endif /* SNMP */ 219 1.4 mycroft } 220 1.4 mycroft | SYSVERSION STRING { 221 1.4 mycroft #ifdef SNMP 222 1.4 mycroft set_sysVersion($2); 223 1.4 mycroft #endif /* SNMP */ 224 1.4 mycroft } 225 1.4 mycroft | SYSLOCATION STRING { 226 1.4 mycroft #ifdef SNMP 227 1.4 mycroft set_sysLocation($2); 228 1.4 mycroft #endif /* SNMP */ 229 1.4 mycroft } 230 1.1 mycroft ; 231 1.1 mycroft 232 1.1 mycroft tunnelmods : /* empty */ 233 1.4 mycroft | tunnelmods tunnelmod 234 1.1 mycroft ; 235 1.1 mycroft 236 1.1 mycroft tunnelmod : mod 237 1.1 mycroft | SRCRT { fatal("Source-route tunnels not supported"); } 238 1.1 mycroft ; 239 1.1 mycroft 240 1.1 mycroft ifmods : /* empty */ 241 1.4 mycroft | ifmods ifmod 242 1.1 mycroft ; 243 1.1 mycroft 244 1.1 mycroft ifmod : mod 245 1.1 mycroft | DISABLE { v->uv_flags |= VIFF_DISABLED; } 246 1.4 mycroft | IGMPV1 { v->uv_flags |= VIFF_IGMPV1; } 247 1.4 mycroft | NETMASK addrname { 248 1.4 mycroft u_int32_t subnet, mask; 249 1.4 mycroft 250 1.4 mycroft mask = $2; 251 1.4 mycroft subnet = v->uv_lcl_addr & mask; 252 1.4 mycroft if (!inet_valid_subnet(subnet, mask)) 253 1.4 mycroft fatal("Invalid netmask"); 254 1.4 mycroft v->uv_subnet = subnet; 255 1.4 mycroft v->uv_subnetmask = mask; 256 1.4 mycroft v->uv_subnetbcast = subnet | ~mask; 257 1.4 mycroft } 258 1.4 mycroft | NETMASK { 259 1.4 mycroft 260 1.4 mycroft warn("Expected address after netmask keyword, ignored"); 261 1.4 mycroft 262 1.4 mycroft } 263 1.1 mycroft | ALTNET addrmask { 264 1.1 mycroft 265 1.1 mycroft struct phaddr *ph; 266 1.1 mycroft 267 1.1 mycroft ph = (struct phaddr *)malloc(sizeof(struct phaddr)); 268 1.1 mycroft if (ph == NULL) 269 1.1 mycroft fatal("out of memory"); 270 1.1 mycroft if ($2.mask) { 271 1.4 mycroft VAL_TO_MASK(ph->pa_subnetmask, $2.mask); 272 1.1 mycroft } else 273 1.4 mycroft ph->pa_subnetmask = v->uv_subnetmask; 274 1.4 mycroft ph->pa_subnet = $2.addr & ph->pa_subnetmask; 275 1.4 mycroft ph->pa_subnetbcast = ph->pa_subnet | ~ph->pa_subnetmask; 276 1.4 mycroft if ($2.addr & ~ph->pa_subnetmask) 277 1.4 mycroft warn("Extra subnet %s/%d has host bits set", 278 1.13 dsl inet_fmt($2.addr), $2.mask); 279 1.1 mycroft ph->pa_next = v->uv_addrs; 280 1.1 mycroft v->uv_addrs = ph; 281 1.1 mycroft 282 1.1 mycroft } 283 1.4 mycroft | ALTNET { 284 1.4 mycroft 285 1.4 mycroft warn("Expected address after altnet keyword, ignored"); 286 1.4 mycroft 287 1.4 mycroft } 288 1.1 mycroft ; 289 1.1 mycroft 290 1.1 mycroft mod : THRESHOLD NUMBER { if ($2 < 1 || $2 > 255) 291 1.1 mycroft fatal("Invalid threshold %d",$2); 292 1.1 mycroft v->uv_threshold = $2; 293 1.1 mycroft } 294 1.1 mycroft | THRESHOLD { 295 1.1 mycroft 296 1.4 mycroft warn("Expected number after threshold keyword, ignored"); 297 1.1 mycroft 298 1.1 mycroft } 299 1.1 mycroft | METRIC NUMBER { if ($2 < 1 || $2 > UNREACHABLE) 300 1.1 mycroft fatal("Invalid metric %d",$2); 301 1.1 mycroft v->uv_metric = $2; 302 1.1 mycroft } 303 1.1 mycroft | METRIC { 304 1.1 mycroft 305 1.4 mycroft warn("Expected number after metric keyword, ignored"); 306 1.1 mycroft 307 1.1 mycroft } 308 1.1 mycroft | RATE_LIMIT NUMBER { if ($2 > MAX_RATE_LIMIT) 309 1.1 mycroft fatal("Invalid rate_limit %d",$2); 310 1.1 mycroft v->uv_rate_limit = $2; 311 1.1 mycroft } 312 1.1 mycroft | RATE_LIMIT { 313 1.1 mycroft 314 1.4 mycroft warn("Expected number after rate_limit keyword, ignored"); 315 1.1 mycroft 316 1.1 mycroft } 317 1.1 mycroft | BOUNDARY bound { 318 1.1 mycroft 319 1.1 mycroft struct vif_acl *v_acl; 320 1.1 mycroft 321 1.1 mycroft v_acl = (struct vif_acl *)malloc(sizeof(struct vif_acl)); 322 1.1 mycroft if (v_acl == NULL) 323 1.1 mycroft fatal("out of memory"); 324 1.1 mycroft VAL_TO_MASK(v_acl->acl_mask, $2.mask); 325 1.1 mycroft v_acl->acl_addr = $2.addr & v_acl->acl_mask; 326 1.1 mycroft if ($2.addr & ~v_acl->acl_mask) 327 1.1 mycroft warn("Boundary spec %s/%d has host bits set", 328 1.13 dsl inet_fmt($2.addr),$2.mask); 329 1.1 mycroft v_acl->acl_next = v->uv_acl; 330 1.1 mycroft v->uv_acl = v_acl; 331 1.1 mycroft 332 1.1 mycroft } 333 1.1 mycroft | BOUNDARY { 334 1.1 mycroft 335 1.4 mycroft warn("Expected boundary spec after boundary keyword, ignored"); 336 1.1 mycroft 337 1.1 mycroft } 338 1.1 mycroft ; 339 1.1 mycroft 340 1.1 mycroft interface : ADDR { $$ = $1; } 341 1.1 mycroft | STRING { 342 1.1 mycroft $$ = valid_if($1); 343 1.1 mycroft if ($$ == 0) 344 1.1 mycroft fatal("Invalid interface name %s",$1); 345 1.1 mycroft } 346 1.1 mycroft ; 347 1.1 mycroft 348 1.4 mycroft addrname : ADDR { $$ = $1; } 349 1.4 mycroft | STRING { struct hostent *hp; 350 1.4 mycroft 351 1.4 mycroft if ((hp = gethostbyname($1)) == NULL) 352 1.4 mycroft fatal("No such host %s", $1); 353 1.4 mycroft 354 1.4 mycroft if (hp->h_addr_list[1]) 355 1.4 mycroft fatal("Hostname %s does not %s", 356 1.4 mycroft $1, "map to a unique address"); 357 1.4 mycroft 358 1.4 mycroft bcopy(hp->h_addr_list[0], &$$, 359 1.4 mycroft hp->h_length); 360 1.4 mycroft } 361 1.4 mycroft 362 1.1 mycroft bound : boundary { $$ = $1; } 363 1.1 mycroft | STRING { int i; 364 1.1 mycroft 365 1.1 mycroft for (i=0; i < numbounds; i++) { 366 1.1 mycroft if (!strcmp(boundlist[i].name, $1)) { 367 1.1 mycroft $$ = boundlist[i].bound; 368 1.1 mycroft break; 369 1.1 mycroft } 370 1.1 mycroft } 371 1.1 mycroft if (i == numbounds) { 372 1.1 mycroft fatal("Invalid boundary name %s",$1); 373 1.1 mycroft } 374 1.1 mycroft } 375 1.1 mycroft ; 376 1.1 mycroft 377 1.1 mycroft boundary : ADDRMASK { 378 1.1 mycroft 379 1.1 mycroft if ((ntohl($1.addr) & 0xff000000) != 0xef000000) { 380 1.1 mycroft fatal("Boundaries must be 239.x.x.x, not %s/%d", 381 1.13 dsl inet_fmt($1.addr), $1.mask); 382 1.1 mycroft } 383 1.1 mycroft $$ = $1; 384 1.1 mycroft 385 1.1 mycroft } 386 1.1 mycroft ; 387 1.1 mycroft 388 1.1 mycroft addrmask : ADDRMASK { $$ = $1; } 389 1.1 mycroft | ADDR { $$.addr = $1; $$.mask = 0; } 390 1.1 mycroft ; 391 1.1 mycroft %% 392 1.4 mycroft static void 393 1.16 lukem fatal(const char *fmt, ...) 394 1.4 mycroft { 395 1.4 mycroft va_list ap; 396 1.4 mycroft char buf[200]; 397 1.4 mycroft 398 1.4 mycroft va_start(ap, fmt); 399 1.11 wiz vsnprintf(buf, sizeof(buf), fmt, ap); 400 1.1 mycroft va_end(ap); 401 1.1 mycroft 402 1.10 wiz logit(LOG_ERR,0,"%s: %s near line %d", configfilename, buf, lineno); 403 1.1 mycroft } 404 1.1 mycroft 405 1.4 mycroft static void 406 1.16 lukem warn(const char *fmt, ...) 407 1.4 mycroft { 408 1.4 mycroft va_list ap; 409 1.4 mycroft char buf[200]; 410 1.4 mycroft 411 1.4 mycroft va_start(ap, fmt); 412 1.11 wiz vsnprintf(buf, sizeof(buf), fmt, ap); 413 1.1 mycroft va_end(ap); 414 1.1 mycroft 415 1.10 wiz logit(LOG_WARNING,0,"%s: %s near line %d", configfilename, buf, lineno); 416 1.1 mycroft } 417 1.1 mycroft 418 1.4 mycroft static void 419 1.4 mycroft yyerror(s) 420 1.16 lukem const char *s; 421 1.1 mycroft { 422 1.10 wiz logit(LOG_ERR, 0, "%s: %s near line %d", configfilename, s, lineno); 423 1.1 mycroft } 424 1.1 mycroft 425 1.4 mycroft static char * 426 1.4 mycroft next_word() 427 1.1 mycroft { 428 1.1 mycroft static char buf[1024]; 429 1.1 mycroft static char *p=NULL; 430 1.1 mycroft extern FILE *f; 431 1.1 mycroft char *q; 432 1.1 mycroft 433 1.1 mycroft while (1) { 434 1.1 mycroft if (!p || !*p) { 435 1.1 mycroft lineno++; 436 1.1 mycroft if (fgets(buf, sizeof(buf), f) == NULL) 437 1.1 mycroft return NULL; 438 1.1 mycroft p = buf; 439 1.1 mycroft } 440 1.1 mycroft while (*p && (*p == ' ' || *p == '\t')) /* skip whitespace */ 441 1.1 mycroft p++; 442 1.1 mycroft if (*p == '#') { 443 1.1 mycroft p = NULL; /* skip comments */ 444 1.1 mycroft continue; 445 1.1 mycroft } 446 1.1 mycroft q = p; 447 1.4 mycroft #ifdef SNMP 448 1.4 mycroft if (*p == '"') { 449 1.4 mycroft p++; 450 1.4 mycroft while (*p && *p != '"' && *p != '\n') 451 1.4 mycroft p++; /* find next whitespace */ 452 1.4 mycroft if (*p == '"') 453 1.4 mycroft p++; 454 1.4 mycroft } else 455 1.4 mycroft #endif 456 1.1 mycroft while (*p && *p != ' ' && *p != '\t' && *p != '\n') 457 1.1 mycroft p++; /* find next whitespace */ 458 1.1 mycroft *p++ = '\0'; /* null-terminate string */ 459 1.1 mycroft 460 1.1 mycroft if (!*q) { 461 1.1 mycroft p = NULL; 462 1.1 mycroft continue; /* if 0-length string, read another line */ 463 1.1 mycroft } 464 1.1 mycroft 465 1.1 mycroft return q; 466 1.1 mycroft } 467 1.1 mycroft } 468 1.1 mycroft 469 1.4 mycroft static int 470 1.4 mycroft yylex() 471 1.1 mycroft { 472 1.1 mycroft int n; 473 1.1 mycroft u_int32_t addr; 474 1.1 mycroft char *q; 475 1.13 dsl char c; 476 1.1 mycroft 477 1.1 mycroft if ((q = next_word()) == NULL) { 478 1.1 mycroft return 0; 479 1.1 mycroft } 480 1.1 mycroft 481 1.1 mycroft if (!strcmp(q,"cache_lifetime")) 482 1.1 mycroft return CACHE_LIFETIME; 483 1.1 mycroft if (!strcmp(q,"pruning")) 484 1.1 mycroft return PRUNING; 485 1.1 mycroft if (!strcmp(q,"phyint")) 486 1.1 mycroft return PHYINT; 487 1.1 mycroft if (!strcmp(q,"tunnel")) 488 1.1 mycroft return TUNNEL; 489 1.1 mycroft if (!strcmp(q,"disable")) 490 1.1 mycroft return DISABLE; 491 1.1 mycroft if (!strcmp(q,"metric")) 492 1.1 mycroft return METRIC; 493 1.1 mycroft if (!strcmp(q,"threshold")) 494 1.1 mycroft return THRESHOLD; 495 1.1 mycroft if (!strcmp(q,"rate_limit")) 496 1.1 mycroft return RATE_LIMIT; 497 1.1 mycroft if (!strcmp(q,"srcrt") || !strcmp(q,"sourceroute")) 498 1.1 mycroft return SRCRT; 499 1.1 mycroft if (!strcmp(q,"boundary")) 500 1.1 mycroft return BOUNDARY; 501 1.1 mycroft if (!strcmp(q,"netmask")) 502 1.1 mycroft return NETMASK; 503 1.4 mycroft if (!strcmp(q,"igmpv1")) 504 1.4 mycroft return IGMPV1; 505 1.4 mycroft if (!strcmp(q,"altnet")) 506 1.4 mycroft return ALTNET; 507 1.1 mycroft if (!strcmp(q,"name")) 508 1.1 mycroft return NAME; 509 1.1 mycroft if (!strcmp(q,"on") || !strcmp(q,"yes")) { 510 1.1 mycroft yylval.num = 1; 511 1.1 mycroft return BOOLEAN; 512 1.1 mycroft } 513 1.1 mycroft if (!strcmp(q,"off") || !strcmp(q,"no")) { 514 1.1 mycroft yylval.num = 0; 515 1.1 mycroft return BOOLEAN; 516 1.1 mycroft } 517 1.13 dsl if ((addr = inet_parse(q, &n)) != 0xffffffff) { 518 1.13 dsl yylval.addrmask.mask = n; 519 1.13 dsl yylval.addrmask.addr = addr; 520 1.13 dsl return ADDRMASK; 521 1.1 mycroft } 522 1.13 dsl if ((addr = inet_parse(q,0)) != 0xffffffff && 523 1.13 dsl inet_valid_host(addr)) { 524 1.13 dsl yylval.addr = addr; 525 1.13 dsl return ADDR; 526 1.1 mycroft } 527 1.13 dsl if (sscanf(q,"0x%8x%c",&n,&c) == 1) { 528 1.1 mycroft yylval.addr = n; 529 1.1 mycroft return ADDR; 530 1.1 mycroft } 531 1.13 dsl if (sscanf(q,"%d%c",&n,&c) == 1) { 532 1.1 mycroft yylval.num = n; 533 1.1 mycroft return NUMBER; 534 1.1 mycroft } 535 1.4 mycroft #ifdef SNMP 536 1.4 mycroft if (!strcmp(q,"sysName")) 537 1.4 mycroft return SYSNAM; 538 1.4 mycroft if (!strcmp(q,"sysContact")) 539 1.4 mycroft return SYSCONTACT; 540 1.4 mycroft if (!strcmp(q,"sysVersion")) 541 1.4 mycroft return SYSVERSION; 542 1.4 mycroft if (!strcmp(q,"sysLocation")) 543 1.4 mycroft return SYSLOCATION; 544 1.4 mycroft if (*q=='"') { 545 1.4 mycroft if (q[ strlen(q)-1 ]=='"') 546 1.4 mycroft q[ strlen(q)-1 ]='\0'; /* trash trailing quote */ 547 1.4 mycroft yylval.ptr = q+1; 548 1.4 mycroft return STRING; 549 1.4 mycroft } 550 1.4 mycroft #endif 551 1.1 mycroft yylval.ptr = q; 552 1.1 mycroft return STRING; 553 1.1 mycroft } 554 1.1 mycroft 555 1.4 mycroft void 556 1.4 mycroft config_vifs_from_file() 557 1.1 mycroft { 558 1.1 mycroft extern FILE *f; 559 1.1 mycroft 560 1.1 mycroft order = 0; 561 1.1 mycroft numbounds = 0; 562 1.1 mycroft lineno = 0; 563 1.1 mycroft 564 1.1 mycroft if ((f = fopen(configfilename, "r")) == NULL) { 565 1.1 mycroft if (errno != ENOENT) 566 1.10 wiz logit(LOG_ERR, errno, "can't open %s", configfilename); 567 1.1 mycroft return; 568 1.1 mycroft } 569 1.1 mycroft 570 1.1 mycroft yyparse(); 571 1.1 mycroft 572 1.4 mycroft fclose(f); 573 1.1 mycroft } 574 1.1 mycroft 575 1.1 mycroft static u_int32_t 576 1.1 mycroft valid_if(s) 577 1.1 mycroft char *s; 578 1.1 mycroft { 579 1.8 wiz vifi_t vifi; 580 1.16 lukem struct uvif *uv; 581 1.1 mycroft 582 1.16 lukem for (vifi=0, uv=uvifs; vifi<numvifs; vifi++, uv++) 583 1.16 lukem if (!strcmp(uv->uv_name, s)) 584 1.16 lukem return uv->uv_lcl_addr; 585 1.1 mycroft 586 1.1 mycroft return 0; 587 1.1 mycroft } 588 1.1 mycroft 589 1.15 itojun static const char * 590 1.15 itojun ifconfaddr(a) 591 1.1 mycroft u_int32_t a; 592 1.1 mycroft { 593 1.15 itojun static char ifname[IFNAMSIZ]; 594 1.15 itojun struct ifaddrs *ifap, *ifa; 595 1.15 itojun 596 1.15 itojun if (getifaddrs(&ifap) != 0) 597 1.15 itojun return (NULL); 598 1.15 itojun 599 1.15 itojun for (ifa = ifap; ifa; ifa = ifa->ifa_next) { 600 1.15 itojun if (ifa->ifa_addr->sa_family == AF_INET && 601 1.15 itojun ((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr == a) { 602 1.15 itojun strlcpy(ifname, ifa->ifa_name, sizeof(ifname)); 603 1.15 itojun freeifaddrs(ifap); 604 1.15 itojun return (ifname); 605 1.15 itojun } 606 1.1 mycroft } 607 1.15 itojun 608 1.15 itojun freeifaddrs(ifap); 609 1.15 itojun return (NULL); 610 1.1 mycroft } 611