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