Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
ISC Open Source Projects
dhcp
Commits
9fb2fb28
Commit
9fb2fb28
authored
Jan 05, 2000
by
Ted Lemon
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
- Support new DNS functions and parse old DNS syntax into new functions.
- New struct hardware support.
parent
f7c83eb4
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
219 additions
and
41 deletions
+219
-41
common/parse.c
common/parse.c
+219
-41
No files found.
common/parse.c
View file @
9fb2fb28
...
...
@@ -22,7 +22,7 @@
#ifndef lint
static
char
copyright
[]
=
"$Id: parse.c,v 1.5
6 1999/11/20 18:36:0
9 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.
\n
"
;
"$Id: parse.c,v 1.5
7 2000/01/05 18:03:4
9 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.
\n
"
;
#endif
/* not lint */
#include "dhcpd.h"
...
...
@@ -261,13 +261,13 @@ void parse_hardware_param (cfile, hardware)
token
=
next_token
(
&
val
,
cfile
);
switch
(
token
)
{
case
ETHERNET
:
hardware
->
h
type
=
HTYPE_ETHER
;
hardware
->
h
buf
[
0
]
=
HTYPE_ETHER
;
break
;
case
TOKEN_RING
:
hardware
->
h
type
=
HTYPE_IEEE802
;
hardware
->
h
buf
[
0
]
=
HTYPE_IEEE802
;
break
;
case
FDDI
:
hardware
->
h
type
=
HTYPE_FDDI
;
hardware
->
h
buf
[
0
]
=
HTYPE_FDDI
;
break
;
default:
parse_warn
(
cfile
,
"expecting a network hardware type"
);
...
...
@@ -287,16 +287,15 @@ void parse_hardware_param (cfile, hardware)
COLON
,
16
,
8
);
if
(
!
t
)
return
;
if
(
hlen
>
sizeof
hardware
->
h
addr
)
{
if
(
hlen
+
1
>
sizeof
hardware
->
h
buf
)
{
free
(
t
);
parse_warn
(
cfile
,
"hardware address too long"
);
}
else
{
hardware
->
hlen
=
hlen
;
memcpy
((
unsigned
char
*
)
&
hardware
->
haddr
[
0
],
t
,
hardware
->
hlen
);
if
(
hlen
<
sizeof
hardware
->
haddr
)
memset
(
&
hardware
->
haddr
[
hlen
],
0
,
(
sizeof
hardware
->
haddr
)
-
hlen
);
hardware
->
hlen
=
hlen
+
1
;
memcpy
((
unsigned
char
*
)
&
hardware
->
hbuf
[
1
],
t
,
hlen
);
if
(
hlen
+
1
<
sizeof
hardware
->
hbuf
)
memset
(
&
hardware
->
hbuf
[
hlen
+
1
],
0
,
(
sizeof
hardware
->
hbuf
)
-
hlen
-
1
);
free
(
t
);
}
...
...
@@ -1628,6 +1627,38 @@ int parse_numeric_expression (expr, cfile, lose)
return
1
;
}
/*
* dns-expression :==
* UPDATE LPAREN ns-class COMMA ns-type COMMA data-expression COMMA
* data-expression COMMA numeric-expression RPAREN
* DELETE LPAREN ns-class COMMA ns-type COMMA data-expression COMMA
* data-expression RPAREN
* EXISTS LPAREN ns-class COMMA ns-type COMMA data-expression COMMA
* data-expression RPAREN
* NOT EXISTS LPAREN ns-class COMMA ns-type COMMA data-expression COMMA
* data-expression RPAREN
* ns-class :== IN | CHAOS | HS | NUMBER
* ns-type :== A | PTR | MX | TXT | NUMBER
*/
int
parse_dns_expression
(
expr
,
cfile
,
lose
)
struct
expression
**
expr
;
struct
parse
*
cfile
;
int
*
lose
;
{
/* Parse an expression... */
if
(
!
parse_expression
(
expr
,
cfile
,
lose
,
context_dns
,
(
struct
expression
**
)
0
,
expr_none
))
return
0
;
if
(
!
is_dns_expression
(
*
expr
))
{
parse_warn
(
cfile
,
"Expecting a dns update subexpression."
);
*
lose
=
1
;
return
0
;
}
return
1
;
}
/* Parse a subexpression that does not contain a binary operator. */
int
parse_non_binary
(
expr
,
cfile
,
lose
,
context
)
...
...
@@ -1642,6 +1673,7 @@ int parse_non_binary (expr, cfile, lose, context)
struct
option
*
option
;
struct
expression
*
nexp
;
int
known
;
enum
expr_op
opcode
;
token
=
peek_token
(
&
val
,
cfile
);
...
...
@@ -1672,6 +1704,10 @@ int parse_non_binary (expr, cfile, lose, context)
case
TOKEN_NOT
:
token
=
next_token
(
&
val
,
cfile
);
if
(
context
==
context_dns
)
{
token
=
peek_token
(
&
val
,
cfile
);
goto
not_exists
;
}
if
(
!
expression_allocate
(
expr
,
"parse_expression: NOT"
))
log_fatal
(
"can't allocate expression"
);
(
*
expr
)
->
op
=
expr_not
;
...
...
@@ -1688,6 +1724,8 @@ int parse_non_binary (expr, cfile, lose, context)
break
;
case
EXISTS
:
if
(
context
==
context_dns
)
goto
ns_exists
;
token
=
next_token
(
&
val
,
cfile
);
if
(
!
expression_allocate
(
expr
,
"parse_expression: EXISTS"
))
log_fatal
(
"can't allocate expression"
);
...
...
@@ -1962,37 +2000,72 @@ int parse_non_binary (expr, cfile, lose, context)
goto
norparen
;
break
;
/* dns-update and dns-delete are present for historical
purposes, but are deprecated in favor of ns-update
in combination with update, delete, exists and not
exists. */
case
DNS_UPDATE
:
case
DNS_DELETE
:
#if !defined (NSUPDATE)
parse_warn
(
cfile
,
"Please rebuild dhcpd with --with-nsupdate."
);
#endif
if
(
token
==
DNS_UPDATE
)
opcode
=
expr_ns_update
;
else
opcode
=
expr_ns_delete
;
token
=
next_token
(
&
val
,
cfile
);
if
(
!
expression_allocate
(
expr
,
"parse_expression: DNS_UPDATE"
))
log_fatal
(
"can't allocate expression"
);
(
*
expr
)
->
op
=
expr_dns_
update
;
(
*
expr
)
->
op
=
expr_dns_
transaction
;
token
=
next_token
(
&
val
,
cfile
);
if
(
token
!=
LPAREN
)
goto
nolparen
;
if
(
!
(
parse_data_expression
(
&
(
*
expr
)
->
data
.
dns_update
.
type
,
cfile
,
lose
)))
{
expression_dereference
(
expr
,
"parse_expression: noRRtype"
);
parse_warn
(
cfile
,
"expecting DNS RR type."
);
nexp
=
(
struct
expression
*
)
0
;
if
(
!
expression_allocate
(
&
nexp
,
"parse_expression: DNS_UPDATE1"
))
log_fatal
(
"can't allocate expression"
);
nexp
->
op
=
opcode
;
(
*
expr
)
->
data
.
dns_transaction
.
car
=
nexp
;
token
=
next_token
(
&
val
,
cfile
);
if
(
token
!=
STRING
)
{
parse_warn
(
cfile
,
"parse_expression: expecting string."
);
badnsupdate:
expression_dereference
(
expr
,
"parse_expression"
);
skip_to_semi
(
cfile
);
*
lose
=
1
;
return
0
;
}
if
(
!
strcasecmp
(
val
,
"a"
))
nexp
->
data
.
ns_update
.
rrtype
=
T_A
;
else
if
(
!
strcasecmp
(
val
,
"ptr"
))
nexp
->
data
.
ns_update
.
rrtype
=
T_PTR
;
else
if
(
!
strcasecmp
(
val
,
"mx"
))
nexp
->
data
.
ns_update
.
rrtype
=
T_MX
;
else
if
(
!
strcasecmp
(
val
,
"cname"
))
nexp
->
data
.
ns_update
.
rrtype
=
T_CNAME
;
else
if
(
!
strcasecmp
(
val
,
"TXT"
))
nexp
->
data
.
ns_update
.
rrtype
=
T_TXT
;
else
{
parse_warn
(
cfile
,
"unexpected rrtype: %s"
,
val
);
goto
badnsupdate
;
}
nexp
->
data
.
ns_update
.
rrclass
=
C_IN
;
token
=
next_token
(
&
val
,
cfile
);
if
(
token
!=
COMMA
)
goto
nocomma
;
if
(
!
(
parse_data_expression
(
&
(
*
exp
r
)
->
data
.
d
ns_update
.
rrname
,
cfile
,
lose
)))
(
&
n
exp
->
data
.
ns_update
.
rrname
,
cfile
,
lose
)))
goto
nodata
;
token
=
next_token
(
&
val
,
cfile
);
...
...
@@ -2000,21 +2073,20 @@ int parse_non_binary (expr, cfile, lose, context)
goto
nocomma
;
if
(
!
(
parse_data_expression
(
&
(
*
exp
r
)
->
data
.
d
ns_update
.
rrdata
,
cfile
,
lose
)))
(
&
n
exp
->
data
.
ns_update
.
rrdata
,
cfile
,
lose
)))
goto
nodata
;
token
=
next_token
(
&
val
,
cfile
);
if
(
token
!=
COMMA
)
goto
nocomma
;
if
(
!
(
parse_numeric_expression
(
&
(
*
expr
)
->
data
.
dns_update
.
ttl
,
cfile
,
lose
)))
{
expression_dereference
(
expr
,
"parse_expression: nottl"
);
parse_warn
(
cfile
,
"expecting data expression."
);
skip_to_semi
(
cfile
);
*
lose
=
1
;
return
0
;
if
(
opcode
==
expr_ns_update
)
{
token
=
next_token
(
&
val
,
cfile
);
if
(
token
!=
COMMA
)
goto
nocomma
;
if
(
!
(
parse_numeric_expression
(
&
nexp
->
data
.
ns_update
.
ttl
,
cfile
,
lose
)))
{
parse_warn
(
cfile
,
"expecting data expression."
);
goto
badnsupdate
;
}
}
token
=
next_token
(
&
val
,
cfile
);
...
...
@@ -2022,37 +2094,130 @@ int parse_non_binary (expr, cfile, lose, context)
goto
norparen
;
break
;
case
D
NS_
DELE
TE
:
case
NS_
UPDA
TE
:
#if !defined (NSUPDATE)
parse_warn
(
cfile
,
"Please rebuild dhcpd with --with-nsupdate."
);
#endif
token
=
next_token
(
&
val
,
cfile
);
if
(
!
expression_allocate
(
expr
,
"parse_expression:
D
NS_
DELE
TE"
))
"parse_expression: NS_
UPDA
TE"
))
log_fatal
(
"can't allocate expression"
);
(
*
expr
)
->
op
=
expr_dns_delete
;
token
=
next_token
(
&
val
,
cfile
);
if
(
token
!=
LPAREN
)
goto
nolparen
;
if
(
!
(
parse_data_expression
(
&
(
*
expr
)
->
data
.
dns_update
.
type
,
cfile
,
lose
)))
{
expression_dereference
(
expr
,
"parse_expression: noRRtype"
);
parse_warn
(
cfile
,
"expecting DNS RR type."
);
nexp
=
*
expr
;
do
{
nexp
->
op
=
expr_dns_transaction
;
if
(
!
(
parse_dns_expression
(
&
nexp
->
data
.
dns_transaction
.
car
,
cfile
,
lose
)))
{
badnstrans:
expression_dereference
(
expr
,
"parse_expression"
);
*
lose
=
1
;
return
0
;
}
token
=
next_token
(
&
val
,
cfile
);
if
(
token
==
COMMA
)
{
if
(
!
(
expression_allocate
(
&
nexp
->
data
.
dns_transaction
.
cdr
,
"parse_expression"
)))
log_fatal
(
"can't allocate expression"
);
nexp
=
nexp
->
data
.
dns_transaction
.
cdr
;
}
}
while
(
token
==
COMMA
);
if
(
token
!=
RPAREN
)
goto
norparen
;
break
;
/* NOT EXISTS is special cased above... */
not_exists:
token
=
next_token
(
&
val
,
cfile
);
opcode
=
expr_ns_not_exists
;
goto
nsupdatecode
;
case
UPDATE
:
opcode
=
expr_ns_update
;
goto
nsupdatecode
;
case
TOKEN_DELETE
:
opcode
=
expr_ns_delete
;
goto
nsupdatecode
;
ns_exists:
opcode
=
expr_ns_exists
;
nsupdatecode:
token
=
next_token
(
&
val
,
cfile
);
#if !defined (NSUPDATE)
parse_warn
(
cfile
,
"Please rebuild dhcpd with --with-nsupdate."
);
#endif
if
(
!
expression_allocate
(
expr
,
"parse_expression"
))
log_fatal
(
"can't allocate expression"
);
(
*
expr
)
->
op
=
opcode
;
token
=
next_token
(
&
val
,
cfile
);
if
(
token
!=
LPAREN
)
goto
nolparen
;
token
=
next_token
(
&
val
,
cfile
);
if
(
!
is_identifier
(
token
)
&&
token
!=
NUMBER
)
{
parse_warn
(
cfile
,
"expecting identifier or number."
);
badnsop:
expression_dereference
(
expr
,
"parse_expression"
);
skip_to_semi
(
cfile
);
*
lose
=
1
;
return
0
;
}
if
(
token
==
NUMBER
)
(
*
expr
)
->
data
.
ns_update
.
rrclass
=
atoi
(
val
);
else
if
(
!
strcasecmp
(
val
,
"in"
))
(
*
expr
)
->
data
.
ns_update
.
rrclass
=
C_IN
;
else
if
(
!
strcasecmp
(
val
,
"chaos"
))
(
*
expr
)
->
data
.
ns_update
.
rrclass
=
C_CHAOS
;
else
if
(
!
strcasecmp
(
val
,
"hs"
))
(
*
expr
)
->
data
.
ns_update
.
rrclass
=
C_HS
;
else
{
parse_warn
(
cfile
,
"unexpected rrclass: %s"
,
val
);
goto
badnsop
;
}
token
=
next_token
(
&
val
,
cfile
);
if
(
!
is_identifier
(
token
)
&&
token
!=
NUMBER
)
{
parse_warn
(
cfile
,
"expecting identifier or number."
);
goto
badnsop
;
}
if
(
token
==
NUMBER
)
(
*
expr
)
->
data
.
ns_update
.
rrtype
=
atoi
(
val
);
else
if
(
!
strcasecmp
(
val
,
"a"
))
nexp
->
data
.
ns_update
.
rrtype
=
T_A
;
else
if
(
!
strcasecmp
(
val
,
"ptr"
))
nexp
->
data
.
ns_update
.
rrtype
=
T_PTR
;
else
if
(
!
strcasecmp
(
val
,
"mx"
))
nexp
->
data
.
ns_update
.
rrtype
=
T_MX
;
else
if
(
!
strcasecmp
(
val
,
"cname"
))
nexp
->
data
.
ns_update
.
rrtype
=
T_CNAME
;
else
if
(
!
strcasecmp
(
val
,
"TXT"
))
nexp
->
data
.
ns_update
.
rrtype
=
T_TXT
;
else
{
parse_warn
(
cfile
,
"unexpected rrtype: %s"
,
val
);
goto
badnsop
;
}
token
=
next_token
(
&
val
,
cfile
);
if
(
token
!=
COMMA
)
goto
nocomma
;
if
(
!
(
parse_data_expression
(
&
(
*
exp
r
)
->
data
.
d
ns_update
.
rrname
,
cfile
,
lose
)))
(
&
n
exp
->
data
.
ns_update
.
rrname
,
cfile
,
lose
)))
goto
nodata
;
token
=
next_token
(
&
val
,
cfile
);
...
...
@@ -2060,9 +2225,22 @@ int parse_non_binary (expr, cfile, lose, context)
goto
nocomma
;
if
(
!
(
parse_data_expression
(
&
(
*
exp
r
)
->
data
.
d
ns_update
.
rrdata
,
cfile
,
lose
)))
(
&
n
exp
->
data
.
ns_update
.
rrdata
,
cfile
,
lose
)))
goto
nodata
;
if
(
opcode
==
expr_ns_update
)
{
token
=
next_token
(
&
val
,
cfile
);
if
(
token
!=
COMMA
)
goto
nocomma
;
if
(
!
(
parse_numeric_expression
(
&
nexp
->
data
.
ns_update
.
ttl
,
cfile
,
lose
)))
{
parse_warn
(
cfile
,
"expecting data expression."
);
goto
badnsupdate
;
}
}
token
=
next_token
(
&
val
,
cfile
);
if
(
token
!=
RPAREN
)
goto
norparen
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment