Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ISC Open Source Projects
BIND
Commits
44a966df
Commit
44a966df
authored
Jan 21, 1999
by
Mark Andrews
Browse files
Added WKS.
parent
bed8e848
Changes
11
Hide whitespace changes
Inline
Side-by-side
bin/tests/rdata_test.c
View file @
44a966df
...
...
@@ -45,9 +45,9 @@ main(int argc, char *argv[]) {
unsigned
int
options
=
0
;
unsigned
int
parens
=
0
;
dns_rdatatype_t
type
;
char
outbuf
[
1024
];
char
inbuf
[
1024
];
char
wirebuf
[
1024
];
char
outbuf
[
16
*
1024
];
char
inbuf
[
16
*
1024
];
char
wirebuf
[
16
*
1024
];
isc_buffer_t
dbuf
;
isc_buffer_t
tbuf
;
isc_buffer_t
wbuf
;
...
...
@@ -151,6 +151,7 @@ main(int argc, char *argv[]) {
"dns_rdatatype_fromtext returned %s(%d)
\n
"
,
dns_result_totext
(
result
),
result
);
fflush
(
stdout
);
need_eol
=
1
;
continue
;
}
fprintf
(
stdout
,
"type = %.*s(%d)
\n
"
,
...
...
lib/dns/include/dns/result.h
View file @
44a966df
...
...
@@ -40,8 +40,9 @@ typedef unsigned int dns_result_t;
#define DNS_R_EXTRATOKEN 17
#define DNS_R_EXTRADATA 18
#define DNS_R_TEXTTOLONG 19
#define DNS_R_RANGE 20
#define DNS_R_LASTENTRY
19
/* Last entry on list. */
#define DNS_R_LASTENTRY
20
/* Last entry on list. */
#define DNS_R_UNEXPECTED 0xFFFFFFFFL
...
...
lib/dns/rdata.c
View file @
44a966df
...
...
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
/* $Id: rdata.c,v 1.
7
1999/01/2
0 22:49:34
marka Exp $ */
/* $Id: rdata.c,v 1.
8
1999/01/2
1 06:02:13
marka Exp $ */
#include <isc/buffer.h>
#include <isc/lex.h>
...
...
@@ -41,12 +41,17 @@ static isc_boolean_t buffer_empty(isc_buffer_t *source);
static
void
buffer_fromregion
(
isc_buffer_t
*
buffer
,
isc_region_t
*
region
,
unsigned
int
type
);
static
isc_result_t
uint32_
fromtext
(
unsigned
long
value
,
static
isc_result_t
uint32_
tobuffer
(
unsigned
long
value
,
isc_buffer_t
*
target
);
static
isc_result_t
uint16_
fromtext
(
unsigned
long
value
,
static
isc_result_t
uint16_
tobuffer
(
unsigned
long
value
,
isc_buffer_t
*
target
);
static
unsigned
long
uint32_fromregion
(
isc_region_t
*
region
);
static
unsigned
short
uint16_fromregion
(
isc_region_t
*
region
);
static
dns_result_t
gettoken
(
isc_lex_t
*
lexer
,
isc_token_t
*
token
,
isc_tokentype_t
expect
,
isc_boolean_t
eol
);
static
dns_result_t
mem_tobuffer
(
isc_buffer_t
*
target
,
void
*
base
,
unsigned
int
length
);
static
int
compare_region
(
isc_region_t
*
r1
,
isc_region_t
*
r2
);
#include "code.h"
...
...
@@ -101,7 +106,6 @@ dns_rdata_init(dns_rdata_t *rdata) {
int
dns_rdata_compare
(
dns_rdata_t
*
rdata1
,
dns_rdata_t
*
rdata2
)
{
int
result
=
0
;
int
l
;
isc_boolean_t
use_default
=
ISC_FALSE
;
REQUIRE
(
rdata1
!=
NULL
);
...
...
@@ -118,12 +122,12 @@ dns_rdata_compare(dns_rdata_t *rdata1, dns_rdata_t *rdata2) {
COMPARESWITCH
if
(
use_default
)
{
l
=
(
rdata1
->
length
>
rdata2
->
length
)
?
rdata1
->
length
:
rdata2
->
length
;
if
((
result
=
memcmp
(
rdata1
->
data
,
rdata2
->
data
,
l
))
==
0
)
result
=
(
result
<
0
)
?
-
1
:
1
;
else
result
=
(
rdata1
->
length
<
rdata2
->
length
)
?
-
1
:
1
;
isc_region_t
r1
;
isc_region_t
r2
;
dns_rdata_toregion
(
rdata1
,
&
r1
)
;
dns_rdata_toregion
(
rdata2
,
&
r2
);
result
=
compare_region
(
&
r1
,
&
r2
)
;
}
return
(
result
);
}
...
...
@@ -541,7 +545,7 @@ buffer_fromregion(isc_buffer_t *buffer, isc_region_t *region,
}
static
isc_result_t
uint32_
fromtext
(
unsigned
long
value
,
isc_buffer_t
*
target
)
{
uint32_
tobuffer
(
unsigned
long
value
,
isc_buffer_t
*
target
)
{
isc_region_t
region
;
isc_buffer_available
(
target
,
&
region
);
...
...
@@ -556,7 +560,7 @@ uint32_fromtext(unsigned long value, isc_buffer_t *target) {
}
static
isc_result_t
uint16_
fromtext
(
unsigned
long
value
,
isc_buffer_t
*
target
)
{
uint16_
tobuffer
(
unsigned
long
value
,
isc_buffer_t
*
target
)
{
isc_region_t
region
;
isc_buffer_available
(
target
,
&
region
);
...
...
@@ -587,3 +591,50 @@ uint16_fromregion(isc_region_t *region) {
return
((
region
->
base
[
0
]
<<
8
)
|
region
->
base
[
1
]);
}
static
dns_result_t
gettoken
(
isc_lex_t
*
lexer
,
isc_token_t
*
token
,
isc_tokentype_t
expect
,
isc_boolean_t
eol
)
{
unsigned
int
options
=
ISC_LEXOPT_EOL
|
ISC_LEXOPT_EOF
;
if
(
expect
==
isc_tokentype_number
)
options
|=
ISC_LEXOPT_NUMBER
;
if
(
isc_lex_gettoken
(
lexer
,
options
,
token
)
!=
ISC_R_SUCCESS
)
return
(
DNS_R_UNEXPECTED
);
if
(
eol
&&
((
token
->
type
==
isc_tokentype_eol
)
||
(
token
->
type
==
isc_tokentype_eof
)))
return
(
DNS_R_SUCCESS
);
if
(
token
->
type
!=
expect
)
{
isc_lex_ungettoken
(
lexer
,
token
);
if
(
token
->
type
==
isc_tokentype_eol
||
token
->
type
==
isc_tokentype_eof
)
return
(
DNS_R_UNEXPECTEDEND
);
return
(
DNS_R_UNEXPECTED
);
}
return
(
DNS_R_SUCCESS
);
}
static
dns_result_t
mem_tobuffer
(
isc_buffer_t
*
target
,
void
*
base
,
unsigned
int
length
)
{
isc_region_t
tr
;
isc_buffer_available
(
target
,
&
tr
);
if
(
length
>
tr
.
length
)
return
(
DNS_R_NOSPACE
);
memcpy
(
tr
.
base
,
base
,
length
);
isc_buffer_add
(
target
,
length
);
return
(
DNS_R_SUCCESS
);
}
static
int
compare_region
(
isc_region_t
*
r1
,
isc_region_t
*
r2
)
{
unsigned
int
l
;
int
result
;
l
=
(
r1
->
length
<
r2
->
length
)
?
r1
->
length
:
r2
->
length
;
if
((
result
=
memcmp
(
r1
->
base
,
r2
->
base
,
l
))
!=
0
)
return
((
result
<
0
)
?
-
1
:
1
);
else
return
((
r1
->
length
<
r2
->
length
)
?
-
1
:
1
);
}
lib/dns/rdata/generic/mx_15.c
View file @
44a966df
...
...
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
/* $Id: mx_15.c,v 1.
6
1999/01/2
0
0
5:20:22
marka Exp $ */
/* $Id: mx_15.c,v 1.
7
1999/01/2
1
0
6:02:14
marka Exp $ */
#ifndef RDATA_GENERIC_MX_15_H
#define RDATA_GENERIC_MX_15_H
...
...
@@ -45,7 +45,7 @@ fromtext_mx(dns_rdataclass_t class, dns_rdatatype_t type,
return
(
DNS_R_UNEXPECTED
);
}
result
=
uint16_
fromtext
(
token
.
value
.
as_ulong
,
target
);
result
=
uint16_
tobuffer
(
token
.
value
.
as_ulong
,
target
);
if
(
result
!=
DNS_R_SUCCESS
)
return
(
result
);
...
...
lib/dns/rdata/generic/mx_15.h
View file @
44a966df
...
...
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
/* $Id: mx_15.h,v 1.
6
1999/01/2
0
0
5:20:22
marka Exp $ */
/* $Id: mx_15.h,v 1.
7
1999/01/2
1
0
6:02:14
marka Exp $ */
#ifndef RDATA_GENERIC_MX_15_H
#define RDATA_GENERIC_MX_15_H
...
...
@@ -45,7 +45,7 @@ fromtext_mx(dns_rdataclass_t class, dns_rdatatype_t type,
return
(
DNS_R_UNEXPECTED
);
}
result
=
uint16_
fromtext
(
token
.
value
.
as_ulong
,
target
);
result
=
uint16_
tobuffer
(
token
.
value
.
as_ulong
,
target
);
if
(
result
!=
DNS_R_SUCCESS
)
return
(
result
);
...
...
lib/dns/rdata/generic/soa_6.c
View file @
44a966df
...
...
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
/* $Id: soa_6.c,v 1.
6
1999/01/2
0
0
5:20:23
marka Exp $ */
/* $Id: soa_6.c,v 1.
7
1999/01/2
1
0
6:02:14
marka Exp $ */
#ifndef RDATA_GENERIC_SOA_6_H
#define RDATA_GENERIC_SOA_6_H
...
...
@@ -83,7 +83,7 @@ fromtext_soa(dns_rdataclass_t class, dns_rdatatype_t type,
return
(
DNS_R_UNEXPECTED
);
}
result
=
uint32_
fromtext
(
token
.
value
.
as_ulong
,
target
);
result
=
uint32_
tobuffer
(
token
.
value
.
as_ulong
,
target
);
if
(
result
!=
DNS_R_SUCCESS
)
return
(
result
);
}
...
...
lib/dns/rdata/generic/soa_6.h
View file @
44a966df
...
...
@@ -15,7 +15,7 @@
* SOFTWARE.
*/
/* $Id: soa_6.h,v 1.
6
1999/01/2
0
0
5:20:23
marka Exp $ */
/* $Id: soa_6.h,v 1.
7
1999/01/2
1
0
6:02:14
marka Exp $ */
#ifndef RDATA_GENERIC_SOA_6_H
#define RDATA_GENERIC_SOA_6_H
...
...
@@ -83,7 +83,7 @@ fromtext_soa(dns_rdataclass_t class, dns_rdatatype_t type,
return
(
DNS_R_UNEXPECTED
);
}
result
=
uint32_
fromtext
(
token
.
value
.
as_ulong
,
target
);
result
=
uint32_
tobuffer
(
token
.
value
.
as_ulong
,
target
);
if
(
result
!=
DNS_R_SUCCESS
)
return
(
result
);
}
...
...
lib/dns/rdata/in_1/wks_11.c
0 → 100644
View file @
44a966df
/*
* Copyright (C) 1998 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
/* $Id: wks_11.c,v 1.1 1999/01/21 06:02:15 marka Exp $ */
#ifndef RDATA_IN_1_WKS_11_H
#define RDATA_IN_1_WKS_11_H
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <limits.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
static
dns_result_t
fromtext_in_wks
(
dns_rdataclass_t
class
,
dns_rdatatype_t
type
,
isc_lex_t
*
lexer
,
dns_name_t
*
origin
,
isc_boolean_t
downcase
,
isc_buffer_t
*
target
)
{
isc_token_t
token
;
dns_result_t
result
;
isc_region_t
region
;
struct
in_addr
addr
;
struct
protoent
*
pe
;
struct
servent
*
se
;
char
*
e
;
long
proto
;
unsigned
char
bm
[
8
*
1024
];
long
port
;
long
maxport
=
-
1
;
char
*
ps
=
NULL
;
unsigned
int
n
;
REQUIRE
(
type
==
11
);
REQUIRE
(
class
==
1
);
origin
=
origin
;
/*unused*/
downcase
=
downcase
;
/*unused*/
/* IPv4 dotted quad */
result
=
gettoken
(
lexer
,
&
token
,
isc_tokentype_string
,
ISC_FALSE
);
if
(
result
!=
DNS_R_SUCCESS
)
return
(
result
);
isc_buffer_available
(
target
,
&
region
);
if
(
inet_aton
(
token
.
value
.
as_pointer
,
&
addr
)
!=
1
)
return
(
DNS_R_BADDOTTEDQUAD
);
if
(
region
.
length
<
4
)
return
(
DNS_R_NOSPACE
);
memcpy
(
region
.
base
,
&
addr
,
4
);
isc_buffer_add
(
target
,
4
);
/* protocol */
result
=
gettoken
(
lexer
,
&
token
,
isc_tokentype_string
,
ISC_FALSE
);
if
(
result
!=
DNS_R_SUCCESS
)
return
(
result
);
proto
=
strtol
(
token
.
value
.
as_pointer
,
&
e
,
10
);
if
(
*
e
==
'\0'
)
(
void
)
NULL
;
else
if
((
pe
=
getprotobyname
(
token
.
value
.
as_pointer
))
!=
NULL
)
proto
=
pe
->
p_proto
;
else
return
(
DNS_R_UNEXPECTED
);
if
(
proto
<
0
||
proto
>
0xffff
)
return
(
DNS_R_RANGE
);
if
(
proto
==
IPPROTO_TCP
)
ps
=
"tcp"
;
else
if
(
proto
==
IPPROTO_UDP
)
ps
=
"udp"
;
result
=
uint16_tobuffer
(
proto
,
target
);
memset
(
bm
,
0
,
sizeof
bm
);
while
(
1
)
{
result
=
gettoken
(
lexer
,
&
token
,
isc_tokentype_string
,
ISC_TRUE
);
if
(
result
!=
DNS_R_SUCCESS
)
return
(
result
);
if
(
token
.
type
==
isc_tokentype_eol
||
token
.
type
==
isc_tokentype_eof
)
break
;
port
=
strtol
(
token
.
value
.
as_pointer
,
&
e
,
10
);
if
(
*
e
==
'\0'
)
(
void
)
NULL
;
else
if
((
se
=
getservbyname
(
token
.
value
.
as_pointer
,
ps
))
!=
NULL
)
port
=
ntohs
(
se
->
s_port
);
else
return
(
DNS_R_UNEXPECTED
);
if
(
port
<
0
||
port
>
0xffff
)
return
(
DNS_R_RANGE
);
if
(
port
>
maxport
)
maxport
=
port
;
bm
[
port
/
8
]
|=
(
0x80
>>
(
port
%
8
));
}
isc_lex_ungettoken
(
lexer
,
&
token
);
n
=
(
maxport
+
8
)
/
8
;
return
(
mem_tobuffer
(
target
,
bm
,
n
));
}
static
dns_result_t
totext_in_wks
(
dns_rdata_t
*
rdata
,
dns_name_t
*
origin
,
isc_buffer_t
*
target
)
{
isc_region_t
sr
;
isc_region_t
tr
;
unsigned
short
proto
;
char
buf
[
sizeof
"65535"
];
dns_result_t
result
;
unsigned
int
i
,
j
;
REQUIRE
(
rdata
->
type
==
11
);
REQUIRE
(
rdata
->
class
==
1
);
origin
=
origin
;
dns_rdata_toregion
(
rdata
,
&
sr
);
isc_buffer_available
(
target
,
&
tr
);
if
(
inet_ntop
(
AF_INET
,
sr
.
base
,
tr
.
base
,
tr
.
length
)
==
NULL
)
return
(
DNS_R_NOSPACE
);
isc_buffer_add
(
target
,
strlen
(
tr
.
base
));
isc_region_consume
(
&
sr
,
4
);
proto
=
uint16_fromregion
(
&
sr
);
sprintf
(
buf
,
"%u"
,
proto
);
result
=
str_totext
(
" "
,
target
);
if
(
result
!=
DNS_R_SUCCESS
)
return
(
result
);
result
=
str_totext
(
buf
,
target
);
if
(
result
!=
DNS_R_SUCCESS
)
return
(
result
);
isc_region_consume
(
&
sr
,
2
);
result
=
str_totext
(
" ("
,
target
);
if
(
result
!=
DNS_R_SUCCESS
)
return
(
result
);
for
(
i
=
0
;
i
<
sr
.
length
;
i
++
)
{
if
(
sr
.
base
[
i
]
!=
0
)
for
(
j
=
0
;
j
<
8
;
j
++
)
if
((
sr
.
base
[
i
]
&
(
0x80
>>
j
))
!=
0
)
{
sprintf
(
buf
,
"%u"
,
i
*
8
+
j
);
result
=
str_totext
(
" "
,
target
);
if
(
result
!=
DNS_R_SUCCESS
)
return
(
result
);
result
=
str_totext
(
buf
,
target
);
if
(
result
!=
DNS_R_SUCCESS
)
return
(
result
);
}
}
result
=
str_totext
(
" )"
,
target
);
return
(
DNS_R_SUCCESS
);
}
static
dns_result_t
fromwire_in_wks
(
dns_rdataclass_t
class
,
dns_rdatatype_t
type
,
isc_buffer_t
*
source
,
dns_decompress_t
*
dctx
,
isc_boolean_t
downcase
,
isc_buffer_t
*
target
)
{
isc_region_t
sr
;
isc_region_t
tr
;
REQUIRE
(
type
==
11
);
REQUIRE
(
class
==
1
);
dctx
=
dctx
;
/*unused*/
downcase
=
downcase
;
/*unused*/
isc_buffer_active
(
source
,
&
sr
);
isc_buffer_available
(
target
,
&
tr
);
if
(
sr
.
length
<
6
)
return
(
DNS_R_UNEXPECTEDEND
);
if
(
sr
.
length
>
8
*
1024
+
6
)
return
(
DNS_R_EXTRADATA
);
if
(
tr
.
length
<
sr
.
length
)
return
(
DNS_R_NOSPACE
);
memcpy
(
tr
.
base
,
sr
.
base
,
sr
.
length
);
isc_buffer_add
(
target
,
sr
.
length
);
isc_buffer_forward
(
source
,
sr
.
length
);
return
(
DNS_R_SUCCESS
);
}
static
dns_result_t
towire_in_wks
(
dns_rdata_t
*
rdata
,
dns_compress_t
*
cctx
,
isc_buffer_t
*
target
)
{
isc_region_t
sr
;
REQUIRE
(
rdata
->
type
==
11
);
REQUIRE
(
rdata
->
class
==
1
);
cctx
=
cctx
;
/*unused*/
dns_rdata_toregion
(
rdata
,
&
sr
);
return
(
mem_tobuffer
(
target
,
sr
.
base
,
sr
.
length
));
}
static
int
compare_in_wks
(
dns_rdata_t
*
rdata1
,
dns_rdata_t
*
rdata2
)
{
isc_region_t
r1
;
isc_region_t
r2
;
REQUIRE
(
rdata1
->
type
==
rdata2
->
type
);
REQUIRE
(
rdata1
->
class
==
rdata2
->
class
);
REQUIRE
(
rdata1
->
type
==
11
);
REQUIRE
(
rdata1
->
class
==
1
);
dns_rdata_toregion
(
rdata1
,
&
r1
);
dns_rdata_toregion
(
rdata2
,
&
r2
);
return
(
compare_region
(
&
r1
,
&
r2
));
}
static
dns_result_t
fromstruct_in_wks
(
dns_rdataclass_t
class
,
dns_rdatatype_t
type
,
void
*
source
,
isc_buffer_t
*
target
)
{
REQUIRE
(
type
==
11
);
REQUIRE
(
class
==
1
);
source
=
source
;
target
=
target
;
return
(
DNS_R_NOTIMPLEMENTED
);
}
static
dns_result_t
tostruct_in_wks
(
dns_rdata_t
*
rdata
,
void
*
target
)
{
REQUIRE
(
rdata
->
type
==
11
);
REQUIRE
(
rdata
->
class
==
1
);
target
=
target
;
return
(
DNS_R_NOTIMPLEMENTED
);
}
#endif
/* RDATA_IN_1_WKS_11_H */
lib/dns/rdata/in_1/wks_11.h
0 → 100644
View file @
44a966df
/*
* Copyright (C) 1998 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
/* $Id: wks_11.h,v 1.1 1999/01/21 06:02:15 marka Exp $ */
#ifndef RDATA_IN_1_WKS_11_H
#define RDATA_IN_1_WKS_11_H
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <limits.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
static
dns_result_t
fromtext_in_wks
(
dns_rdataclass_t
class
,
dns_rdatatype_t
type
,
isc_lex_t
*
lexer
,
dns_name_t
*
origin
,
isc_boolean_t
downcase
,
isc_buffer_t
*
target
)
{
isc_token_t
token
;
dns_result_t
result
;
isc_region_t
region
;
struct
in_addr
addr
;
struct
protoent
*
pe
;
struct
servent
*
se
;
char
*
e
;
long
proto
;
unsigned
char
bm
[
8
*
1024
];
long
port
;
long
maxport
=
-
1
;
char
*
ps
=
NULL
;
unsigned
int
n
;
REQUIRE
(
type
==
11
);
REQUIRE
(
class
==
1
);
origin
=
origin
;
/*unused*/
downcase
=
downcase
;
/*unused*/
/* IPv4 dotted quad */
result
=
gettoken
(
lexer
,
&
token
,
isc_tokentype_string
,
ISC_FALSE
);
if
(
result
!=
DNS_R_SUCCESS
)
return
(
result
);
isc_buffer_available
(
target
,
&
region
);
if
(
inet_aton
(
token
.
value
.
as_pointer
,
&
addr
)
!=
1
)
return
(
DNS_R_BADDOTTEDQUAD
);
if
(
region
.
length
<
4
)
return
(
DNS_R_NOSPACE
);
memcpy
(
region
.
base
,
&
addr
,
4
);
isc_buffer_add
(
target
,
4
);
/* protocol */
result
=
gettoken
(
lexer
,
&
token
,
isc_tokentype_string
,
ISC_FALSE
);
if
(
result
!=
DNS_R_SUCCESS
)
return
(
result
);
proto
=
strtol
(
token
.
value
.
as_pointer
,
&
e
,
10
);
if
(
*
e
==
'\0'
)
(
void
)
NULL
;
else
if
((
pe
=
getprotobyname
(
token
.
value
.
as_pointer
))
!=
NULL
)
proto
=
pe
->
p_proto
;
else
return
(
DNS_R_UNEXPECTED
);
if
(
proto
<
0
||
proto
>
0xffff
)
return
(
DNS_R_RANGE
);
if
(
proto
==
IPPROTO_TCP
)
ps
=
"tcp"
;
else
if
(
proto
==
IPPROTO_UDP
)
ps
=
"udp"
;
result
=
uint16_tobuffer
(
proto
,
target
);
memset
(
bm
,
0
,
sizeof
bm
);
while
(
1
)
{
result
=
gettoken
(
lexer
,
&
token
,
isc_tokentype_string
,
ISC_TRUE
);
if
(
result
!=
DNS_R_SUCCESS
)
return
(
result
);
if
(
token
.
type
==
isc_tokentype_eol
||
token
.
type
==
isc_tokentype_eof
)
break
;
port
=
strtol
(
token
.
value
.
as_pointer
,
&
e
,
10
);
if
(
*
e
==
'\0'
)
(
void
)
NULL
;
else
if
((
se
=
getservbyname
(
token
.
value
.
as_pointer
,
ps
))
!=
NULL
)
port
=
ntohs
(
se
->
s_port
);
else
return
(
DNS_R_UNEXPECTED
);
if
(
port
<
0
||
port
>
0xffff
)
return
(
DNS_R_RANGE
);
if
(
port
>
maxport
)
maxport
=
port
;
bm
[
port
/
8
]
|=
(
0x80
>>
(
port
%
8
));
}
isc_lex_ungettoken
(
lexer
,
&
token
);
n
=
(
maxport
+
8
)
/
8
;
return
(
mem_tobuffer
(
target
,
bm
,
n
));
}
static
dns_result_t
totext_in_wks
(
dns_rdata_t
*
rdata
,
dns_name_t
*
origin
,
isc_buffer_t
*
target
)
{
isc_region_t
sr
;
isc_region_t
tr
;
unsigned
short
proto
;
char
buf
[
sizeof
"65535"
];
dns_result_t
result
;
unsigned
int
i
,
j
;
REQUIRE
(
rdata
->
type
==
11
);
REQUIRE
(
rdata
->
class
==
1
);
origin
=
origin
;
dns_rdata_toregion
(
rdata
,
&
sr
);
isc_buffer_available
(
target
,
&
tr
);