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