conflex.c revision 149400
1147072Sbrooks/* $OpenBSD: conflex.c,v 1.7 2004/09/15 19:02:38 deraadt Exp $ */ 2147072Sbrooks 3147072Sbrooks/* Lexical scanner for dhcpd config file... */ 4147072Sbrooks 5147072Sbrooks/* 6147072Sbrooks * Copyright (c) 1995, 1996, 1997 The Internet Software Consortium. 7147072Sbrooks * All rights reserved. 8147072Sbrooks * 9147072Sbrooks * Redistribution and use in source and binary forms, with or without 10147072Sbrooks * modification, are permitted provided that the following conditions 11147072Sbrooks * are met: 12147072Sbrooks * 13147072Sbrooks * 1. Redistributions of source code must retain the above copyright 14147072Sbrooks * notice, this list of conditions and the following disclaimer. 15147072Sbrooks * 2. Redistributions in binary form must reproduce the above copyright 16147072Sbrooks * notice, this list of conditions and the following disclaimer in the 17147072Sbrooks * documentation and/or other materials provided with the distribution. 18147072Sbrooks * 3. Neither the name of The Internet Software Consortium nor the names 19147072Sbrooks * of its contributors may be used to endorse or promote products derived 20147072Sbrooks * from this software without specific prior written permission. 21147072Sbrooks * 22147072Sbrooks * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND 23147072Sbrooks * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 24147072Sbrooks * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 25147072Sbrooks * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 26147072Sbrooks * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR 27147072Sbrooks * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 28147072Sbrooks * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 29147072Sbrooks * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 30147072Sbrooks * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 31147072Sbrooks * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 32147072Sbrooks * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 33147072Sbrooks * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34147072Sbrooks * SUCH DAMAGE. 35147072Sbrooks * 36147072Sbrooks * This software has been written for the Internet Software Consortium 37147072Sbrooks * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie 38147072Sbrooks * Enterprises. To learn more about the Internet Software Consortium, 39147072Sbrooks * see ``http://www.vix.com/isc''. To learn more about Vixie 40147072Sbrooks * Enterprises, see ``http://www.vix.com''. 41147072Sbrooks */ 42147072Sbrooks 43149399Sbrooks#include <sys/cdefs.h> 44149399Sbrooks__FBSDID("$FreeBSD: head/sbin/dhclient/conflex.c 149400 2005-08-24 00:05:04Z brooks $"); 45149399Sbrooks 46147072Sbrooks#include <ctype.h> 47147072Sbrooks 48147072Sbrooks#include "dhcpd.h" 49147072Sbrooks#include "dhctoken.h" 50147072Sbrooks 51147072Sbrooksint lexline; 52147072Sbrooksint lexchar; 53147072Sbrookschar *token_line; 54147072Sbrookschar *prev_line; 55147072Sbrookschar *cur_line; 56147072Sbrookschar *tlname; 57147072Sbrooksint eol_token; 58147072Sbrooks 59147072Sbrooksstatic char line1[81]; 60147072Sbrooksstatic char line2[81]; 61147072Sbrooksstatic int lpos; 62147072Sbrooksstatic int line; 63147072Sbrooksstatic int tlpos; 64147072Sbrooksstatic int tline; 65147072Sbrooksstatic int token; 66147072Sbrooksstatic int ugflag; 67147072Sbrooksstatic char *tval; 68147072Sbrooksstatic char tokbuf[1500]; 69147072Sbrooks 70147072Sbrooksstatic int get_char(FILE *); 71147072Sbrooksstatic int get_token(FILE *); 72147072Sbrooksstatic void skip_to_eol(FILE *); 73147072Sbrooksstatic int read_string(FILE *); 74147072Sbrooksstatic int read_number(int, FILE *); 75147072Sbrooksstatic int read_num_or_name(int, FILE *); 76147072Sbrooksstatic int intern(char *, int); 77147072Sbrooks 78147072Sbrooksvoid 79147072Sbrooksnew_parse(char *name) 80147072Sbrooks{ 81147072Sbrooks tlname = name; 82147072Sbrooks lpos = line = 1; 83147072Sbrooks cur_line = line1; 84147072Sbrooks prev_line = line2; 85147072Sbrooks token_line = cur_line; 86147072Sbrooks cur_line[0] = prev_line[0] = 0; 87147072Sbrooks warnings_occurred = 0; 88147072Sbrooks} 89147072Sbrooks 90147072Sbrooksstatic int 91147072Sbrooksget_char(FILE *cfile) 92147072Sbrooks{ 93147072Sbrooks int c = getc(cfile); 94147072Sbrooks if (!ugflag) { 95147072Sbrooks if (c == '\n') { 96147072Sbrooks if (cur_line == line1) { 97147072Sbrooks cur_line = line2; 98147072Sbrooks prev_line = line1; 99147072Sbrooks } else { 100147072Sbrooks cur_line = line2; 101147072Sbrooks prev_line = line1; 102147072Sbrooks } 103147072Sbrooks line++; 104147072Sbrooks lpos = 1; 105147072Sbrooks cur_line[0] = 0; 106147072Sbrooks } else if (c != EOF) { 107149400Sbrooks if (lpos < sizeof(line1)) { 108147072Sbrooks cur_line[lpos - 1] = c; 109147072Sbrooks cur_line[lpos] = 0; 110147072Sbrooks } 111147072Sbrooks lpos++; 112147072Sbrooks } 113147072Sbrooks } else 114147072Sbrooks ugflag = 0; 115147072Sbrooks return (c); 116147072Sbrooks} 117147072Sbrooks 118147072Sbrooksstatic int 119147072Sbrooksget_token(FILE *cfile) 120147072Sbrooks{ 121147072Sbrooks int c, ttok; 122147072Sbrooks static char tb[2]; 123147072Sbrooks int l, p; 124147072Sbrooks 125147072Sbrooks do { 126147072Sbrooks l = line; 127147072Sbrooks p = lpos; 128147072Sbrooks 129147072Sbrooks c = get_char(cfile); 130147072Sbrooks 131147072Sbrooks if (!(c == '\n' && eol_token) && isascii(c) && isspace(c)) 132147072Sbrooks continue; 133147072Sbrooks if (c == '#') { 134147072Sbrooks skip_to_eol(cfile); 135147072Sbrooks continue; 136147072Sbrooks } 137147072Sbrooks if (c == '"') { 138147072Sbrooks lexline = l; 139147072Sbrooks lexchar = p; 140147072Sbrooks ttok = read_string(cfile); 141147072Sbrooks break; 142147072Sbrooks } 143147072Sbrooks if ((isascii(c) && isdigit(c)) || c == '-') { 144147072Sbrooks lexline = l; 145147072Sbrooks lexchar = p; 146147072Sbrooks ttok = read_number(c, cfile); 147147072Sbrooks break; 148147072Sbrooks } else if (isascii(c) && isalpha(c)) { 149147072Sbrooks lexline = l; 150147072Sbrooks lexchar = p; 151147072Sbrooks ttok = read_num_or_name(c, cfile); 152147072Sbrooks break; 153147072Sbrooks } else { 154147072Sbrooks lexline = l; 155147072Sbrooks lexchar = p; 156147072Sbrooks tb[0] = c; 157147072Sbrooks tb[1] = 0; 158147072Sbrooks tval = tb; 159147072Sbrooks ttok = c; 160147072Sbrooks break; 161147072Sbrooks } 162147072Sbrooks } while (1); 163147072Sbrooks return (ttok); 164147072Sbrooks} 165147072Sbrooks 166147072Sbrooksint 167147072Sbrooksnext_token(char **rval, FILE *cfile) 168147072Sbrooks{ 169147072Sbrooks int rv; 170147072Sbrooks 171147072Sbrooks if (token) { 172147072Sbrooks if (lexline != tline) 173147072Sbrooks token_line = cur_line; 174147072Sbrooks lexchar = tlpos; 175147072Sbrooks lexline = tline; 176147072Sbrooks rv = token; 177147072Sbrooks token = 0; 178147072Sbrooks } else { 179147072Sbrooks rv = get_token(cfile); 180147072Sbrooks token_line = cur_line; 181147072Sbrooks } 182147072Sbrooks if (rval) 183147072Sbrooks *rval = tval; 184147072Sbrooks 185147072Sbrooks return (rv); 186147072Sbrooks} 187147072Sbrooks 188147072Sbrooksint 189147072Sbrookspeek_token(char **rval, FILE *cfile) 190147072Sbrooks{ 191147072Sbrooks int x; 192147072Sbrooks 193147072Sbrooks if (!token) { 194147072Sbrooks tlpos = lexchar; 195147072Sbrooks tline = lexline; 196147072Sbrooks token = get_token(cfile); 197147072Sbrooks if (lexline != tline) 198147072Sbrooks token_line = prev_line; 199147072Sbrooks x = lexchar; 200147072Sbrooks lexchar = tlpos; 201147072Sbrooks tlpos = x; 202147072Sbrooks x = lexline; 203147072Sbrooks lexline = tline; 204147072Sbrooks tline = x; 205147072Sbrooks } 206147072Sbrooks if (rval) 207147072Sbrooks *rval = tval; 208147072Sbrooks 209147072Sbrooks return (token); 210147072Sbrooks} 211147072Sbrooks 212147072Sbrooksstatic void 213147072Sbrooksskip_to_eol(FILE *cfile) 214147072Sbrooks{ 215147072Sbrooks int c; 216147072Sbrooks 217147072Sbrooks do { 218147072Sbrooks c = get_char(cfile); 219147072Sbrooks if (c == EOF) 220147072Sbrooks return; 221147072Sbrooks if (c == '\n') 222147072Sbrooks return; 223147072Sbrooks } while (1); 224147072Sbrooks} 225147072Sbrooks 226147072Sbrooksstatic int 227147072Sbrooksread_string(FILE *cfile) 228147072Sbrooks{ 229147072Sbrooks int i, c, bs = 0; 230147072Sbrooks 231147072Sbrooks for (i = 0; i < sizeof(tokbuf); i++) { 232147072Sbrooks c = get_char(cfile); 233147072Sbrooks if (c == EOF) { 234147072Sbrooks parse_warn("eof in string constant"); 235147072Sbrooks break; 236147072Sbrooks } 237147072Sbrooks if (bs) { 238147072Sbrooks bs = 0; 239147072Sbrooks tokbuf[i] = c; 240147072Sbrooks } else if (c == '\\') 241147072Sbrooks bs = 1; 242147072Sbrooks else if (c == '"') 243147072Sbrooks break; 244147072Sbrooks else 245147072Sbrooks tokbuf[i] = c; 246147072Sbrooks } 247147072Sbrooks /* 248147072Sbrooks * Normally, I'd feel guilty about this, but we're talking about 249147072Sbrooks * strings that'll fit in a DHCP packet here... 250147072Sbrooks */ 251147072Sbrooks if (i == sizeof(tokbuf)) { 252147072Sbrooks parse_warn("string constant larger than internal buffer"); 253147072Sbrooks i--; 254147072Sbrooks } 255147072Sbrooks tokbuf[i] = 0; 256147072Sbrooks tval = tokbuf; 257147072Sbrooks return (STRING); 258147072Sbrooks} 259147072Sbrooks 260147072Sbrooksstatic int 261147072Sbrooksread_number(int c, FILE *cfile) 262147072Sbrooks{ 263147072Sbrooks int seenx = 0, i = 0, token = NUMBER; 264147072Sbrooks 265147072Sbrooks tokbuf[i++] = c; 266147072Sbrooks for (; i < sizeof(tokbuf); i++) { 267147072Sbrooks c = get_char(cfile); 268147072Sbrooks if (!seenx && c == 'x') 269147072Sbrooks seenx = 1; 270147072Sbrooks else if (!isascii(c) || !isxdigit(c)) { 271147072Sbrooks ungetc(c, cfile); 272147072Sbrooks ugflag = 1; 273147072Sbrooks break; 274147072Sbrooks } 275147072Sbrooks tokbuf[i] = c; 276147072Sbrooks } 277147072Sbrooks if (i == sizeof(tokbuf)) { 278147072Sbrooks parse_warn("numeric token larger than internal buffer"); 279147072Sbrooks i--; 280147072Sbrooks } 281147072Sbrooks tokbuf[i] = 0; 282147072Sbrooks tval = tokbuf; 283147072Sbrooks 284147072Sbrooks return (token); 285147072Sbrooks} 286147072Sbrooks 287147072Sbrooksstatic int 288147072Sbrooksread_num_or_name(int c, FILE *cfile) 289147072Sbrooks{ 290147072Sbrooks int i = 0; 291147072Sbrooks int rv = NUMBER_OR_NAME; 292147072Sbrooks 293147072Sbrooks tokbuf[i++] = c; 294147072Sbrooks for (; i < sizeof(tokbuf); i++) { 295147072Sbrooks c = get_char(cfile); 296147072Sbrooks if (!isascii(c) || (c != '-' && c != '_' && !isalnum(c))) { 297147072Sbrooks ungetc(c, cfile); 298147072Sbrooks ugflag = 1; 299147072Sbrooks break; 300147072Sbrooks } 301147072Sbrooks if (!isxdigit(c)) 302147072Sbrooks rv = NAME; 303147072Sbrooks tokbuf[i] = c; 304147072Sbrooks } 305147072Sbrooks if (i == sizeof(tokbuf)) { 306147072Sbrooks parse_warn("token larger than internal buffer"); 307147072Sbrooks i--; 308147072Sbrooks } 309147072Sbrooks tokbuf[i] = 0; 310147072Sbrooks tval = tokbuf; 311147072Sbrooks 312147072Sbrooks return (intern(tval, rv)); 313147072Sbrooks} 314147072Sbrooks 315147072Sbrooksstatic int 316147072Sbrooksintern(char *atom, int dfv) 317147072Sbrooks{ 318147072Sbrooks if (!isascii(atom[0])) 319147072Sbrooks return (dfv); 320147072Sbrooks 321147072Sbrooks switch (tolower(atom[0])) { 322147072Sbrooks case 'a': 323147072Sbrooks if (!strcasecmp(atom + 1, "lways-reply-rfc1048")) 324147072Sbrooks return (ALWAYS_REPLY_RFC1048); 325147072Sbrooks if (!strcasecmp(atom + 1, "ppend")) 326147072Sbrooks return (APPEND); 327147072Sbrooks if (!strcasecmp(atom + 1, "llow")) 328147072Sbrooks return (ALLOW); 329147072Sbrooks if (!strcasecmp(atom + 1, "lias")) 330147072Sbrooks return (ALIAS); 331147072Sbrooks if (!strcasecmp(atom + 1, "bandoned")) 332147072Sbrooks return (ABANDONED); 333147072Sbrooks if (!strcasecmp(atom + 1, "uthoritative")) 334147072Sbrooks return (AUTHORITATIVE); 335147072Sbrooks break; 336147072Sbrooks case 'b': 337147072Sbrooks if (!strcasecmp(atom + 1, "ackoff-cutoff")) 338147072Sbrooks return (BACKOFF_CUTOFF); 339147072Sbrooks if (!strcasecmp(atom + 1, "ootp")) 340147072Sbrooks return (BOOTP); 341147072Sbrooks if (!strcasecmp(atom + 1, "ooting")) 342147072Sbrooks return (BOOTING); 343147072Sbrooks if (!strcasecmp(atom + 1, "oot-unknown-clients")) 344147072Sbrooks return (BOOT_UNKNOWN_CLIENTS); 345147072Sbrooks case 'c': 346147072Sbrooks if (!strcasecmp(atom + 1, "lass")) 347147072Sbrooks return (CLASS); 348147072Sbrooks if (!strcasecmp(atom + 1, "iaddr")) 349147072Sbrooks return (CIADDR); 350147072Sbrooks if (!strcasecmp(atom + 1, "lient-identifier")) 351147072Sbrooks return (CLIENT_IDENTIFIER); 352147072Sbrooks if (!strcasecmp(atom + 1, "lient-hostname")) 353147072Sbrooks return (CLIENT_HOSTNAME); 354147072Sbrooks break; 355147072Sbrooks case 'd': 356147072Sbrooks if (!strcasecmp(atom + 1, "omain")) 357147072Sbrooks return (DOMAIN); 358147072Sbrooks if (!strcasecmp(atom + 1, "eny")) 359147072Sbrooks return (DENY); 360147072Sbrooks if (!strncasecmp(atom + 1, "efault", 6)) { 361147072Sbrooks if (!atom[7]) 362147072Sbrooks return (DEFAULT); 363147072Sbrooks if (!strcasecmp(atom + 7, "-lease-time")) 364147072Sbrooks return (DEFAULT_LEASE_TIME); 365147072Sbrooks break; 366147072Sbrooks } 367147072Sbrooks if (!strncasecmp(atom + 1, "ynamic-bootp", 12)) { 368147072Sbrooks if (!atom[13]) 369147072Sbrooks return (DYNAMIC_BOOTP); 370147072Sbrooks if (!strcasecmp(atom + 13, "-lease-cutoff")) 371147072Sbrooks return (DYNAMIC_BOOTP_LEASE_CUTOFF); 372147072Sbrooks if (!strcasecmp(atom + 13, "-lease-length")) 373147072Sbrooks return (DYNAMIC_BOOTP_LEASE_LENGTH); 374147072Sbrooks break; 375147072Sbrooks } 376147072Sbrooks break; 377147072Sbrooks case 'e': 378147072Sbrooks if (!strcasecmp(atom + 1, "thernet")) 379147072Sbrooks return (ETHERNET); 380147072Sbrooks if (!strcasecmp(atom + 1, "nds")) 381147072Sbrooks return (ENDS); 382147072Sbrooks if (!strcasecmp(atom + 1, "xpire")) 383147072Sbrooks return (EXPIRE); 384147072Sbrooks break; 385147072Sbrooks case 'f': 386147072Sbrooks if (!strcasecmp(atom + 1, "ilename")) 387147072Sbrooks return (FILENAME); 388147072Sbrooks if (!strcasecmp(atom + 1, "ixed-address")) 389147072Sbrooks return (FIXED_ADDR); 390147072Sbrooks if (!strcasecmp(atom + 1, "ddi")) 391147072Sbrooks return (FDDI); 392147072Sbrooks break; 393147072Sbrooks case 'g': 394147072Sbrooks if (!strcasecmp(atom + 1, "iaddr")) 395147072Sbrooks return (GIADDR); 396147072Sbrooks if (!strcasecmp(atom + 1, "roup")) 397147072Sbrooks return (GROUP); 398147072Sbrooks if (!strcasecmp(atom + 1, "et-lease-hostnames")) 399147072Sbrooks return (GET_LEASE_HOSTNAMES); 400147072Sbrooks break; 401147072Sbrooks case 'h': 402147072Sbrooks if (!strcasecmp(atom + 1, "ost")) 403147072Sbrooks return (HOST); 404147072Sbrooks if (!strcasecmp(atom + 1, "ardware")) 405147072Sbrooks return (HARDWARE); 406147072Sbrooks if (!strcasecmp(atom + 1, "ostname")) 407147072Sbrooks return (HOSTNAME); 408147072Sbrooks break; 409147072Sbrooks case 'i': 410147072Sbrooks if (!strcasecmp(atom + 1, "nitial-interval")) 411147072Sbrooks return (INITIAL_INTERVAL); 412147072Sbrooks if (!strcasecmp(atom + 1, "nterface")) 413147072Sbrooks return (INTERFACE); 414147072Sbrooks break; 415147072Sbrooks case 'l': 416147072Sbrooks if (!strcasecmp(atom + 1, "ease")) 417147072Sbrooks return (LEASE); 418147072Sbrooks break; 419147072Sbrooks case 'm': 420147072Sbrooks if (!strcasecmp(atom + 1, "ax-lease-time")) 421147072Sbrooks return (MAX_LEASE_TIME); 422147072Sbrooks if (!strncasecmp(atom + 1, "edi", 3)) { 423147072Sbrooks if (!strcasecmp(atom + 4, "a")) 424147072Sbrooks return (MEDIA); 425147072Sbrooks if (!strcasecmp(atom + 4, "um")) 426147072Sbrooks return (MEDIUM); 427147072Sbrooks break; 428147072Sbrooks } 429147072Sbrooks break; 430147072Sbrooks case 'n': 431147072Sbrooks if (!strcasecmp(atom + 1, "ameserver")) 432147072Sbrooks return (NAMESERVER); 433147072Sbrooks if (!strcasecmp(atom + 1, "etmask")) 434147072Sbrooks return (NETMASK); 435147072Sbrooks if (!strcasecmp(atom + 1, "ext-server")) 436147072Sbrooks return (NEXT_SERVER); 437147072Sbrooks if (!strcasecmp(atom + 1, "ot")) 438147072Sbrooks return (TOKEN_NOT); 439147072Sbrooks break; 440147072Sbrooks case 'o': 441147072Sbrooks if (!strcasecmp(atom + 1, "ption")) 442147072Sbrooks return (OPTION); 443147072Sbrooks if (!strcasecmp(atom + 1, "ne-lease-per-client")) 444147072Sbrooks return (ONE_LEASE_PER_CLIENT); 445147072Sbrooks break; 446147072Sbrooks case 'p': 447147072Sbrooks if (!strcasecmp(atom + 1, "repend")) 448147072Sbrooks return (PREPEND); 449147072Sbrooks if (!strcasecmp(atom + 1, "acket")) 450147072Sbrooks return (PACKET); 451147072Sbrooks break; 452147072Sbrooks case 'r': 453147072Sbrooks if (!strcasecmp(atom + 1, "ange")) 454147072Sbrooks return (RANGE); 455147072Sbrooks if (!strcasecmp(atom + 1, "equest")) 456147072Sbrooks return (REQUEST); 457147072Sbrooks if (!strcasecmp(atom + 1, "equire")) 458147072Sbrooks return (REQUIRE); 459147072Sbrooks if (!strcasecmp(atom + 1, "etry")) 460147072Sbrooks return (RETRY); 461147072Sbrooks if (!strcasecmp(atom + 1, "enew")) 462147072Sbrooks return (RENEW); 463147072Sbrooks if (!strcasecmp(atom + 1, "ebind")) 464147072Sbrooks return (REBIND); 465147072Sbrooks if (!strcasecmp(atom + 1, "eboot")) 466147072Sbrooks return (REBOOT); 467147072Sbrooks if (!strcasecmp(atom + 1, "eject")) 468147072Sbrooks return (REJECT); 469147072Sbrooks break; 470147072Sbrooks case 's': 471147072Sbrooks if (!strcasecmp(atom + 1, "earch")) 472147072Sbrooks return (SEARCH); 473147072Sbrooks if (!strcasecmp(atom + 1, "tarts")) 474147072Sbrooks return (STARTS); 475147072Sbrooks if (!strcasecmp(atom + 1, "iaddr")) 476147072Sbrooks return (SIADDR); 477147072Sbrooks if (!strcasecmp(atom + 1, "ubnet")) 478147072Sbrooks return (SUBNET); 479147072Sbrooks if (!strcasecmp(atom + 1, "hared-network")) 480147072Sbrooks return (SHARED_NETWORK); 481147072Sbrooks if (!strcasecmp(atom + 1, "erver-name")) 482147072Sbrooks return (SERVER_NAME); 483147072Sbrooks if (!strcasecmp(atom + 1, "erver-identifier")) 484147072Sbrooks return (SERVER_IDENTIFIER); 485147072Sbrooks if (!strcasecmp(atom + 1, "elect-timeout")) 486147072Sbrooks return (SELECT_TIMEOUT); 487147072Sbrooks if (!strcasecmp(atom + 1, "end")) 488147072Sbrooks return (SEND); 489147072Sbrooks if (!strcasecmp(atom + 1, "cript")) 490147072Sbrooks return (SCRIPT); 491147072Sbrooks if (!strcasecmp(atom + 1, "upersede")) 492147072Sbrooks return (SUPERSEDE); 493147072Sbrooks break; 494147072Sbrooks case 't': 495147072Sbrooks if (!strcasecmp(atom + 1, "imestamp")) 496147072Sbrooks return (TIMESTAMP); 497147072Sbrooks if (!strcasecmp(atom + 1, "imeout")) 498147072Sbrooks return (TIMEOUT); 499147072Sbrooks if (!strcasecmp(atom + 1, "oken-ring")) 500147072Sbrooks return (TOKEN_RING); 501147072Sbrooks break; 502147072Sbrooks case 'u': 503147072Sbrooks if (!strncasecmp(atom + 1, "se", 2)) { 504147072Sbrooks if (!strcasecmp(atom + 3, "r-class")) 505147072Sbrooks return (USER_CLASS); 506147072Sbrooks if (!strcasecmp(atom + 3, "-host-decl-names")) 507147072Sbrooks return (USE_HOST_DECL_NAMES); 508147072Sbrooks if (!strcasecmp(atom + 3, 509147072Sbrooks "-lease-addr-for-default-route")) 510147072Sbrooks return (USE_LEASE_ADDR_FOR_DEFAULT_ROUTE); 511147072Sbrooks break; 512147072Sbrooks } 513147072Sbrooks if (!strcasecmp(atom + 1, "id")) 514147072Sbrooks return (UID); 515147072Sbrooks if (!strcasecmp(atom + 1, "nknown-clients")) 516147072Sbrooks return (UNKNOWN_CLIENTS); 517147072Sbrooks break; 518147072Sbrooks case 'v': 519147072Sbrooks if (!strcasecmp(atom + 1, "endor-class")) 520147072Sbrooks return (VENDOR_CLASS); 521147072Sbrooks break; 522147072Sbrooks case 'y': 523147072Sbrooks if (!strcasecmp(atom + 1, "iaddr")) 524147072Sbrooks return (YIADDR); 525147072Sbrooks break; 526147072Sbrooks } 527147072Sbrooks return (dfv); 528147072Sbrooks} 529