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: releng/11.0/sbin/dhclient/conflex.c 301235 2016-06-03 03:40:39Z pfg $"); 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 { 100301235Spfg cur_line = line1; 101301235Spfg prev_line = line2; 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; 239149481Sbrooks i--; 240147072Sbrooks tokbuf[i] = c; 241147072Sbrooks } else if (c == '\\') 242147072Sbrooks bs = 1; 243147072Sbrooks else if (c == '"') 244147072Sbrooks break; 245147072Sbrooks else 246147072Sbrooks tokbuf[i] = c; 247147072Sbrooks } 248147072Sbrooks /* 249147072Sbrooks * Normally, I'd feel guilty about this, but we're talking about 250147072Sbrooks * strings that'll fit in a DHCP packet here... 251147072Sbrooks */ 252147072Sbrooks if (i == sizeof(tokbuf)) { 253147072Sbrooks parse_warn("string constant larger than internal buffer"); 254147072Sbrooks i--; 255147072Sbrooks } 256147072Sbrooks tokbuf[i] = 0; 257147072Sbrooks tval = tokbuf; 258147072Sbrooks return (STRING); 259147072Sbrooks} 260147072Sbrooks 261147072Sbrooksstatic int 262147072Sbrooksread_number(int c, FILE *cfile) 263147072Sbrooks{ 264147072Sbrooks int seenx = 0, i = 0, token = NUMBER; 265147072Sbrooks 266147072Sbrooks tokbuf[i++] = c; 267147072Sbrooks for (; i < sizeof(tokbuf); i++) { 268147072Sbrooks c = get_char(cfile); 269147072Sbrooks if (!seenx && c == 'x') 270147072Sbrooks seenx = 1; 271147072Sbrooks else if (!isascii(c) || !isxdigit(c)) { 272147072Sbrooks ungetc(c, cfile); 273147072Sbrooks ugflag = 1; 274147072Sbrooks break; 275147072Sbrooks } 276147072Sbrooks tokbuf[i] = c; 277147072Sbrooks } 278147072Sbrooks if (i == sizeof(tokbuf)) { 279147072Sbrooks parse_warn("numeric token larger than internal buffer"); 280147072Sbrooks i--; 281147072Sbrooks } 282147072Sbrooks tokbuf[i] = 0; 283147072Sbrooks tval = tokbuf; 284147072Sbrooks 285147072Sbrooks return (token); 286147072Sbrooks} 287147072Sbrooks 288147072Sbrooksstatic int 289147072Sbrooksread_num_or_name(int c, FILE *cfile) 290147072Sbrooks{ 291147072Sbrooks int i = 0; 292147072Sbrooks int rv = NUMBER_OR_NAME; 293147072Sbrooks 294147072Sbrooks tokbuf[i++] = c; 295147072Sbrooks for (; i < sizeof(tokbuf); i++) { 296147072Sbrooks c = get_char(cfile); 297147072Sbrooks if (!isascii(c) || (c != '-' && c != '_' && !isalnum(c))) { 298147072Sbrooks ungetc(c, cfile); 299147072Sbrooks ugflag = 1; 300147072Sbrooks break; 301147072Sbrooks } 302147072Sbrooks if (!isxdigit(c)) 303147072Sbrooks rv = NAME; 304147072Sbrooks tokbuf[i] = c; 305147072Sbrooks } 306147072Sbrooks if (i == sizeof(tokbuf)) { 307147072Sbrooks parse_warn("token larger than internal buffer"); 308147072Sbrooks i--; 309147072Sbrooks } 310147072Sbrooks tokbuf[i] = 0; 311147072Sbrooks tval = tokbuf; 312147072Sbrooks 313147072Sbrooks return (intern(tval, rv)); 314147072Sbrooks} 315147072Sbrooks 316147072Sbrooksstatic int 317147072Sbrooksintern(char *atom, int dfv) 318147072Sbrooks{ 319147072Sbrooks if (!isascii(atom[0])) 320147072Sbrooks return (dfv); 321147072Sbrooks 322147072Sbrooks switch (tolower(atom[0])) { 323147072Sbrooks case 'a': 324147072Sbrooks if (!strcasecmp(atom + 1, "lways-reply-rfc1048")) 325147072Sbrooks return (ALWAYS_REPLY_RFC1048); 326147072Sbrooks if (!strcasecmp(atom + 1, "ppend")) 327147072Sbrooks return (APPEND); 328147072Sbrooks if (!strcasecmp(atom + 1, "llow")) 329147072Sbrooks return (ALLOW); 330147072Sbrooks if (!strcasecmp(atom + 1, "lias")) 331147072Sbrooks return (ALIAS); 332147072Sbrooks if (!strcasecmp(atom + 1, "bandoned")) 333147072Sbrooks return (ABANDONED); 334147072Sbrooks if (!strcasecmp(atom + 1, "uthoritative")) 335147072Sbrooks return (AUTHORITATIVE); 336147072Sbrooks break; 337147072Sbrooks case 'b': 338147072Sbrooks if (!strcasecmp(atom + 1, "ackoff-cutoff")) 339147072Sbrooks return (BACKOFF_CUTOFF); 340147072Sbrooks if (!strcasecmp(atom + 1, "ootp")) 341147072Sbrooks return (BOOTP); 342147072Sbrooks if (!strcasecmp(atom + 1, "ooting")) 343147072Sbrooks return (BOOTING); 344147072Sbrooks if (!strcasecmp(atom + 1, "oot-unknown-clients")) 345147072Sbrooks return (BOOT_UNKNOWN_CLIENTS); 346147072Sbrooks case 'c': 347147072Sbrooks if (!strcasecmp(atom + 1, "lass")) 348147072Sbrooks return (CLASS); 349147072Sbrooks if (!strcasecmp(atom + 1, "iaddr")) 350147072Sbrooks return (CIADDR); 351147072Sbrooks if (!strcasecmp(atom + 1, "lient-identifier")) 352147072Sbrooks return (CLIENT_IDENTIFIER); 353147072Sbrooks if (!strcasecmp(atom + 1, "lient-hostname")) 354147072Sbrooks return (CLIENT_HOSTNAME); 355147072Sbrooks break; 356147072Sbrooks case 'd': 357147072Sbrooks if (!strcasecmp(atom + 1, "omain")) 358147072Sbrooks return (DOMAIN); 359147072Sbrooks if (!strcasecmp(atom + 1, "eny")) 360147072Sbrooks return (DENY); 361147072Sbrooks if (!strncasecmp(atom + 1, "efault", 6)) { 362147072Sbrooks if (!atom[7]) 363147072Sbrooks return (DEFAULT); 364147072Sbrooks if (!strcasecmp(atom + 7, "-lease-time")) 365147072Sbrooks return (DEFAULT_LEASE_TIME); 366147072Sbrooks break; 367147072Sbrooks } 368147072Sbrooks if (!strncasecmp(atom + 1, "ynamic-bootp", 12)) { 369147072Sbrooks if (!atom[13]) 370147072Sbrooks return (DYNAMIC_BOOTP); 371147072Sbrooks if (!strcasecmp(atom + 13, "-lease-cutoff")) 372147072Sbrooks return (DYNAMIC_BOOTP_LEASE_CUTOFF); 373147072Sbrooks if (!strcasecmp(atom + 13, "-lease-length")) 374147072Sbrooks return (DYNAMIC_BOOTP_LEASE_LENGTH); 375147072Sbrooks break; 376147072Sbrooks } 377147072Sbrooks break; 378147072Sbrooks case 'e': 379147072Sbrooks if (!strcasecmp(atom + 1, "thernet")) 380147072Sbrooks return (ETHERNET); 381147072Sbrooks if (!strcasecmp(atom + 1, "nds")) 382147072Sbrooks return (ENDS); 383147072Sbrooks if (!strcasecmp(atom + 1, "xpire")) 384147072Sbrooks return (EXPIRE); 385147072Sbrooks break; 386147072Sbrooks case 'f': 387147072Sbrooks if (!strcasecmp(atom + 1, "ilename")) 388147072Sbrooks return (FILENAME); 389147072Sbrooks if (!strcasecmp(atom + 1, "ixed-address")) 390147072Sbrooks return (FIXED_ADDR); 391147072Sbrooks if (!strcasecmp(atom + 1, "ddi")) 392147072Sbrooks return (FDDI); 393147072Sbrooks break; 394147072Sbrooks case 'g': 395147072Sbrooks if (!strcasecmp(atom + 1, "iaddr")) 396147072Sbrooks return (GIADDR); 397147072Sbrooks if (!strcasecmp(atom + 1, "roup")) 398147072Sbrooks return (GROUP); 399147072Sbrooks if (!strcasecmp(atom + 1, "et-lease-hostnames")) 400147072Sbrooks return (GET_LEASE_HOSTNAMES); 401147072Sbrooks break; 402147072Sbrooks case 'h': 403147072Sbrooks if (!strcasecmp(atom + 1, "ost")) 404147072Sbrooks return (HOST); 405147072Sbrooks if (!strcasecmp(atom + 1, "ardware")) 406147072Sbrooks return (HARDWARE); 407147072Sbrooks if (!strcasecmp(atom + 1, "ostname")) 408147072Sbrooks return (HOSTNAME); 409147072Sbrooks break; 410147072Sbrooks case 'i': 411147072Sbrooks if (!strcasecmp(atom + 1, "nitial-interval")) 412147072Sbrooks return (INITIAL_INTERVAL); 413147072Sbrooks if (!strcasecmp(atom + 1, "nterface")) 414147072Sbrooks return (INTERFACE); 415147072Sbrooks break; 416147072Sbrooks case 'l': 417147072Sbrooks if (!strcasecmp(atom + 1, "ease")) 418147072Sbrooks return (LEASE); 419147072Sbrooks break; 420147072Sbrooks case 'm': 421147072Sbrooks if (!strcasecmp(atom + 1, "ax-lease-time")) 422147072Sbrooks return (MAX_LEASE_TIME); 423147072Sbrooks if (!strncasecmp(atom + 1, "edi", 3)) { 424147072Sbrooks if (!strcasecmp(atom + 4, "a")) 425147072Sbrooks return (MEDIA); 426147072Sbrooks if (!strcasecmp(atom + 4, "um")) 427147072Sbrooks return (MEDIUM); 428147072Sbrooks break; 429147072Sbrooks } 430147072Sbrooks break; 431147072Sbrooks case 'n': 432147072Sbrooks if (!strcasecmp(atom + 1, "ameserver")) 433147072Sbrooks return (NAMESERVER); 434147072Sbrooks if (!strcasecmp(atom + 1, "etmask")) 435147072Sbrooks return (NETMASK); 436147072Sbrooks if (!strcasecmp(atom + 1, "ext-server")) 437147072Sbrooks return (NEXT_SERVER); 438147072Sbrooks if (!strcasecmp(atom + 1, "ot")) 439147072Sbrooks return (TOKEN_NOT); 440147072Sbrooks break; 441147072Sbrooks case 'o': 442147072Sbrooks if (!strcasecmp(atom + 1, "ption")) 443147072Sbrooks return (OPTION); 444147072Sbrooks if (!strcasecmp(atom + 1, "ne-lease-per-client")) 445147072Sbrooks return (ONE_LEASE_PER_CLIENT); 446147072Sbrooks break; 447147072Sbrooks case 'p': 448147072Sbrooks if (!strcasecmp(atom + 1, "repend")) 449147072Sbrooks return (PREPEND); 450147072Sbrooks if (!strcasecmp(atom + 1, "acket")) 451147072Sbrooks return (PACKET); 452147072Sbrooks break; 453147072Sbrooks case 'r': 454147072Sbrooks if (!strcasecmp(atom + 1, "ange")) 455147072Sbrooks return (RANGE); 456147072Sbrooks if (!strcasecmp(atom + 1, "equest")) 457147072Sbrooks return (REQUEST); 458147072Sbrooks if (!strcasecmp(atom + 1, "equire")) 459147072Sbrooks return (REQUIRE); 460147072Sbrooks if (!strcasecmp(atom + 1, "etry")) 461147072Sbrooks return (RETRY); 462147072Sbrooks if (!strcasecmp(atom + 1, "enew")) 463147072Sbrooks return (RENEW); 464147072Sbrooks if (!strcasecmp(atom + 1, "ebind")) 465147072Sbrooks return (REBIND); 466147072Sbrooks if (!strcasecmp(atom + 1, "eboot")) 467147072Sbrooks return (REBOOT); 468147072Sbrooks if (!strcasecmp(atom + 1, "eject")) 469147072Sbrooks return (REJECT); 470147072Sbrooks break; 471147072Sbrooks case 's': 472147072Sbrooks if (!strcasecmp(atom + 1, "earch")) 473147072Sbrooks return (SEARCH); 474147072Sbrooks if (!strcasecmp(atom + 1, "tarts")) 475147072Sbrooks return (STARTS); 476147072Sbrooks if (!strcasecmp(atom + 1, "iaddr")) 477147072Sbrooks return (SIADDR); 478147072Sbrooks if (!strcasecmp(atom + 1, "ubnet")) 479147072Sbrooks return (SUBNET); 480147072Sbrooks if (!strcasecmp(atom + 1, "hared-network")) 481147072Sbrooks return (SHARED_NETWORK); 482147072Sbrooks if (!strcasecmp(atom + 1, "erver-name")) 483147072Sbrooks return (SERVER_NAME); 484147072Sbrooks if (!strcasecmp(atom + 1, "erver-identifier")) 485147072Sbrooks return (SERVER_IDENTIFIER); 486147072Sbrooks if (!strcasecmp(atom + 1, "elect-timeout")) 487147072Sbrooks return (SELECT_TIMEOUT); 488147072Sbrooks if (!strcasecmp(atom + 1, "end")) 489147072Sbrooks return (SEND); 490147072Sbrooks if (!strcasecmp(atom + 1, "cript")) 491147072Sbrooks return (SCRIPT); 492147072Sbrooks if (!strcasecmp(atom + 1, "upersede")) 493147072Sbrooks return (SUPERSEDE); 494147072Sbrooks break; 495147072Sbrooks case 't': 496147072Sbrooks if (!strcasecmp(atom + 1, "imestamp")) 497147072Sbrooks return (TIMESTAMP); 498147072Sbrooks if (!strcasecmp(atom + 1, "imeout")) 499147072Sbrooks return (TIMEOUT); 500147072Sbrooks if (!strcasecmp(atom + 1, "oken-ring")) 501147072Sbrooks return (TOKEN_RING); 502147072Sbrooks break; 503147072Sbrooks case 'u': 504147072Sbrooks if (!strncasecmp(atom + 1, "se", 2)) { 505147072Sbrooks if (!strcasecmp(atom + 3, "r-class")) 506147072Sbrooks return (USER_CLASS); 507147072Sbrooks if (!strcasecmp(atom + 3, "-host-decl-names")) 508147072Sbrooks return (USE_HOST_DECL_NAMES); 509147072Sbrooks if (!strcasecmp(atom + 3, 510147072Sbrooks "-lease-addr-for-default-route")) 511147072Sbrooks return (USE_LEASE_ADDR_FOR_DEFAULT_ROUTE); 512147072Sbrooks break; 513147072Sbrooks } 514147072Sbrooks if (!strcasecmp(atom + 1, "id")) 515147072Sbrooks return (UID); 516147072Sbrooks if (!strcasecmp(atom + 1, "nknown-clients")) 517147072Sbrooks return (UNKNOWN_CLIENTS); 518147072Sbrooks break; 519147072Sbrooks case 'v': 520147072Sbrooks if (!strcasecmp(atom + 1, "endor-class")) 521147072Sbrooks return (VENDOR_CLASS); 522147072Sbrooks break; 523147072Sbrooks case 'y': 524147072Sbrooks if (!strcasecmp(atom + 1, "iaddr")) 525147072Sbrooks return (YIADDR); 526147072Sbrooks break; 527147072Sbrooks } 528147072Sbrooks return (dfv); 529147072Sbrooks} 530