xref: /freebsd/sbin/dhclient/conflex.c (revision 1d386b48a555f61cb7325543adbbb5c3f3407a66)
147c08596SBrooks Davis /*	$OpenBSD: conflex.c,v 1.7 2004/09/15 19:02:38 deraadt Exp $	*/
247c08596SBrooks Davis 
347c08596SBrooks Davis /* Lexical scanner for dhcpd config file... */
447c08596SBrooks Davis 
58a16b7a1SPedro F. Giffuni /*-
68a16b7a1SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
78a16b7a1SPedro F. Giffuni  *
847c08596SBrooks Davis  * Copyright (c) 1995, 1996, 1997 The Internet Software Consortium.
947c08596SBrooks Davis  * All rights reserved.
1047c08596SBrooks Davis  *
1147c08596SBrooks Davis  * Redistribution and use in source and binary forms, with or without
1247c08596SBrooks Davis  * modification, are permitted provided that the following conditions
1347c08596SBrooks Davis  * are met:
1447c08596SBrooks Davis  *
1547c08596SBrooks Davis  * 1. Redistributions of source code must retain the above copyright
1647c08596SBrooks Davis  *    notice, this list of conditions and the following disclaimer.
1747c08596SBrooks Davis  * 2. Redistributions in binary form must reproduce the above copyright
1847c08596SBrooks Davis  *    notice, this list of conditions and the following disclaimer in the
1947c08596SBrooks Davis  *    documentation and/or other materials provided with the distribution.
2047c08596SBrooks Davis  * 3. Neither the name of The Internet Software Consortium nor the names
2147c08596SBrooks Davis  *    of its contributors may be used to endorse or promote products derived
2247c08596SBrooks Davis  *    from this software without specific prior written permission.
2347c08596SBrooks Davis  *
2447c08596SBrooks Davis  * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
2547c08596SBrooks Davis  * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
2647c08596SBrooks Davis  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
2747c08596SBrooks Davis  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
2847c08596SBrooks Davis  * DISCLAIMED.  IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
2947c08596SBrooks Davis  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3047c08596SBrooks Davis  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3147c08596SBrooks Davis  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
3247c08596SBrooks Davis  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
3347c08596SBrooks Davis  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
3447c08596SBrooks Davis  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
3547c08596SBrooks Davis  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3647c08596SBrooks Davis  * SUCH DAMAGE.
3747c08596SBrooks Davis  *
3847c08596SBrooks Davis  * This software has been written for the Internet Software Consortium
3947c08596SBrooks Davis  * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
4047c08596SBrooks Davis  * Enterprises.  To learn more about the Internet Software Consortium,
4147c08596SBrooks Davis  * see ``http://www.vix.com/isc''.  To learn more about Vixie
4247c08596SBrooks Davis  * Enterprises, see ``http://www.vix.com''.
4347c08596SBrooks Davis  */
4447c08596SBrooks Davis 
458794fdbbSBrooks Davis #include <sys/cdefs.h>
4647c08596SBrooks Davis #include <ctype.h>
4747c08596SBrooks Davis 
4847c08596SBrooks Davis #include "dhcpd.h"
4947c08596SBrooks Davis #include "dhctoken.h"
5047c08596SBrooks Davis 
5147c08596SBrooks Davis int lexline;
5247c08596SBrooks Davis int lexchar;
5347c08596SBrooks Davis char *token_line;
5471c6c44dSEitan Adler static char *prev_line;
5571c6c44dSEitan Adler static char *cur_line;
5679a1d195SAlan Somers const char *tlname;
5747c08596SBrooks Davis int eol_token;
5847c08596SBrooks Davis 
5947c08596SBrooks Davis static char line1[81];
6047c08596SBrooks Davis static char line2[81];
61afe6f835SAlan Somers static unsigned lpos;
62afe6f835SAlan Somers static unsigned line;
6347c08596SBrooks Davis static int tlpos;
6447c08596SBrooks Davis static int tline;
6547c08596SBrooks Davis static int token;
6647c08596SBrooks Davis static int ugflag;
6747c08596SBrooks Davis static char *tval;
6847c08596SBrooks Davis static char tokbuf[1500];
6947c08596SBrooks Davis 
7047c08596SBrooks Davis static int get_char(FILE *);
7147c08596SBrooks Davis static int get_token(FILE *);
7247c08596SBrooks Davis static void skip_to_eol(FILE *);
7347c08596SBrooks Davis static int read_string(FILE *);
7447c08596SBrooks Davis static int read_number(int, FILE *);
7547c08596SBrooks Davis static int read_num_or_name(int, FILE *);
7647c08596SBrooks Davis static int intern(char *, int);
7747c08596SBrooks Davis 
7847c08596SBrooks Davis void
new_parse(const char * name)7979a1d195SAlan Somers new_parse(const char *name)
8047c08596SBrooks Davis {
8147c08596SBrooks Davis 	tlname = name;
8247c08596SBrooks Davis 	lpos = line = 1;
8347c08596SBrooks Davis 	cur_line = line1;
8447c08596SBrooks Davis 	prev_line = line2;
8547c08596SBrooks Davis 	token_line = cur_line;
8647c08596SBrooks Davis 	cur_line[0] = prev_line[0] = 0;
8747c08596SBrooks Davis 	warnings_occurred = 0;
8847c08596SBrooks Davis }
8947c08596SBrooks Davis 
9047c08596SBrooks Davis static int
get_char(FILE * cfile)9147c08596SBrooks Davis get_char(FILE *cfile)
9247c08596SBrooks Davis {
9347c08596SBrooks Davis 	int c = getc(cfile);
9447c08596SBrooks Davis 	if (!ugflag) {
9547c08596SBrooks Davis 		if (c == '\n') {
9647c08596SBrooks Davis 			if (cur_line == line1) {
9747c08596SBrooks Davis 				cur_line = line2;
9847c08596SBrooks Davis 				prev_line = line1;
9947c08596SBrooks Davis 			} else {
10032ceeb31SPedro F. Giffuni 				cur_line = line1;
10132ceeb31SPedro F. Giffuni 				prev_line = line2;
10247c08596SBrooks Davis 			}
10347c08596SBrooks Davis 			line++;
10447c08596SBrooks Davis 			lpos = 1;
10547c08596SBrooks Davis 			cur_line[0] = 0;
10647c08596SBrooks Davis 		} else if (c != EOF) {
1071469b42cSBrooks Davis 			if (lpos < sizeof(line1)) {
10847c08596SBrooks Davis 				cur_line[lpos - 1] = c;
10947c08596SBrooks Davis 				cur_line[lpos] = 0;
11047c08596SBrooks Davis 			}
11147c08596SBrooks Davis 			lpos++;
11247c08596SBrooks Davis 		}
11347c08596SBrooks Davis 	} else
11447c08596SBrooks Davis 		ugflag = 0;
11547c08596SBrooks Davis 	return (c);
11647c08596SBrooks Davis }
11747c08596SBrooks Davis 
11847c08596SBrooks Davis static int
get_token(FILE * cfile)11947c08596SBrooks Davis get_token(FILE *cfile)
12047c08596SBrooks Davis {
12147c08596SBrooks Davis 	int		c, ttok;
12247c08596SBrooks Davis 	static char	tb[2];
12347c08596SBrooks Davis 	int		l, p;
12447c08596SBrooks Davis 
12547c08596SBrooks Davis 	do {
12647c08596SBrooks Davis 		l = line;
12747c08596SBrooks Davis 		p = lpos;
12847c08596SBrooks Davis 
12947c08596SBrooks Davis 		c = get_char(cfile);
13047c08596SBrooks Davis 
13147c08596SBrooks Davis 		if (!(c == '\n' && eol_token) && isascii(c) && isspace(c))
13247c08596SBrooks Davis 			continue;
13347c08596SBrooks Davis 		if (c == '#') {
13447c08596SBrooks Davis 			skip_to_eol(cfile);
13547c08596SBrooks Davis 			continue;
13647c08596SBrooks Davis 		}
13747c08596SBrooks Davis 		if (c == '"') {
13847c08596SBrooks Davis 			lexline = l;
13947c08596SBrooks Davis 			lexchar = p;
14047c08596SBrooks Davis 			ttok = read_string(cfile);
14147c08596SBrooks Davis 			break;
14247c08596SBrooks Davis 		}
14347c08596SBrooks Davis 		if ((isascii(c) && isdigit(c)) || c == '-') {
14447c08596SBrooks Davis 			lexline = l;
14547c08596SBrooks Davis 			lexchar = p;
14647c08596SBrooks Davis 			ttok = read_number(c, cfile);
14747c08596SBrooks Davis 			break;
14847c08596SBrooks Davis 		} else if (isascii(c) && isalpha(c)) {
14947c08596SBrooks Davis 			lexline = l;
15047c08596SBrooks Davis 			lexchar = p;
15147c08596SBrooks Davis 			ttok = read_num_or_name(c, cfile);
15247c08596SBrooks Davis 			break;
15347c08596SBrooks Davis 		} else {
15447c08596SBrooks Davis 			lexline = l;
15547c08596SBrooks Davis 			lexchar = p;
15647c08596SBrooks Davis 			tb[0] = c;
15747c08596SBrooks Davis 			tb[1] = 0;
15847c08596SBrooks Davis 			tval = tb;
15947c08596SBrooks Davis 			ttok = c;
16047c08596SBrooks Davis 			break;
16147c08596SBrooks Davis 		}
16247c08596SBrooks Davis 	} while (1);
16347c08596SBrooks Davis 	return (ttok);
16447c08596SBrooks Davis }
16547c08596SBrooks Davis 
16647c08596SBrooks Davis int
next_token(char ** rval,FILE * cfile)16747c08596SBrooks Davis next_token(char **rval, FILE *cfile)
16847c08596SBrooks Davis {
16947c08596SBrooks Davis 	int	rv;
17047c08596SBrooks Davis 
17147c08596SBrooks Davis 	if (token) {
17247c08596SBrooks Davis 		if (lexline != tline)
17347c08596SBrooks Davis 			token_line = cur_line;
17447c08596SBrooks Davis 		lexchar = tlpos;
17547c08596SBrooks Davis 		lexline = tline;
17647c08596SBrooks Davis 		rv = token;
17747c08596SBrooks Davis 		token = 0;
17847c08596SBrooks Davis 	} else {
17947c08596SBrooks Davis 		rv = get_token(cfile);
18047c08596SBrooks Davis 		token_line = cur_line;
18147c08596SBrooks Davis 	}
18247c08596SBrooks Davis 	if (rval)
18347c08596SBrooks Davis 		*rval = tval;
18447c08596SBrooks Davis 
18547c08596SBrooks Davis 	return (rv);
18647c08596SBrooks Davis }
18747c08596SBrooks Davis 
18847c08596SBrooks Davis int
peek_token(char ** rval,FILE * cfile)18947c08596SBrooks Davis peek_token(char **rval, FILE *cfile)
19047c08596SBrooks Davis {
19147c08596SBrooks Davis 	int	x;
19247c08596SBrooks Davis 
19347c08596SBrooks Davis 	if (!token) {
19447c08596SBrooks Davis 		tlpos = lexchar;
19547c08596SBrooks Davis 		tline = lexline;
19647c08596SBrooks Davis 		token = get_token(cfile);
19747c08596SBrooks Davis 		if (lexline != tline)
19847c08596SBrooks Davis 			token_line = prev_line;
19947c08596SBrooks Davis 		x = lexchar;
20047c08596SBrooks Davis 		lexchar = tlpos;
20147c08596SBrooks Davis 		tlpos = x;
20247c08596SBrooks Davis 		x = lexline;
20347c08596SBrooks Davis 		lexline = tline;
20447c08596SBrooks Davis 		tline = x;
20547c08596SBrooks Davis 	}
20647c08596SBrooks Davis 	if (rval)
20747c08596SBrooks Davis 		*rval = tval;
20847c08596SBrooks Davis 
20947c08596SBrooks Davis 	return (token);
21047c08596SBrooks Davis }
21147c08596SBrooks Davis 
21247c08596SBrooks Davis static void
skip_to_eol(FILE * cfile)21347c08596SBrooks Davis skip_to_eol(FILE *cfile)
21447c08596SBrooks Davis {
21547c08596SBrooks Davis 	int	c;
21647c08596SBrooks Davis 
21747c08596SBrooks Davis 	do {
21847c08596SBrooks Davis 		c = get_char(cfile);
21947c08596SBrooks Davis 		if (c == EOF)
22047c08596SBrooks Davis 			return;
22147c08596SBrooks Davis 		if (c == '\n')
22247c08596SBrooks Davis 			return;
22347c08596SBrooks Davis 	} while (1);
22447c08596SBrooks Davis }
22547c08596SBrooks Davis 
22647c08596SBrooks Davis static int
read_string(FILE * cfile)22747c08596SBrooks Davis read_string(FILE *cfile)
22847c08596SBrooks Davis {
229afe6f835SAlan Somers 	int	c, bs = 0;
230afe6f835SAlan Somers 	unsigned i;
23147c08596SBrooks Davis 
23247c08596SBrooks Davis 	for (i = 0; i < sizeof(tokbuf); i++) {
23347c08596SBrooks Davis 		c = get_char(cfile);
23447c08596SBrooks Davis 		if (c == EOF) {
23547c08596SBrooks Davis 			parse_warn("eof in string constant");
23647c08596SBrooks Davis 			break;
23747c08596SBrooks Davis 		}
23847c08596SBrooks Davis 		if (bs) {
23947c08596SBrooks Davis 			bs = 0;
240753d6c03SBrooks Davis 			i--;
24147c08596SBrooks Davis 			tokbuf[i] = c;
24247c08596SBrooks Davis 		} else if (c == '\\')
24347c08596SBrooks Davis 			bs = 1;
24447c08596SBrooks Davis 		else if (c == '"')
24547c08596SBrooks Davis 			break;
24647c08596SBrooks Davis 		else
24747c08596SBrooks Davis 			tokbuf[i] = c;
24847c08596SBrooks Davis 	}
24947c08596SBrooks Davis 	/*
25047c08596SBrooks Davis 	 * Normally, I'd feel guilty about this, but we're talking about
25147c08596SBrooks Davis 	 * strings that'll fit in a DHCP packet here...
25247c08596SBrooks Davis 	 */
25347c08596SBrooks Davis 	if (i == sizeof(tokbuf)) {
25447c08596SBrooks Davis 		parse_warn("string constant larger than internal buffer");
25547c08596SBrooks Davis 		i--;
25647c08596SBrooks Davis 	}
25747c08596SBrooks Davis 	tokbuf[i] = 0;
25847c08596SBrooks Davis 	tval = tokbuf;
25947c08596SBrooks Davis 	return (STRING);
26047c08596SBrooks Davis }
26147c08596SBrooks Davis 
26247c08596SBrooks Davis static int
read_number(int c,FILE * cfile)26347c08596SBrooks Davis read_number(int c, FILE *cfile)
26447c08596SBrooks Davis {
26579a1d195SAlan Somers 	int	seenx = 0, _token = NUMBER;
266afe6f835SAlan Somers 	unsigned i = 0;
26747c08596SBrooks Davis 
26847c08596SBrooks Davis 	tokbuf[i++] = c;
26947c08596SBrooks Davis 	for (; i < sizeof(tokbuf); i++) {
27047c08596SBrooks Davis 		c = get_char(cfile);
27147c08596SBrooks Davis 		if (!seenx && c == 'x')
27247c08596SBrooks Davis 			seenx = 1;
27347c08596SBrooks Davis 		else if (!isascii(c) || !isxdigit(c)) {
27447c08596SBrooks Davis 			ungetc(c, cfile);
27547c08596SBrooks Davis 			ugflag = 1;
27647c08596SBrooks Davis 			break;
27747c08596SBrooks Davis 		}
27847c08596SBrooks Davis 		tokbuf[i] = c;
27947c08596SBrooks Davis 	}
28047c08596SBrooks Davis 	if (i == sizeof(tokbuf)) {
28147c08596SBrooks Davis 		parse_warn("numeric token larger than internal buffer");
28247c08596SBrooks Davis 		i--;
28347c08596SBrooks Davis 	}
28447c08596SBrooks Davis 	tokbuf[i] = 0;
28547c08596SBrooks Davis 	tval = tokbuf;
28647c08596SBrooks Davis 
28779a1d195SAlan Somers 	return (_token);
28847c08596SBrooks Davis }
28947c08596SBrooks Davis 
29047c08596SBrooks Davis static int
read_num_or_name(int c,FILE * cfile)29147c08596SBrooks Davis read_num_or_name(int c, FILE *cfile)
29247c08596SBrooks Davis {
293afe6f835SAlan Somers 	unsigned i = 0;
29447c08596SBrooks Davis 	int	rv = NUMBER_OR_NAME;
29547c08596SBrooks Davis 
29647c08596SBrooks Davis 	tokbuf[i++] = c;
29747c08596SBrooks Davis 	for (; i < sizeof(tokbuf); i++) {
29847c08596SBrooks Davis 		c = get_char(cfile);
29947c08596SBrooks Davis 		if (!isascii(c) || (c != '-' && c != '_' && !isalnum(c))) {
30047c08596SBrooks Davis 			ungetc(c, cfile);
30147c08596SBrooks Davis 			ugflag = 1;
30247c08596SBrooks Davis 			break;
30347c08596SBrooks Davis 		}
30447c08596SBrooks Davis 		if (!isxdigit(c))
30547c08596SBrooks Davis 			rv = NAME;
30647c08596SBrooks Davis 		tokbuf[i] = c;
30747c08596SBrooks Davis 	}
30847c08596SBrooks Davis 	if (i == sizeof(tokbuf)) {
30947c08596SBrooks Davis 		parse_warn("token larger than internal buffer");
31047c08596SBrooks Davis 		i--;
31147c08596SBrooks Davis 	}
31247c08596SBrooks Davis 	tokbuf[i] = 0;
31347c08596SBrooks Davis 	tval = tokbuf;
31447c08596SBrooks Davis 
31547c08596SBrooks Davis 	return (intern(tval, rv));
31647c08596SBrooks Davis }
31747c08596SBrooks Davis 
31847c08596SBrooks Davis static int
intern(char * atom,int dfv)31947c08596SBrooks Davis intern(char *atom, int dfv)
32047c08596SBrooks Davis {
32147c08596SBrooks Davis 	if (!isascii(atom[0]))
32247c08596SBrooks Davis 		return (dfv);
32347c08596SBrooks Davis 
32447c08596SBrooks Davis 	switch (tolower(atom[0])) {
32547c08596SBrooks Davis 	case 'a':
32647c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "lways-reply-rfc1048"))
32747c08596SBrooks Davis 			return (ALWAYS_REPLY_RFC1048);
32847c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "ppend"))
32947c08596SBrooks Davis 			return (APPEND);
33047c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "llow"))
33147c08596SBrooks Davis 			return (ALLOW);
33247c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "lias"))
33347c08596SBrooks Davis 			return (ALIAS);
33447c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "bandoned"))
33547c08596SBrooks Davis 			return (ABANDONED);
33647c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "uthoritative"))
33747c08596SBrooks Davis 			return (AUTHORITATIVE);
33847c08596SBrooks Davis 		break;
33947c08596SBrooks Davis 	case 'b':
34047c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "ackoff-cutoff"))
34147c08596SBrooks Davis 			return (BACKOFF_CUTOFF);
34247c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "ootp"))
34347c08596SBrooks Davis 			return (BOOTP);
34447c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "ooting"))
34547c08596SBrooks Davis 			return (BOOTING);
34647c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "oot-unknown-clients"))
34747c08596SBrooks Davis 			return (BOOT_UNKNOWN_CLIENTS);
34871c6c44dSEitan Adler 		break;
34947c08596SBrooks Davis 	case 'c':
35047c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "lass"))
35147c08596SBrooks Davis 			return (CLASS);
35247c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "iaddr"))
35347c08596SBrooks Davis 			return (CIADDR);
35447c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "lient-identifier"))
35547c08596SBrooks Davis 			return (CLIENT_IDENTIFIER);
35647c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "lient-hostname"))
35747c08596SBrooks Davis 			return (CLIENT_HOSTNAME);
35847c08596SBrooks Davis 		break;
35947c08596SBrooks Davis 	case 'd':
36047c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "omain"))
36147c08596SBrooks Davis 			return (DOMAIN);
36247c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "eny"))
36347c08596SBrooks Davis 			return (DENY);
36447c08596SBrooks Davis 		if (!strncasecmp(atom + 1, "efault", 6)) {
36547c08596SBrooks Davis 			if (!atom[7])
36647c08596SBrooks Davis 				return (DEFAULT);
36747c08596SBrooks Davis 			if (!strcasecmp(atom + 7, "-lease-time"))
36847c08596SBrooks Davis 				return (DEFAULT_LEASE_TIME);
36947c08596SBrooks Davis 			break;
37047c08596SBrooks Davis 		}
37147c08596SBrooks Davis 		if (!strncasecmp(atom + 1, "ynamic-bootp", 12)) {
37247c08596SBrooks Davis 			if (!atom[13])
37347c08596SBrooks Davis 				return (DYNAMIC_BOOTP);
37447c08596SBrooks Davis 			if (!strcasecmp(atom + 13, "-lease-cutoff"))
37547c08596SBrooks Davis 				return (DYNAMIC_BOOTP_LEASE_CUTOFF);
37647c08596SBrooks Davis 			if (!strcasecmp(atom + 13, "-lease-length"))
37747c08596SBrooks Davis 				return (DYNAMIC_BOOTP_LEASE_LENGTH);
37847c08596SBrooks Davis 			break;
37947c08596SBrooks Davis 		}
38047c08596SBrooks Davis 		break;
38147c08596SBrooks Davis 	case 'e':
38247c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "thernet"))
38347c08596SBrooks Davis 			return (ETHERNET);
38447c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "nds"))
38547c08596SBrooks Davis 			return (ENDS);
38647c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "xpire"))
38747c08596SBrooks Davis 			return (EXPIRE);
38847c08596SBrooks Davis 		break;
38947c08596SBrooks Davis 	case 'f':
39047c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "ilename"))
39147c08596SBrooks Davis 			return (FILENAME);
39247c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "ixed-address"))
39347c08596SBrooks Davis 			return (FIXED_ADDR);
39447c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "ddi"))
39547c08596SBrooks Davis 			return (FDDI);
39647c08596SBrooks Davis 		break;
39747c08596SBrooks Davis 	case 'g':
39847c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "iaddr"))
39947c08596SBrooks Davis 			return (GIADDR);
40047c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "roup"))
40147c08596SBrooks Davis 			return (GROUP);
40247c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "et-lease-hostnames"))
40347c08596SBrooks Davis 			return (GET_LEASE_HOSTNAMES);
40447c08596SBrooks Davis 		break;
40547c08596SBrooks Davis 	case 'h':
40647c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "ost"))
40747c08596SBrooks Davis 			return (HOST);
40847c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "ardware"))
40947c08596SBrooks Davis 			return (HARDWARE);
41047c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "ostname"))
41147c08596SBrooks Davis 			return (HOSTNAME);
41247c08596SBrooks Davis 		break;
41347c08596SBrooks Davis 	case 'i':
414*461ccb55SRob Norris 		if (!strcasecmp(atom + 1, "gnore"))
415*461ccb55SRob Norris 			return (IGNORE);
41647c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "nitial-interval"))
41747c08596SBrooks Davis 			return (INITIAL_INTERVAL);
41847c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "nterface"))
41947c08596SBrooks Davis 			return (INTERFACE);
42047c08596SBrooks Davis 		break;
42147c08596SBrooks Davis 	case 'l':
42247c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "ease"))
42347c08596SBrooks Davis 			return (LEASE);
42447c08596SBrooks Davis 		break;
42547c08596SBrooks Davis 	case 'm':
42647c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "ax-lease-time"))
42747c08596SBrooks Davis 			return (MAX_LEASE_TIME);
42847c08596SBrooks Davis 		if (!strncasecmp(atom + 1, "edi", 3)) {
42947c08596SBrooks Davis 			if (!strcasecmp(atom + 4, "a"))
43047c08596SBrooks Davis 				return (MEDIA);
43147c08596SBrooks Davis 			if (!strcasecmp(atom + 4, "um"))
43247c08596SBrooks Davis 				return (MEDIUM);
43347c08596SBrooks Davis 			break;
43447c08596SBrooks Davis 		}
43547c08596SBrooks Davis 		break;
43647c08596SBrooks Davis 	case 'n':
43747c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "ameserver"))
43847c08596SBrooks Davis 			return (NAMESERVER);
43947c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "etmask"))
44047c08596SBrooks Davis 			return (NETMASK);
44147c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "ext-server"))
44247c08596SBrooks Davis 			return (NEXT_SERVER);
44347c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "ot"))
44447c08596SBrooks Davis 			return (TOKEN_NOT);
44547c08596SBrooks Davis 		break;
44647c08596SBrooks Davis 	case 'o':
44747c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "ption"))
44847c08596SBrooks Davis 			return (OPTION);
44947c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "ne-lease-per-client"))
45047c08596SBrooks Davis 			return (ONE_LEASE_PER_CLIENT);
45147c08596SBrooks Davis 		break;
45247c08596SBrooks Davis 	case 'p':
45347c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "repend"))
45447c08596SBrooks Davis 			return (PREPEND);
45547c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "acket"))
45647c08596SBrooks Davis 			return (PACKET);
45747c08596SBrooks Davis 		break;
45847c08596SBrooks Davis 	case 'r':
45947c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "ange"))
46047c08596SBrooks Davis 			return (RANGE);
46147c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "equest"))
46247c08596SBrooks Davis 			return (REQUEST);
46347c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "equire"))
46447c08596SBrooks Davis 			return (REQUIRE);
46547c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "etry"))
46647c08596SBrooks Davis 			return (RETRY);
46747c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "enew"))
46847c08596SBrooks Davis 			return (RENEW);
46947c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "ebind"))
47047c08596SBrooks Davis 			return (REBIND);
47147c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "eboot"))
47247c08596SBrooks Davis 			return (REBOOT);
47347c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "eject"))
47447c08596SBrooks Davis 			return (REJECT);
47547c08596SBrooks Davis 		break;
47647c08596SBrooks Davis 	case 's':
47747c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "earch"))
47847c08596SBrooks Davis 			return (SEARCH);
47947c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "tarts"))
48047c08596SBrooks Davis 			return (STARTS);
48147c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "iaddr"))
48247c08596SBrooks Davis 			return (SIADDR);
48347c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "ubnet"))
48447c08596SBrooks Davis 			return (SUBNET);
48547c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "hared-network"))
48647c08596SBrooks Davis 			return (SHARED_NETWORK);
48747c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "erver-name"))
48847c08596SBrooks Davis 			return (SERVER_NAME);
48947c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "erver-identifier"))
49047c08596SBrooks Davis 			return (SERVER_IDENTIFIER);
49147c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "elect-timeout"))
49247c08596SBrooks Davis 			return (SELECT_TIMEOUT);
49347c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "end"))
49447c08596SBrooks Davis 			return (SEND);
49547c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "cript"))
49647c08596SBrooks Davis 			return (SCRIPT);
49747c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "upersede"))
49847c08596SBrooks Davis 			return (SUPERSEDE);
49947c08596SBrooks Davis 		break;
50047c08596SBrooks Davis 	case 't':
50147c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "imestamp"))
50247c08596SBrooks Davis 			return (TIMESTAMP);
50347c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "imeout"))
50447c08596SBrooks Davis 			return (TIMEOUT);
50547c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "oken-ring"))
50647c08596SBrooks Davis 			return (TOKEN_RING);
50747c08596SBrooks Davis 		break;
50847c08596SBrooks Davis 	case 'u':
50947c08596SBrooks Davis 		if (!strncasecmp(atom + 1, "se", 2)) {
51047c08596SBrooks Davis 			if (!strcasecmp(atom + 3, "r-class"))
51147c08596SBrooks Davis 				return (USER_CLASS);
51247c08596SBrooks Davis 			if (!strcasecmp(atom + 3, "-host-decl-names"))
51347c08596SBrooks Davis 				return (USE_HOST_DECL_NAMES);
51447c08596SBrooks Davis 			if (!strcasecmp(atom + 3,
51547c08596SBrooks Davis 					 "-lease-addr-for-default-route"))
51647c08596SBrooks Davis 				return (USE_LEASE_ADDR_FOR_DEFAULT_ROUTE);
51747c08596SBrooks Davis 			break;
51847c08596SBrooks Davis 		}
51947c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "id"))
52047c08596SBrooks Davis 			return (UID);
52147c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "nknown-clients"))
52247c08596SBrooks Davis 			return (UNKNOWN_CLIENTS);
52347c08596SBrooks Davis 		break;
52447c08596SBrooks Davis 	case 'v':
52547c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "endor-class"))
52647c08596SBrooks Davis 			return (VENDOR_CLASS);
5271e7fe2fbSLuiz Otavio O Souza 		if (!strcasecmp(atom + 1, "lan-pcp"))
5281e7fe2fbSLuiz Otavio O Souza 			return (VLAN_PCP);
52947c08596SBrooks Davis 		break;
53047c08596SBrooks Davis 	case 'y':
53147c08596SBrooks Davis 		if (!strcasecmp(atom + 1, "iaddr"))
53247c08596SBrooks Davis 			return (YIADDR);
53347c08596SBrooks Davis 		break;
53447c08596SBrooks Davis 	}
53547c08596SBrooks Davis 	return (dfv);
53647c08596SBrooks Davis }
537