mirror of
https://gitlab.isc.org/isc-projects/kea
synced 2025-08-30 05:27:55 +00:00
[trac751]Merge branch 'master' into trac751
Conflicts: src/lib/Makefile.am src/lib/resolve/recursive_query.h
This commit is contained in:
commit
262ac6c6fc
@ -624,6 +624,8 @@ AC_CONFIG_FILES([Makefile
|
||||
src/bin/auth/benchmarks/Makefile
|
||||
src/bin/resolver/Makefile
|
||||
src/bin/resolver/tests/Makefile
|
||||
src/bin/sockcreator/Makefile
|
||||
src/bin/sockcreator/tests/Makefile
|
||||
src/bin/xfrin/Makefile
|
||||
src/bin/xfrin/tests/Makefile
|
||||
src/bin/xfrout/Makefile
|
||||
@ -694,6 +696,10 @@ AC_CONFIG_FILES([Makefile
|
||||
src/lib/server_common/tests/Makefile
|
||||
tests/Makefile
|
||||
tests/system/Makefile
|
||||
src/lib/util/Makefile
|
||||
src/lib/util/io/Makefile
|
||||
src/lib/util/io/tests/Makefile
|
||||
src/lib/util/unittests/Makefile
|
||||
])
|
||||
AC_OUTPUT([doc/version.ent
|
||||
src/bin/cfgmgr/b10-cfgmgr.py
|
||||
@ -708,6 +714,7 @@ AC_OUTPUT([doc/version.ent
|
||||
src/bin/xfrout/xfrout.py
|
||||
src/bin/xfrout/xfrout.spec.pre
|
||||
src/bin/xfrout/tests/xfrout_test
|
||||
src/bin/xfrout/tests/xfrout_test.py
|
||||
src/bin/xfrout/run_b10-xfrout.sh
|
||||
src/bin/resolver/resolver.spec.pre
|
||||
src/bin/resolver/spec_config.h.pre
|
||||
|
@ -568,7 +568,11 @@ WARN_LOGFILE =
|
||||
# directories like "/usr/src/myproject". Separate the files or directories
|
||||
# with spaces.
|
||||
|
||||
INPUT = ../src/lib/cc ../src/lib/config ../src/lib/dns ../src/lib/exceptions ../src/lib/datasrc ../src/bin/auth ../src/bin/resolver ../src/lib/bench ../src/lib/log ../src/lib/asiolink/ ../src/lib/nsas ../src/lib/testutils ../src/lib/cache ../src/lib/server_common/
|
||||
INPUT = ../src/lib/cc ../src/lib/config ../src/lib/dns \
|
||||
../src/lib/exceptions ../src/lib/datasrc ../src/bin/auth \
|
||||
../src/bin/resolver ../src/lib/bench ../src/lib/log ../src/lib/asiolink/ \
|
||||
../src/lib/nsas ../src/lib/testutils ../src/lib/cache \
|
||||
../src/lib/server_common/ ../src/bin/sockcreator/ ../src/lib/util/
|
||||
|
||||
# This tag can be used to specify the character encoding of the source files
|
||||
# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
|
||||
|
@ -1,4 +1,4 @@
|
||||
SUBDIRS = bind10 bindctl cfgmgr loadzone msgq host cmdctl auth xfrin xfrout \
|
||||
usermgr zonemgr stats tests resolver
|
||||
usermgr zonemgr stats tests resolver sockcreator
|
||||
|
||||
check-recursive: all-recursive
|
||||
|
@ -41,7 +41,7 @@ b10_auth_SOURCES += auth_srv.cc auth_srv.h
|
||||
b10_auth_SOURCES += change_user.cc change_user.h
|
||||
b10_auth_SOURCES += auth_config.cc auth_config.h
|
||||
b10_auth_SOURCES += command.cc command.h
|
||||
b10_auth_SOURCES += common.h
|
||||
b10_auth_SOURCES += common.h common.cc
|
||||
b10_auth_SOURCES += statistics.cc statistics.h
|
||||
b10_auth_SOURCES += main.cc
|
||||
b10_auth_LDADD = $(top_builddir)/src/lib/datasrc/libdatasrc.la
|
||||
|
36
src/bin/auth/common.cc
Normal file
36
src/bin/auth/common.cc
Normal file
@ -0,0 +1,36 @@
|
||||
// Copyright (C) 2009-2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
|
||||
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
// AND FITNESS. IN NO EVENT SHALL ISC 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.
|
||||
|
||||
#include <auth/common.h>
|
||||
#include <auth/spec_config.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
using std::string;
|
||||
|
||||
string getXfroutSocketPath() {
|
||||
if (getenv("B10_FROM_BUILD") != NULL) {
|
||||
if (getenv("B10_FROM_SOURCE_LOCALSTATEDIR")) {
|
||||
return (string(getenv("B10_FROM_SOURCE_LOCALSTATEDIR")) +
|
||||
"/auth_xfrout_conn");
|
||||
} else {
|
||||
return (string(getenv("B10_FROM_BUILD")) + "/auth_xfrout_conn");
|
||||
}
|
||||
} else {
|
||||
if (getenv("BIND10_XFROUT_SOCKET_FILE")) {
|
||||
return (getenv("BIND10_XFROUT_SOCKET_FILE"));
|
||||
} else {
|
||||
return (UNIX_SOCKET_FILE);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
|
||||
// Copyright (C) 2009-2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or distribute this software for any
|
||||
// purpose with or without fee is hereby granted, provided that the above
|
||||
@ -29,6 +29,15 @@ public:
|
||||
{}
|
||||
};
|
||||
|
||||
/// \short Get the path of socket to talk to xfrout
|
||||
///
|
||||
/// It takes some environment variables into account (B10_FROM_BUILD,
|
||||
/// B10_FROM_SOURCE_LOCALSTATEDIR and BIND10_XFROUT_SOCKET_FILE). It
|
||||
/// also considers the installation prefix.
|
||||
///
|
||||
/// The logic should be the same as in b10-xfrout, so they find each other.
|
||||
std::string getXfroutSocketPath();
|
||||
|
||||
#endif // __COMMON_H
|
||||
|
||||
// Local Variables:
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
|
||||
// Copyright (C) 2009-2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or distribute this software for any
|
||||
// purpose with or without fee is hereby granted, provided that the above
|
||||
@ -124,19 +124,7 @@ main(int argc, char* argv[]) {
|
||||
bool xfrin_session_established = false; // XXX (see Trac #287)
|
||||
bool statistics_session_established = false; // XXX (see Trac #287)
|
||||
ModuleCCSession* config_session = NULL;
|
||||
string xfrout_socket_path;
|
||||
if (getenv("B10_FROM_BUILD") != NULL) {
|
||||
if (getenv("B10_FROM_SOURCE_LOCALSTATEDIR")) {
|
||||
xfrout_socket_path = string("B10_FROM_SOURCE_LOCALSTATEDIR") +
|
||||
"/auth_xfrout_conn";
|
||||
} else {
|
||||
xfrout_socket_path = string(getenv("B10_FROM_BUILD")) +
|
||||
"/auth_xfrout_conn";
|
||||
}
|
||||
} else {
|
||||
xfrout_socket_path = UNIX_SOCKET_FILE;
|
||||
}
|
||||
XfroutClient xfrout_client(xfrout_socket_path);
|
||||
XfroutClient xfrout_client(getXfroutSocketPath());
|
||||
try {
|
||||
string specfile;
|
||||
if (getenv("B10_FROM_BUILD")) {
|
||||
|
@ -1,4 +1,5 @@
|
||||
AM_CPPFLAGS = -I$(top_srcdir)/src/lib -I$(top_builddir)/src/lib
|
||||
AM_CPPFLAGS += -I$(top_builddir)/src/bin # for generated spec_config.h header
|
||||
AM_CPPFLAGS += -I$(top_builddir)/src/lib/dns -I$(top_srcdir)/src/bin
|
||||
AM_CPPFLAGS += -I$(top_builddir)/src/lib/cc
|
||||
AM_CPPFLAGS += $(BOOST_INCLUDES)
|
||||
@ -16,6 +17,8 @@ CLEANFILES = *.gcno *.gcda
|
||||
|
||||
TESTS =
|
||||
if HAVE_GTEST
|
||||
|
||||
BUILT_SOURCES = ../spec_config.h
|
||||
TESTS += run_unittests
|
||||
run_unittests_SOURCES = $(top_srcdir)/src/lib/dns/tests/unittest_util.h
|
||||
run_unittests_SOURCES += $(top_srcdir)/src/lib/dns/tests/unittest_util.cc
|
||||
@ -24,10 +27,13 @@ run_unittests_SOURCES += ../query.h ../query.cc
|
||||
run_unittests_SOURCES += ../change_user.h ../change_user.cc
|
||||
run_unittests_SOURCES += ../auth_config.h ../auth_config.cc
|
||||
run_unittests_SOURCES += ../command.h ../command.cc
|
||||
run_unittests_SOURCES += ../common.h ../common.cc
|
||||
run_unittests_SOURCES += ../spec_config.h
|
||||
run_unittests_SOURCES += ../statistics.h ../statistics.cc
|
||||
run_unittests_SOURCES += auth_srv_unittest.cc
|
||||
run_unittests_SOURCES += config_unittest.cc
|
||||
run_unittests_SOURCES += command_unittest.cc
|
||||
run_unittests_SOURCES += common_unittest.cc
|
||||
run_unittests_SOURCES += query_unittest.cc
|
||||
run_unittests_SOURCES += change_user_unittest.cc
|
||||
run_unittests_SOURCES += statistics_unittest.cc
|
||||
|
96
src/bin/auth/tests/common_unittest.cc
Normal file
96
src/bin/auth/tests/common_unittest.cc
Normal file
@ -0,0 +1,96 @@
|
||||
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
|
||||
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
// AND FITNESS. IN NO EVENT SHALL ISC 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.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <auth/common.h>
|
||||
#include <auth/spec_config.h>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <cstdio>
|
||||
#include <boost/foreach.hpp>
|
||||
|
||||
using std::pair;
|
||||
using std::vector;
|
||||
using std::string;
|
||||
|
||||
namespace {
|
||||
|
||||
class Paths : public ::testing::Test {
|
||||
private:
|
||||
typedef pair<string, string*> Environ;
|
||||
vector<Environ> restoreEnviron;
|
||||
public:
|
||||
void TearDown() {
|
||||
// Restore the original environment
|
||||
BOOST_FOREACH(const Environ &env, restoreEnviron) {
|
||||
if (env.second == NULL) {
|
||||
EXPECT_EQ(0, unsetenv(env.first.c_str())) <<
|
||||
"Couldn't restore environment, results of other tests"
|
||||
"are uncertain";
|
||||
} else {
|
||||
EXPECT_EQ(0, setenv(env.first.c_str(), env.second->c_str(),
|
||||
1)) << "Couldn't restore environment, "
|
||||
"results of other tests are uncertain";
|
||||
}
|
||||
}
|
||||
}
|
||||
protected:
|
||||
// Sets a temporary value into environment. If value is empty, it deletes
|
||||
// the variable from environment (just for simplicity).
|
||||
void setEnv(const string& name, const string& value) {
|
||||
// Backup the original environment
|
||||
char* env(getenv(name.c_str()));
|
||||
restoreEnviron.push_back(Environ(name, env == NULL ? NULL :
|
||||
new string(env)));
|
||||
// Set the new value
|
||||
if (value.empty()) {
|
||||
EXPECT_EQ(0, unsetenv(name.c_str()));
|
||||
} else {
|
||||
EXPECT_EQ(0, setenv(name.c_str(), value.c_str(), 1));
|
||||
}
|
||||
}
|
||||
// Test getXfroutSocketPath under given environment
|
||||
void testXfrout(const string& fromBuild, const string& localStateDir,
|
||||
const string& socketFile, const string& expected)
|
||||
{
|
||||
setEnv("B10_FROM_BUILD", fromBuild);
|
||||
setEnv("B10_FROM_SOURCE_LOCALSTATEDIR", localStateDir);
|
||||
setEnv("BIND10_XFROUT_SOCKET_FILE", socketFile);
|
||||
EXPECT_EQ(expected, getXfroutSocketPath());
|
||||
}
|
||||
};
|
||||
|
||||
// Test that when we have no special environment, we get the default from prefix
|
||||
TEST_F(Paths, xfroutNoEnv) {
|
||||
testXfrout("", "", "", UNIX_SOCKET_FILE);
|
||||
}
|
||||
|
||||
// Override by B10_FROM_BUILD
|
||||
TEST_F(Paths, xfroutFromBuild) {
|
||||
testXfrout("/from/build", "", "/wrong/path",
|
||||
"/from/build/auth_xfrout_conn");
|
||||
}
|
||||
|
||||
// Override by B10_FROM_SOURCE_LOCALSTATEDIR
|
||||
TEST_F(Paths, xfroutLocalStatedir) {
|
||||
testXfrout("/wrong/path", "/state/dir", "/wrong/path",
|
||||
"/state/dir/auth_xfrout_conn");
|
||||
}
|
||||
|
||||
// Override by BIND10_XFROUT_SOCKET_FILE explicitly
|
||||
TEST_F(Paths, xfroutFromEnv) {
|
||||
testXfrout("", "", "/the/path/to/file", "/the/path/to/file");
|
||||
}
|
||||
|
||||
}
|
@ -2,12 +2,12 @@
|
||||
.\" Title: bind10
|
||||
.\" Author: [see the "AUTHORS" section]
|
||||
.\" Generator: DocBook XSL Stylesheets v1.75.2 <http://docbook.sf.net/>
|
||||
.\" Date: February 22, 2011
|
||||
.\" Date: March 31, 2011
|
||||
.\" Manual: BIND10
|
||||
.\" Source: BIND10
|
||||
.\" Language: English
|
||||
.\"
|
||||
.TH "BIND10" "8" "February 22, 2011" "BIND10" "BIND10"
|
||||
.TH "BIND10" "8" "March 31, 2011" "BIND10" "BIND10"
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * set default formatting
|
||||
.\" -----------------------------------------------------------------
|
||||
@ -22,7 +22,7 @@
|
||||
bind10 \- BIND 10 boss process
|
||||
.SH "SYNOPSIS"
|
||||
.HP \w'\fBbind10\fR\ 'u
|
||||
\fBbind10\fR [\fB\-m\ \fR\fB\fIfile\fR\fR] [\fB\-n\fR] [\fB\-u\ \fR\fB\fIuser\fR\fR] [\fB\-v\fR] [\fB\-\-msgq\-socket\-file\ \fR\fB\fIfile\fR\fR] [\fB\-\-no\-cache\fR] [\fB\-\-user\ \fR\fB\fIuser\fR\fR] [\fB\-\-pretty\-name\ \fR\fB\fIname\fR\fR] [\fB\-\-brittle\fR] [\fB\-\-verbose\fR]
|
||||
\fBbind10\fR [\fB\-c\ \fR\fB\fIconfig\-filename\fR\fR] [\fB\-m\ \fR\fB\fIfile\fR\fR] [\fB\-n\fR] [\fB\-p\ \fR\fB\fIdata_path\fR\fR] [\fB\-u\ \fR\fB\fIuser\fR\fR] [\fB\-v\fR] [\fB\-\-brittle\fR] [\fB\-\-cmdctl\-port\fR\ \fIport\fR] [\fB\-\-config\-file\fR\ \fIconfig\-filename\fR] [\fB\-\-data\-path\fR\ \fIdirectory\fR] [\fB\-\-msgq\-socket\-file\ \fR\fB\fIfile\fR\fR] [\fB\-\-no\-cache\fR] [\fB\-\-pid\-file\fR\ \fIfilename\fR] [\fB\-\-pretty\-name\ \fR\fB\fIname\fR\fR] [\fB\-\-user\ \fR\fB\fIuser\fR\fR] [\fB\-\-verbose\fR]
|
||||
.SH "DESCRIPTION"
|
||||
.PP
|
||||
The
|
||||
@ -32,6 +32,34 @@ daemon starts up other BIND 10 required daemons\&. It handles restarting of exit
|
||||
.PP
|
||||
The arguments are as follows:
|
||||
.PP
|
||||
\fB\-\-brittle\fR
|
||||
.RS 4
|
||||
Shutdown if any of the child processes of
|
||||
\fBbind10\fR
|
||||
exit\&. This is intended to help developers debug the server, and should not be used in production\&.
|
||||
.RE
|
||||
.PP
|
||||
\fB\-c\fR \fIconfig\-filename\fR, \fB\-\-config\-file\fR \fIconfig\-filename\fR
|
||||
.RS 4
|
||||
The configuration filename to use\&. Can be either absolute or relative to data path\&. In case it is absolute, value of data path is not considered\&.
|
||||
.sp
|
||||
Defaults to b10\-config\&.db\&.
|
||||
.RE
|
||||
.PP
|
||||
\fB\-\-cmdctl\-port\fR \fIport\fR
|
||||
.RS 4
|
||||
The
|
||||
\fBb10\-cmdctl\fR
|
||||
daemon will listen on this port\&. (See
|
||||
b10\-cmdctl(8)
|
||||
for the default\&.)
|
||||
.RE
|
||||
.PP
|
||||
\fB\-p\fR \fIdirectory\fR, \fB\-\-data\-path\fR \fIdirectory\fR
|
||||
.RS 4
|
||||
The path where BIND 10 programs look for various data files\&. Currently only b10\-cfgmgr uses it to locate the configuration file, but the usage might be extended for other programs and other types of files\&.
|
||||
.RE
|
||||
.PP
|
||||
\fB\-m\fR \fIfile\fR, \fB\-\-msgq\-socket\-file\fR \fIfile\fR
|
||||
.RS 4
|
||||
The UNIX domain socket file for the
|
||||
@ -57,6 +85,13 @@ to run as\&.
|
||||
must be initially ran as the root user to use this option\&. The default is to run as the current user\&.
|
||||
.RE
|
||||
.PP
|
||||
\fB\-\-pid\-file\fR \fIfilename\fR
|
||||
.RS 4
|
||||
If defined, the PID of the
|
||||
\fBbind10\fR
|
||||
is stored in this file\&. This is used for testing purposes\&.
|
||||
.RE
|
||||
.PP
|
||||
\fB\-\-pretty\-name \fR\fB\fIname\fR\fR
|
||||
.RS 4
|
||||
The name this process should have in tools like
|
||||
@ -66,14 +101,6 @@ or
|
||||
\fBbind10\fR\&.
|
||||
.RE
|
||||
.PP
|
||||
\fB\-\-brittle\fR
|
||||
.RS 4
|
||||
Shutdown if any of the child processes of
|
||||
\fBbind10\fR
|
||||
exit\&. This is intended to help developers debug the server, and should
|
||||
not be used in production.
|
||||
.RE
|
||||
.PP
|
||||
\fB\-v\fR, \fB\-\-verbose\fR
|
||||
.RS 4
|
||||
Display more about what is going on for
|
||||
|
@ -20,7 +20,7 @@
|
||||
<refentry>
|
||||
|
||||
<refentryinfo>
|
||||
<date>February 22, 2011</date>
|
||||
<date>March 31, 2011</date>
|
||||
</refentryinfo>
|
||||
|
||||
<refmeta>
|
||||
@ -44,16 +44,21 @@
|
||||
<refsynopsisdiv>
|
||||
<cmdsynopsis>
|
||||
<command>bind10</command>
|
||||
<arg><option>-c <replaceable>config-filename</replaceable></option></arg>
|
||||
<arg><option>-m <replaceable>file</replaceable></option></arg>
|
||||
<arg><option>-n</option></arg>
|
||||
<arg><option>-p <replaceable>data_path</replaceable></option></arg>
|
||||
<arg><option>-u <replaceable>user</replaceable></option></arg>
|
||||
<arg><option>-v</option></arg>
|
||||
<arg><option>-c<replaceable>config-filename</replaceable></option></arg>
|
||||
<arg><option>-p<replaceable>data_path</replaceable></option></arg>
|
||||
<arg><option>--brittle</option></arg>
|
||||
<arg><option>--cmdctl-port</option> <replaceable>port</replaceable></arg>
|
||||
<arg><option>--config-file</option> <replaceable>config-filename</replaceable></arg>
|
||||
<arg><option>--data-path</option> <replaceable>directory</replaceable></arg>
|
||||
<arg><option>--msgq-socket-file <replaceable>file</replaceable></option></arg>
|
||||
<arg><option>--no-cache</option></arg>
|
||||
<arg><option>--user <replaceable>user</replaceable></option></arg>
|
||||
<arg><option>--pid-file</option> <replaceable>filename</replaceable></arg>
|
||||
<arg><option>--pretty-name <replaceable>name</replaceable></option></arg>
|
||||
<arg><option>--user <replaceable>user</replaceable></option></arg>
|
||||
<arg><option>--verbose</option></arg>
|
||||
</cmdsynopsis>
|
||||
</refsynopsisdiv>
|
||||
@ -82,9 +87,24 @@
|
||||
<para>The arguments are as follows:</para>
|
||||
|
||||
<variablelist>
|
||||
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-c</option><replaceable>config-filename</replaceable>,
|
||||
<option>--brittle</option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Shutdown if any of the child processes of
|
||||
<command>bind10</command> exit. This is intended to
|
||||
help developers debug the server, and should not be
|
||||
used in production.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-c</option> <replaceable>config-filename</replaceable>,
|
||||
<option>--config-file</option> <replaceable>config-filename</replaceable>
|
||||
</term>
|
||||
<listitem>
|
||||
@ -97,8 +117,22 @@
|
||||
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-p</option><replaceable>data-path</replaceable>,
|
||||
<option>--data-path</option> <replaceable>data-path</replaceable>
|
||||
<option>--cmdctl-port</option> <replaceable>port</replaceable>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>The <command>b10-cmdctl</command> daemon will listen
|
||||
on this port.
|
||||
(See
|
||||
<refentrytitle>b10-cmdctl</refentrytitle><manvolnum>8</manvolnum>
|
||||
for the default.)
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-p</option> <replaceable>directory</replaceable>,
|
||||
<option>--data-path</option> <replaceable>directory</replaceable>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>The path where BIND 10 programs look for various data files.
|
||||
@ -134,7 +168,6 @@
|
||||
|
||||
<varlistentry>
|
||||
<term><option>-u</option> <replaceable>user</replaceable>, <option>--user</option> <replaceable>name</replaceable></term>
|
||||
|
||||
<listitem>
|
||||
<para>The username for <command>bind10</command> to run as.
|
||||
<!-- TODO: example more detail. -->
|
||||
@ -144,6 +177,16 @@
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--pid-file</option> <replaceable>filename</replaceable></term>
|
||||
<listitem>
|
||||
<para>If defined, the PID of the <command>bind10</command> is stored
|
||||
in this file.
|
||||
This is used for testing purposes.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--pretty-name <replaceable>name</replaceable></option></term>
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
PYCOVERAGE_RUN = @PYCOVERAGE_RUN@
|
||||
#PYTESTS = args_test.py bind10_test.py
|
||||
# NOTE: this has a generated test found in the builddir
|
||||
PYTESTS = bind10_test.py
|
||||
EXTRA_DIST = $(PYTESTS)
|
||||
|
||||
@ -14,5 +15,5 @@ endif
|
||||
echo Running test: $$pytest ; \
|
||||
env PYTHONPATH=$(abs_top_srcdir)/src/lib/python:$(abs_top_builddir)/src/lib/python:$(abs_top_builddir)/src/bin/bind10 \
|
||||
BIND10_MSGQ_SOCKET_FILE=$(abs_top_builddir)/msgq_socket \
|
||||
$(PYCOVERAGE_RUN) $(abs_srcdir)/$$pytest || exit ; \
|
||||
$(PYCOVERAGE_RUN) $(abs_builddir)/$$pytest || exit ; \
|
||||
done
|
||||
|
18
src/bin/sockcreator/Makefile.am
Normal file
18
src/bin/sockcreator/Makefile.am
Normal file
@ -0,0 +1,18 @@
|
||||
SUBDIRS = tests
|
||||
|
||||
AM_CPPFLAGS = -I$(top_srcdir)/src/lib -I$(top_builddir)/src/lib
|
||||
|
||||
AM_CXXFLAGS = $(B10_CXXFLAGS)
|
||||
|
||||
if USE_STATIC_LINK
|
||||
AM_LDFLAGS = -static
|
||||
endif
|
||||
|
||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
||||
|
||||
CLEANFILES = *.gcno *.gcda
|
||||
|
||||
pkglibexec_PROGRAMS = b10-sockcreator
|
||||
|
||||
b10_sockcreator_SOURCES = sockcreator.cc sockcreator.h main.cc
|
||||
b10_sockcreator_LDADD = $(top_builddir)/src/lib/util/io/libutil_io.la
|
49
src/bin/sockcreator/README
Normal file
49
src/bin/sockcreator/README
Normal file
@ -0,0 +1,49 @@
|
||||
The socket creator
|
||||
==================
|
||||
|
||||
The only thing we need higher rights than standard user is binding sockets to
|
||||
ports lower than 1024. So we will have a separate process that keeps the
|
||||
rights, while the rests drop them for security reasons.
|
||||
|
||||
This process is the socket creator. Its goal is to be as simple as possible
|
||||
and to contain as little code as possible to minimise the amount of code
|
||||
running with higher privileges (to minimize the number of bugs and make
|
||||
checking/auditing it easier). It uses low-level OS API instead of some
|
||||
fancy library for that reason. It has only fixed-length reads so there's no
|
||||
place for buffer overruns.
|
||||
|
||||
Protocol
|
||||
--------
|
||||
|
||||
It talks with whoever started it by its stdin/stdout. It reads simple
|
||||
binary protocol from stdin and does what the commands ask. Command is a single
|
||||
byte (usually from the printable range, so it is easier to debug and guess
|
||||
what it does), followed by parameters.
|
||||
|
||||
Note that as send_fd and recv_fd works only with unix domain socket, it's stdio
|
||||
must be a socket, not pipe.
|
||||
|
||||
* 'T': It has no parameters. It asks the socket creator to terminate.
|
||||
|
||||
* 'S' 'U|T' '4|6' port address: Asks it to create a port. First parameter
|
||||
tels the socket type (either UDP or TCP). The second one is address family
|
||||
(either IPv4 or IPv6). Then there's 2 bytes of the port number, in the
|
||||
network byte order. The last one is either 4 or 16 bytes of address, as
|
||||
they would be passed to bind (note that both parameters are already prepared,
|
||||
like hton called on them).
|
||||
|
||||
The answer to this is either 'S' directly followed by the socket (using
|
||||
sendmsg) if it is successful. If it fails, 'E' is returned instead, followed
|
||||
by either 'S' or 'B' (either socket() or bind() call failed). Then there is
|
||||
one int (architecture-dependent length and endianess), which is the errno
|
||||
value after the failure.
|
||||
|
||||
The creator may also send these messages at any time (but not in the middle
|
||||
of another message):
|
||||
|
||||
* 'F': A fatal error has been detected. It is followed by one byte of error
|
||||
condition code and then the creator terminates with non-zero status.
|
||||
|
||||
The conditions are:
|
||||
* 'I': Invalid input (eg. someone sent a wrong letter and it does not
|
||||
understand it).
|
@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
|
||||
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or distribute this software for any
|
||||
// purpose with or without fee is hereby granted, provided that the above
|
||||
@ -12,21 +12,15 @@
|
||||
// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
// PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
#include <boost/python.hpp>
|
||||
#include <boost/python/class.hpp>
|
||||
#include <boost/python/module.hpp>
|
||||
#include <boost/python/def.hpp>
|
||||
#include <boost/python/exception_translator.hpp>
|
||||
#include <boost/python/return_internal_reference.hpp>
|
||||
#include <boost/python/copy_const_reference.hpp>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include "sockcreator.h"
|
||||
|
||||
#include <xfr/fd_share.h>
|
||||
using namespace isc::socket_creator;
|
||||
|
||||
using namespace isc::xfr;
|
||||
using namespace boost::python;
|
||||
|
||||
BOOST_PYTHON_MODULE(bind10_xfr) {
|
||||
def("recv_fd", &recv_fd);
|
||||
def("send_fd", &send_fd);
|
||||
int
|
||||
main() {
|
||||
/*
|
||||
* TODO Maybe use some OS-specific caps interface and drop everything
|
||||
* but ability to bind ports? It would be nice.
|
||||
*/
|
||||
return run(0, 1); // Read commands from stdin, output to stdout
|
||||
}
|
151
src/bin/sockcreator/sockcreator.cc
Normal file
151
src/bin/sockcreator/sockcreator.cc
Normal file
@ -0,0 +1,151 @@
|
||||
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
|
||||
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
// AND FITNESS. IN NO EVENT SHALL ISC 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.
|
||||
|
||||
#include "sockcreator.h"
|
||||
|
||||
#include <util/io/fd.h>
|
||||
|
||||
#include <unistd.h>
|
||||
#include <cerrno>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
using namespace isc::util::io;
|
||||
|
||||
namespace isc {
|
||||
namespace socket_creator {
|
||||
|
||||
int
|
||||
get_sock(const int type, struct sockaddr *bind_addr, const socklen_t addr_len)
|
||||
{
|
||||
int sock(socket(bind_addr->sa_family, type, 0));
|
||||
if (sock == -1) {
|
||||
return -1;
|
||||
}
|
||||
if (bind(sock, bind_addr, addr_len) == -1) {
|
||||
return -2;
|
||||
}
|
||||
return sock;
|
||||
}
|
||||
|
||||
// These are macros so they can exit the function
|
||||
#define READ(WHERE, HOW_MANY) do { \
|
||||
size_t how_many = (HOW_MANY); \
|
||||
if (read_data(input_fd, (WHERE), how_many) < how_many) { \
|
||||
return 1; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define WRITE(WHAT, HOW_MANY) do { \
|
||||
if (!write_data(output_fd, (WHAT), (HOW_MANY))) { \
|
||||
return 2; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define DEFAULT \
|
||||
default: /* Unrecognized part of protocol */ \
|
||||
WRITE("FI", 2); \
|
||||
return 3;
|
||||
|
||||
int
|
||||
run(const int input_fd, const int output_fd, const get_sock_t get_sock,
|
||||
const send_fd_t send_fd)
|
||||
{
|
||||
for (;;) {
|
||||
// Read the command
|
||||
char command;
|
||||
READ(&command, 1);
|
||||
switch (command) {
|
||||
case 'T': // The "terminate" command
|
||||
return 0;
|
||||
case 'S': { // Create a socket
|
||||
// Read what type of socket they want
|
||||
char type[2];
|
||||
READ(type, 2);
|
||||
// Read the address they ask for
|
||||
struct sockaddr *addr(NULL);
|
||||
size_t addr_len(0);
|
||||
struct sockaddr_in addr_in;
|
||||
struct sockaddr_in6 addr_in6;
|
||||
switch (type[1]) { // The address family
|
||||
/*
|
||||
* Here are some casts. They are required by C++ and
|
||||
* the low-level interface (they are implicit in C).
|
||||
*/
|
||||
case '4':
|
||||
addr = static_cast<struct sockaddr *>(
|
||||
static_cast<void *>(&addr_in));
|
||||
addr_len = sizeof addr_in;
|
||||
memset(&addr_in, 0, sizeof addr_in);
|
||||
addr_in.sin_family = AF_INET;
|
||||
READ(static_cast<char *>(static_cast<void *>(
|
||||
&addr_in.sin_port)), 2);
|
||||
READ(static_cast<char *>(static_cast<void *>(
|
||||
&addr_in.sin_addr.s_addr)), 4);
|
||||
break;
|
||||
case '6':
|
||||
addr = static_cast<struct sockaddr *>(
|
||||
static_cast<void *>(&addr_in6));
|
||||
addr_len = sizeof addr_in6;
|
||||
memset(&addr_in6, 0, sizeof addr_in6);
|
||||
addr_in6.sin6_family = AF_INET6;
|
||||
READ(static_cast<char *>(static_cast<void *>(
|
||||
&addr_in6.sin6_port)), 2);
|
||||
READ(static_cast<char *>(static_cast<void *>(
|
||||
&addr_in6.sin6_addr.s6_addr)), 16);
|
||||
break;
|
||||
DEFAULT
|
||||
}
|
||||
int sock_type;
|
||||
switch (type[0]) { // Translate the type
|
||||
case 'T':
|
||||
sock_type = SOCK_STREAM;
|
||||
break;
|
||||
case 'U':
|
||||
sock_type = SOCK_DGRAM;
|
||||
break;
|
||||
DEFAULT
|
||||
}
|
||||
int result(get_sock(sock_type, addr, addr_len));
|
||||
if (result >= 0) { // We got the socket
|
||||
WRITE("S", 1);
|
||||
// FIXME: Check the output and write a test for it
|
||||
send_fd(output_fd, result);
|
||||
} else {
|
||||
WRITE("E", 1);
|
||||
switch (result) {
|
||||
case -1:
|
||||
WRITE("S", 1);
|
||||
break;
|
||||
case -2:
|
||||
WRITE("B", 1);
|
||||
break;
|
||||
default:
|
||||
return 4;
|
||||
}
|
||||
int error(errno);
|
||||
WRITE(static_cast<char *>(static_cast<void *>(&error)),
|
||||
sizeof error);
|
||||
}
|
||||
break;
|
||||
}
|
||||
DEFAULT
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // End of the namespaces
|
||||
}
|
100
src/bin/sockcreator/sockcreator.h
Normal file
100
src/bin/sockcreator/sockcreator.h
Normal file
@ -0,0 +1,100 @@
|
||||
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
|
||||
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
// AND FITNESS. IN NO EVENT SHALL ISC 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.
|
||||
|
||||
/**
|
||||
* \file sockcreator.h
|
||||
* \short Socket creator functionality.
|
||||
*
|
||||
* This module holds the functionality of the socket creator. It is
|
||||
* a separate module from main to ease up the tests.
|
||||
*/
|
||||
|
||||
#ifndef __SOCKCREATOR_H
|
||||
#define __SOCKCREATOR_H 1
|
||||
|
||||
#include <util/io/fd_share.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
namespace isc {
|
||||
namespace socket_creator {
|
||||
|
||||
/**
|
||||
* \short Create a socket and bind it.
|
||||
*
|
||||
* This is just a bundle of socket() and bind() calls. The sa_family of
|
||||
* bind_addr is used to determine the domain of the socket.
|
||||
*
|
||||
* \return The file descriptor of the newly created socket, if everything
|
||||
* goes well. A negative number is returned if an error occurs -
|
||||
* -1 if the socket() call fails or -2 if bind() fails. In case of error,
|
||||
* errno is set (or better, left intact from socket() or bind()).
|
||||
* \param type The type of socket to create (SOCK_STREAM, SOCK_DGRAM, etc).
|
||||
* \param bind_addr The address to bind.
|
||||
* \param addr_len The actual length of bind_addr.
|
||||
*/
|
||||
int
|
||||
get_sock(const int type, struct sockaddr *bind_addr, const socklen_t addr_len);
|
||||
|
||||
/**
|
||||
* Type of the get_sock function, to pass it as parameter.
|
||||
*/
|
||||
typedef
|
||||
int
|
||||
(*get_sock_t)(const int, struct sockaddr *, const socklen_t);
|
||||
|
||||
/**
|
||||
* Type of the send_fd() function, so it can be passed as a parameter.
|
||||
*/
|
||||
typedef
|
||||
int
|
||||
(*send_fd_t)(const int, const int);
|
||||
|
||||
/**
|
||||
* \short Infinite loop parsing commands and returning the sockets.
|
||||
*
|
||||
* This reads commands and socket descriptions from the input_fd
|
||||
* file descriptor, creates sockets and writes the results (socket or
|
||||
* error) to output_fd.
|
||||
*
|
||||
* Current errors are:
|
||||
* - 1: Read error
|
||||
* - 2: Write error
|
||||
* - 3: Protocol error (unknown command, etc)
|
||||
* - 4: Some internal inconsistency detected
|
||||
*
|
||||
* It terminates either if a command asks it to or when unrecoverable
|
||||
* error happens.
|
||||
*
|
||||
* \return Like a return value of a main - 0 means everything OK, anything
|
||||
* else is error.
|
||||
* \param input_fd Here is where it reads the commads.
|
||||
* \param output_fd Here is where it writes the results.
|
||||
* \param get_sock_fun The function that is used to create the sockets.
|
||||
* This should be left on the default value, the parameter is here
|
||||
* for testing purposes.
|
||||
* \param send_fd_fun The function that is used to send the socket over
|
||||
* a file descriptor. This should be left on the default value, it is
|
||||
* here for testing purposes.
|
||||
*/
|
||||
int
|
||||
run(const int input_fd, const int output_fd,
|
||||
const get_sock_t get_sock_fun = get_sock,
|
||||
const send_fd_t send_fd_fun = isc::util::io::send_fd);
|
||||
|
||||
} // End of the namespaces
|
||||
}
|
||||
|
||||
#endif // __SOCKCREATOR_H
|
25
src/bin/sockcreator/tests/Makefile.am
Normal file
25
src/bin/sockcreator/tests/Makefile.am
Normal file
@ -0,0 +1,25 @@
|
||||
CLEANFILES = *.gcno *.gcda
|
||||
|
||||
AM_CPPFLAGS = -I$(top_srcdir)/src/lib -I$(top_builddir)/src/lib
|
||||
AM_CXXFLAGS = $(B10_CXXFLAGS)
|
||||
|
||||
if USE_STATIC_LINK
|
||||
AM_LDFLAGS = -static
|
||||
endif
|
||||
|
||||
TESTS =
|
||||
if HAVE_GTEST
|
||||
TESTS += run_unittests
|
||||
run_unittests_SOURCES = ../sockcreator.cc ../sockcreator.h
|
||||
run_unittests_SOURCES += sockcreator_tests.cc
|
||||
run_unittests_SOURCES += run_unittests.cc
|
||||
|
||||
run_unittests_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_INCLUDES)
|
||||
run_unittests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS)
|
||||
run_unittests_LDADD = $(GTEST_LDADD)
|
||||
run_unittests_LDADD += $(top_builddir)/src/lib/util/io/libutil_io.la
|
||||
run_unittests_LDADD += \
|
||||
$(top_builddir)/src/lib/util/unittests/libutil_unittests.la
|
||||
endif
|
||||
|
||||
noinst_PROGRAMS = $(TESTS)
|
22
src/bin/sockcreator/tests/run_unittests.cc
Normal file
22
src/bin/sockcreator/tests/run_unittests.cc
Normal file
@ -0,0 +1,22 @@
|
||||
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
|
||||
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
// AND FITNESS. IN NO EVENT SHALL ISC 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.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
int
|
||||
main(int argc, char *argv[]) {
|
||||
::testing::InitGoogleTest(&argc, argv);
|
||||
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
273
src/bin/sockcreator/tests/sockcreator_tests.cc
Normal file
273
src/bin/sockcreator/tests/sockcreator_tests.cc
Normal file
@ -0,0 +1,273 @@
|
||||
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
|
||||
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
// AND FITNESS. IN NO EVENT SHALL ISC 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.
|
||||
|
||||
#include "../sockcreator.h"
|
||||
|
||||
#include <util/unittests/fork.h>
|
||||
#include <util/io/fd.h>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <unistd.h>
|
||||
#include <cstring>
|
||||
#include <cerrno>
|
||||
|
||||
using namespace isc::socket_creator;
|
||||
using namespace isc::util::unittests;
|
||||
using namespace isc::util::io;
|
||||
|
||||
namespace {
|
||||
|
||||
/*
|
||||
* Generic version of the creation of socket test. It just tries to
|
||||
* create the socket and checks the result is not negative (eg.
|
||||
* it is valid descriptor) and that it can listen.
|
||||
*
|
||||
* This is a macro so ASSERT_* does abort the TEST, not just the
|
||||
* function inside.
|
||||
*/
|
||||
#define TEST_ANY_CREATE(SOCK_TYPE, ADDR_TYPE, ADDR_FAMILY, FAMILY_FIELD, \
|
||||
ADDR_SET, CHECK_SOCK) \
|
||||
do { \
|
||||
/*
|
||||
* This should create an address that binds on all interfaces
|
||||
* and lets the OS choose a free port.
|
||||
*/ \
|
||||
struct ADDR_TYPE addr; \
|
||||
memset(&addr, 0, sizeof addr); \
|
||||
ADDR_SET(addr); \
|
||||
addr.FAMILY_FIELD = ADDR_FAMILY; \
|
||||
struct sockaddr *addr_ptr = static_cast<struct sockaddr *>( \
|
||||
static_cast<void *>(&addr)); \
|
||||
\
|
||||
int socket = get_sock(SOCK_TYPE, addr_ptr, sizeof addr); \
|
||||
/* Provide even nice error message. */ \
|
||||
ASSERT_GE(socket, 0) << "Couldn't create a socket of type " \
|
||||
#SOCK_TYPE " and family " #ADDR_FAMILY ", failed with " \
|
||||
<< socket << " and error " << strerror(errno); \
|
||||
CHECK_SOCK(ADDR_TYPE, socket); \
|
||||
EXPECT_EQ(0, close(socket)); \
|
||||
} while (0)
|
||||
|
||||
// Just helper macros
|
||||
#define INADDR_SET(WHAT) do { WHAT.sin_addr.s_addr = INADDR_ANY; } while (0)
|
||||
#define IN6ADDR_SET(WHAT) do { WHAT.sin6_addr = in6addr_loopback; } while (0)
|
||||
// If the get_sock returned something useful, listen must work
|
||||
#define TCP_CHECK(UNUSED, SOCKET) do { \
|
||||
EXPECT_EQ(0, listen(SOCKET, 1)); \
|
||||
} while (0)
|
||||
// More complicated with UDP, so we send a packet to ourselfs and se if it
|
||||
// arrives
|
||||
#define UDP_CHECK(ADDR_TYPE, SOCKET) do { \
|
||||
struct ADDR_TYPE addr; \
|
||||
memset(&addr, 0, sizeof addr); \
|
||||
struct sockaddr *addr_ptr = static_cast<struct sockaddr *>( \
|
||||
static_cast<void *>(&addr)); \
|
||||
\
|
||||
socklen_t len = sizeof addr; \
|
||||
ASSERT_EQ(0, getsockname(SOCKET, addr_ptr, &len)); \
|
||||
ASSERT_EQ(5, sendto(SOCKET, "test", 5, 0, addr_ptr, sizeof addr)) << \
|
||||
"Send failed with error " << strerror(errno) << " on socket " << \
|
||||
SOCKET; \
|
||||
char buffer[5]; \
|
||||
ASSERT_EQ(5, recv(SOCKET, buffer, 5, 0)) << \
|
||||
"Recv failed with error " << strerror(errno) << " on socket " << \
|
||||
SOCKET; \
|
||||
EXPECT_STREQ("test", buffer); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Several tests to ensure we can create the sockets.
|
||||
*/
|
||||
TEST(get_sock, udp4_create) {
|
||||
TEST_ANY_CREATE(SOCK_DGRAM, sockaddr_in, AF_INET, sin_family, INADDR_SET,
|
||||
UDP_CHECK);
|
||||
}
|
||||
|
||||
TEST(get_sock, tcp4_create) {
|
||||
TEST_ANY_CREATE(SOCK_STREAM, sockaddr_in, AF_INET, sin_family, INADDR_SET,
|
||||
TCP_CHECK);
|
||||
}
|
||||
|
||||
TEST(get_sock, udp6_create) {
|
||||
TEST_ANY_CREATE(SOCK_DGRAM, sockaddr_in6, AF_INET6, sin6_family,
|
||||
IN6ADDR_SET, UDP_CHECK);
|
||||
}
|
||||
|
||||
TEST(get_sock, tcp6_create) {
|
||||
TEST_ANY_CREATE(SOCK_STREAM, sockaddr_in6, AF_INET6, sin6_family,
|
||||
IN6ADDR_SET, TCP_CHECK);
|
||||
}
|
||||
|
||||
/*
|
||||
* Try to ask the get_sock function some nonsense and test if it
|
||||
* is able to report error.
|
||||
*/
|
||||
TEST(get_sock, fail_with_nonsense) {
|
||||
struct sockaddr addr;
|
||||
memset(&addr, 0, sizeof addr);
|
||||
ASSERT_LT(get_sock(0, &addr, sizeof addr), 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper functions to pass to run during testing.
|
||||
*/
|
||||
int
|
||||
get_sock_dummy(const int type, struct sockaddr *addr, const socklen_t)
|
||||
{
|
||||
int result(0);
|
||||
int port(0);
|
||||
/*
|
||||
* We encode the type and address family into the int and return it.
|
||||
* Lets ignore the port and address for now
|
||||
* First bit is 1 if it is known type. Second tells if TCP or UDP.
|
||||
* The familly is similar - third bit is known address family,
|
||||
* the fourth is the family.
|
||||
*/
|
||||
switch (type) {
|
||||
case SOCK_STREAM:
|
||||
result += 1;
|
||||
break;
|
||||
case SOCK_DGRAM:
|
||||
result += 3;
|
||||
break;
|
||||
}
|
||||
switch (addr->sa_family) {
|
||||
case AF_INET:
|
||||
result += 4;
|
||||
port = static_cast<struct sockaddr_in *>(
|
||||
static_cast<void *>(addr))->sin_port;
|
||||
break;
|
||||
case AF_INET6:
|
||||
result += 12;
|
||||
port = static_cast<struct sockaddr_in6 *>(
|
||||
static_cast<void *>(addr))->sin6_port;
|
||||
break;
|
||||
}
|
||||
/*
|
||||
* The port should be 0xffff. If it's not, we change the result.
|
||||
* The port of 0xbbbb means bind should fail and 0xcccc means
|
||||
* socket should fail.
|
||||
*/
|
||||
if (port != 0xffff) {
|
||||
errno = 0;
|
||||
if (port == 0xbbbb) {
|
||||
return -2;
|
||||
} else if (port == 0xcccc) {
|
||||
return -1;
|
||||
} else {
|
||||
result += 16;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
int
|
||||
send_fd_dummy(const int destination, const int what)
|
||||
{
|
||||
/*
|
||||
* Make sure it is 1 byte so we know the length. We do not use more during
|
||||
* the test anyway.
|
||||
*/
|
||||
char fd_data(what);
|
||||
if (!write_data(destination, &fd_data, 1)) {
|
||||
return -1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Generic test that it works, with various inputs and outputs.
|
||||
* It uses different functions to create the socket and send it and pass
|
||||
* data to it and check it returns correct data back, to see if the run()
|
||||
* parses the commands correctly.
|
||||
*/
|
||||
void run_test(const char *input_data, const size_t input_size,
|
||||
const char *output_data, const size_t output_size,
|
||||
bool should_succeed = true)
|
||||
{
|
||||
// Prepare the input feeder and output checker processes
|
||||
int input_fd(0), output_fd(0);
|
||||
pid_t input(provide_input(&input_fd, input_data, input_size)),
|
||||
output(check_output(&output_fd, output_data, output_size));
|
||||
ASSERT_NE(-1, input) << "Couldn't start input feeder";
|
||||
ASSERT_NE(-1, output) << "Couldn't start output checker";
|
||||
// Run the body
|
||||
int result(run(input_fd, output_fd, get_sock_dummy, send_fd_dummy));
|
||||
// Close the pipes
|
||||
close(input_fd);
|
||||
close(output_fd);
|
||||
// Did it run well?
|
||||
if (should_succeed) {
|
||||
EXPECT_EQ(0, result);
|
||||
} else {
|
||||
EXPECT_NE(0, result);
|
||||
}
|
||||
// Check the subprocesses say everything is OK too
|
||||
EXPECT_TRUE(process_ok(input));
|
||||
EXPECT_TRUE(process_ok(output));
|
||||
}
|
||||
|
||||
/*
|
||||
* Check it terminates successfully when asked to.
|
||||
*/
|
||||
TEST(run, terminate) {
|
||||
run_test("T", 1, NULL, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check it rejects incorrect input.
|
||||
*/
|
||||
TEST(run, bad_input) {
|
||||
run_test("XXX", 3, "FI", 2, false);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check it correctly parses queries to create sockets.
|
||||
*/
|
||||
TEST(run, sockets) {
|
||||
run_test(
|
||||
"SU4\xff\xff\0\0\0\0" // This has 9 bytes
|
||||
"ST4\xff\xff\0\0\0\0" // This has 9 bytes
|
||||
"ST6\xff\xff\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" // This has 21 bytes
|
||||
"SU6\xff\xff\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" // This has 21 bytes
|
||||
"T", 61,
|
||||
"S\x07S\x05S\x0dS\x0f", 8);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if failures of get_socket are handled correctly.
|
||||
*/
|
||||
TEST(run, bad_sockets) {
|
||||
// We need to construct the answer, but it depends on int length.
|
||||
size_t int_len(sizeof(int));
|
||||
size_t result_len(4 + 2 * int_len);
|
||||
char result[4 + sizeof(int) * 2];
|
||||
// Both errno parts should be 0
|
||||
memset(result, 0, result_len);
|
||||
// Fill the 2 control parts
|
||||
strcpy(result, "EB");
|
||||
strcpy(result + 2 + int_len, "ES");
|
||||
// Run the test
|
||||
run_test(
|
||||
"SU4\xbb\xbb\0\0\0\0"
|
||||
"SU4\xcc\xcc\0\0\0\0"
|
||||
"T", 19,
|
||||
result, result_len);
|
||||
}
|
||||
|
||||
}
|
@ -6,7 +6,7 @@ EXTRA_DIST = $(PYTESTS)
|
||||
# required by loadable python modules.
|
||||
LIBRARY_PATH_PLACEHOLDER =
|
||||
if SET_ENV_LIBRARY_PATH
|
||||
LIBRARY_PATH_PLACEHOLDER += $(ENV_LIBRARY_PATH)=$(abs_top_builddir)/src/lib/dns/.libs:$(abs_top_builddir)/src/lib/exceptions/.libs:$(abs_top_builddir)/src/lib/xfr/.libs:$$$(ENV_LIBRARY_PATH)
|
||||
LIBRARY_PATH_PLACEHOLDER += $(ENV_LIBRARY_PATH)=$(abs_top_builddir)/src/lib/dns/.libs:$(abs_top_builddir)/src/lib/exceptions/.libs:$(abs_top_builddir)/src/lib/util/io/.libs:$$$(ENV_LIBRARY_PATH)
|
||||
endif
|
||||
|
||||
# test using command-line arguments, so use check-local target instead of TESTS
|
||||
@ -18,7 +18,7 @@ if ENABLE_PYTHON_COVERAGE
|
||||
endif
|
||||
for pytest in $(PYTESTS) ; do \
|
||||
echo Running test: $$pytest ; \
|
||||
env PYTHONPATH=$(abs_top_builddir)/src/bin/xfrout:$(abs_top_srcdir)/src/lib/python:$(abs_top_builddir)/src/lib/python:$(abs_top_builddir)/src/lib/dns/python/.libs:$(abs_top_builddir)/src/lib/xfr/.libs \
|
||||
env PYTHONPATH=$(abs_top_builddir)/src/bin/xfrout:$(abs_top_srcdir)/src/lib/python:$(abs_top_builddir)/src/lib/python:$(abs_top_builddir)/src/lib/dns/python/.libs:$(abs_top_builddir)/src/lib/util/io/.libs \
|
||||
$(LIBRARY_PATH_PLACEHOLDER) \
|
||||
$(PYCOVERAGE_RUN) $(abs_srcdir)/$$pytest || exit ; \
|
||||
done
|
||||
|
@ -21,6 +21,7 @@ import os
|
||||
from isc.cc.session import *
|
||||
from pydnspp import *
|
||||
from xfrout import *
|
||||
import xfrout
|
||||
|
||||
# our fake socket, where we can read and insert messages
|
||||
class MySocket():
|
||||
@ -433,5 +434,36 @@ class TestUnixSockServer(unittest.TestCase):
|
||||
sys.stdout = old_stdout
|
||||
os.rmdir(dir_name)
|
||||
|
||||
class TestInitialization(unittest.TestCase):
|
||||
def setEnv(self, name, value):
|
||||
if value is None:
|
||||
if name in os.environ:
|
||||
del os.environ[name]
|
||||
else:
|
||||
os.environ[name] = value
|
||||
|
||||
def setUp(self):
|
||||
self._oldSocket = os.getenv("BIND10_XFROUT_SOCKET_FILE")
|
||||
self._oldFromBuild = os.getenv("B10_FROM_BUILD")
|
||||
|
||||
def tearDown(self):
|
||||
self.setEnv("B10_FROM_BUILD", self._oldFromBuild)
|
||||
self.setEnv("BIND10_XFROUT_SOCKET_FILE", self._oldSocket)
|
||||
# Make sure even the computed values are back
|
||||
xfrout.init_paths()
|
||||
|
||||
def testNoEnv(self):
|
||||
self.setEnv("B10_FROM_BUILD", None)
|
||||
self.setEnv("BIND10_XFROUT_SOCKET_FILE", None)
|
||||
xfrout.init_paths()
|
||||
self.assertEqual(xfrout.UNIX_SOCKET_FILE,
|
||||
"@@LOCALSTATEDIR@@/auth_xfrout_conn")
|
||||
|
||||
def testProvidedSocket(self):
|
||||
self.setEnv("B10_FROM_BUILD", None)
|
||||
self.setEnv("BIND10_XFROUT_SOCKET_FILE", "The/Socket/File")
|
||||
xfrout.init_paths()
|
||||
self.assertEqual(xfrout.UNIX_SOCKET_FILE, "The/Socket/File")
|
||||
|
||||
if __name__== "__main__":
|
||||
unittest.main()
|
@ -37,29 +37,38 @@ from optparse import OptionParser, OptionValueError
|
||||
from isc.util import socketserver_mixin
|
||||
|
||||
try:
|
||||
from libxfr_python import *
|
||||
from libutil_io_python import *
|
||||
from pydnspp import *
|
||||
except ImportError as e:
|
||||
# C++ loadable module may not be installed; even so the xfrout process
|
||||
# must keep running, so we warn about it and move forward.
|
||||
sys.stderr.write('[b10-xfrout] failed to import DNS or XFR module: %s\n' % str(e))
|
||||
sys.stderr.write('[b10-xfrout] failed to import DNS or isc.util.io module: %s\n' % str(e))
|
||||
|
||||
isc.util.process.rename()
|
||||
|
||||
if "B10_FROM_BUILD" in os.environ:
|
||||
SPECFILE_PATH = os.environ["B10_FROM_BUILD"] + "/src/bin/xfrout"
|
||||
AUTH_SPECFILE_PATH = os.environ["B10_FROM_BUILD"] + "/src/bin/auth"
|
||||
if "B10_FROM_SOURCE_LOCALSTATEDIR" in os.environ:
|
||||
UNIX_SOCKET_FILE = os.environ["B10_FROM_SOURCE_LOCALSTATEDIR"] + \
|
||||
"/auth_xfrout_conn"
|
||||
def init_paths():
|
||||
global SPECFILE_PATH
|
||||
global AUTH_SPECFILE_PATH
|
||||
global UNIX_SOCKET_FILE
|
||||
if "B10_FROM_BUILD" in os.environ:
|
||||
SPECFILE_PATH = os.environ["B10_FROM_BUILD"] + "/src/bin/xfrout"
|
||||
AUTH_SPECFILE_PATH = os.environ["B10_FROM_BUILD"] + "/src/bin/auth"
|
||||
if "B10_FROM_SOURCE_LOCALSTATEDIR" in os.environ:
|
||||
UNIX_SOCKET_FILE = os.environ["B10_FROM_SOURCE_LOCALSTATEDIR"] + \
|
||||
"/auth_xfrout_conn"
|
||||
else:
|
||||
UNIX_SOCKET_FILE = os.environ["B10_FROM_BUILD"] + "/auth_xfrout_conn"
|
||||
else:
|
||||
UNIX_SOCKET_FILE = os.environ["B10_FROM_BUILD"] + "/auth_xfrout_conn"
|
||||
else:
|
||||
PREFIX = "@prefix@"
|
||||
DATAROOTDIR = "@datarootdir@"
|
||||
SPECFILE_PATH = "@datadir@/@PACKAGE@".replace("${datarootdir}", DATAROOTDIR).replace("${prefix}", PREFIX)
|
||||
AUTH_SPECFILE_PATH = SPECFILE_PATH
|
||||
UNIX_SOCKET_FILE = "@@LOCALSTATEDIR@@/auth_xfrout_conn"
|
||||
PREFIX = "@prefix@"
|
||||
DATAROOTDIR = "@datarootdir@"
|
||||
SPECFILE_PATH = "@datadir@/@PACKAGE@".replace("${datarootdir}", DATAROOTDIR).replace("${prefix}", PREFIX)
|
||||
AUTH_SPECFILE_PATH = SPECFILE_PATH
|
||||
if "BIND10_XFROUT_SOCKET_FILE" in os.environ:
|
||||
UNIX_SOCKET_FILE = os.environ["BIND10_XFROUT_SOCKET_FILE"]
|
||||
else:
|
||||
UNIX_SOCKET_FILE = "@@LOCALSTATEDIR@@/auth_xfrout_conn"
|
||||
|
||||
init_paths()
|
||||
|
||||
SPECFILE_LOCATION = SPECFILE_PATH + "/xfrout.spec"
|
||||
AUTH_SPECFILE_LOCATION = AUTH_SPECFILE_PATH + os.sep + "auth.spec"
|
||||
@ -376,7 +385,7 @@ class UnixSockServer(socketserver_mixin.NoPollMixIn, ThreadingUnixStreamServer):
|
||||
# This may happen when one xfrout process try to connect to
|
||||
# xfrout unix socket server, to check whether there is another
|
||||
# xfrout running.
|
||||
if sock_fd == XFR_FD_RECEIVE_FAIL:
|
||||
if sock_fd == FD_COMM_ERROR:
|
||||
self._log.log_message("error", "Failed to receive the file descriptor for XFR connection")
|
||||
return
|
||||
|
||||
|
@ -1,2 +1,2 @@
|
||||
SUBDIRS = exceptions dns cc config python xfr bench log asiolink \
|
||||
SUBDIRS = exceptions dns cc config util python xfr bench log asiolink \
|
||||
asiodns nsas cache resolve testutils datasrc server_common
|
||||
|
@ -398,7 +398,7 @@ TEST_F(RBTreeTest, getLastComparedNode) {
|
||||
EXPECT_EQ(static_cast<void*>(NULL), chain.getLastComparedNode());
|
||||
chain.clear();
|
||||
|
||||
const RBNode<int>* expected_node;
|
||||
const RBNode<int>* expected_node = NULL;
|
||||
|
||||
// Exact match case. The returned node should be last compared.
|
||||
EXPECT_EQ(RBTree<int>::EXACTMATCH,
|
||||
|
@ -15,6 +15,8 @@
|
||||
#ifndef __BUFFER_H
|
||||
#define __BUFFER_H 1
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <cstring>
|
||||
#include <vector>
|
||||
|
||||
#include <string.h>
|
||||
@ -286,15 +288,58 @@ public:
|
||||
/// \brief Constructor from the initial size of the buffer.
|
||||
///
|
||||
/// \param len The initial length of the buffer in bytes.
|
||||
OutputBuffer(size_t len) { data_.reserve(len); }
|
||||
OutputBuffer(size_t len) :
|
||||
buffer_(NULL),
|
||||
size_(0),
|
||||
allocated_(len)
|
||||
{
|
||||
// We use malloc and free instead of C++ new[] and delete[].
|
||||
// This way we can use realloc, which may in fact do it without a copy.
|
||||
buffer_ = static_cast<uint8_t*>(malloc(allocated_));
|
||||
if (buffer_ == NULL && len != 0) {
|
||||
throw std::bad_alloc();
|
||||
}
|
||||
}
|
||||
|
||||
/// \brief Copy constructor
|
||||
OutputBuffer(const OutputBuffer& other) :
|
||||
buffer_(NULL),
|
||||
size_(other.size_),
|
||||
allocated_(other.allocated_)
|
||||
{
|
||||
buffer_ = static_cast<uint8_t*>(malloc(allocated_));
|
||||
if (buffer_ == NULL && allocated_ != 0) {
|
||||
throw std::bad_alloc();
|
||||
}
|
||||
memcpy(buffer_, other.buffer_, size_);
|
||||
}
|
||||
|
||||
/// \brief Destructor
|
||||
~ OutputBuffer() {
|
||||
free(buffer_);
|
||||
}
|
||||
//@}
|
||||
|
||||
/// \brief Assignment operator
|
||||
OutputBuffer& operator =(const OutputBuffer& other) {
|
||||
uint8_t* newbuff(static_cast<uint8_t*>(malloc(other.allocated_)));
|
||||
if (newbuff == NULL && other.allocated_ != 0) {
|
||||
throw std::bad_alloc();
|
||||
}
|
||||
free(buffer_);
|
||||
buffer_ = newbuff;
|
||||
size_ = other.size_;
|
||||
allocated_ = other.allocated_;
|
||||
memcpy(buffer_, other.buffer_, size_);
|
||||
return (*this);
|
||||
}
|
||||
|
||||
///
|
||||
/// \name Getter Methods
|
||||
///
|
||||
//@{
|
||||
/// \brief Return the current capacity of the buffer.
|
||||
size_t getCapacity() const { return (data_.capacity()); }
|
||||
size_t getCapacity() const { return (allocated_); }
|
||||
/// \brief Return a pointer to the head of the data stored in the buffer.
|
||||
///
|
||||
/// The caller can assume that the subsequent \c getLength() bytes are
|
||||
@ -302,21 +347,21 @@ public:
|
||||
///
|
||||
/// Note: The pointer returned by this method may be invalidated after a
|
||||
/// subsequent write operation.
|
||||
const void* getData() const { return (&data_[0]); }
|
||||
const void* getData() const { return (buffer_); }
|
||||
/// \brief Return the length of data written in the buffer.
|
||||
size_t getLength() const { return (data_.size()); }
|
||||
size_t getLength() const { return (size_); }
|
||||
/// \brief Return the value of the buffer at the specified position.
|
||||
///
|
||||
/// \c pos must specify the valid position of the buffer; otherwise an
|
||||
/// exception class of \c InvalidBufferPosition will be thrown.
|
||||
///
|
||||
/// \param pos The position in the buffer to be returned.
|
||||
const uint8_t& operator[](size_t pos) const
|
||||
uint8_t operator[](size_t pos) const
|
||||
{
|
||||
if (pos >= data_.size()) {
|
||||
if (pos >= size_) {
|
||||
isc_throw(InvalidBufferPosition, "read at invalid position");
|
||||
}
|
||||
return (data_[pos]);
|
||||
return (buffer_[pos]);
|
||||
}
|
||||
//@}
|
||||
|
||||
@ -330,7 +375,10 @@ public:
|
||||
/// This method is provided as a shortcut to make a hole in the buffer
|
||||
/// that is to be filled in later, e.g, by \ref writeUint16At().
|
||||
/// \param len The length of the gap to be inserted in bytes.
|
||||
void skip(size_t len) { data_.insert(data_.end(), len, 0); }
|
||||
void skip(size_t len) {
|
||||
ensureAllocated(size_ + len);
|
||||
size_ += len;
|
||||
}
|
||||
|
||||
/// \brief Trim the specified length of data from the end of the buffer.
|
||||
///
|
||||
@ -341,20 +389,23 @@ public:
|
||||
/// \param len The length of data that should be trimmed.
|
||||
void trim(size_t len)
|
||||
{
|
||||
if (len > data_.size()) {
|
||||
if (len > size_) {
|
||||
isc_throw(OutOfRange, "trimming too large from output buffer");
|
||||
}
|
||||
data_.resize(data_.size() - len);
|
||||
size_ -= len;
|
||||
}
|
||||
/// \brief Clear buffer content.
|
||||
///
|
||||
/// This method can be used to re-initialize and reuse the buffer without
|
||||
/// constructing a new one.
|
||||
void clear() { data_.clear(); }
|
||||
void clear() { size_ = 0; }
|
||||
/// \brief Write an unsigned 8-bit integer into the buffer.
|
||||
///
|
||||
/// \param data The 8-bit integer to be written into the buffer.
|
||||
void writeUint8(uint8_t data) { data_.push_back(data); }
|
||||
void writeUint8(uint8_t data) {
|
||||
ensureAllocated(size_ + 1);
|
||||
buffer_[size_ ++] = data;
|
||||
}
|
||||
|
||||
/// \brief Write an unsigned 8-bit integer into the buffer.
|
||||
///
|
||||
@ -365,10 +416,10 @@ public:
|
||||
/// \param data The 8-bit integer to be written into the buffer.
|
||||
/// \param pos The position in the buffer to write the data.
|
||||
void writeUint8At(uint8_t data, size_t pos) {
|
||||
if (pos + sizeof(data) > data_.size()) {
|
||||
if (pos + sizeof(data) > size_) {
|
||||
isc_throw(InvalidBufferPosition, "write at invalid position");
|
||||
}
|
||||
data_[pos] = data;
|
||||
buffer_[pos] = data;
|
||||
}
|
||||
|
||||
/// \brief Write an unsigned 16-bit integer in host byte order into the
|
||||
@ -377,8 +428,9 @@ public:
|
||||
/// \param data The 16-bit integer to be written into the buffer.
|
||||
void writeUint16(uint16_t data)
|
||||
{
|
||||
data_.push_back(static_cast<uint8_t>((data & 0xff00U) >> 8));
|
||||
data_.push_back(static_cast<uint8_t>(data & 0x00ffU));
|
||||
ensureAllocated(size_ + sizeof(data));
|
||||
buffer_[size_ ++] = static_cast<uint8_t>((data & 0xff00U) >> 8);
|
||||
buffer_[size_ ++] = static_cast<uint8_t>(data & 0x00ffU);
|
||||
}
|
||||
/// \brief Write an unsigned 16-bit integer in host byte order at the
|
||||
/// specified position of the buffer in network byte order.
|
||||
@ -393,12 +445,12 @@ public:
|
||||
/// \param pos The beginning position in the buffer to write the data.
|
||||
void writeUint16At(uint16_t data, size_t pos)
|
||||
{
|
||||
if (pos + sizeof(data) > data_.size()) {
|
||||
if (pos + sizeof(data) > size_) {
|
||||
isc_throw(InvalidBufferPosition, "write at invalid position");
|
||||
}
|
||||
|
||||
data_[pos] = static_cast<uint8_t>((data & 0xff00U) >> 8);
|
||||
data_[pos + 1] = static_cast<uint8_t>(data & 0x00ffU);
|
||||
buffer_[pos] = static_cast<uint8_t>((data & 0xff00U) >> 8);
|
||||
buffer_[pos + 1] = static_cast<uint8_t>(data & 0x00ffU);
|
||||
}
|
||||
/// \brief Write an unsigned 32-bit integer in host byte order
|
||||
/// into the buffer in network byte order.
|
||||
@ -406,10 +458,11 @@ public:
|
||||
/// \param data The 32-bit integer to be written into the buffer.
|
||||
void writeUint32(uint32_t data)
|
||||
{
|
||||
data_.push_back(static_cast<uint8_t>((data & 0xff000000) >> 24));
|
||||
data_.push_back(static_cast<uint8_t>((data & 0x00ff0000) >> 16));
|
||||
data_.push_back(static_cast<uint8_t>((data & 0x0000ff00) >> 8));
|
||||
data_.push_back(static_cast<uint8_t>(data & 0x000000ff));
|
||||
ensureAllocated(size_ + sizeof(data));
|
||||
buffer_[size_ ++] = static_cast<uint8_t>((data & 0xff000000) >> 24);
|
||||
buffer_[size_ ++] = static_cast<uint8_t>((data & 0x00ff0000) >> 16);
|
||||
buffer_[size_ ++] = static_cast<uint8_t>((data & 0x0000ff00) >> 8);
|
||||
buffer_[size_ ++] = static_cast<uint8_t>(data & 0x000000ff);
|
||||
}
|
||||
/// \brief Copy an arbitrary length of data into the buffer.
|
||||
///
|
||||
@ -419,13 +472,38 @@ public:
|
||||
/// \param len The length of the data in bytes.
|
||||
void writeData(const void *data, size_t len)
|
||||
{
|
||||
const uint8_t* cp = static_cast<const uint8_t*>(data);
|
||||
data_.insert(data_.end(), cp, cp + len);
|
||||
ensureAllocated(size_ + len);
|
||||
memcpy(buffer_ + size_, data, len);
|
||||
size_ += len;
|
||||
}
|
||||
//@}
|
||||
|
||||
|
||||
private:
|
||||
std::vector<uint8_t> data_;
|
||||
// The actual data
|
||||
uint8_t* buffer_;
|
||||
// How many bytes are used
|
||||
size_t size_;
|
||||
// How many bytes do we have preallocated (eg. the capacity)
|
||||
size_t allocated_;
|
||||
// Make sure at last needed_size bytes are allocated in the buffer
|
||||
void ensureAllocated(size_t needed_size) {
|
||||
if (allocated_ < needed_size) {
|
||||
// Guess some bigger size
|
||||
size_t new_size = (allocated_ == 0) ? 1024 : allocated_;
|
||||
while (new_size < needed_size) {
|
||||
new_size *= 2;
|
||||
}
|
||||
// Allocate bigger space
|
||||
uint8_t* new_buffer_(static_cast<uint8_t*>(realloc(buffer_,
|
||||
new_size)));
|
||||
if (new_buffer_ == NULL) {
|
||||
// If it fails, the original block is left intact by it
|
||||
throw std::bad_alloc();
|
||||
}
|
||||
buffer_ = new_buffer_;
|
||||
allocated_ = new_size;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/// \brief Pointer-like types pointing to \c InputBuffer or \c OutputBuffer
|
||||
|
@ -297,12 +297,15 @@ EDNS_getUDPSize(const s_EDNS* const self) {
|
||||
|
||||
PyObject*
|
||||
EDNS_setUDPSize(s_EDNS* self, PyObject* args) {
|
||||
unsigned int size;
|
||||
if (!PyArg_ParseTuple(args, "I", &size)) {
|
||||
long size;
|
||||
if (!PyArg_ParseTuple(args, "l", &size)) {
|
||||
PyErr_Clear();
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"No valid type in set_udp_size argument");
|
||||
return (NULL);
|
||||
}
|
||||
if (size > 65535) {
|
||||
PyErr_SetString(PyExc_OverflowError,
|
||||
if (size < 0 || size > 0xffff) {
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"UDP size is not an unsigned 16-bit integer");
|
||||
return (NULL);
|
||||
}
|
||||
|
@ -226,9 +226,9 @@ static PyTypeObject message_type = {
|
||||
|
||||
static int
|
||||
Message_init(s_Message* self, PyObject* args) {
|
||||
unsigned int i;
|
||||
|
||||
if (PyArg_ParseTuple(args, "I", &i)) {
|
||||
int i;
|
||||
|
||||
if (PyArg_ParseTuple(args, "i", &i)) {
|
||||
PyErr_Clear();
|
||||
if (i == Message::PARSE) {
|
||||
self->message = new Message(Message::PARSE);
|
||||
@ -274,17 +274,17 @@ Message_getHeaderFlag(s_Message* self, PyObject* args) {
|
||||
|
||||
static PyObject*
|
||||
Message_setHeaderFlag(s_Message* self, PyObject* args) {
|
||||
int messageflag;
|
||||
long messageflag;
|
||||
PyObject *on = Py_True;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "i|O!", &messageflag, &PyBool_Type, &on)) {
|
||||
if (!PyArg_ParseTuple(args, "l|O!", &messageflag, &PyBool_Type, &on)) {
|
||||
PyErr_Clear();
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"no valid type in set_header_flag argument");
|
||||
return (NULL);
|
||||
}
|
||||
if (messageflag < 0) {
|
||||
PyErr_SetString(PyExc_TypeError, "invalid Message header flag");
|
||||
if (messageflag < 0 || messageflag > 0xffff) {
|
||||
PyErr_SetString(PyExc_ValueError, "Message header flag out of range");
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@ -310,10 +310,19 @@ Message_getQid(s_Message* self) {
|
||||
|
||||
static PyObject*
|
||||
Message_setQid(s_Message* self, PyObject* args) {
|
||||
uint16_t id;
|
||||
if (!PyArg_ParseTuple(args, "H", &id)) {
|
||||
long id;
|
||||
if (!PyArg_ParseTuple(args, "l", &id)) {
|
||||
PyErr_Clear();
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"no valid type in set_qid argument");
|
||||
return (NULL);
|
||||
}
|
||||
if (id < 0 || id > 0xffff) {
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"Message id out of range");
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
try {
|
||||
self->message->setQid(id);
|
||||
Py_RETURN_NONE;
|
||||
@ -565,9 +574,9 @@ Message_addQuestion(s_Message* self, PyObject* args) {
|
||||
static PyObject*
|
||||
Message_addRRset(s_Message* self, PyObject* args) {
|
||||
PyObject *sign = Py_False;
|
||||
unsigned int section;
|
||||
int section;
|
||||
s_RRset* rrset;
|
||||
if (!PyArg_ParseTuple(args, "IO!|O!", §ion, &rrset_type, &rrset,
|
||||
if (!PyArg_ParseTuple(args, "iO!|O!", §ion, &rrset_type, &rrset,
|
||||
&PyBool_Type, &sign)) {
|
||||
return (NULL);
|
||||
}
|
||||
@ -591,8 +600,8 @@ Message_addRRset(s_Message* self, PyObject* args) {
|
||||
|
||||
static PyObject*
|
||||
Message_clear(s_Message* self, PyObject* args) {
|
||||
unsigned int i;
|
||||
if (PyArg_ParseTuple(args, "I", &i)) {
|
||||
int i;
|
||||
if (PyArg_ParseTuple(args, "i", &i)) {
|
||||
PyErr_Clear();
|
||||
if (i == Message::PARSE) {
|
||||
self->message->clear(Message::PARSE);
|
||||
|
@ -178,8 +178,16 @@ static PyObject*
|
||||
MessageRenderer_setLengthLimit(s_MessageRenderer* self,
|
||||
PyObject* args)
|
||||
{
|
||||
unsigned int lengthlimit;
|
||||
if (!PyArg_ParseTuple(args, "I", &lengthlimit)) {
|
||||
long lengthlimit;
|
||||
if (!PyArg_ParseTuple(args, "l", &lengthlimit)) {
|
||||
PyErr_Clear();
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"No valid type in set_length_limit argument");
|
||||
return (NULL);
|
||||
}
|
||||
if (lengthlimit < 0) {
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"MessageRenderer length limit out of range");
|
||||
return (NULL);
|
||||
}
|
||||
self->messagerenderer->setLengthLimit(lengthlimit);
|
||||
@ -190,8 +198,8 @@ static PyObject*
|
||||
MessageRenderer_setCompressMode(s_MessageRenderer* self,
|
||||
PyObject* args)
|
||||
{
|
||||
unsigned int mode;
|
||||
if (!PyArg_ParseTuple(args, "I", &mode)) {
|
||||
int mode;
|
||||
if (!PyArg_ParseTuple(args, "i", &mode)) {
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
@ -321,14 +321,20 @@ Name_init(s_Name* self, PyObject* args) {
|
||||
PyObject* bytes_obj;
|
||||
const char* bytes;
|
||||
Py_ssize_t len;
|
||||
unsigned int position = 0;
|
||||
long position = 0;
|
||||
|
||||
// It was not a string (see comment above), so try bytes, and
|
||||
// create with buffer object
|
||||
if (PyArg_ParseTuple(args, "O|IO!", &bytes_obj, &position,
|
||||
if (PyArg_ParseTuple(args, "O|lO!", &bytes_obj, &position,
|
||||
&PyBool_Type, &downcase) &&
|
||||
PyObject_AsCharBuffer(bytes_obj, &bytes, &len) != -1) {
|
||||
try {
|
||||
if (position < 0) {
|
||||
// Throw IndexError here since name index should be unsigned
|
||||
PyErr_SetString(PyExc_IndexError,
|
||||
"Name index shouldn't be negative");
|
||||
return (-1);
|
||||
}
|
||||
InputBuffer buffer(bytes, len);
|
||||
|
||||
buffer.setPosition(position);
|
||||
@ -363,10 +369,17 @@ Name_destroy(s_Name* self) {
|
||||
|
||||
static PyObject*
|
||||
Name_at(s_Name* self, PyObject* args) {
|
||||
unsigned int pos;
|
||||
if (!PyArg_ParseTuple(args, "I", &pos)) {
|
||||
int pos;
|
||||
if (!PyArg_ParseTuple(args, "i", &pos)) {
|
||||
return (NULL);
|
||||
}
|
||||
if (pos < 0) {
|
||||
// Throw IndexError here since name index should be unsigned
|
||||
PyErr_SetString(PyExc_IndexError,
|
||||
"name index shouldn't be negative");
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
try {
|
||||
return (Py_BuildValue("I", self->name->at(pos)));
|
||||
} catch (const isc::OutOfRange&) {
|
||||
@ -405,10 +418,10 @@ static PyObject*
|
||||
Name_toWire(s_Name* self, PyObject* args) {
|
||||
PyObject* bytes;
|
||||
s_MessageRenderer* mr;
|
||||
|
||||
|
||||
if (PyArg_ParseTuple(args, "O", &bytes) && PySequence_Check(bytes)) {
|
||||
PyObject* bytes_o = bytes;
|
||||
|
||||
|
||||
OutputBuffer buffer(Name::MAX_WIRE);
|
||||
self->name->toWire(buffer);
|
||||
PyObject* name_bytes = PyBytes_FromStringAndSize(static_cast<const char*>(buffer.getData()), buffer.getLength());
|
||||
@ -457,12 +470,18 @@ Name_equals(s_Name* self, PyObject* args) {
|
||||
Py_RETURN_FALSE;
|
||||
}
|
||||
|
||||
static PyObject*
|
||||
static PyObject*
|
||||
Name_split(s_Name* self, PyObject* args) {
|
||||
unsigned int first, n;
|
||||
int first, n;
|
||||
s_Name* ret = NULL;
|
||||
|
||||
if (PyArg_ParseTuple(args, "II", &first, &n)) {
|
||||
|
||||
if (PyArg_ParseTuple(args, "ii", &first, &n)) {
|
||||
if (first < 0 || n < 0) {
|
||||
// Throw IndexError here since name index should be unsigned
|
||||
PyErr_SetString(PyExc_IndexError,
|
||||
"name index shouldn't be negative");
|
||||
return (NULL);
|
||||
}
|
||||
ret = PyObject_New(s_Name, &name_type);
|
||||
if (ret != NULL) {
|
||||
ret->name = NULL;
|
||||
@ -477,7 +496,14 @@ Name_split(s_Name* self, PyObject* args) {
|
||||
return (NULL);
|
||||
}
|
||||
}
|
||||
} else if (PyArg_ParseTuple(args, "I", &n)) {
|
||||
} else if (PyArg_ParseTuple(args, "i", &n)) {
|
||||
PyErr_Clear();
|
||||
if (n < 0) {
|
||||
// Throw IndexError here since name index should be unsigned
|
||||
PyErr_SetString(PyExc_IndexError,
|
||||
"name index shouldn't be negative");
|
||||
return (NULL);
|
||||
}
|
||||
ret = PyObject_New(s_Name, &name_type);
|
||||
if (ret != NULL) {
|
||||
ret->name = NULL;
|
||||
@ -493,6 +519,10 @@ Name_split(s_Name* self, PyObject* args) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PyErr_Clear();
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"No valid type in split argument");
|
||||
return (ret);
|
||||
}
|
||||
#include <iostream>
|
||||
@ -502,7 +532,7 @@ Name_split(s_Name* self, PyObject* args) {
|
||||
// It is translated to a function that gets 3 arguments, an object,
|
||||
// an object to compare to, and an operator.
|
||||
//
|
||||
static PyObject*
|
||||
static PyObject*
|
||||
Name_richcmp(s_Name* self, s_Name* other, int op) {
|
||||
bool c;
|
||||
|
||||
|
@ -169,7 +169,7 @@ Question_init(s_Question* self, PyObject* args) {
|
||||
}
|
||||
|
||||
self->question = QuestionPtr();
|
||||
|
||||
|
||||
PyErr_Clear();
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"no valid type in constructor argument");
|
||||
|
@ -171,18 +171,18 @@ PyTypeObject rcode_type = {
|
||||
|
||||
int
|
||||
Rcode_init(s_Rcode* const self, PyObject* args) {
|
||||
int code = 0;
|
||||
long code = 0;
|
||||
int ext_code = 0;
|
||||
|
||||
if (PyArg_ParseTuple(args, "i", &code)) {
|
||||
if (PyArg_ParseTuple(args, "l", &code)) {
|
||||
if (code < 0 || code > 0xffff) {
|
||||
PyErr_SetString(PyExc_OverflowError, "Rcode out of range");
|
||||
PyErr_SetString(PyExc_ValueError, "Rcode out of range");
|
||||
return (-1);
|
||||
}
|
||||
ext_code = -1;
|
||||
} else if (PyArg_ParseTuple(args, "ii", &code, &ext_code)) {
|
||||
} else if (PyArg_ParseTuple(args, "li", &code, &ext_code)) {
|
||||
if (code < 0 || code > 0xff || ext_code < 0 || ext_code > 0xff) {
|
||||
PyErr_SetString(PyExc_OverflowError, "Rcode out of range");
|
||||
PyErr_SetString(PyExc_ValueError, "Rcode out of range");
|
||||
return (-1);
|
||||
}
|
||||
} else {
|
||||
|
@ -152,7 +152,7 @@ static PyTypeObject rrclass_type = {
|
||||
static int
|
||||
RRClass_init(s_RRClass* self, PyObject* args) {
|
||||
const char* s;
|
||||
unsigned int i;
|
||||
long i;
|
||||
PyObject* bytes = NULL;
|
||||
// The constructor argument can be a string ("IN"), an integer (1),
|
||||
// or a sequence of numbers between 0 and 65535 (wire code)
|
||||
@ -165,10 +165,11 @@ RRClass_init(s_RRClass* self, PyObject* args) {
|
||||
if (PyArg_ParseTuple(args, "s", &s)) {
|
||||
self->rrclass = new RRClass(s);
|
||||
return (0);
|
||||
} else if (PyArg_ParseTuple(args, "I", &i)) {
|
||||
PyErr_Clear();
|
||||
if (i > 65535) {
|
||||
PyErr_SetString(po_InvalidRRClass, "RR class number too high");
|
||||
} else if (PyArg_ParseTuple(args, "l", &i)) {
|
||||
if (i < 0 || i > 0xffff) {
|
||||
PyErr_Clear();
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"RR class number out of range");
|
||||
return (-1);
|
||||
}
|
||||
self->rrclass = new RRClass(i);
|
||||
|
@ -145,7 +145,7 @@ static PyTypeObject rrttl_type = {
|
||||
static int
|
||||
RRTTL_init(s_RRTTL* self, PyObject* args) {
|
||||
const char* s;
|
||||
unsigned long i;
|
||||
long long i;
|
||||
PyObject* bytes = NULL;
|
||||
// The constructor argument can be a string ("1234"), an integer (1),
|
||||
// or a sequence of numbers between 0 and 255 (wire code)
|
||||
@ -158,8 +158,12 @@ RRTTL_init(s_RRTTL* self, PyObject* args) {
|
||||
if (PyArg_ParseTuple(args, "s", &s)) {
|
||||
self->rrttl = new RRTTL(s);
|
||||
return (0);
|
||||
} else if (PyArg_ParseTuple(args, "I", &i)) {
|
||||
} else if (PyArg_ParseTuple(args, "L", &i)) {
|
||||
PyErr_Clear();
|
||||
if (i < 0 || i > 0xffffffff) {
|
||||
PyErr_SetString(PyExc_ValueError, "RR TTL number out of range");
|
||||
return (-1);
|
||||
}
|
||||
self->rrttl = new RRTTL(i);
|
||||
return (0);
|
||||
} else if (PyArg_ParseTuple(args, "O", &bytes) &&
|
||||
|
@ -182,7 +182,7 @@ static PyTypeObject rrtype_type = {
|
||||
static int
|
||||
RRType_init(s_RRType* self, PyObject* args) {
|
||||
const char* s;
|
||||
unsigned int i;
|
||||
long i;
|
||||
PyObject* bytes = NULL;
|
||||
// The constructor argument can be a string ("A"), an integer (1),
|
||||
// or a sequence of numbers between 0 and 65535 (wire code)
|
||||
@ -195,10 +195,10 @@ RRType_init(s_RRType* self, PyObject* args) {
|
||||
if (PyArg_ParseTuple(args, "s", &s)) {
|
||||
self->rrtype = new RRType(s);
|
||||
return (0);
|
||||
} else if (PyArg_ParseTuple(args, "I", &i)) {
|
||||
} else if (PyArg_ParseTuple(args, "l", &i)) {
|
||||
PyErr_Clear();
|
||||
if (i > 65535) {
|
||||
PyErr_SetString(po_InvalidRRType, "RR Type number too high");
|
||||
if (i < 0 || i > 0xffff) {
|
||||
PyErr_SetString(PyExc_ValueError, "RR Type number out of range");
|
||||
return (-1);
|
||||
}
|
||||
self->rrtype = new RRType(i);
|
||||
@ -259,10 +259,10 @@ static PyObject*
|
||||
RRType_toWire(s_RRType* self, PyObject* args) {
|
||||
PyObject* bytes;
|
||||
s_MessageRenderer* mr;
|
||||
|
||||
|
||||
if (PyArg_ParseTuple(args, "O", &bytes) && PySequence_Check(bytes)) {
|
||||
PyObject* bytes_o = bytes;
|
||||
|
||||
|
||||
OutputBuffer buffer(2);
|
||||
self->rrtype->toWire(buffer);
|
||||
PyObject* n = PyBytes_FromStringAndSize(static_cast<const char*>(buffer.getData()), buffer.getLength());
|
||||
|
@ -62,17 +62,16 @@ class EDNSTest(unittest.TestCase):
|
||||
edns = EDNS()
|
||||
edns.set_udp_size(511)
|
||||
self.assertEqual(511, edns.get_udp_size())
|
||||
edns.set_udp_size(0)
|
||||
self.assertEqual(0, edns.get_udp_size())
|
||||
edns.set_udp_size(65535)
|
||||
self.assertEqual(65535, edns.get_udp_size())
|
||||
|
||||
self.assertRaises(TypeError, edns.set_udp_size, "wrong")
|
||||
|
||||
# Range check. We need to do this at the binding level, so we need
|
||||
# explicit tests for it.
|
||||
self.assertRaises(OverflowError, edns.set_udp_size, 65536)
|
||||
self.assertRaises(OverflowError, edns.set_udp_size, -1)
|
||||
edns.set_udp_size(0)
|
||||
self.assertEqual(0, edns.get_udp_size())
|
||||
edns.set_udp_size(65535)
|
||||
self.assertEqual(65535, edns.get_udp_size())
|
||||
self.assertRaises(ValueError, edns.set_udp_size, 0x10000)
|
||||
self.assertRaises(ValueError, edns.set_udp_size, -1)
|
||||
|
||||
def test_get_version(self):
|
||||
self.assertEqual(EDNS.SUPPORTED_VERSION, EDNS().get_version())
|
||||
|
@ -80,8 +80,10 @@ class MessageTest(unittest.TestCase):
|
||||
"2001:db8::134"))
|
||||
|
||||
self.bogus_section = Message.SECTION_ADDITIONAL + 1
|
||||
self.bogus_below_section = Message.SECTION_QUESTION - 1
|
||||
|
||||
def test_init(self):
|
||||
self.assertRaises(TypeError, Message, -1)
|
||||
self.assertRaises(TypeError, Message, 3)
|
||||
self.assertRaises(TypeError, Message, "wrong")
|
||||
|
||||
@ -109,22 +111,28 @@ class MessageTest(unittest.TestCase):
|
||||
self.assertRaises(InvalidParameter, self.r.set_header_flag, 0)
|
||||
self.assertRaises(InvalidParameter, self.r.set_header_flag, 0x7000)
|
||||
self.assertRaises(InvalidParameter, self.r.set_header_flag, 0x0800)
|
||||
self.assertRaises(InvalidParameter, self.r.set_header_flag, 0x10000)
|
||||
self.assertRaises(TypeError, self.r.set_header_flag, 0x80000000)
|
||||
# this would cause overflow and result in a "valid" flag
|
||||
self.assertRaises(TypeError, self.r.set_header_flag,
|
||||
Message.HEADERFLAG_AA | 0x100000000)
|
||||
self.assertRaises(TypeError, self.r.set_header_flag, -1)
|
||||
|
||||
self.assertRaises(InvalidMessageOperation,
|
||||
self.p.set_header_flag, Message.HEADERFLAG_AA)
|
||||
|
||||
# Range check. We need to do this at the binding level, so we need
|
||||
# explicit tests for it.
|
||||
self.assertRaises(ValueError, self.r.set_header_flag, 0x10000)
|
||||
self.assertRaises(ValueError, self.r.set_header_flag, -1)
|
||||
|
||||
def test_set_qid(self):
|
||||
self.assertRaises(TypeError, self.r.set_qid, "wrong")
|
||||
self.assertRaises(InvalidMessageOperation,
|
||||
self.p.set_qid, 123)
|
||||
self.r.set_qid(1234)
|
||||
self.assertEqual(1234, self.r.get_qid())
|
||||
# Range check. We need to do this at the binding level, so we need
|
||||
# explicit tests for it.
|
||||
self.r.set_qid(0)
|
||||
self.assertEqual(0, self.r.get_qid())
|
||||
self.r.set_qid(0xffff)
|
||||
self.assertEqual(0xffff, self.r.get_qid())
|
||||
self.assertRaises(ValueError, self.r.set_qid, -1)
|
||||
self.assertRaises(ValueError, self.r.set_qid, 0x10000)
|
||||
|
||||
def test_set_rcode(self):
|
||||
self.assertRaises(TypeError, self.r.set_rcode, "wrong")
|
||||
@ -135,7 +143,7 @@ class MessageTest(unittest.TestCase):
|
||||
|
||||
self.assertRaises(InvalidMessageOperation,
|
||||
self.p.set_rcode, rcode)
|
||||
|
||||
|
||||
self.assertRaises(InvalidMessageOperation, self.p.get_rcode)
|
||||
|
||||
def test_set_opcode(self):
|
||||
@ -197,7 +205,7 @@ class MessageTest(unittest.TestCase):
|
||||
|
||||
self.assertRaises(InvalidMessageOperation, self.p.add_rrset,
|
||||
Message.SECTION_ANSWER, self.rrset_a)
|
||||
|
||||
|
||||
self.assertFalse(compare_rrset_list(section_rrset, self.r.get_section(Message.SECTION_ANSWER)))
|
||||
self.assertEqual(0, self.r.get_rr_count(Message.SECTION_ANSWER))
|
||||
self.r.add_rrset(Message.SECTION_ANSWER, self.rrset_a)
|
||||
@ -239,6 +247,8 @@ class MessageTest(unittest.TestCase):
|
||||
Message.SECTION_ANSWER, self.rrset_a)
|
||||
self.assertRaises(OverflowError, self.r.add_rrset,
|
||||
self.bogus_section, self.rrset_a)
|
||||
self.assertRaises(OverflowError, self.r.add_rrset,
|
||||
self.bogus_below_section, self.rrset_a)
|
||||
|
||||
def test_clear(self):
|
||||
self.assertEqual(None, self.r.clear(Message.PARSE))
|
||||
|
@ -98,6 +98,11 @@ class MessageRendererTest(unittest.TestCase):
|
||||
renderer.set_length_limit(1024)
|
||||
self.assertEqual(1024, renderer.get_length_limit())
|
||||
self.assertRaises(TypeError, renderer.set_length_limit, "wrong")
|
||||
# Range check. We need to do this at the binding level, so we need
|
||||
# explicit tests for it.
|
||||
renderer.set_length_limit(0)
|
||||
self.assertEqual(0, renderer.get_length_limit())
|
||||
self.assertRaises(ValueError, renderer.set_length_limit, -1)
|
||||
|
||||
def test_messagerenderer_set_compress_mode(self):
|
||||
renderer = MessageRenderer()
|
||||
|
@ -95,11 +95,14 @@ class NameTest(unittest.TestCase):
|
||||
b = bytearray()
|
||||
b += b'\x07example'*32 + b'\x03com\x00'
|
||||
self.assertRaises(DNSMessageFORMERR, Name, b, 0)
|
||||
self.assertRaises(IndexError, Name, b, -1)
|
||||
|
||||
def test_at(self):
|
||||
self.assertEqual(7, self.name1.at(0))
|
||||
self.assertEqual(101, self.name1.at(1))
|
||||
self.assertRaises(IndexError, self.name1.at, 100)
|
||||
self.assertRaises(IndexError, self.name1.at, 0x10000)
|
||||
self.assertRaises(IndexError, self.name1.at, -1)
|
||||
self.assertRaises(TypeError, self.name1.at, "wrong")
|
||||
|
||||
def test_get_length(self):
|
||||
@ -151,14 +154,25 @@ class NameTest(unittest.TestCase):
|
||||
self.assertEqual("completely.different.", s.to_text())
|
||||
self.assertRaises(TypeError, self.name1.split, "wrong", 1)
|
||||
self.assertRaises(TypeError, self.name1.split, 1, "wrong")
|
||||
self.assertRaises(IndexError, self.name1.split, 123, 1)
|
||||
self.assertRaises(IndexError, self.name1.split, 1, 123)
|
||||
|
||||
s = self.name1.split(1)
|
||||
self.assertEqual("com.", s.to_text())
|
||||
|
||||
# Range check. We need to do this at the binding level, so we need
|
||||
# explicit tests for it.
|
||||
self.assertRaises(IndexError, self.name1.split, 123, 1)
|
||||
self.assertRaises(IndexError, self.name1.split, 1, 123)
|
||||
self.assertRaises(IndexError, self.name1.split, 0x10000, 5)
|
||||
self.assertRaises(IndexError, self.name1.split, -1, -1)
|
||||
self.assertRaises(IndexError, self.name1.split, 0, -1)
|
||||
self.assertRaises(IndexError, self.name1.split, -1, 0x10000)
|
||||
|
||||
s = self.name1.split(0)
|
||||
self.assertEqual("example.com.", s.to_text())
|
||||
self.assertRaises(IndexError, self.name1.split, 123)
|
||||
self.assertRaises(IndexError, self.name1.split, 0x10000)
|
||||
self.assertRaises(IndexError, self.name1.split, -123)
|
||||
self.assertRaises(TypeError, self.name1.split, -1)
|
||||
|
||||
def test_reverse(self):
|
||||
self.assertEqual("com.example.", self.name1.reverse().to_text())
|
||||
@ -169,7 +183,6 @@ class NameTest(unittest.TestCase):
|
||||
self.assertEqual("example.com.example.com.", self.name1.concatenate(self.name1).to_text())
|
||||
self.assertRaises(TypeError, self.name1.concatenate, "wrong")
|
||||
self.assertRaises(TooLongName, self.name1.concatenate, Name("example."*31))
|
||||
|
||||
|
||||
def test_downcase(self):
|
||||
self.assertEqual("EXAMPLE.com.", self.name4.to_text())
|
||||
|
@ -45,7 +45,7 @@ class QuestionTest(unittest.TestCase):
|
||||
# tests below based on cpp unit tests
|
||||
# also tests get_name, get_class and get_type
|
||||
def test_from_wire(self):
|
||||
|
||||
|
||||
q = question_from_wire("question_fromWire")
|
||||
|
||||
self.assertEqual(self.example_name1, q.get_name())
|
||||
|
@ -23,12 +23,8 @@ from pydnspp import *
|
||||
class RcodeTest(unittest.TestCase):
|
||||
def test_init(self):
|
||||
self.assertRaises(TypeError, Rcode, "wrong")
|
||||
self.assertRaises(OverflowError, Rcode, 65536)
|
||||
self.assertEqual(Rcode(0).get_code(), 0)
|
||||
|
||||
self.assertEqual(0, Rcode(0).get_code())
|
||||
self.assertEqual(0xfff, Rcode(0xfff).get_code()) # possible max code
|
||||
|
||||
|
||||
# should fail on attempt of construction with an out of range code
|
||||
self.assertRaises(OverflowError, Rcode, 0x1000)
|
||||
self.assertRaises(OverflowError, Rcode, 0xffff)
|
||||
@ -38,7 +34,18 @@ class RcodeTest(unittest.TestCase):
|
||||
self.assertEqual(Rcode.BADVERS_CODE, Rcode(0, 1).get_code())
|
||||
self.assertEqual(0xfff, Rcode(0xf, 0xff).get_code())
|
||||
self.assertRaises(OverflowError, Rcode, 0x10, 0xff)
|
||||
|
||||
|
||||
# Range check. We need to do this at the binding level, so we need
|
||||
# explicit tests for it.
|
||||
self.assertEqual(Rcode(0).get_code(), 0)
|
||||
self.assertEqual(Rcode(4095).get_code(), 4095)
|
||||
self.assertEqual(Rcode(0, 0).get_code(), 0)
|
||||
self.assertEqual(Rcode(0, 0).get_extended_code(), 0)
|
||||
self.assertEqual(Rcode(15, 255).get_code(), 4095)
|
||||
self.assertRaises(ValueError, Rcode, 65536)
|
||||
self.assertRaises(ValueError, Rcode, 0x10, 0x100)
|
||||
self.assertRaises(ValueError, Rcode, 0x100, 0x10)
|
||||
|
||||
def test_constants(self):
|
||||
self.assertEqual(Rcode.NOERROR_CODE, Rcode(0).get_code())
|
||||
self.assertEqual(Rcode.FORMERR_CODE, Rcode(1).get_code())
|
||||
|
@ -32,12 +32,17 @@ class RRClassTest(unittest.TestCase):
|
||||
b = bytearray(1)
|
||||
b[0] = 123
|
||||
self.assertRaises(TypeError, RRClass, b)
|
||||
self.assertRaises(InvalidRRClass, RRClass, 65536)
|
||||
self.assertEqual(self.c1, RRClass(1))
|
||||
b = bytearray()
|
||||
self.c1.to_wire(b)
|
||||
self.assertEqual(self.c1, RRClass(b))
|
||||
|
||||
# Range check. We need to do this at the binding level, so we need
|
||||
# explicit tests for it.
|
||||
self.assertRaises(ValueError, RRClass, 65536)
|
||||
self.assertRaises(TypeError, RRClass, -1)
|
||||
self.assertEqual(RRClass(65535).get_code(), 65535)
|
||||
self.assertEqual(RRClass(0).get_code(), 0)
|
||||
|
||||
def test_rrclass_to_text(self):
|
||||
self.assertEqual("IN", self.c1.to_text())
|
||||
self.assertEqual("IN", str(self.c1))
|
||||
|
@ -25,7 +25,7 @@ class RRTTLTest(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.t1 = RRTTL(1)
|
||||
self.t2 = RRTTL(3600)
|
||||
|
||||
|
||||
def test_init(self):
|
||||
self.assertRaises(InvalidRRTTL, RRTTL, "wrong")
|
||||
self.assertRaises(TypeError, RRTTL, Exception())
|
||||
@ -39,7 +39,13 @@ class RRTTLTest(unittest.TestCase):
|
||||
b[2] = 0
|
||||
b[3] = 15
|
||||
self.assertEqual(15, RRTTL(b).get_value())
|
||||
|
||||
# Range check. We need to do this at the binding level, so we need
|
||||
# explicit tests for it.
|
||||
self.assertRaises(TypeError, RRTTL, -1)
|
||||
self.assertRaises(ValueError, RRTTL, 4294967296)
|
||||
self.assertEqual(0, RRTTL(0).get_value())
|
||||
self.assertEqual(4294967295, RRTTL(4294967295).get_value())
|
||||
|
||||
def test_rrttl_to_text(self):
|
||||
self.assertEqual("1", self.t1.to_text())
|
||||
self.assertEqual("1", str(self.t1))
|
||||
|
@ -22,7 +22,7 @@ import os
|
||||
from pydnspp import *
|
||||
|
||||
class TestModuleSpec(unittest.TestCase):
|
||||
|
||||
|
||||
rrtype_1 = RRType(1)
|
||||
rrtype_0x80 = RRType(0x80);
|
||||
rrtype_0x800 = RRType(0x800);
|
||||
@ -32,24 +32,28 @@ class TestModuleSpec(unittest.TestCase):
|
||||
|
||||
|
||||
def test_init(self):
|
||||
self.assertRaises(InvalidRRType, RRType, 65537)
|
||||
b = bytearray(b'\x00\x01')
|
||||
self.assertEqual(RRType("A"), RRType(b))
|
||||
b = bytearray(b'\x01')
|
||||
self.assertRaises(IncompleteRRType, RRType, b)
|
||||
self.assertRaises(TypeError, RRType, Exception)
|
||||
|
||||
# Range check. We need to do this at the binding level, so we need
|
||||
# explicit tests for it.
|
||||
self.assertRaises(ValueError, RRType, 65536)
|
||||
self.assertRaises(TypeError, RRType, -1)
|
||||
self.assertEqual("TYPE65535", RRType(65535).to_text());
|
||||
self.assertEqual("TYPE0", RRType(0).to_text());
|
||||
|
||||
def test_init_from_text(self):
|
||||
self.assertEqual("A", RRType("A").to_text())
|
||||
self.assertEqual("NS", RRType("NS").to_text());
|
||||
self.assertEqual("NS", str(RRType("NS")));
|
||||
|
||||
self.assertEqual("TYPE65535", RRType("TYPE65535").to_text());
|
||||
|
||||
|
||||
self.assertEqual(53, RRType("TYPE00053").get_code());
|
||||
|
||||
self.assertRaises(InvalidRRType, RRType, "TYPE000053");
|
||||
|
||||
|
||||
self.assertRaises(InvalidRRType, RRType, "TYPE");
|
||||
self.assertRaises(InvalidRRType, RRType, "TYPE-1");
|
||||
self.assertRaises(InvalidRRType, RRType, "TYPExxx");
|
||||
|
@ -66,7 +66,8 @@ createRdata(const RRType& rrtype, const RRClass& rrclass,
|
||||
len);
|
||||
|
||||
if (buffer.getPosition() - old_pos != len) {
|
||||
isc_throw(InvalidRdataLength, "RDLENGTH mismatch");
|
||||
isc_throw(InvalidRdataLength, "RDLENGTH mismatch: " <<
|
||||
buffer.getPosition() - old_pos << " != " << len);
|
||||
}
|
||||
|
||||
return (rdata);
|
||||
|
@ -161,6 +161,7 @@ public:
|
||||
///
|
||||
/// \return A string representation of \c Rdata.
|
||||
virtual std::string toText() const = 0;
|
||||
|
||||
/// \brief Render the \c Rdata in the wire format into a buffer.
|
||||
///
|
||||
/// This is a pure virtual method without the definition; the actual
|
||||
@ -169,6 +170,7 @@ public:
|
||||
///
|
||||
/// \param buffer An output buffer to store the wire data.
|
||||
virtual void toWire(OutputBuffer& buffer) const = 0;
|
||||
|
||||
/// \brief Render the \c Rdata in the wire format into a
|
||||
/// \c MessageRenderer object.
|
||||
///
|
||||
@ -251,6 +253,7 @@ public:
|
||||
/// \param rdata_string A string of textual representation of generic
|
||||
/// RDATA.
|
||||
explicit Generic(const std::string& rdata_string);
|
||||
|
||||
///
|
||||
/// \brief Constructor from wire-format data.
|
||||
///
|
||||
@ -273,6 +276,7 @@ public:
|
||||
/// \c Rdata to parse.
|
||||
/// \param rdata_len The length in buffer of the \c Rdata. In bytes.
|
||||
Generic(InputBuffer& buffer, size_t rdata_len);
|
||||
|
||||
///
|
||||
/// \brief The destructor.
|
||||
virtual ~Generic();
|
||||
@ -284,6 +288,7 @@ public:
|
||||
///
|
||||
/// \param source A reference to a \c generic::Generic object to copy from.
|
||||
Generic(const Generic& source);
|
||||
|
||||
///
|
||||
/// \brief The assignment operator.
|
||||
///
|
||||
@ -293,6 +298,7 @@ public:
|
||||
/// \param source A reference to a \c generic::Generic object to copy from.
|
||||
Generic& operator=(const Generic& source);
|
||||
//@}
|
||||
|
||||
///
|
||||
/// \name Converter methods
|
||||
///
|
||||
@ -307,6 +313,7 @@ public:
|
||||
///
|
||||
/// \return A string representation of \c generic::Generic.
|
||||
virtual std::string toText() const;
|
||||
|
||||
///
|
||||
/// \brief Render the \c generic::Generic in the wire format into a buffer.
|
||||
///
|
||||
@ -317,6 +324,7 @@ public:
|
||||
///
|
||||
/// \param buffer An output buffer to store the wire data.
|
||||
virtual void toWire(OutputBuffer& buffer) const;
|
||||
|
||||
/// \brief Render the \c generic::Generic in the wire format into a
|
||||
/// \c MessageRenderer object.
|
||||
///
|
||||
@ -329,6 +337,7 @@ public:
|
||||
/// output buffer in which the \c Generic object is to be stored.
|
||||
virtual void toWire(MessageRenderer& renderer) const;
|
||||
//@}
|
||||
|
||||
///
|
||||
/// \name Comparison method
|
||||
///
|
||||
@ -421,6 +430,7 @@ std::ostream& operator<<(std::ostream& os, const Generic& rdata);
|
||||
/// object.
|
||||
RdataPtr createRdata(const RRType& rrtype, const RRClass& rrclass,
|
||||
const std::string& rdata_string);
|
||||
|
||||
/// \brief Create RDATA of a given pair of RR type and class from
|
||||
/// wire-format data.
|
||||
///
|
||||
@ -444,6 +454,7 @@ RdataPtr createRdata(const RRType& rrtype, const RRClass& rrclass,
|
||||
/// object.
|
||||
RdataPtr createRdata(const RRType& rrtype, const RRClass& rrclass,
|
||||
InputBuffer& buffer, size_t len);
|
||||
|
||||
/// \brief Create RDATA of a given pair of RR type and class, copying
|
||||
/// of another RDATA of same kind.
|
||||
///
|
||||
|
124
src/lib/dns/rdata/generic/rp_17.cc
Normal file
124
src/lib/dns/rdata/generic/rp_17.cc
Normal file
@ -0,0 +1,124 @@
|
||||
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
|
||||
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
// AND FITNESS. IN NO EVENT SHALL ISC 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.
|
||||
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
|
||||
#include <dns/buffer.h>
|
||||
#include <dns/messagerenderer.h>
|
||||
#include <dns/name.h>
|
||||
#include <dns/rdata.h>
|
||||
#include <dns/rdataclass.h>
|
||||
|
||||
using namespace std;
|
||||
using namespace isc::dns;
|
||||
|
||||
// BEGIN_ISC_NAMESPACE
|
||||
// BEGIN_RDATA_NAMESPACE
|
||||
|
||||
/// \brief Constructor from string.
|
||||
///
|
||||
/// \c rp_str must be formatted as follows:
|
||||
/// \code <mailbox name> <text name>
|
||||
/// \endcode
|
||||
/// where both fields must represent a valid domain name.
|
||||
///
|
||||
/// \exception InvalidRdataText The number of RDATA fields (must be 2) is
|
||||
/// incorrect.
|
||||
/// \exception Other The constructor of the \c Name class will throw if the
|
||||
/// given name is invalid.
|
||||
/// \exception std::bad_alloc Memory allocation for names fails.
|
||||
RP::RP(const std::string& rp_str) :
|
||||
// We cannot construct both names in the initialization list due to the
|
||||
// necessary text processing, so we have to initialize them with a dummy
|
||||
// name and replace them later.
|
||||
mailbox_(Name::ROOT_NAME()), text_(Name::ROOT_NAME())
|
||||
{
|
||||
istringstream iss(rp_str);
|
||||
string mailbox_str, text_str;
|
||||
iss >> mailbox_str >> text_str;
|
||||
|
||||
// Validation: A valid RP RR must have exactly two fields.
|
||||
if (iss.bad() || iss.fail()) {
|
||||
isc_throw(InvalidRdataText, "Invalid RP text: " << rp_str);
|
||||
}
|
||||
if (!iss.eof()) {
|
||||
isc_throw(InvalidRdataText, "Invalid RP text (redundant field): "
|
||||
<< rp_str);
|
||||
}
|
||||
|
||||
mailbox_ = Name(mailbox_str);
|
||||
text_ = Name(text_str);
|
||||
}
|
||||
|
||||
/// \brief Constructor from wire-format data.
|
||||
///
|
||||
/// This constructor doesn't check the validity of the second parameter (rdata
|
||||
/// length) for parsing.
|
||||
/// If necessary, the caller will check consistency.
|
||||
///
|
||||
/// \exception std::bad_alloc Memory allocation for names fails.
|
||||
/// \exception Other The constructor of the \c Name class will throw if the
|
||||
/// names in the wire is invalid.
|
||||
RP::RP(InputBuffer& buffer, size_t) : mailbox_(buffer), text_(buffer) {
|
||||
}
|
||||
|
||||
/// \brief Copy constructor.
|
||||
///
|
||||
/// \exception std::bad_alloc Memory allocation fails in copying internal
|
||||
/// member variables (this should be very rare).
|
||||
RP::RP(const RP& other) :
|
||||
Rdata(), mailbox_(other.mailbox_), text_(other.text_)
|
||||
{}
|
||||
|
||||
/// \brief Convert the \c RP to a string.
|
||||
///
|
||||
/// The output of this method is formatted as described in the "from string"
|
||||
/// constructor (\c RP(const std::string&))).
|
||||
///
|
||||
/// \exception std::bad_alloc Internal resource allocation fails.
|
||||
///
|
||||
/// \return A \c string object that represents the \c RP object.
|
||||
std::string
|
||||
RP::toText() const {
|
||||
return (mailbox_.toText() + " " + text_.toText());
|
||||
}
|
||||
|
||||
void
|
||||
RP::toWire(OutputBuffer& buffer) const {
|
||||
mailbox_.toWire(buffer);
|
||||
text_.toWire(buffer);
|
||||
}
|
||||
|
||||
void
|
||||
RP::toWire(MessageRenderer& renderer) const {
|
||||
// Type RP is not "well-known", and name compression must be disabled
|
||||
// per RFC3597.
|
||||
renderer.writeName(mailbox_, false);
|
||||
renderer.writeName(text_, false);
|
||||
}
|
||||
|
||||
int
|
||||
RP::compare(const Rdata& other) const {
|
||||
const RP& other_rp = dynamic_cast<const RP&>(other);
|
||||
|
||||
const int cmp = compareNames(mailbox_, other_rp.mailbox_);
|
||||
if (cmp != 0) {
|
||||
return (cmp);
|
||||
}
|
||||
return (compareNames(text_, other_rp.text_));
|
||||
}
|
||||
|
||||
// END_RDATA_NAMESPACE
|
||||
// END_ISC_NAMESPACE
|
88
src/lib/dns/rdata/generic/rp_17.h
Normal file
88
src/lib/dns/rdata/generic/rp_17.h
Normal file
@ -0,0 +1,88 @@
|
||||
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
|
||||
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
// AND FITNESS. IN NO EVENT SHALL ISC 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.
|
||||
|
||||
// BEGIN_HEADER_GUARD
|
||||
|
||||
#include <string>
|
||||
|
||||
#include <dns/name.h>
|
||||
#include <dns/rdata.h>
|
||||
|
||||
// BEGIN_ISC_NAMESPACE
|
||||
|
||||
// BEGIN_COMMON_DECLARATIONS
|
||||
// END_COMMON_DECLARATIONS
|
||||
|
||||
// BEGIN_RDATA_NAMESPACE
|
||||
|
||||
/// \brief \c rdata::generic::RP class represents the RP RDATA as defined in
|
||||
/// RFC1183.
|
||||
///
|
||||
/// This class implements the basic interfaces inherited from the abstract
|
||||
/// \c rdata::Rdata class, and provides trivial accessors specific to the
|
||||
/// RP RDATA.
|
||||
class RP : public Rdata {
|
||||
public:
|
||||
// BEGIN_COMMON_MEMBERS
|
||||
// END_COMMON_MEMBERS
|
||||
|
||||
/// We use the default copy constructor and assignment operator.
|
||||
|
||||
/// \brief Constructor from RDATA field parameters.
|
||||
///
|
||||
/// The parameters are a straightforward mapping of %RP RDATA
|
||||
/// fields as defined in RFC1183.
|
||||
RP(const Name& mailbox, const Name& text) :
|
||||
mailbox_(mailbox), text_(text)
|
||||
{}
|
||||
|
||||
/// \brief Return the value of the mailbox field.
|
||||
///
|
||||
/// This method normally does not throw an exception, but if resource
|
||||
/// allocation for the returned \c Name object fails, a corresponding
|
||||
/// standard exception will be thrown.
|
||||
///
|
||||
/// \note
|
||||
/// Unlike the case of some other RDATA classes (such as
|
||||
/// \c NS::getNSName()), this method constructs a new \c Name object
|
||||
/// and returns it, instead of returning a reference to a \c Name object
|
||||
/// internally maintained in the class (which is a private member).
|
||||
/// This is based on the observation that this method will be rarely used
|
||||
/// and even when it's used it will not be in a performance context
|
||||
/// (for example, a recursive resolver won't need this field in its
|
||||
/// resolution process). By returning a new object we have flexibility of
|
||||
/// changing the internal representation without the risk of changing
|
||||
/// the interface or method property.
|
||||
/// The same note applies to the \c getText() method.
|
||||
Name getMailbox() const { return (mailbox_); }
|
||||
|
||||
/// \brief Return the value of the text field.
|
||||
///
|
||||
/// This method normally does not throw an exception, but if resource
|
||||
/// allocation for the returned \c Name object fails, a corresponding
|
||||
/// standard exception will be thrown.
|
||||
Name getText() const { return (text_); }
|
||||
|
||||
private:
|
||||
Name mailbox_;
|
||||
Name text_;
|
||||
};
|
||||
|
||||
// END_RDATA_NAMESPACE
|
||||
// END_ISC_NAMESPACE
|
||||
// END_HEADER_GUARD
|
||||
|
||||
// Local Variables:
|
||||
// mode: c++
|
||||
// End:
|
@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
|
||||
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or distribute this software for any
|
||||
// purpose with or without fee is hereby granted, provided that the above
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
|
||||
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or distribute this software for any
|
||||
// purpose with or without fee is hereby granted, provided that the above
|
||||
|
@ -39,6 +39,7 @@ run_unittests_SOURCES += rdata_nsec3_unittest.cc
|
||||
run_unittests_SOURCES += rdata_nsecbitmap_unittest.cc
|
||||
run_unittests_SOURCES += rdata_nsec3param_unittest.cc
|
||||
run_unittests_SOURCES += rdata_rrsig_unittest.cc
|
||||
run_unittests_SOURCES += rdata_rp_unittest.cc
|
||||
run_unittests_SOURCES += rdata_tsig_unittest.cc
|
||||
run_unittests_SOURCES += rrset_unittest.cc rrsetlist_unittest.cc
|
||||
run_unittests_SOURCES += question_unittest.cc
|
||||
|
@ -190,4 +190,53 @@ TEST_F(BufferTest, outputBufferClear) {
|
||||
obuffer.clear();
|
||||
EXPECT_EQ(0, obuffer.getLength());
|
||||
}
|
||||
|
||||
TEST_F(BufferTest, outputBufferCopy) {
|
||||
obuffer.writeData(testdata, sizeof(testdata));
|
||||
|
||||
EXPECT_NO_THROW({
|
||||
OutputBuffer copy(obuffer);
|
||||
ASSERT_EQ(sizeof(testdata), copy.getLength());
|
||||
for (int i = 0; i < sizeof(testdata); i ++) {
|
||||
EXPECT_EQ(testdata[i], copy[i]);
|
||||
if (i + 1 < sizeof(testdata)) {
|
||||
obuffer.writeUint16At(0, i);
|
||||
}
|
||||
EXPECT_EQ(testdata[i], copy[i]);
|
||||
}
|
||||
obuffer.clear();
|
||||
ASSERT_EQ(sizeof(testdata), copy.getLength());
|
||||
});
|
||||
}
|
||||
|
||||
TEST_F(BufferTest, outputBufferAssign) {
|
||||
OutputBuffer another(0);
|
||||
another.clear();
|
||||
obuffer.writeData(testdata, sizeof(testdata));
|
||||
|
||||
EXPECT_NO_THROW({
|
||||
another = obuffer;
|
||||
ASSERT_EQ(sizeof(testdata), another.getLength());
|
||||
for (int i = 0; i < sizeof(testdata); i ++) {
|
||||
EXPECT_EQ(testdata[i], another[i]);
|
||||
if (i + 1 < sizeof(testdata)) {
|
||||
obuffer.writeUint16At(0, i);
|
||||
}
|
||||
EXPECT_EQ(testdata[i], another[i]);
|
||||
}
|
||||
obuffer.clear();
|
||||
ASSERT_EQ(sizeof(testdata), another.getLength());
|
||||
});
|
||||
}
|
||||
|
||||
TEST_F(BufferTest, outputBufferZeroSize) {
|
||||
// Some OSes might return NULL on malloc for 0 size, so check it works
|
||||
EXPECT_NO_THROW({
|
||||
OutputBuffer first(0);
|
||||
OutputBuffer copy(first);
|
||||
OutputBuffer second(0);
|
||||
second = first;
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
162
src/lib/dns/tests/rdata_rp_unittest.cc
Normal file
162
src/lib/dns/tests/rdata_rp_unittest.cc
Normal file
@ -0,0 +1,162 @@
|
||||
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
|
||||
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
// AND FITNESS. IN NO EVENT SHALL ISC 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.
|
||||
|
||||
#include <string>
|
||||
|
||||
#include <dns/buffer.h>
|
||||
#include <dns/exceptions.h>
|
||||
#include <dns/rdataclass.h>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <dns/tests/unittest_util.h>
|
||||
#include <dns/tests/rdata_unittest.h>
|
||||
|
||||
using isc::UnitTestUtil;
|
||||
using namespace std;
|
||||
using namespace isc::dns;
|
||||
using namespace isc::dns::rdata;
|
||||
|
||||
namespace {
|
||||
class Rdata_RP_Test : public RdataTest {
|
||||
protected:
|
||||
Rdata_RP_Test() :
|
||||
mailbox_name("root.example.com."),
|
||||
text_name("rp-text.example.com."),
|
||||
// this also serves as a test for "from text" constructor in a normal
|
||||
// case.
|
||||
rdata_rp("root.example.com. rp-text.example.com."),
|
||||
obuffer(0), renderer(obuffer)
|
||||
{}
|
||||
|
||||
const Name mailbox_name, text_name;
|
||||
const generic::RP rdata_rp; // commonly used test RDATA
|
||||
OutputBuffer obuffer;
|
||||
MessageRenderer renderer;
|
||||
vector<uint8_t> expected_wire;
|
||||
};
|
||||
|
||||
TEST_F(Rdata_RP_Test, createFromText) {
|
||||
EXPECT_EQ(mailbox_name, rdata_rp.getMailbox());
|
||||
EXPECT_EQ(text_name, rdata_rp.getText());
|
||||
|
||||
// Invalid textual input cases follow:
|
||||
// names are invalid
|
||||
EXPECT_THROW(generic::RP("bad..name. rp-text.example.com"), EmptyLabel);
|
||||
EXPECT_THROW(generic::RP("mailbox.example.com. bad..name"), EmptyLabel);
|
||||
|
||||
// missing field
|
||||
EXPECT_THROW(generic::RP("mailbox.example.com."), InvalidRdataText);
|
||||
|
||||
// redundant field
|
||||
EXPECT_THROW(generic::RP("mailbox.example.com. rp-text.example.com. "
|
||||
"redundant.example."), InvalidRdataText);
|
||||
}
|
||||
|
||||
TEST_F(Rdata_RP_Test, createFromWire) {
|
||||
RdataPtr rdata(rdataFactoryFromFile(RRType::RP(), RRClass::IN(),
|
||||
"rdata_rp_fromWire1.wire"));
|
||||
EXPECT_EQ(mailbox_name, dynamic_cast<generic::RP&>(*rdata).getMailbox());
|
||||
EXPECT_EQ(text_name, dynamic_cast<generic::RP&>(*rdata).getText());
|
||||
|
||||
// a similar test with names being compressed
|
||||
rdata = rdataFactoryFromFile(RRType::RP(), RRClass::IN(),
|
||||
"rdata_rp_fromWire2.wire", 30);
|
||||
EXPECT_EQ(mailbox_name, dynamic_cast<generic::RP&>(*rdata).getMailbox());
|
||||
EXPECT_EQ(Name("rp-text.example.net"),
|
||||
dynamic_cast<generic::RP&>(*rdata).getText());
|
||||
}
|
||||
|
||||
TEST_F(Rdata_RP_Test, badFromWire) {
|
||||
// RDLEN is too short
|
||||
EXPECT_THROW(rdataFactoryFromFile(RRType::RP(), RRClass::IN(),
|
||||
"rdata_rp_fromWire3.wire"),
|
||||
InvalidRdataLength);
|
||||
|
||||
// RDLEN is too long
|
||||
EXPECT_THROW(rdataFactoryFromFile(RRType::RP(), RRClass::IN(),
|
||||
"rdata_rp_fromWire4.wire"),
|
||||
InvalidRdataLength);
|
||||
|
||||
// bogus mailbox name
|
||||
EXPECT_THROW(rdataFactoryFromFile(RRType::RP(), RRClass::IN(),
|
||||
"rdata_rp_fromWire5.wire"),
|
||||
DNSMessageFORMERR);
|
||||
|
||||
// bogus text name
|
||||
EXPECT_THROW(rdataFactoryFromFile(RRType::RP(), RRClass::IN(),
|
||||
"rdata_rp_fromWire6.wire"),
|
||||
DNSMessageFORMERR);
|
||||
}
|
||||
|
||||
TEST_F(Rdata_RP_Test, createFromParams) {
|
||||
EXPECT_EQ(mailbox_name, generic::RP(mailbox_name, text_name).getMailbox());
|
||||
EXPECT_EQ(text_name, generic::RP(mailbox_name, text_name).getText());
|
||||
}
|
||||
|
||||
TEST_F(Rdata_RP_Test, toWireBuffer) {
|
||||
// construct expected data
|
||||
UnitTestUtil::readWireData("rdata_rp_toWire1.wire", expected_wire);
|
||||
|
||||
// construct actual data
|
||||
rdata_rp.toWire(obuffer);
|
||||
|
||||
// then compare them
|
||||
EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData,
|
||||
obuffer.getData(), obuffer.getLength(),
|
||||
&expected_wire[0], expected_wire.size());
|
||||
}
|
||||
|
||||
TEST_F(Rdata_RP_Test, toWireRenderer) {
|
||||
// similar to toWireBuffer, but names in RDATA could be compressed due to
|
||||
// preceding names. Actually they must not be compressed according to
|
||||
// RFC3597, and this test checks that.
|
||||
|
||||
UnitTestUtil::readWireData("rdata_rp_toWire2.wire", expected_wire);
|
||||
|
||||
renderer.writeName(Name("a.example.com"));
|
||||
renderer.writeName(Name("b.example.net"));
|
||||
generic::RP(mailbox_name, Name("rp-text.example.net")).toWire(renderer);
|
||||
EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData,
|
||||
renderer.getData(), renderer.getLength(),
|
||||
&expected_wire[0], expected_wire.size());
|
||||
}
|
||||
|
||||
TEST_F(Rdata_RP_Test, toText) {
|
||||
// there's not much to test for this method. Only checking a simple case.
|
||||
EXPECT_EQ("root.example.com. rp-text.example.com.", rdata_rp.toText());
|
||||
}
|
||||
|
||||
TEST_F(Rdata_RP_Test, compare) {
|
||||
// check reflexivity
|
||||
EXPECT_EQ(0, rdata_rp.compare(rdata_rp));
|
||||
|
||||
// names must be compared in case-insensitive manner
|
||||
EXPECT_EQ(0, rdata_rp.compare(generic::RP("ROOT.example.com. "
|
||||
"rp-text.EXAMPLE.com.")));
|
||||
|
||||
// another RP whose mailbox name is larger than that of rdata_rp.
|
||||
const generic::RP large1_rp("zzzz.example.com. rp-text.example.com.");
|
||||
EXPECT_GT(0, rdata_rp.compare(large1_rp));
|
||||
EXPECT_LT(0, large1_rp.compare(rdata_rp));
|
||||
|
||||
// yet another RP whose text name is larger than that of rdata_rp.
|
||||
const generic::RP large2_rp("root.example.com. zzzzzzz.example.com.");
|
||||
EXPECT_GT(0, rdata_rp.compare(large2_rp));
|
||||
EXPECT_LT(0, large2_rp.compare(rdata_rp));
|
||||
|
||||
// comparison attempt between incompatible RR types should be rejected
|
||||
EXPECT_THROW(rdata_rp.compare(*RdataTest::rdata_nomatch), bad_cast);
|
||||
}
|
||||
}
|
8
src/lib/dns/tests/testdata/Makefile.am
vendored
8
src/lib/dns/tests/testdata/Makefile.am
vendored
@ -16,6 +16,10 @@ BUILT_SOURCES += rdata_nsec3_fromWire10.wire rdata_nsec3_fromWire11.wire
|
||||
BUILT_SOURCES += rdata_nsec3_fromWire12.wire rdata_nsec3_fromWire13.wire
|
||||
BUILT_SOURCES += rdata_nsec3_fromWire14.wire rdata_nsec3_fromWire15.wire
|
||||
BUILT_SOURCES += rdata_rrsig_fromWire2.wire
|
||||
BUILT_SOURCES += rdata_rp_fromWire1.wire rdata_rp_fromWire2.wire
|
||||
BUILT_SOURCES += rdata_rp_fromWire3.wire rdata_rp_fromWire4.wire
|
||||
BUILT_SOURCES += rdata_rp_fromWire5.wire rdata_rp_fromWire6.wire
|
||||
BUILT_SOURCES += rdata_rp_toWire1.wire rdata_rp_toWire2.wire
|
||||
BUILT_SOURCES += rdata_soa_toWireUncompressed.wire
|
||||
BUILT_SOURCES += rdata_txt_fromWire2.wire rdata_txt_fromWire3.wire
|
||||
BUILT_SOURCES += rdata_txt_fromWire4.wire rdata_txt_fromWire5.wire
|
||||
@ -67,6 +71,10 @@ EXTRA_DIST += rdata_nsec3_fromWire12.spec rdata_nsec3_fromWire13.spec
|
||||
EXTRA_DIST += rdata_nsec3_fromWire14.spec rdata_nsec3_fromWire15.spec
|
||||
EXTRA_DIST += rdata_opt_fromWire rdata_rrsig_fromWire1
|
||||
EXTRA_DIST += rdata_rrsig_fromWire2.spec
|
||||
EXTRA_DIST += rdata_rp_fromWire1.spec rdata_rp_fromWire2.spec
|
||||
EXTRA_DIST += rdata_rp_fromWire3.spec rdata_rp_fromWire4.spec
|
||||
EXTRA_DIST += rdata_rp_fromWire5.spec rdata_rp_fromWire6.spec
|
||||
EXTRA_DIST += rdata_rp_toWire1.spec rdata_rp_toWire2.spec
|
||||
EXTRA_DIST += rdata_soa_fromWire rdata_soa_toWireUncompressed.spec
|
||||
EXTRA_DIST += rdata_txt_fromWire1 rdata_txt_fromWire2.spec
|
||||
EXTRA_DIST += rdata_txt_fromWire3.spec rdata_txt_fromWire4.spec
|
||||
|
35
src/lib/dns/tests/testdata/gen-wiredata.py.in
vendored
35
src/lib/dns/tests/testdata/gen-wiredata.py.in
vendored
@ -90,7 +90,7 @@ def encode_name(name, absolute=True):
|
||||
for l in labels:
|
||||
if len(l) > 4 and l[0:4] == 'ptr=':
|
||||
# special meta-syntax for compression pointer
|
||||
wire += ' %04x' % (0xc000 | int(l[4:]))
|
||||
wire += '%04x' % (0xc000 | int(l[4:]))
|
||||
break
|
||||
if absolute or len(l) > 0:
|
||||
wire += '%02x' % len(l)
|
||||
@ -277,6 +277,34 @@ class TXT:
|
||||
' ' if len(wirestring_list[i]) > 0 else '',
|
||||
wirestring_list[i]))
|
||||
|
||||
class RP:
|
||||
'''Implements rendering RP RDATA in the wire format.
|
||||
Configurable parameters are as follows:
|
||||
- rdlen: 16-bit RDATA length. If omitted, the accurate value is auto
|
||||
calculated and used; if negative, the RDLEN field will be omitted from
|
||||
the output data.
|
||||
- mailbox: The mailbox field.
|
||||
- text: The text field.
|
||||
All of these parameters have the default values and can be omitted.
|
||||
'''
|
||||
rdlen = None # auto-calculate
|
||||
mailbox = 'root.example.com'
|
||||
text = 'rp-text.example.com'
|
||||
def dump(self, f):
|
||||
mailbox_wire = encode_name(self.mailbox)
|
||||
text_wire = encode_name(self.text)
|
||||
if self.rdlen is None:
|
||||
self.rdlen = (len(mailbox_wire) + len(text_wire)) / 2
|
||||
else:
|
||||
self.rdlen = int(self.rdlen)
|
||||
if self.rdlen >= 0:
|
||||
f.write('\n# RP RDATA (RDLEN=%d)\n' % self.rdlen)
|
||||
f.write('%04x\n' % self.rdlen)
|
||||
else:
|
||||
f.write('\n# RP RDATA (RDLEN omitted)\n')
|
||||
f.write('# MAILBOX=%s TEXT=%s\n' % (self.mailbox, self.text))
|
||||
f.write('%s %s\n' % (mailbox_wire, text_wire))
|
||||
|
||||
class NSECBASE:
|
||||
'''Implements rendering NSEC/NSEC3 type bitmaps commonly used for
|
||||
these RRs. The NSEC and NSEC3 classes will be inherited from this
|
||||
@ -461,8 +489,9 @@ def get_config_param(section):
|
||||
'header' : (DNSHeader, header_xtables),
|
||||
'question' : (DNSQuestion, question_xtables),
|
||||
'edns' : (EDNS, {}), 'soa' : (SOA, {}), 'txt' : (TXT, {}),
|
||||
'rrsig' : (RRSIG, {}), 'nsec' : (NSEC, {}),
|
||||
'nsec3' : (NSEC3, {}), 'tsig' : (TSIG, {}) }
|
||||
'rp' : (RP, {}), 'rrsig' : (RRSIG, {}),
|
||||
'nsec' : (NSEC, {}), 'nsec3' : (NSEC3, {}),
|
||||
'tsig' : (TSIG, {}) }
|
||||
s = section
|
||||
m = re.match('^([^:]+)/\d+$', section)
|
||||
if m:
|
||||
|
6
src/lib/dns/tests/testdata/rdata_rp_fromWire1.spec
vendored
Normal file
6
src/lib/dns/tests/testdata/rdata_rp_fromWire1.spec
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
#
|
||||
# A simplest form of RP: all default parameters
|
||||
#
|
||||
[custom]
|
||||
sections: rp
|
||||
[rp]
|
12
src/lib/dns/tests/testdata/rdata_rp_fromWire2.spec
vendored
Normal file
12
src/lib/dns/tests/testdata/rdata_rp_fromWire2.spec
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
#
|
||||
# A simplest form of RP: names are compressed.
|
||||
#
|
||||
[custom]
|
||||
sections: name/1:name/2:rp
|
||||
[name/1]
|
||||
name: a.example.com
|
||||
[name/2]
|
||||
name: b.example.net
|
||||
[rp]
|
||||
mailbox: root.ptr=2
|
||||
text: rp-text.ptr=17
|
7
src/lib/dns/tests/testdata/rdata_rp_fromWire3.spec
vendored
Normal file
7
src/lib/dns/tests/testdata/rdata_rp_fromWire3.spec
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
#
|
||||
# RP-like RDATA but RDLEN is too short.
|
||||
#
|
||||
[custom]
|
||||
sections: rp
|
||||
[rp]
|
||||
rdlen: 38
|
7
src/lib/dns/tests/testdata/rdata_rp_fromWire4.spec
vendored
Normal file
7
src/lib/dns/tests/testdata/rdata_rp_fromWire4.spec
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
#
|
||||
# RP-like RDATA but RDLEN is too long.
|
||||
#
|
||||
[custom]
|
||||
sections: rp
|
||||
[rp]
|
||||
rdlen: 40
|
7
src/lib/dns/tests/testdata/rdata_rp_fromWire5.spec
vendored
Normal file
7
src/lib/dns/tests/testdata/rdata_rp_fromWire5.spec
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
#
|
||||
# RP-like RDATA but mailbox name is broken.
|
||||
#
|
||||
[custom]
|
||||
sections: rp
|
||||
[rp]
|
||||
mailbox: "01234567890123456789012345678901234567890123456789012345678901234"
|
7
src/lib/dns/tests/testdata/rdata_rp_fromWire6.spec
vendored
Normal file
7
src/lib/dns/tests/testdata/rdata_rp_fromWire6.spec
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
#
|
||||
# RP-like RDATA but text name is broken.
|
||||
#
|
||||
[custom]
|
||||
sections: rp
|
||||
[rp]
|
||||
text: "01234567890123456789012345678901234567890123456789012345678901234"
|
8
src/lib/dns/tests/testdata/rdata_rp_toWire1.spec
vendored
Normal file
8
src/lib/dns/tests/testdata/rdata_rp_toWire1.spec
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
#
|
||||
# A simplest form of RP for toWire test: all default parameters except rdlen,
|
||||
# which is to be omitted.
|
||||
#
|
||||
[custom]
|
||||
sections: rp
|
||||
[rp]
|
||||
rdlen: -1
|
14
src/lib/dns/tests/testdata/rdata_rp_toWire2.spec
vendored
Normal file
14
src/lib/dns/tests/testdata/rdata_rp_toWire2.spec
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
#
|
||||
# A simple form of RP: names could be compressed (but MUST NOT).
|
||||
# rdlen is omitted for the "to wire" test.
|
||||
#
|
||||
[custom]
|
||||
sections: name/1:name/2:rp
|
||||
[name/1]
|
||||
name: a.example.com
|
||||
[name/2]
|
||||
name: b.example.net
|
||||
[rp]
|
||||
rdlen: -1
|
||||
mailbox: root.example.com
|
||||
text: rp-text.example.net
|
@ -59,19 +59,19 @@ RecursiveQuery::RecursiveQuery(DNSService& dns_service,
|
||||
const std::vector<std::pair<std::string, uint16_t> >& upstream,
|
||||
const std::vector<std::pair<std::string, uint16_t> >& upstream_root,
|
||||
int query_timeout, int client_timeout, int lookup_timeout,
|
||||
unsigned retries) :
|
||||
unsigned retries)
|
||||
:
|
||||
dns_service_(dns_service),
|
||||
nsas_(nsas), cache_(cache),
|
||||
upstream_(new AddressVector(upstream)),
|
||||
upstream_root_(new AddressVector(upstream_root)),
|
||||
test_server_("", 0),
|
||||
query_timeout_(query_timeout), client_timeout_(client_timeout),
|
||||
lookup_timeout_(lookup_timeout), retries_(retries)
|
||||
lookup_timeout_(lookup_timeout), retries_(retries), rtt_recorder_()
|
||||
{
|
||||
}
|
||||
|
||||
// Set the test server - only used for unit testing.
|
||||
|
||||
void
|
||||
RecursiveQuery::setTestServer(const std::string& address, uint16_t port) {
|
||||
dlog("Setting test server to " + address + "(" +
|
||||
@ -80,6 +80,11 @@ RecursiveQuery::setTestServer(const std::string& address, uint16_t port) {
|
||||
test_server_.second = port;
|
||||
}
|
||||
|
||||
// Set the RTT recorder - only used for testing
|
||||
void
|
||||
RecursiveQuery::setRttRecorder(boost::shared_ptr<RttRecorder>& recorder) {
|
||||
rtt_recorder_ = recorder;
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
@ -225,6 +230,10 @@ private:
|
||||
// event; we can cancel the NSAS callback safely.
|
||||
size_t outstanding_events_;
|
||||
|
||||
// RTT Recorder. Used for testing, the RTTs of queries are
|
||||
// sent to this object as well as being used to update the NSAS.
|
||||
boost::shared_ptr<RttRecorder> rtt_recorder_;
|
||||
|
||||
// perform a single lookup; first we check the cache to see
|
||||
// if we have a response for our query stored already. if
|
||||
// so, call handlerecursiveresponse(), if not, we call send()
|
||||
@ -483,7 +492,9 @@ public:
|
||||
int query_timeout, int client_timeout, int lookup_timeout,
|
||||
unsigned retries,
|
||||
isc::nsas::NameserverAddressStore& nsas,
|
||||
isc::cache::ResolverCache& cache) :
|
||||
isc::cache::ResolverCache& cache,
|
||||
boost::shared_ptr<RttRecorder>& recorder)
|
||||
:
|
||||
io_(io),
|
||||
question_(question),
|
||||
answer_message_(answer_message),
|
||||
@ -504,7 +515,8 @@ public:
|
||||
cur_zone_("."),
|
||||
nsas_callback_(new ResolverNSASCallback(this)),
|
||||
nsas_callback_out_(false),
|
||||
outstanding_events_(0)
|
||||
outstanding_events_(0),
|
||||
rtt_recorder_(recorder)
|
||||
{
|
||||
// Setup the timer to stop trying (lookup_timeout)
|
||||
if (lookup_timeout >= 0) {
|
||||
@ -621,9 +633,11 @@ public:
|
||||
rtt = 1000 * (cur_time.tv_sec - current_ns_qsent_time.tv_sec);
|
||||
rtt += (cur_time.tv_usec - current_ns_qsent_time.tv_usec) / 1000;
|
||||
}
|
||||
|
||||
dlog("RTT: " + boost::lexical_cast<std::string>(rtt));
|
||||
current_ns_address.updateRTT(rtt);
|
||||
if (rtt_recorder_) {
|
||||
rtt_recorder_->addRtt(rtt);
|
||||
}
|
||||
|
||||
try {
|
||||
Message incoming(Message::PARSE);
|
||||
@ -741,7 +755,8 @@ RecursiveQuery::resolve(const QuestionPtr& question,
|
||||
new RunningQuery(io, *question, answer_message, upstream_,
|
||||
test_server_, buffer, callback,
|
||||
query_timeout_, client_timeout_,
|
||||
lookup_timeout_, retries_, nsas_, cache_);
|
||||
lookup_timeout_, retries_, nsas_,
|
||||
cache_, rtt_recorder_);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -794,7 +809,7 @@ RecursiveQuery::resolve(const Question& question,
|
||||
new RunningQuery(io, question, answer_message, upstream_,
|
||||
test_server_, buffer, crs, query_timeout_,
|
||||
client_timeout_, lookup_timeout_, retries_,
|
||||
nsas_, cache_);
|
||||
nsas_, cache_, rtt_recorder_);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -23,11 +23,41 @@
|
||||
|
||||
namespace isc {
|
||||
namespace asiodns {
|
||||
/// \brief The \c RecursiveQuery class provides a layer of abstraction around
|
||||
/// the ASIO code that carries out an upstream query.
|
||||
|
||||
/// \brief RTT Recorder
|
||||
///
|
||||
/// This design is very preliminary; currently it is only capable of
|
||||
/// handling simple forward requests to a single resolver.
|
||||
/// Used for testing, this class will hold the set of round-trip times to
|
||||
/// nameservers for the current recursive query.
|
||||
///
|
||||
/// A pointer to an object of this class is passed to RecursiveQuery which in
|
||||
/// turn passes it to the created RunningQuery class. When a running query
|
||||
/// completes, its RTT is passed to the RTT Recorder object.
|
||||
class RttRecorder {
|
||||
public:
|
||||
/// \brief Record Time
|
||||
///
|
||||
/// Adds a round-trip time to the internal vector of times.
|
||||
///
|
||||
/// \param RTT to record.
|
||||
void addRtt(uint32_t rtt) {
|
||||
rtt_.push_back(rtt);
|
||||
}
|
||||
|
||||
/// \brief Return RTT Vector
|
||||
std::vector<uint32_t> getRtt() const {
|
||||
return rtt_;
|
||||
}
|
||||
|
||||
private:
|
||||
std::vector<uint32_t> rtt_; ///< Stored round-trip times
|
||||
};
|
||||
|
||||
|
||||
/// \brief Recursive Query
|
||||
///
|
||||
/// The \c RecursiveQuery class provides a layer of abstraction around
|
||||
/// the ASIO code that carries out an upstream query.
|
||||
|
||||
class RecursiveQuery {
|
||||
///
|
||||
/// \name Constructors
|
||||
@ -66,6 +96,14 @@ public:
|
||||
unsigned retries = 3);
|
||||
//@}
|
||||
|
||||
/// \brief Set Round-Trip Time Recorder
|
||||
///
|
||||
/// Sets the RTT recorder object. This is not accessed directly, instead
|
||||
/// it is passed to created RunningQuery objects.
|
||||
///
|
||||
/// \param recorder Pointer to the RTT recorder object used to hold RTTs.
|
||||
void setRttRecorder(boost::shared_ptr<RttRecorder>& recorder);
|
||||
|
||||
/// \brief Initiate resolving
|
||||
///
|
||||
/// When sendQuery() is called, a (set of) message(s) is sent
|
||||
@ -128,6 +166,7 @@ private:
|
||||
int client_timeout_;
|
||||
int lookup_timeout_;
|
||||
unsigned retries_;
|
||||
boost::shared_ptr<RttRecorder> rtt_recorder_; ///< Round-trip time recorder
|
||||
};
|
||||
|
||||
} // namespace asiodns
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include <iomanip>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <boost/bind.hpp>
|
||||
@ -651,13 +652,17 @@ TEST_F(RecursiveQueryTest2, Resolve) {
|
||||
boost::bind(&RecursiveQueryTest2::tcpAcceptHandler,
|
||||
this, _1, 0));
|
||||
|
||||
// Set up the RecursiveQuery object.
|
||||
// Set up the RecursiveQuery object. We will also test that it correctly records
|
||||
// RTT times by setting up a RTT recorder object as well.
|
||||
std::vector<std::pair<std::string, uint16_t> > upstream; // Empty
|
||||
std::vector<std::pair<std::string, uint16_t> > upstream_root; // Empty
|
||||
RecursiveQuery query(dns_service_, *nsas_, cache_,
|
||||
upstream, upstream_root);
|
||||
query.setTestServer(TEST_ADDRESS, TEST_PORT);
|
||||
|
||||
boost::shared_ptr<RttRecorder> recorder(new RttRecorder());
|
||||
query.setRttRecorder(recorder);
|
||||
|
||||
// Set up callback to receive notification that the query has completed.
|
||||
isc::resolve::ResolverInterface::CallbackPtr
|
||||
resolver_callback(new ResolverCallback(service_));
|
||||
@ -674,6 +679,16 @@ TEST_F(RecursiveQueryTest2, Resolve) {
|
||||
ResolverCallback* rc = static_cast<ResolverCallback*>(resolver_callback.get());
|
||||
EXPECT_TRUE(rc->getRun());
|
||||
EXPECT_TRUE(rc->getStatus());
|
||||
|
||||
// Finally, check that all the RTTs were "reasonable" (defined here as
|
||||
// being below 2 seconds). This is an explicit check to test that the
|
||||
// variables in the RTT calculation are at least being initialized; if they
|
||||
// weren't, we would expect some absurdly high answers.
|
||||
vector<uint32_t> rtt = recorder->getRtt();
|
||||
EXPECT_GT(rtt.size(), 0);
|
||||
for (int i = 0; i < rtt.size(); ++i) {
|
||||
EXPECT_LT(rtt[i], 2000);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace asiodns
|
||||
|
3
src/lib/util/Makefile.am
Normal file
3
src/lib/util/Makefile.am
Normal file
@ -0,0 +1,3 @@
|
||||
SUBDIRS = io unittests io/tests
|
||||
# The io/tests is hack, because otherwise we can not order these directories
|
||||
# properly. Unittests use io and io/tests use unittest.
|
16
src/lib/util/io/Makefile.am
Normal file
16
src/lib/util/io/Makefile.am
Normal file
@ -0,0 +1,16 @@
|
||||
AM_CXXFLAGS = $(B10_CXXFLAGS)
|
||||
|
||||
lib_LTLIBRARIES = libutil_io.la
|
||||
libutil_io_la_SOURCES = fd.h fd.cc fd_share.h fd_share.cc
|
||||
libutil_io_la_CXXFLAGS = $(AM_CXXFLAGS) -fno-strict-aliasing
|
||||
|
||||
CLEANFILES = *.gcno *.gcda
|
||||
|
||||
pyexec_LTLIBRARIES = libutil_io_python.la
|
||||
# Python prefers .so, while some OSes (specifically MacOS) use a different
|
||||
# suffix for dynamic objects. -module is necessary to work this around.
|
||||
libutil_io_python_la_LDFLAGS = -module
|
||||
libutil_io_python_la_SOURCES = fdshare_python.cc
|
||||
libutil_io_python_la_LIBADD = libutil_io.la
|
||||
libutil_io_python_la_CPPFLAGS = $(AM_CPPFLAGS) $(PYTHON_INCLUDES)
|
||||
libutil_io_python_la_CXXFLAGS = $(AM_CXXFLAGS)
|
70
src/lib/util/io/fd.cc
Normal file
70
src/lib/util/io/fd.cc
Normal file
@ -0,0 +1,70 @@
|
||||
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
|
||||
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
// AND FITNESS. IN NO EVENT SHALL ISC 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.
|
||||
|
||||
#include "fd.h"
|
||||
|
||||
#include <unistd.h>
|
||||
#include <cerrno>
|
||||
|
||||
namespace isc {
|
||||
namespace util {
|
||||
namespace io {
|
||||
|
||||
bool
|
||||
write_data(const int fd, const void *buffer_v, const size_t length) {
|
||||
const unsigned char *buffer(static_cast<const unsigned char *>(buffer_v));
|
||||
size_t rest(length);
|
||||
// Just keep writing until all is written
|
||||
while (rest) {
|
||||
ssize_t written(write(fd, buffer, rest));
|
||||
if (rest == -1) {
|
||||
if (errno == EINTR) { // Just keep going
|
||||
continue;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else { // Wrote something
|
||||
rest -= written;
|
||||
buffer += written;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
ssize_t
|
||||
read_data(const int fd, void *buffer_v, const size_t length) {
|
||||
unsigned char *buffer(static_cast<unsigned char *>(buffer_v));
|
||||
size_t rest(length), already(0);
|
||||
while (rest) { // Stil something to read
|
||||
ssize_t amount(read(fd, buffer, rest));
|
||||
if (rest == -1) {
|
||||
if (errno == EINTR) { // Continue on interrupted call
|
||||
continue;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
} else if (amount) {
|
||||
already += amount;
|
||||
rest -= amount;
|
||||
buffer += amount;
|
||||
} else { // EOF
|
||||
return already;
|
||||
}
|
||||
}
|
||||
return already;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
61
src/lib/util/io/fd.h
Normal file
61
src/lib/util/io/fd.h
Normal file
@ -0,0 +1,61 @@
|
||||
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
|
||||
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
// AND FITNESS. IN NO EVENT SHALL ISC 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.
|
||||
|
||||
#ifndef __UTIL_IO_FD_H
|
||||
#define __UTIL_IO_FD_H 1
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
/**
|
||||
* @file fd.h
|
||||
* @short Wrappers around common unix fd manipulation functions.
|
||||
*/
|
||||
|
||||
namespace isc {
|
||||
namespace util {
|
||||
namespace io {
|
||||
|
||||
/*
|
||||
* \short write() that writes everything.
|
||||
* Wrapper around write(). The difference is, it never writes less data
|
||||
* and looks successfull (eg. it blocks until all data are written).
|
||||
* Retries on signals.
|
||||
*
|
||||
* \return True if sucessfull, false otherwise. The errno variable is left
|
||||
* intact.
|
||||
* \param fd Where to write.
|
||||
* \param data The buffer to write.
|
||||
* \param length How much data is there to write.
|
||||
*/
|
||||
bool
|
||||
write_data(const int fd, const void *data, const size_t length);
|
||||
|
||||
/*
|
||||
* \short read() that reads everything.
|
||||
* Wrapper around read(). It does not do short reads, if it returns less,
|
||||
* it means there was EOF. It retries on signals.
|
||||
*
|
||||
* \return Number of bytes read or -1 on error.
|
||||
* \param fd Where to read data from.
|
||||
* \param data Where to put the data.
|
||||
* \param length How many of them.
|
||||
*/
|
||||
ssize_t
|
||||
read_data(const int fd, void *buffer, const size_t length);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif // __UTIL_IO_FD_H
|
@ -19,10 +19,11 @@
|
||||
#include <sys/socket.h>
|
||||
#include <sys/uio.h>
|
||||
#include <stdlib.h> // for malloc and free
|
||||
#include <xfr/fd_share.h>
|
||||
#include "fd_share.h"
|
||||
|
||||
namespace isc {
|
||||
namespace xfr {
|
||||
namespace util {
|
||||
namespace io {
|
||||
|
||||
namespace {
|
||||
// Not all OSes support advanced CMSG macros: CMSG_LEN and CMSG_SPACE.
|
||||
@ -86,15 +87,15 @@ recv_fd(const int sock) {
|
||||
msghdr.msg_controllen = cmsg_space(sizeof(int));
|
||||
msghdr.msg_control = malloc(msghdr.msg_controllen);
|
||||
if (msghdr.msg_control == NULL) {
|
||||
return (-1);
|
||||
return (FD_OTHER_ERROR);
|
||||
}
|
||||
|
||||
if (recvmsg(sock, &msghdr, 0) < 0) {
|
||||
free(msghdr.msg_control);
|
||||
return (XFR_FD_RECEIVE_FAIL);
|
||||
return (FD_COMM_ERROR);
|
||||
}
|
||||
const struct cmsghdr* cmsg = CMSG_FIRSTHDR(&msghdr);
|
||||
int fd = -1;
|
||||
int fd = FD_OTHER_ERROR;
|
||||
if (cmsg != NULL && cmsg->cmsg_len == cmsg_len(sizeof(int)) &&
|
||||
cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) {
|
||||
fd = *(const int*)CMSG_DATA(cmsg);
|
||||
@ -119,7 +120,7 @@ send_fd(const int sock, const int fd) {
|
||||
msghdr.msg_controllen = cmsg_space(sizeof(int));
|
||||
msghdr.msg_control = malloc(msghdr.msg_controllen);
|
||||
if (msghdr.msg_control == NULL) {
|
||||
return (-1);
|
||||
return (FD_OTHER_ERROR);
|
||||
}
|
||||
|
||||
struct cmsghdr* cmsg = CMSG_FIRSTHDR(&msghdr);
|
||||
@ -130,8 +131,9 @@ send_fd(const int sock, const int fd) {
|
||||
|
||||
const int ret = sendmsg(sock, &msghdr, 0);
|
||||
free(msghdr.msg_control);
|
||||
return (ret >= 0 ? 0 : -1);
|
||||
return (ret >= 0 ? 0 : FD_COMM_ERROR);
|
||||
}
|
||||
|
||||
} // End for namespace xfr
|
||||
} // End for namespace io
|
||||
} // End for namespace util
|
||||
} // End for namespace isc
|
65
src/lib/util/io/fd_share.h
Normal file
65
src/lib/util/io/fd_share.h
Normal file
@ -0,0 +1,65 @@
|
||||
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
|
||||
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
// AND FITNESS. IN NO EVENT SHALL ISC 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.
|
||||
|
||||
#ifndef FD_SHARE_H_
|
||||
#define FD_SHARE_H_
|
||||
|
||||
/**
|
||||
* \file fd_share.h
|
||||
* \short Support to transfer file descriptors between processes.
|
||||
* \todo This interface is very C-ish. Should we have some kind of exceptions?
|
||||
*/
|
||||
|
||||
namespace isc {
|
||||
namespace util {
|
||||
namespace io {
|
||||
|
||||
const int FD_COMM_ERROR = -2;
|
||||
const int FD_OTHER_ERROR = -1;
|
||||
|
||||
/**
|
||||
* \short Receives a file descriptor.
|
||||
* This receives a file descriptor sent over an unix domain socket. This
|
||||
* is the counterpart of send_fd().
|
||||
*
|
||||
* \return FD_COMM_ERROR when there's error receiving the socket, FD_OTHER_ERROR
|
||||
* when there's a different error.
|
||||
* \param sock The unix domain socket to read from. Tested and it does
|
||||
* not work with a pipe.
|
||||
*/
|
||||
int recv_fd(const int sock);
|
||||
|
||||
/**
|
||||
* \short Sends a file descriptor.
|
||||
* This sends a file descriptor over an unix domain socket. This is the
|
||||
* counterpart of recv_fd().
|
||||
*
|
||||
* \return FD_COMM_ERROR when there's error sending the socket, FD_OTHER_ERROR
|
||||
* for all other possible errors.
|
||||
* \param sock The unix domain socket to send to. Tested and it does not
|
||||
* work with a pipe.
|
||||
* \param fd The file descriptor to send. It should work with any valid
|
||||
* file descriptor.
|
||||
*/
|
||||
int send_fd(const int sock, const int fd);
|
||||
|
||||
} // End for namespace io
|
||||
} // End for namespace util
|
||||
} // End for namespace isc
|
||||
|
||||
#endif
|
||||
|
||||
// Local Variables:
|
||||
// mode: c++
|
||||
// End:
|
@ -18,7 +18,7 @@
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <xfr/fd_share.h>
|
||||
#include "fd_share.h"
|
||||
|
||||
|
||||
static PyObject*
|
||||
@ -27,7 +27,7 @@ fdshare_recv_fd(PyObject*, PyObject* args) {
|
||||
if (!PyArg_ParseTuple(args, "i", &sock)) {
|
||||
return (NULL);
|
||||
}
|
||||
fd = isc::xfr::recv_fd(sock);
|
||||
fd = isc::util::io::recv_fd(sock);
|
||||
return (Py_BuildValue("i", fd));
|
||||
}
|
||||
|
||||
@ -37,7 +37,7 @@ fdshare_send_fd(PyObject*, PyObject* args) {
|
||||
if (!PyArg_ParseTuple(args, "ii", &sock, &fd)) {
|
||||
return (NULL);
|
||||
}
|
||||
result = isc::xfr::send_fd(sock, fd);
|
||||
result = isc::util::io::send_fd(sock, fd);
|
||||
return (Py_BuildValue("i", result));
|
||||
}
|
||||
|
||||
@ -61,20 +61,33 @@ static PyModuleDef bind10_fdshare_python = {
|
||||
};
|
||||
|
||||
PyMODINIT_FUNC
|
||||
PyInit_libxfr_python(void) {
|
||||
PyObject* mod = PyModule_Create(&bind10_fdshare_python);
|
||||
PyInit_libutil_io_python(void) {
|
||||
PyObject *mod = PyModule_Create(&bind10_fdshare_python);
|
||||
if (mod == NULL) {
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
PyObject* XFR_FD_RECEIVE_FAIL = Py_BuildValue("i", isc::xfr::XFR_FD_RECEIVE_FAIL);
|
||||
if (XFR_FD_RECEIVE_FAIL == NULL) {
|
||||
PyObject* FD_COMM_ERROR = Py_BuildValue("i", isc::util::io::FD_COMM_ERROR);
|
||||
if (FD_COMM_ERROR == NULL) {
|
||||
Py_XDECREF(mod);
|
||||
return (NULL);
|
||||
}
|
||||
int ret = PyModule_AddObject(mod, "XFR_FD_RECEIVE_FAIL", XFR_FD_RECEIVE_FAIL);
|
||||
int ret = PyModule_AddObject(mod, "FD_COMM_ERROR", FD_COMM_ERROR);
|
||||
if (-1 == ret) {
|
||||
Py_XDECREF(XFR_FD_RECEIVE_FAIL);
|
||||
Py_XDECREF(FD_COMM_ERROR);
|
||||
Py_XDECREF(mod);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
PyObject* FD_OTHER_ERROR = Py_BuildValue("i",
|
||||
isc::util::io::FD_OTHER_ERROR);
|
||||
if (FD_OTHER_ERROR == NULL) {
|
||||
Py_XDECREF(mod);
|
||||
return (NULL);
|
||||
}
|
||||
ret = PyModule_AddObject(mod, "FD_OTHER_ERROR", FD_OTHER_ERROR);
|
||||
if (-1 == ret) {
|
||||
Py_XDECREF(FD_OTHER_ERROR);
|
||||
Py_XDECREF(mod);
|
||||
return (NULL);
|
||||
}
|
25
src/lib/util/io/tests/Makefile.am
Normal file
25
src/lib/util/io/tests/Makefile.am
Normal file
@ -0,0 +1,25 @@
|
||||
CLEANFILES = *.gcno *.gcda
|
||||
|
||||
AM_CPPFLAGS = -I$(top_srcdir)/src/lib -I$(top_builddir)/src/lib
|
||||
AM_CXXFLAGS = $(B10_CXXFLAGS)
|
||||
|
||||
if USE_STATIC_LINK
|
||||
AM_LDFLAGS = -static
|
||||
endif
|
||||
|
||||
TESTS =
|
||||
if HAVE_GTEST
|
||||
TESTS += run_unittests
|
||||
run_unittests_SOURCES = run_unittests.cc
|
||||
run_unittests_SOURCES += fd_tests.cc
|
||||
run_unittests_SOURCES += fd_share_tests.cc
|
||||
|
||||
run_unittests_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_INCLUDES)
|
||||
run_unittests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS)
|
||||
run_unittests_LDADD = $(GTEST_LDADD)
|
||||
run_unittests_LDADD += $(top_builddir)/src/lib/util/io/libutil_io.la
|
||||
run_unittests_LDADD += \
|
||||
$(top_builddir)/src/lib/util/unittests/libutil_unittests.la
|
||||
endif
|
||||
|
||||
noinst_PROGRAMS = $(TESTS)
|
74
src/lib/util/io/tests/fd_share_tests.cc
Normal file
74
src/lib/util/io/tests/fd_share_tests.cc
Normal file
@ -0,0 +1,74 @@
|
||||
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
|
||||
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
// AND FITNESS. IN NO EVENT SHALL ISC 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.
|
||||
|
||||
#include "../fd.h"
|
||||
#include "../fd_share.h"
|
||||
|
||||
#include <util/unittests/fork.h>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <cstdio>
|
||||
|
||||
using namespace isc::util::io;
|
||||
using namespace isc::util::unittests;
|
||||
|
||||
namespace {
|
||||
|
||||
// We test that we can transfer a pipe over other pipe
|
||||
TEST(FDShare, transfer) {
|
||||
// Get a pipe and fork
|
||||
int pipes[2];
|
||||
ASSERT_NE(-1, socketpair(AF_UNIX, SOCK_STREAM, 0, pipes));
|
||||
pid_t sender(fork());
|
||||
ASSERT_NE(-1, sender);
|
||||
if(sender) { // We are in parent
|
||||
// Close the other side of pipe, we want only writible one
|
||||
EXPECT_NE(-1, close(pipes[0]));
|
||||
// Get a process to check data
|
||||
int fd(0);
|
||||
pid_t checker(check_output(&fd, "data", 4));
|
||||
ASSERT_NE(-1, checker);
|
||||
// Now, send the file descriptor, close it and close the pipe
|
||||
EXPECT_NE(-1, send_fd(pipes[1], fd));
|
||||
EXPECT_NE(-1, close(pipes[1]));
|
||||
EXPECT_NE(-1, close(fd));
|
||||
// Check both subprocesses ended well
|
||||
EXPECT_TRUE(process_ok(sender));
|
||||
EXPECT_TRUE(process_ok(checker));
|
||||
} else { // We are in child. We do not use ASSERT here
|
||||
// Close the write end, we only read
|
||||
if(close(pipes[1])) {
|
||||
exit(1);
|
||||
}
|
||||
// Get the file descriptor
|
||||
int fd(recv_fd(pipes[0]));
|
||||
if(fd == -1) {
|
||||
exit(1);
|
||||
}
|
||||
// This pipe is not needed
|
||||
if(close(pipes[0])) {
|
||||
exit(1);
|
||||
}
|
||||
// Send "data" trough the received fd, close it and be done
|
||||
if(!write_data(fd, "data", 4) || close(fd) == -1) {
|
||||
exit(1);
|
||||
}
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
66
src/lib/util/io/tests/fd_tests.cc
Normal file
66
src/lib/util/io/tests/fd_tests.cc
Normal file
@ -0,0 +1,66 @@
|
||||
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
|
||||
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
// AND FITNESS. IN NO EVENT SHALL ISC 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.
|
||||
|
||||
#include "../fd.h"
|
||||
|
||||
#include <util/unittests/fork.h>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
using namespace isc::util::io;
|
||||
using namespace isc::util::unittests;
|
||||
|
||||
namespace {
|
||||
|
||||
// Make sure the test is large enough and does not fit into one
|
||||
// read or write request
|
||||
const size_t TEST_DATA_SIZE = 8 * 1024 * 1024;
|
||||
|
||||
class FDTest : public ::testing::Test {
|
||||
public:
|
||||
unsigned char *data, *buffer;
|
||||
FDTest() :
|
||||
// We do not care what is inside, we just need it to be the same
|
||||
data(new unsigned char[TEST_DATA_SIZE]),
|
||||
buffer(NULL)
|
||||
{ }
|
||||
~ FDTest() {
|
||||
delete[] data;
|
||||
delete[] buffer;
|
||||
}
|
||||
};
|
||||
|
||||
// Test we read what was sent
|
||||
TEST_F(FDTest, read) {
|
||||
int read_pipe(0);
|
||||
buffer = new unsigned char[TEST_DATA_SIZE];
|
||||
pid_t feeder(provide_input(&read_pipe, data, TEST_DATA_SIZE));
|
||||
ASSERT_GE(feeder, 0);
|
||||
ssize_t received(read_data(read_pipe, buffer, TEST_DATA_SIZE));
|
||||
EXPECT_TRUE(process_ok(feeder));
|
||||
EXPECT_EQ(TEST_DATA_SIZE, received);
|
||||
EXPECT_EQ(0, memcmp(data, buffer, received));
|
||||
}
|
||||
|
||||
// Test we write the correct thing
|
||||
TEST_F(FDTest, write) {
|
||||
int write_pipe(0);
|
||||
pid_t checker(check_output(&write_pipe, data, TEST_DATA_SIZE));
|
||||
ASSERT_GE(checker, 0);
|
||||
EXPECT_TRUE(write_data(write_pipe, data, TEST_DATA_SIZE));
|
||||
EXPECT_EQ(0, close(write_pipe));
|
||||
EXPECT_TRUE(process_ok(checker));
|
||||
}
|
||||
|
||||
}
|
22
src/lib/util/io/tests/run_unittests.cc
Normal file
22
src/lib/util/io/tests/run_unittests.cc
Normal file
@ -0,0 +1,22 @@
|
||||
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
|
||||
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
// AND FITNESS. IN NO EVENT SHALL ISC 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.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
int
|
||||
main(int argc, char *argv[]) {
|
||||
::testing::InitGoogleTest(&argc, argv);
|
||||
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
9
src/lib/util/unittests/Makefile.am
Normal file
9
src/lib/util/unittests/Makefile.am
Normal file
@ -0,0 +1,9 @@
|
||||
AM_CPPFLAGS = -I$(top_srcdir)/src/lib -I$(top_builddir)/src/lib
|
||||
AM_CXXFLAGS = $(B10_CXXFLAGS)
|
||||
|
||||
lib_LTLIBRARIES = libutil_unittests.la
|
||||
libutil_unittests_la_SOURCES = fork.h fork.cc
|
||||
libutil_unittests_la_LIBADD = \
|
||||
$(top_builddir)/src/lib/util/io/libutil_io.la
|
||||
|
||||
CLEANFILES = *.gcno *.gcda
|
5
src/lib/util/unittests/README
Normal file
5
src/lib/util/unittests/README
Normal file
@ -0,0 +1,5 @@
|
||||
This directory contains some code that is useful while writing various
|
||||
unittest code. It doesn't contain any code that would actually run in
|
||||
bind10.
|
||||
|
||||
Because this is a test code, we do not test it explicitly.
|
145
src/lib/util/unittests/fork.cc
Normal file
145
src/lib/util/unittests/fork.cc
Normal file
@ -0,0 +1,145 @@
|
||||
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
|
||||
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
// AND FITNESS. IN NO EVENT SHALL ISC 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.
|
||||
|
||||
#include "fork.h"
|
||||
|
||||
#include <util/io/fd.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include <string.h>
|
||||
#include <cerrno>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
using namespace isc::util::io;
|
||||
|
||||
namespace {
|
||||
|
||||
// Just a NOP function to ignore a signal but let it interrupt function.
|
||||
void no_handler(int) { }
|
||||
|
||||
};
|
||||
|
||||
namespace isc {
|
||||
namespace util {
|
||||
namespace unittests {
|
||||
|
||||
bool
|
||||
process_ok(pid_t process) {
|
||||
// Create a timeout
|
||||
struct sigaction ignored, original;
|
||||
memset(&ignored, 0, sizeof ignored);
|
||||
ignored.sa_handler = no_handler;
|
||||
if (sigaction(SIGALRM, &ignored, &original)) {
|
||||
return false;
|
||||
}
|
||||
// It is long, but if everything is OK, it'll not happen
|
||||
alarm(10);
|
||||
int status;
|
||||
int result(waitpid(process, &status, 0) == -1);
|
||||
// Cancel the alarm and return the original handler
|
||||
alarm(0);
|
||||
if (sigaction(SIGALRM, &original, NULL)) {
|
||||
return false;
|
||||
}
|
||||
// Check what we found out
|
||||
if (result) {
|
||||
if (errno == EINTR)
|
||||
kill(process, SIGTERM);
|
||||
return false;
|
||||
}
|
||||
return WIFEXITED(status) && WEXITSTATUS(status) == 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This creates a pipe, forks and feeds the pipe with given data.
|
||||
* Used to provide the input in non-blocking/asynchronous way.
|
||||
*/
|
||||
pid_t
|
||||
provide_input(int *read_pipe, const void *input, const size_t length)
|
||||
{
|
||||
int pipes[2];
|
||||
if (pipe(pipes)) {
|
||||
return -1;
|
||||
}
|
||||
*read_pipe = pipes[0];
|
||||
pid_t pid(fork());
|
||||
if (pid) { // We are in the parent
|
||||
return pid;
|
||||
} else { // This is in the child, just puth the data there
|
||||
close(pipes[0]);
|
||||
if (!write_data(pipes[1], input, length)) {
|
||||
exit(1);
|
||||
} else {
|
||||
close(pipes[1]);
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This creates a pipe, forks and reads the pipe and compares it
|
||||
* with given data. Used to check output of run in asynchronous way.
|
||||
*/
|
||||
pid_t
|
||||
check_output(int *write_pipe, const void *output, const size_t length)
|
||||
{
|
||||
int pipes[2];
|
||||
if (pipe(pipes)) {
|
||||
return -1;
|
||||
}
|
||||
*write_pipe = pipes[1];
|
||||
pid_t pid(fork());
|
||||
if (pid) { // We are in parent
|
||||
close(pipes[0]);
|
||||
return pid;
|
||||
} else {
|
||||
close(pipes[1]);
|
||||
// We don't return the memory, but we're in tests and end this process
|
||||
// right away.
|
||||
unsigned char *buffer = new unsigned char[length + 1];
|
||||
// Try to read one byte more to see if the output ends here
|
||||
size_t got_length(read_data(pipes[0], buffer, length + 1));
|
||||
bool ok(true);
|
||||
if (got_length != length) {
|
||||
fprintf(stderr, "Different length (expected %u, got %u)\n",
|
||||
static_cast<unsigned>(length),
|
||||
static_cast<unsigned>(got_length));
|
||||
ok = false;
|
||||
}
|
||||
if(!ok || memcmp(buffer, output, length)) {
|
||||
const unsigned char *output_c(static_cast<const unsigned char *>(
|
||||
output));
|
||||
// If they differ, print what we have
|
||||
for(size_t i(0); i != got_length; ++ i) {
|
||||
fprintf(stderr, "%02hhx", buffer[i]);
|
||||
}
|
||||
fprintf(stderr, "\n");
|
||||
for(size_t i(0); i != length; ++ i) {
|
||||
fprintf(stderr, "%02hhx", output_c[i]);
|
||||
}
|
||||
fprintf(stderr, "\n");
|
||||
exit(1);
|
||||
} else {
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
52
src/lib/util/unittests/fork.h
Normal file
52
src/lib/util/unittests/fork.h
Normal file
@ -0,0 +1,52 @@
|
||||
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
|
||||
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
// AND FITNESS. IN NO EVENT SHALL ISC 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.
|
||||
|
||||
#ifndef __UTIL_UNITTESTS_FORK_H
|
||||
#define __UTIL_UNITTESTS_FORK_H 1
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
/**
|
||||
* @file fork.h
|
||||
* @short Help functions to fork the test case process.
|
||||
* Various functions to fork a process and feed some data to pipe, check
|
||||
* its output and such lives here.
|
||||
*/
|
||||
|
||||
namespace isc {
|
||||
namespace util {
|
||||
namespace unittests {
|
||||
|
||||
/**
|
||||
* @short Checks that a process terminates correctly.
|
||||
* Waits for a process to terminate (with a short timeout, this should be
|
||||
* used whan the process is about tu terminate) and checks its exit code.
|
||||
*
|
||||
* @return True if the process terminates with 0, false otherwise.
|
||||
* @param process The ID of process to wait for.
|
||||
*/
|
||||
bool
|
||||
process_ok(pid_t process);
|
||||
|
||||
pid_t
|
||||
provide_input(int *read_pipe, const void *input, const size_t length);
|
||||
|
||||
pid_t
|
||||
check_output(int *write_pipe, const void *output, const size_t length);
|
||||
|
||||
} // End of the namespace
|
||||
}
|
||||
}
|
||||
|
||||
#endif // __UTIL_UNITTESTS_FORK_H
|
@ -2,7 +2,7 @@ AM_CPPFLAGS = -I$(top_srcdir)/src/lib -I$(top_builddir)/src/lib
|
||||
AM_CPPFLAGS += -I$(top_srcdir)/src/lib/dns -I$(top_builddir)/src/lib/dns
|
||||
AM_CPPFLAGS += $(BOOST_INCLUDES)
|
||||
|
||||
AM_CXXFLAGS = $(B10_CXXFLAGS) -Wno-strict-aliasing
|
||||
AM_CXXFLAGS = $(B10_CXXFLAGS)
|
||||
AM_CXXFLAGS += -Wno-unused-parameter # see src/lib/cc/Makefile.am
|
||||
if USE_CLANGPP
|
||||
AM_CXXFLAGS += -Wno-error
|
||||
@ -11,13 +11,5 @@ endif
|
||||
CLEANFILES = *.gcno *.gcda
|
||||
|
||||
lib_LTLIBRARIES = libxfr.la
|
||||
libxfr_la_SOURCES = xfrout_client.h xfrout_client.cc
|
||||
libxfr_la_SOURCES += fd_share.h fd_share.cc
|
||||
|
||||
pyexec_LTLIBRARIES = libxfr_python.la
|
||||
# Python prefers .so, while some OSes (specifically MacOS) use a different
|
||||
# suffix for dynamic objects. -module is necessary to work this around.
|
||||
libxfr_python_la_LDFLAGS = -module
|
||||
libxfr_python_la_SOURCES = fdshare_python.cc fd_share.cc fd_share.h
|
||||
libxfr_python_la_CPPFLAGS = $(AM_CPPFLAGS) $(PYTHON_INCLUDES)
|
||||
libxfr_python_la_CXXFLAGS = $(AM_CXXFLAGS)
|
||||
libxfr_la_SOURCES = xfrout_client.h xfrout_client.cc
|
||||
libxfr_la_LIBADD = $(top_builddir)/src/lib/util/io/libutil_io.la
|
||||
|
@ -1,42 +0,0 @@
|
||||
// Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
|
||||
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
// AND FITNESS. IN NO EVENT SHALL ISC 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.
|
||||
|
||||
#ifndef FD_SHARE_H_
|
||||
#define FD_SHARE_H_
|
||||
|
||||
namespace isc {
|
||||
namespace xfr {
|
||||
|
||||
/// Failed to receive xfr socket descriptor "fd" on unix domain socket 'sock'
|
||||
const int XFR_FD_RECEIVE_FAIL = -2;
|
||||
|
||||
// Receive socket descriptor on unix domain socket 'sock'.
|
||||
// Returned value is the socket descriptor received.
|
||||
// Returned XFR_FD_RECEIVE_FAIL if failed to receive xfr socket descriptor
|
||||
// Errors are indicated by a return value of -1.
|
||||
int recv_fd(const int sock);
|
||||
|
||||
// Send socket descriptor "fd" to server over unix domain socket 'sock',
|
||||
// the connection from socket 'sock' to unix domain server should be established first.
|
||||
// Errors are indicated by a return value of -1.
|
||||
int send_fd(const int sock, const int fd);
|
||||
|
||||
} // End for namespace xfr
|
||||
} // End for namespace isc
|
||||
|
||||
#endif
|
||||
|
||||
// Local Variables:
|
||||
// mode: c++
|
||||
// End:
|
@ -20,10 +20,11 @@
|
||||
#include <unistd.h>
|
||||
#include <asio.hpp>
|
||||
|
||||
#include <xfr/fd_share.h>
|
||||
#include <util/io/fd_share.h>
|
||||
#include <xfr/xfrout_client.h>
|
||||
|
||||
using namespace std;
|
||||
using namespace isc::util::io;
|
||||
using asio::local::stream_protocol;
|
||||
|
||||
namespace isc {
|
||||
@ -72,7 +73,7 @@ XfroutClient::sendXfroutRequestInfo(const int tcp_sock,
|
||||
const void* const msg_data,
|
||||
const uint16_t msg_len)
|
||||
{
|
||||
if (-1 == send_fd(impl_->socket_.native(), tcp_sock)) {
|
||||
if (send_fd(impl_->socket_.native(), tcp_sock) < 0) {
|
||||
isc_throw(XfroutError,
|
||||
"Failed to send the socket file descriptor "
|
||||
"to xfrout module");
|
||||
|
27
tools/query_cmp/README
Normal file
27
tools/query_cmp/README
Normal file
@ -0,0 +1,27 @@
|
||||
This is a tool to compare two DNS server's response to query.
|
||||
|
||||
DIRECTORY STRUCTURE
|
||||
|
||||
zonefile
|
||||
The file under this directory is for the testee servers
|
||||
to load before running the test, containing various types
|
||||
of RRs in the test cases. It is in bind9's format. One
|
||||
file is signed while the other is not, which you can choose.
|
||||
|
||||
queries
|
||||
The files under this directory are the input of the test,
|
||||
involving various types of query cases.
|
||||
|
||||
src
|
||||
The scripts of this test.
|
||||
It uses the dns python binding interface of bind10 from the
|
||||
source tree, so src/lib/dns/python/.libs must be added to
|
||||
PYTHONPATH environment variable ahead of running the tests.
|
||||
|
||||
RUNNING
|
||||
|
||||
e.g.
|
||||
cd src
|
||||
./query_two_server.py -u -f ../queries/dquery01 -s 10.10.1.1 -p 30000 -t 10.10.10.2 -q 30002 > bind10test_normal
|
||||
|
||||
./query_two_server.py --help' for more details
|
394
tools/query_cmp/queries/dquery01
Normal file
394
tools/query_cmp/queries/dquery01
Normal file
@ -0,0 +1,394 @@
|
||||
# Fields Description
|
||||
#
|
||||
#query:ID QR OPCODE AA TC RD RA Z AD CD RCODE QDCOUNT ANCOUNT NSCOUNT ARCOUNT QNAME QTYPE QCLASS
|
||||
#response:ID QR OPCODE AA TC RD RA Z AD CD RCODE QDCOUNT ANCOUNT NSCOUNT ARCOUNT QNAME QTYPE QCLASS <answer> <authority> <additional>
|
||||
# <answer> := <rr1> .. <rrN>
|
||||
# <rr> := NAME TYPE CLASS TTL RDLENGTH <rdata>
|
||||
# <rdata> := ADDRESS |
|
||||
# NSDNAME |
|
||||
# MNAME RNAME SERIAL REFRESH RETRY EXPIRE MINIMUM |
|
||||
# ...
|
||||
# <authority> := <rr1> .. <rrN>
|
||||
# <additional> := <rr1> .. <rrN>
|
||||
#
|
||||
#
|
||||
#
|
||||
# Description in BNF (http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form)
|
||||
# <query> ::= <header> <question>
|
||||
# <header> ::= <ID> <QR> <OPCODE> <AA> <TC> <RD> <RA> <Z> <AD> <CD> <RCODE>
|
||||
# <QDCOUNT> <ANCOUNT> <NSCOUNT> <ARCOUNT>
|
||||
# <question> ::= <QNAME> <QTYPE> <QCLASS>
|
||||
#
|
||||
# <response> ::= <header> <question> <answer> <authority> <additional>
|
||||
# <answer> ::= <rrset>
|
||||
# <authority> ::= <rrset>
|
||||
# <additional> ::= <rrset>
|
||||
# <rrset> ::= { <rr> }
|
||||
# <rr> ::= <name> <type> <class> <ttl> <rdlength> <rdata>
|
||||
# <name> ::= <subdomain> | ""
|
||||
# <subdomain> ::= <label> | <subdomain> "." <label>
|
||||
# <label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
|
||||
# <ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
|
||||
# <let-dig-hyp> ::= <let-dig> | "-"
|
||||
# <let-dig> ::= <letter> | <digit>
|
||||
# <letter> ::= "a" | .. | "z" | "A" | .. | "Z"
|
||||
# <digit> ::= "0" | .. | "9"
|
||||
# <type> ::= A | NS | CNAME | SOA | PTR | MX | ..
|
||||
# <class> ::= IN | CH | HS | CS
|
||||
# <ttl> ::= <digit> | { <digit> }
|
||||
# <rdlength> ::= <digit> | { <digit> }
|
||||
# <rdata> ::= <address> |
|
||||
# <nsdname> |
|
||||
# <cname> |
|
||||
# <preference> <exchange> |
|
||||
# <ptrdname> |
|
||||
# ...
|
||||
|
||||
0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.example.com A IN
|
||||
1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.example.com A IN
|
||||
2 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com A IN
|
||||
3 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com A IN
|
||||
4 0 0 0 0 1 0 0 0 0 0 1 0 0 0 BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com A IN
|
||||
5 0 0 0 0 1 0 0 0 0 0 1 0 0 0 EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com A IN
|
||||
6 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.example.com A IN
|
||||
7 0 0 0 0 1 0 0 0 0 0 1 0 0 0 B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.example.com A IN
|
||||
8 0 0 0 0 1 0 0 0 0 0 1 0 0 0 M.example.com A IN
|
||||
9 0 0 0 0 1 0 0 0 0 0 1 0 0 0 multiple-type-a-record.example.com A IN
|
||||
|
||||
10 0 0 0 0 1 0 0 0 0 0 1 0 0 0 NS.example.com A IN
|
||||
11 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nS.example.com A IN
|
||||
12 0 0 0 0 1 0 0 0 0 0 1 0 0 0 NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com A IN
|
||||
13 0 0 0 0 1 0 0 0 0 0 1 0 0 0 NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com A IN
|
||||
14 0 0 0 0 1 0 0 0 0 0 1 0 0 0 N.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.example.com A IN
|
||||
15 0 0 0 0 1 0 0 0 0 0 1 0 0 0 www.multiple-type-ns-record.example.com a IN
|
||||
|
||||
20 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C.example.com A IN
|
||||
21 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C.example.com CNAME IN
|
||||
22 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C.example.com MX IN
|
||||
23 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C.example.com ANY IN
|
||||
|
||||
24 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C0.example.com A IN
|
||||
25 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C0.example.com CNAME IN
|
||||
26 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C0.example.com MX IN
|
||||
27 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C0.example.com ANY IN
|
||||
|
||||
28 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C10.example.com A IN
|
||||
29 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C10.example.com CNAME IN
|
||||
30 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C10.example.com MX IN
|
||||
31 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C10.example.com ANY IN
|
||||
|
||||
32 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C36.example.com A IN
|
||||
33 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C36.example.com CNAME IN
|
||||
34 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C36.example.com MX IN
|
||||
35 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C36.example.com ANY IN
|
||||
|
||||
36 0 0 0 0 1 0 0 0 0 0 1 0 0 0 c.Example.coM A IN
|
||||
37 0 0 0 0 1 0 0 0 0 0 1 0 0 0 c.Example.coM CNAME IN
|
||||
38 0 0 0 0 1 0 0 0 0 0 1 0 0 0 c.Example.coM MX IN
|
||||
39 0 0 0 0 1 0 0 0 0 0 1 0 0 0 c.Example.coM ANY IN
|
||||
|
||||
40 0 0 0 0 1 0 0 0 0 0 1 0 0 0 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.example.com A IN
|
||||
41 0 0 0 0 1 0 0 0 0 0 1 0 0 0 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.example.com CNAME IN
|
||||
42 0 0 0 0 1 0 0 0 0 0 1 0 0 0 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.example.com MX IN
|
||||
43 0 0 0 0 1 0 0 0 0 0 1 0 0 0 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.example.com ANY IN
|
||||
|
||||
44 0 0 0 0 1 0 0 0 0 0 1 0 0 0 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA1.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA2.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA3.example.com A IN
|
||||
45 0 0 0 0 1 0 0 0 0 0 1 0 0 0 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA1.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA2.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA3.example.com CNAME IN
|
||||
46 0 0 0 0 1 0 0 0 0 0 1 0 0 0 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA1.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA2.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA3.example.com MX IN
|
||||
47 0 0 0 0 1 0 0 0 0 0 1 0 0 0 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA1.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA2.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA3.example.com ANY IN
|
||||
|
||||
48 0 0 0 0 1 0 0 0 0 0 1 0 0 0 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA1.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA2.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA4.example.com A IN
|
||||
49 0 0 0 0 1 0 0 0 0 0 1 0 0 0 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA1.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA2.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA4.example.com CNAME IN
|
||||
50 0 0 0 0 1 0 0 0 0 0 1 0 0 0 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA1.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA2.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA4.example.com MX IN
|
||||
51 0 0 0 0 1 0 0 0 0 0 1 0 0 0 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA1.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA2.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA4.example.com ANY IN
|
||||
|
||||
52 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.example.com A IN
|
||||
53 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.example.com CNAME IN
|
||||
54 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.example.com MX IN
|
||||
55 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.example.com ANY IN
|
||||
|
||||
56 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.1.example.com A IN
|
||||
57 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.1.example.com CNAME IN
|
||||
58 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.1.example.com MX IN
|
||||
59 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.1.example.com ANY IN
|
||||
|
||||
60 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C0.name1.cn A IN
|
||||
61 0 0 0 0 1 0 0 0 0 0 1 0 0 0 C12.name1.cn A IN
|
||||
|
||||
70 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example.com SOA IN
|
||||
71 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example.com ANY IN
|
||||
|
||||
72 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example1.com SOA IN
|
||||
73 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example1.com A IN
|
||||
74 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example1.com NS IN
|
||||
75 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example1.com ANY IN
|
||||
|
||||
76 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example2.com SOA IN
|
||||
77 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example2.com A IN
|
||||
78 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example2.com NS IN
|
||||
79 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example2.com ANY IN
|
||||
|
||||
80 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example3.com SOA IN
|
||||
81 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example3.com A IN
|
||||
82 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example3.com NS IN
|
||||
83 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example3.com ANY IN
|
||||
|
||||
84 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example4.com SOA IN
|
||||
85 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example4.com A IN
|
||||
86 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example4.com NS IN
|
||||
87 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example4.com ANY IN
|
||||
|
||||
88 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example13.com SOA IN
|
||||
89 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example13.com A IN
|
||||
90 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example13.com NS IN
|
||||
91 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example13.com ANY IN
|
||||
|
||||
92 0 0 0 0 1 0 0 0 0 0 1 0 0 0 noexist.example.com A IN
|
||||
93 0 0 0 0 1 0 0 0 0 0 1 0 0 0 noexist.example.com ANY IN
|
||||
94 0 0 0 0 1 0 0 0 0 0 1 0 0 0 noexist.example.com NS IN
|
||||
|
||||
95 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example9.com SOA IN
|
||||
96 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example9.com ns IN
|
||||
97 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example9.com ANY IN
|
||||
|
||||
98 0 0 0 0 1 0 0 0 0 0 1 0 0 0 noexist.example.com SOA IN
|
||||
99 0 0 0 0 1 0 0 0 0 0 1 0 0 0 noexist.noexist SOA IN
|
||||
|
||||
100 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1.1.10.10.in-addr.arpA PTR IN
|
||||
101 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.example.com PTR IN
|
||||
102 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1.1.10.10.in-addr.arpa PTR IN
|
||||
103 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.examPle.com PTR IN
|
||||
104 0 0 0 0 1 0 0 0 0 0 1 0 0 0 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.example.com PTR IN
|
||||
105 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com PTR IN
|
||||
106 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.example.com PTR IN
|
||||
107 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1.2.168.192.in-addr.arpa PTR IN
|
||||
108 0 0 0 0 1 0 0 0 0 0 1 0 0 0 multiple-type-a-record.example.com PTR IN
|
||||
|
||||
110 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.example.com MX IN
|
||||
111 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.example.com MX IN
|
||||
112 0 0 0 0 1 0 0 0 0 0 1 0 0 0 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.example.com MX IN
|
||||
113 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com MX IN
|
||||
114 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.example.com MX IN
|
||||
115 0 0 0 0 1 0 0 0 0 0 1 0 0 0 multiple-type-mx-record.example.com MX IN
|
||||
|
||||
120 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.example.com TXT IN
|
||||
121 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.example.com TXT IN
|
||||
122 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com TXT IN
|
||||
123 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com TXT IN
|
||||
124 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.example.com TXT IN
|
||||
125 0 0 0 0 1 0 0 0 0 0 1 0 0 0 multiple-type-txt-record.example.com TXT IN
|
||||
|
||||
130 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.example.com AAAA IN
|
||||
131 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.example.com AAAA IN
|
||||
132 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com AAAA IN
|
||||
133 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com AAAA IN
|
||||
134 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.example.com AAAA IN
|
||||
135 0 0 0 0 1 0 0 0 0 0 1 0 0 0 multiple-type-aaaa-record.example.com AAAA IN
|
||||
|
||||
140 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.example.com NAPTR IN
|
||||
141 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.example.com NAPTR IN
|
||||
142 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com NAPTR IN
|
||||
143 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com NAPTR IN
|
||||
144 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.example.com NAPTR IN
|
||||
145 0 0 0 0 1 0 0 0 0 0 1 0 0 0 2.1.2.1.5.5.5.0.7.7.1.e164.arpa NAPTR IN
|
||||
146 0 0 0 0 1 0 0 0 0 0 1 0 0 0 b.e164.arpa NAPTR IN
|
||||
147 0 0 0 0 1 0 0 0 0 0 1 0 0 0 6.8.e164.arpa NAPTR IN
|
||||
|
||||
#150 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.example.com A6 IN
|
||||
#151 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.example.com A6 IN
|
||||
#152 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com A6 IN
|
||||
#153 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com A6 IN
|
||||
#154 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.example.com A6 IN
|
||||
#155 0 0 0 0 1 0 0 0 0 0 1 0 0 0 multiple-type-a6-record.example.com A6 IN
|
||||
|
||||
# case 160-163
|
||||
160 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.example.com DNAME IN
|
||||
161 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.example.com ANY IN
|
||||
162 0 0 0 0 1 0 0 0 0 0 1 0 0 0 www.A.example.com A IN
|
||||
163 0 0 0 0 1 0 0 0 0 0 1 0 0 0 www.A.example.com ANY IN
|
||||
|
||||
# case 164-167
|
||||
164 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.exAmple.com DNAME IN
|
||||
165 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.exAmple.com ANY IN
|
||||
166 0 0 0 0 1 0 0 0 0 0 1 0 0 0 www.a.exAmple.com A IN
|
||||
167 0 0 0 0 1 0 0 0 0 0 1 0 0 0 www.a.exAmple.com ANY IN
|
||||
|
||||
# case 168-171
|
||||
168 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com DNAME IN
|
||||
169 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com ANY IN
|
||||
170 0 0 0 0 1 0 0 0 0 0 1 0 0 0 www.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com A IN
|
||||
171 0 0 0 0 1 0 0 0 0 0 1 0 0 0 www.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com ANY IN
|
||||
|
||||
# case 172-175
|
||||
172 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com DNAME IN
|
||||
173 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com ANY IN
|
||||
174 0 0 0 0 1 0 0 0 0 0 1 0 0 0 D.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com A IN
|
||||
175 0 0 0 0 1 0 0 0 0 0 1 0 0 0 D.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com ANY IN
|
||||
|
||||
# case 176-179
|
||||
176 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.example.com DNAME IN
|
||||
177 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.example.com ANY IN
|
||||
178 0 0 0 0 1 0 0 0 0 0 1 0 0 0 D.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.example.com A IN
|
||||
179 0 0 0 0 1 0 0 0 0 0 1 0 0 0 D.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.example.com ANY IN
|
||||
|
||||
# case 180-195
|
||||
180 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.d0.example.com a IN
|
||||
181 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.d1.example.com a IN
|
||||
182 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.d2.example.com a IN
|
||||
183 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.d4.example.com a IN
|
||||
184 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.d5.example.com a IN
|
||||
185 0 0 0 0 1 0 0 0 0 0 1 0 0 0 ns.d0.example.com a IN
|
||||
186 0 0 0 0 1 0 0 0 0 0 1 0 0 0 www.a.b.d1.example.com a IN
|
||||
187 0 0 0 0 1 0 0 0 0 0 1 0 0 0 www.a.b.d1.example.com mx IN
|
||||
|
||||
188 0 0 0 0 1 0 0 0 0 0 1 0 0 0 www.d10.example.com a IN
|
||||
189 0 0 0 0 1 0 0 0 0 0 1 0 0 0 www.d20.example.com a IN
|
||||
190 0 0 0 0 1 0 0 0 0 0 1 0 0 0 www.d30.example.com a IN
|
||||
191 0 0 0 0 1 0 0 0 0 0 1 0 0 0 www.d40.example.com a IN
|
||||
192 0 0 0 0 1 0 0 0 0 0 1 0 0 0 www.d50.example.com a IN
|
||||
193 0 0 0 0 1 0 0 0 0 0 1 0 0 0 c45.example.com any IN
|
||||
194 0 0 0 0 1 0 0 0 0 0 1 0 0 0 d45.example.com any IN
|
||||
195 0 0 0 0 1 0 0 0 0 0 1 0 0 0 noexist.d45.example.com any IN
|
||||
196 0 0 0 0 1 0 0 0 0 0 1 0 0 0 www.d45.example.com any IN
|
||||
|
||||
197 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.d72.example.com a IN
|
||||
198 0 0 0 0 1 0 0 0 0 0 1 0 0 0 www.d1.example.com a IN
|
||||
|
||||
# case 200-205
|
||||
200 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.example.com WKS IN
|
||||
201 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.example.com WKS IN
|
||||
202 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com WKS IN
|
||||
203 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com WKS IN
|
||||
204 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.example.com WKS IN
|
||||
205 0 0 0 0 1 0 0 0 0 0 1 0 0 0 multiple-type-wks-record.example.com WKS IN
|
||||
|
||||
# case 210-215
|
||||
210 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.example.com HINFO IN
|
||||
211 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.example.com HINFO IN
|
||||
212 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com HINFO IN
|
||||
213 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com HINFO IN
|
||||
214 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.example.com HINFO IN
|
||||
215 0 0 0 0 1 0 0 0 0 0 1 0 0 0 multiple-type-hinfo-record.example.com HINFO IN
|
||||
|
||||
# case 220-225
|
||||
220 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.example.com MINFO IN
|
||||
221 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.example.com MINFO IN
|
||||
222 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com MINFO IN
|
||||
223 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com MINFO IN
|
||||
224 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.example.com MINFO IN
|
||||
225 0 0 0 0 1 0 0 0 0 0 1 0 0 0 multiple-type-minfo-record.example.com MINFO IN
|
||||
|
||||
# case 230-235
|
||||
230 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.example.com NSAP IN
|
||||
231 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.example.com NSAP IN
|
||||
232 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com NSAP IN
|
||||
233 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com NSAP IN
|
||||
234 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.example.com NSAP IN
|
||||
235 0 0 0 0 1 0 0 0 0 0 1 0 0 0 multiple-type-nsap-record.example.com NSAP IN
|
||||
|
||||
# case 240-245
|
||||
240 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.example.com PX IN
|
||||
241 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.example.com PX IN
|
||||
242 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com PX IN
|
||||
243 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com PX IN
|
||||
244 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.example.com PX IN
|
||||
245 0 0 0 0 1 0 0 0 0 0 1 0 0 0 multiple-type-px-record.example.com PX IN
|
||||
|
||||
# case 250-255
|
||||
250 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.example.com LOC IN
|
||||
251 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.example.com LOC IN
|
||||
252 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com LOC IN
|
||||
253 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com LOC IN
|
||||
254 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.example.com LOC IN
|
||||
255 0 0 0 0 1 0 0 0 0 0 1 0 0 0 multiple-type-loc-record.example.com LOC IN
|
||||
|
||||
# case 260-265
|
||||
260 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.example.com SRV IN
|
||||
261 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.example.com SRV IN
|
||||
262 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com SRV IN
|
||||
263 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com SRV IN
|
||||
264 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.example.com SRV IN
|
||||
265 0 0 0 0 1 0 0 0 0 0 1 0 0 0 multiple-type-srv-record.example.com SRV IN
|
||||
|
||||
# case 270-275
|
||||
270 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.example.com KX IN
|
||||
271 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.example.com KX IN
|
||||
272 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com KX IN
|
||||
273 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com KX IN
|
||||
274 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.example.com KX IN
|
||||
275 0 0 0 0 1 0 0 0 0 0 1 0 0 0 multiple-type-kx-record.example.com KX IN
|
||||
|
||||
# case 280-285
|
||||
280 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.example.com CERT IN
|
||||
281 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.example.com CERT IN
|
||||
282 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com CERT IN
|
||||
283 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com CERT IN
|
||||
284 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.example.com CERT IN
|
||||
285 0 0 0 0 1 0 0 0 0 0 1 0 0 0 multiple-type-cert-record.example.com CERT IN
|
||||
|
||||
# case 290-295
|
||||
290 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.example.com APL IN
|
||||
291 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.example.com APL IN
|
||||
292 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com APL IN
|
||||
293 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com APL IN
|
||||
294 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.example.com APL IN
|
||||
295 0 0 0 0 1 0 0 0 0 0 1 0 0 0 multiple-type-apl-record.example.com APL IN
|
||||
|
||||
# case 300-305
|
||||
300 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.example.com SSHFP IN
|
||||
301 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.example.com SSHFP IN
|
||||
302 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com SSHFP IN
|
||||
303 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com SSHFP IN
|
||||
304 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.example.com SSHFP IN
|
||||
305 0 0 0 0 1 0 0 0 0 0 1 0 0 0 multiple-type-sshfp-record.example.com SSHFP IN
|
||||
|
||||
# case 310-315
|
||||
310 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.example.com IPSECKEY IN
|
||||
311 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.example.com IPSECKEY IN
|
||||
312 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com IPSECKEY IN
|
||||
313 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com IPSECKEY IN
|
||||
314 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.example.com IPSECKEY IN
|
||||
315 0 0 0 0 1 0 0 0 0 0 1 0 0 0 multiple-type-ipseckey-record.example.com IPSECKEY IN
|
||||
|
||||
# case 320-325
|
||||
#320 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.example.com DHCID IN
|
||||
#321 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.example.com DHCID IN
|
||||
#322 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com DHCID IN
|
||||
#323 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com DHCID IN
|
||||
#324 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.example.com DHCID IN
|
||||
#325 0 0 0 0 1 0 0 0 0 0 1 0 0 0 multiple-type-dhcid-record.example.com DHCID IN
|
||||
|
||||
# case 330-335
|
||||
330 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.example.com SPF IN
|
||||
331 0 0 0 0 1 0 0 0 0 0 1 0 0 0 a.example.com SPF IN
|
||||
332 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com SPF IN
|
||||
333 0 0 0 0 1 0 0 0 0 0 1 0 0 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com SPF IN
|
||||
334 0 0 0 0 1 0 0 0 0 0 1 0 0 0 A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.K.L.M.example.com SPF IN
|
||||
335 0 0 0 0 1 0 0 0 0 0 1 0 0 0 multiple-type-spf-record.example.com SPF IN
|
||||
|
||||
360 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0.example.com A IN
|
||||
361 0 0 0 0 1 0 0 0 0 0 1 0 0 0 9.example.com A IN
|
||||
|
||||
370 0 0 0 0 1 0 0 0 0 0 1 0 0 0 sub-cname.example.com A IN
|
||||
371 0 0 0 0 1 0 0 0 0 0 1 0 0 0 www.sub-dname.example.com A IN
|
||||
|
||||
381 0 0 0 0 1 0 0 0 0 0 1 0 0 0 type-a-answer.toobigudp.com A IN
|
||||
382 0 0 0 0 1 0 0 0 0 0 1 0 0 0 type-a-authority.toobigudp.com A IN
|
||||
383 0 0 0 0 1 0 0 0 0 0 1 0 0 0 toobigudp.com NS IN
|
||||
384 0 0 0 0 1 0 0 0 0 0 1 0 0 0 type-txt-answer.toobigudp.com TXT IN
|
||||
385 0 0 0 0 1 0 0 0 0 0 1 0 0 0 type-txt-authority.toobigudp.com TXT IN
|
||||
386 0 0 0 0 1 0 0 0 0 0 1 0 0 0 type-cname-answer.toobigudp.com A IN
|
||||
387 0 0 0 0 1 0 0 0 0 0 1 0 0 0 type-cname-answer.toobigudp.com TXT IN
|
||||
|
||||
390 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example.com DNSKEY IN
|
||||
391 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example.com RRSIG IN
|
||||
392 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example.com NSEC IN
|
||||
393 0 0 0 0 1 0 0 0 0 0 1 0 0 0 example.com DS IN
|
||||
#0x1000 0 0 0 0 1 0 0 0 0 0 1 0 0 0 version.bind txt CH
|
||||
#0x1001 0 0 0 0 1 0 0 0 0 0 1 0 0 0 hostname.bind txt CH
|
||||
#0x1002 0 0 0 0 1 0 0 0 0 0 1 0 0 0 id.server txt CH
|
||||
#0x1003 0 0 0 0 1 0 0 0 0 0 1 0 0 0 authors.bind txt CH
|
||||
#0x1000 0 0 0 0 1 0 0 0 0 0 1 0 0 0 version.bind txt CH
|
||||
#0x1001 0 0 0 0 1 0 0 0 0 0 1 0 0 0 hostname.bind txt CH
|
||||
#0x1002 0 0 0 0 1 0 0 0 0 0 1 0 0 0 id.server txt CH
|
||||
#0x1003 0 0 0 0 1 0 0 0 0 0 1 0 0 0 authors.bind txt CH
|
316
tools/query_cmp/queries/dquery01_no-type
Normal file
316
tools/query_cmp/queries/dquery01_no-type
Normal file
@ -0,0 +1,316 @@
|
||||
# Fields Description
|
||||
#
|
||||
#query:ID QR OPCODE AA TC RD RA Z AD CD RCODE QDCOUNT ANCOUNT NSCOUNT ARCOUNT testa.no-type.QNAME QTYPE QCLASS
|
||||
#response:ID QR OPCODE AA TC RD RA Z AD CD RCODE QDCOUNT ANCOUNT NSCOUNT ARCOUNT testa.no-type.QNAME QTYPE QCLASS
|
||||
# <answer> := <rr1> .. <rrN>
|
||||
# <rr> := NAME TYPE CLASS TTL RDLENGTH <rdata>
|
||||
# <rdata> := ADDRESS |
|
||||
# NSDNAME |
|
||||
# MNAME RNAME SERIAL REFRESH RETRY EXPIRE MINIMUM |
|
||||
# ...
|
||||
# <authority> := <rr1> .. <rrN>
|
||||
# <additional> := <rr1> .. <rrN>
|
||||
#
|
||||
#
|
||||
#
|
||||
# Description in BNF (http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form)
|
||||
# <query> ::= <header> <question>
|
||||
# <header> ::= <ID> <QR> <OPCODE> <AA> <TC> <RD> <RA> <Z> <AD> <CD> <RCODE>
|
||||
# <QDCOUNT> <ANCOUNT> <NSCOUNT> <ARCOUNT>
|
||||
# <question> ::= <QNAME> <QTYPE> <QCLASS>
|
||||
#
|
||||
# <response> ::= <header> <question> <answer> <authority> <additional>
|
||||
# <answer> ::= <rrset>
|
||||
# <authority> ::= <rrset>
|
||||
# <additional> ::= <rrset>
|
||||
# <rrset> ::= { <rr> }
|
||||
# <rr> ::= <name> <type> <class> <ttl> <rdlength> <rdata>
|
||||
# <name> ::= <subdomain> | ""
|
||||
# <subdomain> ::= <label> | <subdomain> "." <label>
|
||||
# <label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
|
||||
# <ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
|
||||
# <let-dig-hyp> ::= <let-dig> | "-"
|
||||
# <let-dig> ::= <letter> | <digit>
|
||||
# <letter> ::= "a" | .. | "z" | "A" | .. | "Z"
|
||||
# <digit> ::= "0" | .. | "9"
|
||||
# <type> ::= A | NS | CNAME | SOA | PTR | MX | testa.no-type...
|
||||
# <class> ::= IN | CH | HS | CS
|
||||
# <ttl> ::= <digit> | { <digit> }
|
||||
# <rdlength> ::= <digit> | { <digit> }
|
||||
# <rdata> ::= <address> |
|
||||
# <nsdname> |
|
||||
# <cname> |
|
||||
# <preference> <exchange> |
|
||||
# <ptrdname> |
|
||||
# ...
|
||||
|
||||
0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.A.example.com A IN
|
||||
1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.example.com A IN
|
||||
2 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com A IN
|
||||
5 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com A IN
|
||||
8 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.M.example.com A IN
|
||||
9 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.multiple-type-a-record.example.com A IN
|
||||
|
||||
10 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.NS.example.com A IN
|
||||
11 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.nS.example.com A IN
|
||||
12 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com A IN
|
||||
15 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.www.multiple-type-ns-record.example.com a IN
|
||||
|
||||
20 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.C.example.com A IN
|
||||
21 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.C.example.com CNAME IN
|
||||
22 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.C.example.com MX IN
|
||||
23 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.C.example.com ANY IN
|
||||
|
||||
24 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.C0.example.com A IN
|
||||
25 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.C0.example.com CNAME IN
|
||||
26 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.C0.example.com MX IN
|
||||
27 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.C0.example.com ANY IN
|
||||
|
||||
28 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.C10.example.com A IN
|
||||
29 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.C10.example.com CNAME IN
|
||||
30 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.C10.example.com MX IN
|
||||
31 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.C10.example.com ANY IN
|
||||
|
||||
32 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.C36.example.com A IN
|
||||
33 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.C36.example.com CNAME IN
|
||||
34 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.C36.example.com MX IN
|
||||
35 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.C36.example.com ANY IN
|
||||
|
||||
36 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.c.Example.coM A IN
|
||||
37 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.c.Example.coM CNAME IN
|
||||
38 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.c.Example.coM MX IN
|
||||
39 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.c.Example.coM ANY IN
|
||||
|
||||
40 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.example.com A IN
|
||||
41 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.example.com CNAME IN
|
||||
42 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.example.com MX IN
|
||||
43 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.example.com ANY IN
|
||||
|
||||
60 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.C0.name1.cn A IN
|
||||
61 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.C12.name1.cn A IN
|
||||
|
||||
70 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example.com SOA IN
|
||||
71 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example.com ANY IN
|
||||
|
||||
72 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example1.com SOA IN
|
||||
73 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example1.com A IN
|
||||
74 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example1.com NS IN
|
||||
75 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example1.com ANY IN
|
||||
|
||||
76 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example2.com SOA IN
|
||||
77 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example2.com A IN
|
||||
78 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example2.com NS IN
|
||||
79 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example2.com ANY IN
|
||||
|
||||
80 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example3.com SOA IN
|
||||
81 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example3.com A IN
|
||||
82 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example3.com NS IN
|
||||
83 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example3.com ANY IN
|
||||
|
||||
84 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example4.com SOA IN
|
||||
85 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example4.com A IN
|
||||
86 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example4.com NS IN
|
||||
87 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example4.com ANY IN
|
||||
|
||||
88 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example13.com SOA IN
|
||||
89 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example13.com A IN
|
||||
90 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example13.com NS IN
|
||||
91 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example13.com ANY IN
|
||||
|
||||
92 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.noexist.example.com A IN
|
||||
93 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.noexist.example.com ANY IN
|
||||
94 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.noexist.example.com NS IN
|
||||
|
||||
95 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example9.com SOA IN
|
||||
96 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example9.com ns IN
|
||||
97 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example9.com ANY IN
|
||||
|
||||
98 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.noexist.example.com SOA IN
|
||||
99 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.noexist.noexist SOA IN
|
||||
|
||||
100 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.1.1.10.10.in-addr.arpA PTR IN
|
||||
101 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.example.com PTR IN
|
||||
102 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.1.1.10.10.in-addr.arpa PTR IN
|
||||
103 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.examPle.com PTR IN
|
||||
104 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.example.com PTR IN
|
||||
107 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.1.2.168.192.in-addr.arpa PTR IN
|
||||
108 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.multiple-type-a-record.example.com PTR IN
|
||||
|
||||
110 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.A.example.com MX IN
|
||||
111 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.example.com MX IN
|
||||
112 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.example.com MX IN
|
||||
115 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.multiple-type-mx-record.example.com MX IN
|
||||
|
||||
120 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.A.example.com TXT IN
|
||||
121 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.example.com TXT IN
|
||||
122 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com TXT IN
|
||||
125 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.multiple-type-txt-record.example.com TXT IN
|
||||
|
||||
130 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.A.example.com AAAA IN
|
||||
131 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.example.com AAAA IN
|
||||
132 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com AAAA IN
|
||||
135 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.multiple-type-aaaa-record.example.com AAAA IN
|
||||
|
||||
140 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.A.example.com NAPTR IN
|
||||
141 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.example.com NAPTR IN
|
||||
142 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com NAPTR IN
|
||||
145 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.2.1.2.1.5.5.5.0.7.7.1.e164.arpa NAPTR IN
|
||||
146 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.b.e164.arpa NAPTR IN
|
||||
147 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.6.8.e164.arpa NAPTR IN
|
||||
|
||||
#150 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.A.example.com A6 IN
|
||||
#151 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.example.com A6 IN
|
||||
#152 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com A6 IN
|
||||
#155 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.multiple-type-a6-record.example.com A6 IN
|
||||
|
||||
# case 160-163
|
||||
160 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.A.example.com DNAME IN
|
||||
161 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.A.example.com ANY IN
|
||||
162 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.www.A.example.com A IN
|
||||
163 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.www.A.example.com ANY IN
|
||||
|
||||
# case 164-167
|
||||
164 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.exAmple.com DNAME IN
|
||||
165 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.exAmple.com ANY IN
|
||||
166 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.www.a.exAmple.com A IN
|
||||
167 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.www.a.exAmple.com ANY IN
|
||||
|
||||
# case 168-171
|
||||
168 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com DNAME IN
|
||||
169 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com ANY IN
|
||||
170 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.www.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com A IN
|
||||
171 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.www.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com ANY IN
|
||||
|
||||
# case 180-195
|
||||
180 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.d0.example.com a IN
|
||||
181 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.d1.example.com a IN
|
||||
182 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.d2.example.com a IN
|
||||
183 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.d4.example.com a IN
|
||||
184 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.d5.example.com a IN
|
||||
185 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.ns.d0.example.com a IN
|
||||
186 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.www.a.b.d1.example.com a IN
|
||||
187 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.www.a.b.d1.example.com mx IN
|
||||
|
||||
188 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.www.d10.example.com a IN
|
||||
189 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.www.d20.example.com a IN
|
||||
190 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.www.d30.example.com a IN
|
||||
191 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.www.d40.example.com a IN
|
||||
192 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.www.d50.example.com a IN
|
||||
193 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.c45.example.com any IN
|
||||
194 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.d45.example.com any IN
|
||||
195 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.noexist.d45.example.com any IN
|
||||
196 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.www.d45.example.com any IN
|
||||
|
||||
197 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.d72.example.com a IN
|
||||
198 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.www.d1.example.com a IN
|
||||
|
||||
# case 200-205
|
||||
200 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.A.example.com WKS IN
|
||||
201 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.example.com WKS IN
|
||||
202 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com WKS IN
|
||||
205 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.multiple-type-wks-record.example.com WKS IN
|
||||
|
||||
# case 210-215
|
||||
210 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.A.example.com HINFO IN
|
||||
211 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.example.com HINFO IN
|
||||
212 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com HINFO IN
|
||||
215 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.multiple-type-hinfo-record.example.com HINFO IN
|
||||
|
||||
# case 220-225
|
||||
220 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.A.example.com MINFO IN
|
||||
221 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.example.com MINFO IN
|
||||
222 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com MINFO IN
|
||||
225 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.multiple-type-minfo-record.example.com MINFO IN
|
||||
|
||||
# case 230-235
|
||||
230 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.A.example.com NSAP IN
|
||||
231 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.example.com NSAP IN
|
||||
232 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com NSAP IN
|
||||
235 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.multiple-type-nsap-record.example.com NSAP IN
|
||||
|
||||
# case 240-245
|
||||
240 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.A.example.com PX IN
|
||||
241 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.example.com PX IN
|
||||
242 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com PX IN
|
||||
245 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.multiple-type-px-record.example.com PX IN
|
||||
|
||||
# case 250-255
|
||||
250 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.A.example.com LOC IN
|
||||
251 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.example.com LOC IN
|
||||
252 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com LOC IN
|
||||
255 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.multiple-type-loc-record.example.com LOC IN
|
||||
|
||||
# case 260-265
|
||||
260 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.A.example.com SRV IN
|
||||
261 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.example.com SRV IN
|
||||
262 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com SRV IN
|
||||
265 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.multiple-type-srv-record.example.com SRV IN
|
||||
|
||||
# case 270-275
|
||||
270 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.A.example.com KX IN
|
||||
271 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.example.com KX IN
|
||||
272 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com KX IN
|
||||
275 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.multiple-type-kx-record.example.com KX IN
|
||||
|
||||
# case 280-285
|
||||
280 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.A.example.com CERT IN
|
||||
281 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.example.com CERT IN
|
||||
282 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com CERT IN
|
||||
285 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.multiple-type-cert-record.example.com CERT IN
|
||||
|
||||
# case 290-295
|
||||
290 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.A.example.com APL IN
|
||||
291 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.example.com APL IN
|
||||
292 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com APL IN
|
||||
295 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.multiple-type-apl-record.example.com APL IN
|
||||
|
||||
# case 300-305
|
||||
300 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.A.example.com SSHFP IN
|
||||
301 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.example.com SSHFP IN
|
||||
302 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com SSHFP IN
|
||||
305 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.multiple-type-sshfp-record.example.com SSHFP IN
|
||||
|
||||
# case 310-315
|
||||
310 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.A.example.com IPSECKEY IN
|
||||
311 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.example.com IPSECKEY IN
|
||||
312 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com IPSECKEY IN
|
||||
315 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.multiple-type-ipseckey-record.example.com IPSECKEY IN
|
||||
|
||||
# case 320-325
|
||||
#320 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.A.example.com DHCID IN
|
||||
#321 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.example.com DHCID IN
|
||||
#322 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com DHCID IN
|
||||
#325 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.multiple-type-dhcid-record.example.com DHCID IN
|
||||
|
||||
# case 330-335
|
||||
330 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.A.example.com SPF IN
|
||||
331 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.a.example.com SPF IN
|
||||
332 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com SPF IN
|
||||
335 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.multiple-type-spf-record.example.com SPF IN
|
||||
|
||||
360 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.0.example.com A IN
|
||||
361 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.9.example.com A IN
|
||||
|
||||
370 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.sub-cname.example.com A IN
|
||||
371 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.www.sub-dname.example.com A IN
|
||||
|
||||
381 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.type-a-answer.toobigudp.com A IN
|
||||
382 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.type-a-authority.toobigudp.com A IN
|
||||
383 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.toobigudp.com NS IN
|
||||
384 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.type-txt-answer.toobigudp.com TXT IN
|
||||
385 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.type-txt-authority.toobigudp.com TXT IN
|
||||
386 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.type-cname-answer.toobigudp.com A IN
|
||||
387 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.type-cname-answer.toobigudp.com TXT IN
|
||||
|
||||
390 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example.com DNSKEY IN
|
||||
391 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example.com RRSIG IN
|
||||
392 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example.com NSEC IN
|
||||
393 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.example.com DS IN
|
||||
#0x1000 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.version.bind txt CH
|
||||
#0x1001 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.hostname.bind txt CH
|
||||
#0x1002 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.id.server txt CH
|
||||
#0x1003 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.authors.bind txt CH
|
||||
#0x1000 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.version.bind txt CH
|
||||
#0x1001 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.hostname.bind txt CH
|
||||
#0x1002 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.id.server txt CH
|
||||
#0x1003 0 0 0 0 1 0 0 0 0 0 1 0 0 0 testa.no-type.authors.bind txt CH
|
317
tools/query_cmp/queries/dquery01_non-terminal
Normal file
317
tools/query_cmp/queries/dquery01_non-terminal
Normal file
@ -0,0 +1,317 @@
|
||||
# Fields Description
|
||||
#
|
||||
#query:ID QR OPCODE AA TC RD RA Z AD CD RCODE QDCOUNT ANCOUNT NSCOUNT ARCOUNT non-terminal.QNAME QTYPE QCLASS
|
||||
#response:ID QR OPCODE AA TC RD RA Z AD CD RCODE QDCOUNT ANCOUNT NSCOUNT ARCOUNT non-terminal.QNAME QTYPE QCLASS
|
||||
# <answer> := <rr1> .. <rrN>
|
||||
# <rr> := NAME TYPE CLASS TTL RDLENGTH <rdata>
|
||||
# <rdata> := ADDRESS |
|
||||
# NSDNAME |
|
||||
# MNAME RNAME SERIAL REFRESH RETRY EXPIRE MINIMUM |
|
||||
# ...
|
||||
# <authority> := <rr1> .. <rrN>
|
||||
# <additional> := <rr1> .. <rrN>
|
||||
#
|
||||
#
|
||||
#
|
||||
# Description in BNF (http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form)
|
||||
# <query> ::= <header> <question>
|
||||
# <header> ::= <ID> <QR> <OPCODE> <AA> <TC> <RD> <RA> <Z> <AD> <CD> <RCODE>
|
||||
# <QDCOUNT> <ANCOUNT> <NSCOUNT> <ARCOUNT>
|
||||
# <question> ::= <QNAME> <QTYPE> <QCLASS>
|
||||
#
|
||||
# <response> ::= <header> <question> <answer> <authority> <additional>
|
||||
# <answer> ::= <rrset>
|
||||
# <authority> ::= <rrset>
|
||||
# <additional> ::= <rrset>
|
||||
# <rrset> ::= { <rr> }
|
||||
# <rr> ::= <name> <type> <class> <ttl> <rdlength> <rdata>
|
||||
# <name> ::= <subdomain> | ""
|
||||
# <subdomain> ::= <label> | <subdomain> "." <label>
|
||||
# <label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
|
||||
# <ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
|
||||
# <let-dig-hyp> ::= <let-dig> | "-"
|
||||
# <let-dig> ::= <letter> | <digit>
|
||||
# <letter> ::= "a" | .. | "z" | "A" | .. | "Z"
|
||||
# <digit> ::= "0" | .. | "9"
|
||||
# <type> ::= A | NS | CNAME | SOA | PTR | MX | non-terminal...
|
||||
# <class> ::= IN | CH | HS | CS
|
||||
# <ttl> ::= <digit> | { <digit> }
|
||||
# <rdlength> ::= <digit> | { <digit> }
|
||||
# <rdata> ::= <address> |
|
||||
# <nsdname> |
|
||||
# <cname> |
|
||||
# <preference> <exchange> |
|
||||
# <ptrdname> |
|
||||
# ...
|
||||
|
||||
0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.A.example.com A IN
|
||||
1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.example.com A IN
|
||||
2 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com A IN
|
||||
5 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com A IN
|
||||
8 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.M.example.com A IN
|
||||
9 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.multiple-type-a-record.example.com A IN
|
||||
|
||||
10 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.NS.example.com A IN
|
||||
11 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.nS.example.com A IN
|
||||
12 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com A IN
|
||||
15 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.www.multiple-type-ns-record.example.com a IN
|
||||
|
||||
20 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.C.example.com A IN
|
||||
21 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.C.example.com CNAME IN
|
||||
22 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.C.example.com MX IN
|
||||
23 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.C.example.com ANY IN
|
||||
|
||||
24 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.C0.example.com A IN
|
||||
25 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.C0.example.com CNAME IN
|
||||
26 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.C0.example.com MX IN
|
||||
27 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.C0.example.com ANY IN
|
||||
|
||||
28 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.C10.example.com A IN
|
||||
29 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.C10.example.com CNAME IN
|
||||
30 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.C10.example.com MX IN
|
||||
31 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.C10.example.com ANY IN
|
||||
|
||||
32 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.C36.example.com A IN
|
||||
33 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.C36.example.com CNAME IN
|
||||
34 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.C36.example.com MX IN
|
||||
35 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.C36.example.com ANY IN
|
||||
|
||||
36 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.c.Example.coM A IN
|
||||
37 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.c.Example.coM CNAME IN
|
||||
38 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.c.Example.coM MX IN
|
||||
39 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.c.Example.coM ANY IN
|
||||
|
||||
40 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.example.com A IN
|
||||
41 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.example.com CNAME IN
|
||||
42 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.example.com MX IN
|
||||
43 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.example.com ANY IN
|
||||
|
||||
|
||||
60 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.C0.name1.cn A IN
|
||||
61 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.C12.name1.cn A IN
|
||||
|
||||
70 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example.com SOA IN
|
||||
71 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example.com ANY IN
|
||||
|
||||
72 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example1.com SOA IN
|
||||
73 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example1.com A IN
|
||||
74 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example1.com NS IN
|
||||
75 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example1.com ANY IN
|
||||
|
||||
76 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example2.com SOA IN
|
||||
77 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example2.com A IN
|
||||
78 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example2.com NS IN
|
||||
79 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example2.com ANY IN
|
||||
|
||||
80 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example3.com SOA IN
|
||||
81 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example3.com A IN
|
||||
82 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example3.com NS IN
|
||||
83 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example3.com ANY IN
|
||||
|
||||
84 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example4.com SOA IN
|
||||
85 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example4.com A IN
|
||||
86 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example4.com NS IN
|
||||
87 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example4.com ANY IN
|
||||
|
||||
88 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example13.com SOA IN
|
||||
89 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example13.com A IN
|
||||
90 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example13.com NS IN
|
||||
91 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example13.com ANY IN
|
||||
|
||||
92 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.noexist.example.com A IN
|
||||
93 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.noexist.example.com ANY IN
|
||||
94 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.noexist.example.com NS IN
|
||||
|
||||
95 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example9.com SOA IN
|
||||
96 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example9.com ns IN
|
||||
97 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example9.com ANY IN
|
||||
|
||||
98 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.noexist.example.com SOA IN
|
||||
99 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.noexist.noexist SOA IN
|
||||
|
||||
100 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.1.1.10.10.in-addr.arpA PTR IN
|
||||
101 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.example.com PTR IN
|
||||
102 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.1.1.10.10.in-addr.arpa PTR IN
|
||||
103 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.examPle.com PTR IN
|
||||
104 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.example.com PTR IN
|
||||
107 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.1.2.168.192.in-addr.arpa PTR IN
|
||||
108 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.multiple-type-a-record.example.com PTR IN
|
||||
|
||||
110 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.A.example.com MX IN
|
||||
111 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.example.com MX IN
|
||||
112 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.example.com MX IN
|
||||
115 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.multiple-type-mx-record.example.com MX IN
|
||||
|
||||
120 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.A.example.com TXT IN
|
||||
121 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.example.com TXT IN
|
||||
122 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com TXT IN
|
||||
125 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.multiple-type-txt-record.example.com TXT IN
|
||||
|
||||
130 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.A.example.com AAAA IN
|
||||
131 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.example.com AAAA IN
|
||||
132 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com AAAA IN
|
||||
135 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.multiple-type-aaaa-record.example.com AAAA IN
|
||||
|
||||
140 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.A.example.com NAPTR IN
|
||||
141 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.example.com NAPTR IN
|
||||
142 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com NAPTR IN
|
||||
145 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.2.1.2.1.5.5.5.0.7.7.1.e164.arpa NAPTR IN
|
||||
146 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.b.e164.arpa NAPTR IN
|
||||
147 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.6.8.e164.arpa NAPTR IN
|
||||
|
||||
#150 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.A.example.com A6 IN
|
||||
#151 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.example.com A6 IN
|
||||
#152 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com A6 IN
|
||||
#155 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.multiple-type-a6-record.example.com A6 IN
|
||||
|
||||
# case 160-163
|
||||
160 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.A.example.com DNAME IN
|
||||
161 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.A.example.com ANY IN
|
||||
162 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.www.A.example.com A IN
|
||||
163 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.www.A.example.com ANY IN
|
||||
|
||||
# case 164-167
|
||||
164 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.exAmple.com DNAME IN
|
||||
165 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.exAmple.com ANY IN
|
||||
166 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.www.a.exAmple.com A IN
|
||||
167 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.www.a.exAmple.com ANY IN
|
||||
|
||||
# case 168-171
|
||||
168 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com DNAME IN
|
||||
169 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com ANY IN
|
||||
170 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.www.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com A IN
|
||||
171 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.www.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com ANY IN
|
||||
|
||||
# case 180-195
|
||||
180 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.d0.example.com a IN
|
||||
181 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.d1.example.com a IN
|
||||
182 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.d2.example.com a IN
|
||||
183 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.d4.example.com a IN
|
||||
184 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.d5.example.com a IN
|
||||
185 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.ns.d0.example.com a IN
|
||||
186 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.www.a.b.d1.example.com a IN
|
||||
187 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.www.a.b.d1.example.com mx IN
|
||||
|
||||
188 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.www.d10.example.com a IN
|
||||
189 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.www.d20.example.com a IN
|
||||
190 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.www.d30.example.com a IN
|
||||
191 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.www.d40.example.com a IN
|
||||
192 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.www.d50.example.com a IN
|
||||
193 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.c45.example.com any IN
|
||||
194 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.d45.example.com any IN
|
||||
195 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.noexist.d45.example.com any IN
|
||||
196 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.www.d45.example.com any IN
|
||||
|
||||
197 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.d72.example.com a IN
|
||||
198 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.www.d1.example.com a IN
|
||||
|
||||
# case 200-205
|
||||
200 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.A.example.com WKS IN
|
||||
201 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.example.com WKS IN
|
||||
202 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com WKS IN
|
||||
205 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.multiple-type-wks-record.example.com WKS IN
|
||||
|
||||
# case 210-215
|
||||
210 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.A.example.com HINFO IN
|
||||
211 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.example.com HINFO IN
|
||||
212 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com HINFO IN
|
||||
215 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.multiple-type-hinfo-record.example.com HINFO IN
|
||||
|
||||
# case 220-225
|
||||
220 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.A.example.com MINFO IN
|
||||
221 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.example.com MINFO IN
|
||||
222 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com MINFO IN
|
||||
225 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.multiple-type-minfo-record.example.com MINFO IN
|
||||
|
||||
# case 230-235
|
||||
230 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.A.example.com NSAP IN
|
||||
231 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.example.com NSAP IN
|
||||
232 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com NSAP IN
|
||||
235 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.multiple-type-nsap-record.example.com NSAP IN
|
||||
|
||||
# case 240-245
|
||||
240 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.A.example.com PX IN
|
||||
241 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.example.com PX IN
|
||||
242 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com PX IN
|
||||
245 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.multiple-type-px-record.example.com PX IN
|
||||
|
||||
# case 250-255
|
||||
250 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.A.example.com LOC IN
|
||||
251 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.example.com LOC IN
|
||||
252 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com LOC IN
|
||||
255 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.multiple-type-loc-record.example.com LOC IN
|
||||
|
||||
# case 260-265
|
||||
260 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.A.example.com SRV IN
|
||||
261 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.example.com SRV IN
|
||||
262 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com SRV IN
|
||||
265 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.multiple-type-srv-record.example.com SRV IN
|
||||
|
||||
# case 270-275
|
||||
270 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.A.example.com KX IN
|
||||
271 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.example.com KX IN
|
||||
272 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com KX IN
|
||||
275 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.multiple-type-kx-record.example.com KX IN
|
||||
|
||||
# case 280-285
|
||||
280 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.A.example.com CERT IN
|
||||
281 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.example.com CERT IN
|
||||
282 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com CERT IN
|
||||
285 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.multiple-type-cert-record.example.com CERT IN
|
||||
|
||||
# case 290-295
|
||||
290 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.A.example.com APL IN
|
||||
291 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.example.com APL IN
|
||||
292 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com APL IN
|
||||
295 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.multiple-type-apl-record.example.com APL IN
|
||||
|
||||
# case 300-305
|
||||
300 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.A.example.com SSHFP IN
|
||||
301 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.example.com SSHFP IN
|
||||
302 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com SSHFP IN
|
||||
305 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.multiple-type-sshfp-record.example.com SSHFP IN
|
||||
|
||||
# case 310-315
|
||||
310 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.A.example.com IPSECKEY IN
|
||||
311 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.example.com IPSECKEY IN
|
||||
312 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com IPSECKEY IN
|
||||
315 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.multiple-type-ipseckey-record.example.com IPSECKEY IN
|
||||
|
||||
# case 320-325
|
||||
#320 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.A.example.com DHCID IN
|
||||
#321 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.example.com DHCID IN
|
||||
#322 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com DHCID IN
|
||||
#325 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.multiple-type-dhcid-record.example.com DHCID IN
|
||||
|
||||
# case 330-335
|
||||
330 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.A.example.com SPF IN
|
||||
331 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.a.example.com SPF IN
|
||||
332 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com SPF IN
|
||||
335 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.multiple-type-spf-record.example.com SPF IN
|
||||
|
||||
360 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.0.example.com A IN
|
||||
361 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.9.example.com A IN
|
||||
|
||||
370 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.sub-cname.example.com A IN
|
||||
371 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.www.sub-dname.example.com A IN
|
||||
|
||||
381 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.type-a-answer.toobigudp.com A IN
|
||||
382 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.type-a-authority.toobigudp.com A IN
|
||||
383 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.toobigudp.com NS IN
|
||||
384 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.type-txt-answer.toobigudp.com TXT IN
|
||||
385 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.type-txt-authority.toobigudp.com TXT IN
|
||||
386 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.type-cname-answer.toobigudp.com A IN
|
||||
387 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.type-cname-answer.toobigudp.com TXT IN
|
||||
|
||||
390 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example.com DNSKEY IN
|
||||
391 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example.com RRSIG IN
|
||||
392 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example.com NSEC IN
|
||||
393 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.example.com DS IN
|
||||
#0x1000 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.version.bind txt CH
|
||||
#0x1001 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.hostname.bind txt CH
|
||||
#0x1002 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.id.server txt CH
|
||||
#0x1003 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.authors.bind txt CH
|
||||
#0x1000 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.version.bind txt CH
|
||||
#0x1001 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.hostname.bind txt CH
|
||||
#0x1002 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.id.server txt CH
|
||||
#0x1003 0 0 0 0 1 0 0 0 0 0 1 0 0 0 non-terminal.authors.bind txt CH
|
316
tools/query_cmp/queries/dquery01_nxdomain
Normal file
316
tools/query_cmp/queries/dquery01_nxdomain
Normal file
@ -0,0 +1,316 @@
|
||||
# Fields Description
|
||||
#
|
||||
#query:ID QR OPCODE AA TC RD RA Z AD CD RCODE QDCOUNT ANCOUNT NSCOUNT ARCOUNT nxdomain.QNAME QTYPE QCLASS
|
||||
#response:ID QR OPCODE AA TC RD RA Z AD CD RCODE QDCOUNT ANCOUNT NSCOUNT ARCOUNT nxdomain.QNAME QTYPE QCLASS
|
||||
# <answer> := <rr1> .. <rrN>
|
||||
# <rr> := NAME TYPE CLASS TTL RDLENGTH <rdata>
|
||||
# <rdata> := ADDRESS |
|
||||
# NSDNAME |
|
||||
# MNAME RNAME SERIAL REFRESH RETRY EXPIRE MINIMUM |
|
||||
# ...
|
||||
# <authority> := <rr1> .. <rrN>
|
||||
# <additional> := <rr1> .. <rrN>
|
||||
#
|
||||
#
|
||||
#
|
||||
# Description in BNF (http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form)
|
||||
# <query> ::= <header> <question>
|
||||
# <header> ::= <ID> <QR> <OPCODE> <AA> <TC> <RD> <RA> <Z> <AD> <CD> <RCODE>
|
||||
# <QDCOUNT> <ANCOUNT> <NSCOUNT> <ARCOUNT>
|
||||
# <question> ::= <QNAME> <QTYPE> <QCLASS>
|
||||
#
|
||||
# <response> ::= <header> <question> <answer> <authority> <additional>
|
||||
# <answer> ::= <rrset>
|
||||
# <authority> ::= <rrset>
|
||||
# <additional> ::= <rrset>
|
||||
# <rrset> ::= { <rr> }
|
||||
# <rr> ::= <name> <type> <class> <ttl> <rdlength> <rdata>
|
||||
# <name> ::= <subdomain> | ""
|
||||
# <subdomain> ::= <label> | <subdomain> "." <label>
|
||||
# <label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
|
||||
# <ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
|
||||
# <let-dig-hyp> ::= <let-dig> | "-"
|
||||
# <let-dig> ::= <letter> | <digit>
|
||||
# <letter> ::= "a" | .. | "z" | "A" | .. | "Z"
|
||||
# <digit> ::= "0" | .. | "9"
|
||||
# <type> ::= A | NS | CNAME | SOA | PTR | MX | nxdomain...
|
||||
# <class> ::= IN | CH | HS | CS
|
||||
# <ttl> ::= <digit> | { <digit> }
|
||||
# <rdlength> ::= <digit> | { <digit> }
|
||||
# <rdata> ::= <address> |
|
||||
# <nsdname> |
|
||||
# <cname> |
|
||||
# <preference> <exchange> |
|
||||
# <ptrdname> |
|
||||
# ...
|
||||
|
||||
0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.A.example.com A IN
|
||||
1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.example.com A IN
|
||||
2 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com A IN
|
||||
5 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE.example.com A IN
|
||||
8 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.M.example.com A IN
|
||||
9 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.multiple-type-a-record.example.com A IN
|
||||
|
||||
10 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.NS.example.com A IN
|
||||
11 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.nS.example.com A IN
|
||||
12 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com A IN
|
||||
15 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.www.multiple-type-ns-record.example.com a IN
|
||||
|
||||
20 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.C.example.com A IN
|
||||
21 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.C.example.com CNAME IN
|
||||
22 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.C.example.com MX IN
|
||||
23 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.C.example.com ANY IN
|
||||
|
||||
24 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.C0.example.com A IN
|
||||
25 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.C0.example.com CNAME IN
|
||||
26 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.C0.example.com MX IN
|
||||
27 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.C0.example.com ANY IN
|
||||
|
||||
28 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.C10.example.com A IN
|
||||
29 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.C10.example.com CNAME IN
|
||||
30 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.C10.example.com MX IN
|
||||
31 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.C10.example.com ANY IN
|
||||
|
||||
32 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.C36.example.com A IN
|
||||
33 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.C36.example.com CNAME IN
|
||||
34 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.C36.example.com MX IN
|
||||
35 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.C36.example.com ANY IN
|
||||
|
||||
36 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.c.Example.coM A IN
|
||||
37 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.c.Example.coM CNAME IN
|
||||
38 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.c.Example.coM MX IN
|
||||
39 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.c.Example.coM ANY IN
|
||||
|
||||
40 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.example.com A IN
|
||||
41 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.example.com CNAME IN
|
||||
42 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.example.com MX IN
|
||||
43 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCA.example.com ANY IN
|
||||
|
||||
60 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.C0.name1.cn A IN
|
||||
61 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.C12.name1.cn A IN
|
||||
|
||||
70 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example.com SOA IN
|
||||
71 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example.com ANY IN
|
||||
|
||||
72 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example1.com SOA IN
|
||||
73 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example1.com A IN
|
||||
74 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example1.com NS IN
|
||||
75 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example1.com ANY IN
|
||||
|
||||
76 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example2.com SOA IN
|
||||
77 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example2.com A IN
|
||||
78 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example2.com NS IN
|
||||
79 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example2.com ANY IN
|
||||
|
||||
80 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example3.com SOA IN
|
||||
81 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example3.com A IN
|
||||
82 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example3.com NS IN
|
||||
83 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example3.com ANY IN
|
||||
|
||||
84 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example4.com SOA IN
|
||||
85 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example4.com A IN
|
||||
86 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example4.com NS IN
|
||||
87 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example4.com ANY IN
|
||||
|
||||
88 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example13.com SOA IN
|
||||
89 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example13.com A IN
|
||||
90 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example13.com NS IN
|
||||
91 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example13.com ANY IN
|
||||
|
||||
92 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.noexist.example.com A IN
|
||||
93 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.noexist.example.com ANY IN
|
||||
94 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.noexist.example.com NS IN
|
||||
|
||||
95 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example9.com SOA IN
|
||||
96 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example9.com ns IN
|
||||
97 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example9.com ANY IN
|
||||
|
||||
98 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.noexist.example.com SOA IN
|
||||
99 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.noexist.noexist SOA IN
|
||||
|
||||
100 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.1.1.10.10.in-addr.arpA PTR IN
|
||||
101 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.example.com PTR IN
|
||||
102 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.1.1.10.10.in-addr.arpa PTR IN
|
||||
103 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.examPle.com PTR IN
|
||||
104 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.example.com PTR IN
|
||||
107 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.1.2.168.192.in-addr.arpa PTR IN
|
||||
108 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.multiple-type-a-record.example.com PTR IN
|
||||
|
||||
110 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.A.example.com MX IN
|
||||
111 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.example.com MX IN
|
||||
112 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.example.com MX IN
|
||||
115 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.multiple-type-mx-record.example.com MX IN
|
||||
|
||||
120 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.A.example.com TXT IN
|
||||
121 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.example.com TXT IN
|
||||
122 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com TXT IN
|
||||
125 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.multiple-type-txt-record.example.com TXT IN
|
||||
|
||||
130 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.A.example.com AAAA IN
|
||||
131 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.example.com AAAA IN
|
||||
132 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com AAAA IN
|
||||
135 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.multiple-type-aaaa-record.example.com AAAA IN
|
||||
|
||||
140 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.A.example.com NAPTR IN
|
||||
141 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.example.com NAPTR IN
|
||||
142 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com NAPTR IN
|
||||
145 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.2.1.2.1.5.5.5.0.7.7.1.e164.arpa NAPTR IN
|
||||
146 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.b.e164.arpa NAPTR IN
|
||||
147 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.6.8.e164.arpa NAPTR IN
|
||||
|
||||
#150 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.A.example.com A6 IN
|
||||
#151 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.example.com A6 IN
|
||||
#152 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com A6 IN
|
||||
#155 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.multiple-type-a6-record.example.com A6 IN
|
||||
|
||||
# case 160-163
|
||||
160 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.A.example.com DNAME IN
|
||||
161 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.A.example.com ANY IN
|
||||
162 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.www.A.example.com A IN
|
||||
163 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.www.A.example.com ANY IN
|
||||
|
||||
# case 164-167
|
||||
164 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.exAmple.com DNAME IN
|
||||
165 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.exAmple.com ANY IN
|
||||
166 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.www.a.exAmple.com A IN
|
||||
167 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.www.a.exAmple.com ANY IN
|
||||
|
||||
# case 168-171
|
||||
168 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com DNAME IN
|
||||
169 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com ANY IN
|
||||
170 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.www.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com A IN
|
||||
171 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.www.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com ANY IN
|
||||
|
||||
# case 180-195
|
||||
180 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.d0.example.com a IN
|
||||
181 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.d1.example.com a IN
|
||||
182 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.d2.example.com a IN
|
||||
183 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.d4.example.com a IN
|
||||
184 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.d5.example.com a IN
|
||||
185 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.ns.d0.example.com a IN
|
||||
186 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.www.a.b.d1.example.com a IN
|
||||
187 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.www.a.b.d1.example.com mx IN
|
||||
|
||||
188 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.www.d10.example.com a IN
|
||||
189 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.www.d20.example.com a IN
|
||||
190 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.www.d30.example.com a IN
|
||||
191 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.www.d40.example.com a IN
|
||||
192 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.www.d50.example.com a IN
|
||||
193 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.c45.example.com any IN
|
||||
194 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.d45.example.com any IN
|
||||
195 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.noexist.d45.example.com any IN
|
||||
196 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.www.d45.example.com any IN
|
||||
|
||||
197 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.d72.example.com a IN
|
||||
198 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.www.d1.example.com a IN
|
||||
|
||||
# case 200-205
|
||||
200 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.A.example.com WKS IN
|
||||
201 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.example.com WKS IN
|
||||
202 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com WKS IN
|
||||
205 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.multiple-type-wks-record.example.com WKS IN
|
||||
|
||||
# case 210-215
|
||||
210 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.A.example.com HINFO IN
|
||||
211 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.example.com HINFO IN
|
||||
212 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com HINFO IN
|
||||
215 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.multiple-type-hinfo-record.example.com HINFO IN
|
||||
|
||||
# case 220-225
|
||||
220 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.A.example.com MINFO IN
|
||||
221 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.example.com MINFO IN
|
||||
222 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com MINFO IN
|
||||
225 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.multiple-type-minfo-record.example.com MINFO IN
|
||||
|
||||
# case 230-235
|
||||
230 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.A.example.com NSAP IN
|
||||
231 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.example.com NSAP IN
|
||||
232 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com NSAP IN
|
||||
235 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.multiple-type-nsap-record.example.com NSAP IN
|
||||
|
||||
# case 240-245
|
||||
240 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.A.example.com PX IN
|
||||
241 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.example.com PX IN
|
||||
242 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com PX IN
|
||||
245 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.multiple-type-px-record.example.com PX IN
|
||||
|
||||
# case 250-255
|
||||
250 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.A.example.com LOC IN
|
||||
251 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.example.com LOC IN
|
||||
252 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com LOC IN
|
||||
255 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.multiple-type-loc-record.example.com LOC IN
|
||||
|
||||
# case 260-265
|
||||
260 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.A.example.com SRV IN
|
||||
261 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.example.com SRV IN
|
||||
262 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com SRV IN
|
||||
265 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.multiple-type-srv-record.example.com SRV IN
|
||||
|
||||
# case 270-275
|
||||
270 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.A.example.com KX IN
|
||||
271 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.example.com KX IN
|
||||
272 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com KX IN
|
||||
275 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.multiple-type-kx-record.example.com KX IN
|
||||
|
||||
# case 280-285
|
||||
280 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.A.example.com CERT IN
|
||||
281 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.example.com CERT IN
|
||||
282 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com CERT IN
|
||||
285 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.multiple-type-cert-record.example.com CERT IN
|
||||
|
||||
# case 290-295
|
||||
290 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.A.example.com APL IN
|
||||
291 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.example.com APL IN
|
||||
292 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com APL IN
|
||||
295 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.multiple-type-apl-record.example.com APL IN
|
||||
|
||||
# case 300-305
|
||||
300 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.A.example.com SSHFP IN
|
||||
301 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.example.com SSHFP IN
|
||||
302 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com SSHFP IN
|
||||
305 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.multiple-type-sshfp-record.example.com SSHFP IN
|
||||
|
||||
# case 310-315
|
||||
310 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.A.example.com IPSECKEY IN
|
||||
311 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.example.com IPSECKEY IN
|
||||
312 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com IPSECKEY IN
|
||||
315 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.multiple-type-ipseckey-record.example.com IPSECKEY IN
|
||||
|
||||
# case 320-325
|
||||
#320 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.A.example.com DHCID IN
|
||||
#321 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.example.com DHCID IN
|
||||
#322 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com DHCID IN
|
||||
#325 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.multiple-type-dhcid-record.example.com DHCID IN
|
||||
|
||||
# case 330-335
|
||||
330 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.A.example.com SPF IN
|
||||
331 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.a.example.com SPF IN
|
||||
332 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.example.com SPF IN
|
||||
335 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.multiple-type-spf-record.example.com SPF IN
|
||||
|
||||
360 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.0.example.com A IN
|
||||
361 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.9.example.com A IN
|
||||
|
||||
370 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.sub-cname.example.com A IN
|
||||
371 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.www.sub-dname.example.com A IN
|
||||
|
||||
381 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.type-a-answer.toobigudp.com A IN
|
||||
382 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.type-a-authority.toobigudp.com A IN
|
||||
383 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.toobigudp.com NS IN
|
||||
384 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.type-txt-answer.toobigudp.com TXT IN
|
||||
385 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.type-txt-authority.toobigudp.com TXT IN
|
||||
386 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.type-cname-answer.toobigudp.com A IN
|
||||
387 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.type-cname-answer.toobigudp.com TXT IN
|
||||
|
||||
390 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example.com DNSKEY IN
|
||||
391 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example.com RRSIG IN
|
||||
392 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example.com NSEC IN
|
||||
393 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.example.com DS IN
|
||||
#0x1000 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.version.bind txt CH
|
||||
#0x1001 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.hostname.bind txt CH
|
||||
#0x1002 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.id.server txt CH
|
||||
#0x1003 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.authors.bind txt CH
|
||||
#0x1000 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.version.bind txt CH
|
||||
#0x1001 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.hostname.bind txt CH
|
||||
#0x1002 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.id.server txt CH
|
||||
#0x1003 0 0 0 0 1 0 0 0 0 0 1 0 0 0 nxdomain.authors.bind txt CH
|
285
tools/query_cmp/src/lib/compare_rrset.py
Executable file
285
tools/query_cmp/src/lib/compare_rrset.py
Executable file
@ -0,0 +1,285 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
# Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
#
|
||||
# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
|
||||
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
# AND FITNESS. IN NO EVENT SHALL ISC 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.
|
||||
|
||||
import struct
|
||||
from pydnspp import *
|
||||
|
||||
# Some position parameters used in the formatted output report.
|
||||
POS_TOTAL = 80
|
||||
POS_TITLE = 14
|
||||
POS_LEFT = int((POS_TOTAL - POS_TITLE) / 2)
|
||||
|
||||
def get_header_field(msg):
|
||||
header = {}
|
||||
header['id'] = msg.get_qid()
|
||||
header['qr'] = msg.get_header_flag(Message.HEADERFLAG_QR)
|
||||
header['opcode'] = msg.get_opcode()
|
||||
header['aa'] = msg.get_header_flag(Message.HEADERFLAG_AA)
|
||||
header['tc'] = msg.get_header_flag(Message.HEADERFLAG_TC)
|
||||
header['rd'] = msg.get_header_flag(Message.HEADERFLAG_RD)
|
||||
header['ra'] = msg.get_header_flag(Message.HEADERFLAG_RA)
|
||||
header['ad'] = msg.get_header_flag(Message.HEADERFLAG_AD)
|
||||
header['cd'] = msg.get_header_flag(Message.HEADERFLAG_CD)
|
||||
#header['rcode'] = dns.rcode.from_flags(msg.flags, msg.ednsflags)
|
||||
header['rcode'] = msg.get_rcode()
|
||||
|
||||
header['qdcount'] = msg.get_rr_count(Message.SECTION_QUESTION)
|
||||
header['ancount'] = msg.get_rr_count(Message.SECTION_ANSWER)
|
||||
header['nscount'] = msg.get_rr_count(Message.SECTION_AUTHORITY)
|
||||
header['arcount'] = msg.get_rr_count(Message.SECTION_ADDITIONAL)
|
||||
|
||||
return header
|
||||
|
||||
def header_cmp(buf, msg1, msg2, diff):
|
||||
""" Compare the header of msg1 and msg2.
|
||||
|
||||
@param buf: the formatted difference for output.
|
||||
@type buf: dict
|
||||
@param diff: the key is each flag in the header, the value is
|
||||
True for different and False for same
|
||||
@type diff: dict
|
||||
"""
|
||||
|
||||
header1 = get_header_field(msg1)
|
||||
header2 = get_header_field(msg2)
|
||||
|
||||
list = ['id', 'qr', 'opcode', 'aa', 'tc', 'rd', \
|
||||
'ra', 'ad', 'cd', 'rcode', 'qdcount', 'ancount', \
|
||||
'nscount', 'arcount']
|
||||
|
||||
for header in list:
|
||||
diff[header] = header1[header] != header2[header]
|
||||
|
||||
buf['header'] = ''
|
||||
for key in list:
|
||||
if diff[key]:
|
||||
buf['header'] = buf['header'] + \
|
||||
'%-*s%-*s%-*s\n' % (POS_TITLE, key, \
|
||||
POS_LEFT, header1[key], POS_LEFT, \
|
||||
header2[key])
|
||||
|
||||
for key in diff.keys():
|
||||
if diff[key]: return(False)
|
||||
|
||||
return(True)
|
||||
|
||||
|
||||
def output(sect, buf, rrset, isleft):
|
||||
""" Format and return the rrset according to which section
|
||||
and which message it belongs to.
|
||||
|
||||
@param sect: section name
|
||||
@type sect: string
|
||||
@param buf: passed by parameter, to store the formatted string
|
||||
@param buf: dict
|
||||
@param rrset: the rrset to be formatted
|
||||
@type rrset: RRset
|
||||
@param isleft: to be compared, the report has the content corresponding to
|
||||
the 1st message printed on the left, while the one corresponding
|
||||
to the 2nd message on the right. This is a flag to which one it is.
|
||||
@type isleft: BOOL
|
||||
"""
|
||||
|
||||
if not sect in buf:
|
||||
buf[sect] = ''
|
||||
if sect == 'question':
|
||||
buf[sect] = buf[sect] + '%-*s' % (POS_TITLE, 'name')
|
||||
if not isleft:
|
||||
buf[sect] = buf[sect] + ' ' * POS_LEFT
|
||||
buf[sect] = buf[sect] + rrset.get_name().to_text() + "\n"
|
||||
|
||||
buf[sect] = buf[sect] + '%-*s' % (POS_TITLE, 'class')
|
||||
if not isleft:
|
||||
buf[sect] = buf[sect] + ' ' * POS_LEFT
|
||||
buf[sect] = buf[sect] + rrset.get_class().to_text() + "\n"
|
||||
|
||||
buf[sect] = buf[sect] + '%-*s' % (POS_TITLE, 'type')
|
||||
if not isleft:
|
||||
buf[sect] = buf[sect] + ' ' * POS_LEFT
|
||||
buf[sect] = buf[sect] + rrset.get_type().to_text() + "\n"
|
||||
|
||||
else:
|
||||
buf[sect] = buf[sect] + '%-*s' % (POS_TITLE, 'ttl')
|
||||
if not isleft:
|
||||
buf[sect] = buf[sect] + ' ' * int(POS_LEFT)
|
||||
buf[sect] = buf[sect] + rrset.get_ttl().to_text() + "\n"
|
||||
|
||||
buf[sect] = buf[sect] + '%-*s' % (POS_TITLE, 'name')
|
||||
if not isleft:
|
||||
buf[sect] = buf[sect] + ' ' * int(POS_LEFT)
|
||||
buf[sect] = buf[sect] + rrset.get_name().to_text() + "\n"
|
||||
|
||||
buf[sect] = buf[sect] + '%-*s' % (POS_TITLE, 'class')
|
||||
if not isleft:
|
||||
buf[sect] = buf[sect] + ' ' * int(POS_LEFT)
|
||||
buf[sect] = buf[sect] + rrset.get_class().to_text() + "\n"
|
||||
|
||||
buf[sect] = buf[sect] + '%-*s' % (POS_TITLE, 'type')
|
||||
if not isleft:
|
||||
buf[sect] = buf[sect] + ' ' * int(POS_LEFT)
|
||||
buf[sect] = buf[sect] + rrset.get_type().to_text() + "\n"
|
||||
|
||||
buf[sect] = buf[sect] + '%-*s' % (POS_TITLE, 'rdata')
|
||||
|
||||
i = 0
|
||||
rdata = rrset.get_rdata()
|
||||
for item in rdata:
|
||||
if i > 0:
|
||||
buf[sect] = buf[sect] + ' ' * POS_TITLE
|
||||
if not isleft:
|
||||
buf[sect] = buf[sect] + ' ' * POS_LEFT
|
||||
buf[sect] = buf[sect] + item.to_text() + "\n"
|
||||
i = i + 1
|
||||
|
||||
buf[sect] = buf[sect] + "\n"
|
||||
|
||||
def array_cmp(sectname, buf, rlist1, rlist2):
|
||||
""" Compare each entry of the question section of rlist1 and rlist2.
|
||||
Compare each RRset of the sectname section (can be answer, authority,
|
||||
additional) of rlist1 and rlist2.
|
||||
|
||||
@param buf: store the formatted output of difference
|
||||
@type: dict
|
||||
"""
|
||||
|
||||
diff_flag = True
|
||||
while len(rlist1) > 0:
|
||||
rr1 = rlist1.pop()
|
||||
find2 = False
|
||||
for rr2 in rlist2:
|
||||
if sectname == 'question':
|
||||
res = question_cmp(rr1, rr2)
|
||||
else:
|
||||
res = rr_cmp(rr1, rr2)
|
||||
if res:
|
||||
find2 = True
|
||||
rlist2.remove(rr2)
|
||||
break
|
||||
if not find2:
|
||||
output(sectname, buf, rr1, True)
|
||||
diff_flag = False
|
||||
|
||||
while len(rlist2) > 0:
|
||||
rr2 = rlist2.pop()
|
||||
output(sectname, buf, rr2, False)
|
||||
diff_flag = False
|
||||
return(diff_flag)
|
||||
|
||||
def question_cmp(rra, rrb):
|
||||
if rra.get_name() != rrb.get_name(): return(False)
|
||||
if rra.get_class() != rrb.get_class(): return(False)
|
||||
if rra.get_type() != rrb.get_type(): return(False)
|
||||
return(True)
|
||||
|
||||
def rr_cmp(rra, rrb):
|
||||
""" Compare two rrsets: rra and rrb """
|
||||
|
||||
if rra.get_name() != rrb.get_name(): return(False)
|
||||
if rra.get_class() != rrb.get_class(): return(False)
|
||||
if rra.get_type() != rrb.get_type(): return(False)
|
||||
if rra.get_ttl() != rrb.get_ttl(): return(False)
|
||||
rdata_a = rra.get_rdata()
|
||||
rdata_b = rrb.get_rdata()
|
||||
rdata_al = len(rdata_a)
|
||||
rdata_bl = len(rdata_b)
|
||||
|
||||
if rdata_al != rdata_bl:
|
||||
return(False)
|
||||
|
||||
cmp_flag = False
|
||||
# Iterate rdata in rrset a, find if there is same rdata in rrset b
|
||||
for ra in rdata_a:
|
||||
for rb in rdata_b:
|
||||
if ra.to_text() == rb.to_text():
|
||||
cmp_flag = True
|
||||
rdata_b.remove(rb)
|
||||
break
|
||||
if not cmp_flag:
|
||||
break
|
||||
return(cmp_flag)
|
||||
|
||||
def resp_casecmp(msg1, msg2, num):
|
||||
""" Compare two response message, and print the different part
|
||||
in formatted report.
|
||||
|
||||
@param msg1: 1st response message
|
||||
@type msg1: Message
|
||||
@param msg2: 2nd response message
|
||||
@type msg2: Message
|
||||
@param num: the id of the query case in the 1st column of the input file.
|
||||
Used by output report to locate the specified query case.
|
||||
@type num: int
|
||||
"""
|
||||
|
||||
diff = {}
|
||||
buf = {}
|
||||
|
||||
query = msg1.get_question()[0]
|
||||
|
||||
res_hdr = header_cmp(buf, msg1, msg2, diff)
|
||||
res_ques = array_cmp('question', buf, \
|
||||
msg1.get_question(), msg2.get_question())
|
||||
res_ans = array_cmp('answer', buf, \
|
||||
msg1.get_section(Message.SECTION_ANSWER), \
|
||||
msg2.get_section(Message.SECTION_ANSWER))
|
||||
res_auth = array_cmp('authority', buf, \
|
||||
msg1.get_section(Message.SECTION_AUTHORITY), \
|
||||
msg2.get_section(Message.SECTION_AUTHORITY))
|
||||
res_addi = array_cmp('additional', buf, \
|
||||
msg1.get_section(Message.SECTION_ADDITIONAL), \
|
||||
msg2.get_section(Message.SECTION_ADDITIONAL))
|
||||
|
||||
# If there are any differnt comparisons in the sections above, print the details
|
||||
# contained in buf formattedly.
|
||||
if not res_hdr or not res_ques or not res_ans or not res_auth or not res_addi:
|
||||
print('=' * 30, ' BEGIN QUERY %s ' % num, '=' * 30, sep='')
|
||||
print('%-*s%-*s%-*s' % (POS_TITLE, '', int(POS_LEFT), 'SERVER1', \
|
||||
POS_TOTAL - POS_TITLE, 'SERVER2'))
|
||||
print('-' * 80)
|
||||
print('Query: ', query.to_text(), sep='')
|
||||
print('-' * 80)
|
||||
|
||||
if not res_hdr:
|
||||
print(buf['header'])
|
||||
print('-' * 80)
|
||||
|
||||
if not res_ques:
|
||||
print("QUESTION")
|
||||
print('-' * 80)
|
||||
print(buf['question'])
|
||||
|
||||
if not res_ans:
|
||||
print("ANSWER")
|
||||
print('-' * 80)
|
||||
print(buf['answer'])
|
||||
|
||||
if not res_auth:
|
||||
print("AUTHORITY")
|
||||
print('-' * 80)
|
||||
print(buf['authority'])
|
||||
|
||||
if not res_addi:
|
||||
print("ADDITIONAL")
|
||||
print('-' * 80)
|
||||
print(buf['additional'])
|
||||
|
||||
print('=' * 30, ' END QUERY %s ' % num, '=' * 30, sep='')
|
||||
print("\n\n")
|
||||
|
||||
return False
|
||||
|
||||
return True
|
||||
|
284
tools/query_cmp/src/lib/handledns.py
Executable file
284
tools/query_cmp/src/lib/handledns.py
Executable file
@ -0,0 +1,284 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
# Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
#
|
||||
# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
|
||||
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
# AND FITNESS. IN NO EVENT SHALL ISC 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.
|
||||
|
||||
import errno
|
||||
import sys
|
||||
import select
|
||||
import socket
|
||||
import struct
|
||||
import time
|
||||
|
||||
from pydnspp import *
|
||||
|
||||
RECV_BUFSIZE = 65536
|
||||
|
||||
def _wait_for(ir, iw, ix, expiration):
|
||||
done = False
|
||||
while not done:
|
||||
if expiration is None:
|
||||
timeout = None
|
||||
else:
|
||||
timeout = expiration - time.time()
|
||||
if timeout <= 0.0:
|
||||
raise socket.timeout
|
||||
try:
|
||||
if timeout is None:
|
||||
(r,w,x) = select.select(ir,iw,ix)
|
||||
else:
|
||||
(r,w,x) = select.select(ir,iw,ix,timeout)
|
||||
except select.error as e:
|
||||
if e.args[0] != errno.EINTR:
|
||||
raise e
|
||||
else:
|
||||
done = True
|
||||
if len(r) == 0 and len(w) == 0 and len(x) == 0:
|
||||
raise socket.timeout
|
||||
|
||||
def _wait_for_readable(s,expiration):
|
||||
_wait_for([s],[],[s],expiration)
|
||||
|
||||
def _compute_expiration(timeout):
|
||||
if timeout is None:
|
||||
return None
|
||||
else:
|
||||
return time.time() + timeout
|
||||
|
||||
def _send_udp(q, where, timeout=None, port=53, source=None, source_port=0):
|
||||
""" Return the response obtained after sending a query via UDP.
|
||||
Refered to dnspython source code. """
|
||||
|
||||
qwire = MessageRenderer()
|
||||
q.to_wire(qwire)
|
||||
if source is not None:
|
||||
source = (source, source_port)
|
||||
|
||||
udpCliSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
|
||||
|
||||
expiration = _compute_expiration(timeout)
|
||||
if source is not None:
|
||||
udpCliSock.bind(source)
|
||||
|
||||
dest = (where, port)
|
||||
udpCliSock.sendto(qwire.get_data(), dest)
|
||||
|
||||
while True:
|
||||
_wait_for_readable(udpCliSock, expiration)
|
||||
rwire, r_addr = udpCliSock.recvfrom(RECV_BUFSIZE)
|
||||
if dest[0] == r_addr[0] and dest[1:] == r_addr[1:]:
|
||||
break
|
||||
else:
|
||||
sys.stderr.write('Got a respose from: %s instead of %s\n' % (r_addr, dest))
|
||||
|
||||
udpCliSock.close()
|
||||
|
||||
resp = Message(Message.PARSE)
|
||||
resp.from_wire(rwire)
|
||||
|
||||
return resp
|
||||
|
||||
def _connect(s, address):
|
||||
try:
|
||||
s.connect(address)
|
||||
except socket.error as msg:
|
||||
(exctype,value) = sys.exc_info()[:2]
|
||||
if value.errno != errno.EINPROGRESS and \
|
||||
value.errno != errno.EWOULDBLOCK and \
|
||||
value.errno != errno.EALREADY:
|
||||
raise value
|
||||
|
||||
def _net_read(sock, count, expiration):
|
||||
""" Read the specified number of bytes from sock. Keep trying until we
|
||||
either get the desired amount, or we hit EOF.
|
||||
A Timeout exception will be raised if the operation is not completed
|
||||
by the expiration time.
|
||||
"""
|
||||
|
||||
msgdata = b''
|
||||
while count > 0:
|
||||
_wait_for_readable(sock, expiration)
|
||||
data = sock.recv(count)
|
||||
if not data:
|
||||
return None
|
||||
|
||||
count -= len(data)
|
||||
msgdata += data
|
||||
|
||||
return msgdata
|
||||
|
||||
def _net_write(sock, data, expiration):
|
||||
""" Write the specified data to the socket.
|
||||
A Timeout exception will be raised if the operation is not completed
|
||||
by the expiration time.
|
||||
"""
|
||||
current = 0
|
||||
l = len(data)
|
||||
while current < 1:
|
||||
_wait_for_writable(sock, expiration)
|
||||
current += sock.send(data[current:])
|
||||
|
||||
def _send_tcp(q, dest, timeout=None, dest_port=53, source=None, source_port=0):
|
||||
""" Return the response obtained after sending a query via TCP.
|
||||
Refered to dnspython source code """
|
||||
|
||||
qwire = MessageRenderer()
|
||||
q.to_wire(qwire)
|
||||
|
||||
if source is not None:
|
||||
source = (source, source_port)
|
||||
dest = (dest, dest_port)
|
||||
tcpCliSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
|
||||
|
||||
expiration = _compute_expiration(timeout)
|
||||
tcpCliSock.setblocking(False)
|
||||
if source is not None:
|
||||
tcpCliSock.bind(source)
|
||||
_connect(tcpCliSock, dest)
|
||||
|
||||
wire_s = qwire.get_data()
|
||||
l = len(wire_s)
|
||||
|
||||
tcpmsg = struct.pack("!H", l) + wire_s
|
||||
_net_write(tcpCliSock, tcpmsg, expiration)
|
||||
ldata = _net_read(tcpCliSock, 2, expiration)
|
||||
(l,) = struct.unpack("!H", ldata)
|
||||
res_wire = _net_read(tcpCliSock, l, expiration)
|
||||
tcpCliSock.close()
|
||||
|
||||
resp = Message(Message.PARSE)
|
||||
resp.from_wire(res_wire)
|
||||
|
||||
return resp
|
||||
|
||||
def send_req(query, server, port=53, timeout=5):
|
||||
""" Return the response message obtained after
|
||||
sending the query.
|
||||
|
||||
@param query: the query readed from input file
|
||||
@type query: dict
|
||||
@param server: the testee server ip address
|
||||
@type server: string
|
||||
@param port: the testee server listening port. The default is 53.
|
||||
@type port: int
|
||||
@param timeout: the number of seconds to wait before the query times out.
|
||||
The default is 5.
|
||||
@type timeout: float
|
||||
"""
|
||||
|
||||
qname = query["qname"]
|
||||
qtype = query["qtype"]
|
||||
qclass = query["qclass"]
|
||||
edns = query["edns"]
|
||||
dnssec = query["dnssec"]
|
||||
qheader = query['header']
|
||||
protocol = query['protocol']
|
||||
|
||||
msg = Message(Message.RENDER)
|
||||
msg.set_qid(int(qheader['id']))
|
||||
msg.set_opcode(Opcode.QUERY())
|
||||
msg.set_rcode(Rcode(int(qheader['rcode'])))
|
||||
|
||||
if qheader['qr'] == 1:
|
||||
msg.set_header_flag(Message.HEADERFLAG_QR)
|
||||
if qheader['aa'] == 1:
|
||||
msg.set_header_flag(Message.HEADERFLAG_AA)
|
||||
if qheader['tc'] == 1:
|
||||
msg.set_header_flag(Message.HEADERFLAG_TC)
|
||||
if qheader['rd'] == 1:
|
||||
msg.set_header_flag(Message.HEADERFLAG_RD)
|
||||
if qheader['ra'] == 1:
|
||||
msg.set_header_flag(Message.HEADERFLAG_RA)
|
||||
if qheader['ad'] == 1:
|
||||
msg.set_header_flag(Message.HEADERFLAG_AD)
|
||||
if qheader['cd'] == 1:
|
||||
msg.set_header_flag(Message.HEADERFLAG_CD)
|
||||
|
||||
try:
|
||||
msg.add_question(Question(Name(qname), \
|
||||
RRClass(qclass), RRType(qtype)))
|
||||
except InvalidRRType as e:
|
||||
sys.stderr.write('Unrecognized RR queryeter string: %s\n' % qtype)
|
||||
return None
|
||||
|
||||
if edns == 1 or dnssec == 1:
|
||||
edns_conf = EDNS()
|
||||
payload = query['payload']
|
||||
edns_conf.set_udp_size(payload)
|
||||
|
||||
if dnssec == 1:
|
||||
edns_conf.set_dnssec_awareness(True)
|
||||
else:
|
||||
edns_conf.set_dnssec_awareness(False)
|
||||
|
||||
msg.set_edns(edns_conf)
|
||||
|
||||
port = int(port)
|
||||
if protocol == 'udp':
|
||||
resp = _send_udp(msg, server, timeout, port)
|
||||
else:
|
||||
resp = _send_tcp(msg, server, timeout, port)
|
||||
|
||||
return resp
|
||||
|
||||
|
||||
def main():
|
||||
query = {}
|
||||
query['qname'] = "A.example.com"
|
||||
query['qtype'] = "ANY"
|
||||
query['qclass'] = "IN"
|
||||
query["edns"] = 1
|
||||
query["dnssec"] = 1
|
||||
query["protocol"] = 'tcp'
|
||||
query["payload"] = 4096
|
||||
|
||||
query['header'] = {}
|
||||
query['header']['id'] = 0
|
||||
query['header']['qr'] = 0
|
||||
query['header']['opcode'] = 0
|
||||
query['header']['aa'] = 0
|
||||
query['header']['tc'] = 0
|
||||
query['header']['rd'] = 1
|
||||
query['header']['ra'] = 0
|
||||
query['header']['z'] = 0
|
||||
query['header']['ad'] = 0
|
||||
query['header']['cd'] = 0
|
||||
query['header']['rcode'] = 0
|
||||
query['header']['qdcount'] = 0
|
||||
query['header']['ancount'] = 0
|
||||
query['header']['nscount'] = 0
|
||||
query['header']['arcount'] = 0
|
||||
|
||||
resp = send_req(query, "218.241.108.124", "4040")
|
||||
|
||||
if resp == None:
|
||||
print('timeout')
|
||||
exit(1)
|
||||
|
||||
print('qid -----')
|
||||
print(resp.get_qid())
|
||||
|
||||
rrset = resp.get_section(Message.SECTION_ANSWER)[0]
|
||||
print('name-----')
|
||||
print(rrset.get_name())
|
||||
print('type')
|
||||
print(rrset.get_type())
|
||||
print('class-----')
|
||||
print(rrset.get_class())
|
||||
print(rrset.get_ttl())
|
||||
rdata = rrset.get_rdata()
|
||||
print(rdata[0].to_text())
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
93
tools/query_cmp/src/lib/read_query.py
Executable file
93
tools/query_cmp/src/lib/read_query.py
Executable file
@ -0,0 +1,93 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
# Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
#
|
||||
# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
|
||||
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
# AND FITNESS. IN NO EVENT SHALL ISC 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.
|
||||
|
||||
import re
|
||||
import sys
|
||||
|
||||
def read_query(file, querylist):
|
||||
fh = open(file)
|
||||
while True:
|
||||
query = {}
|
||||
query['header'] = {}
|
||||
|
||||
line = fh.readline()
|
||||
if not line: break
|
||||
line = line.rstrip('\n')
|
||||
|
||||
if re.search('^#', line): continue
|
||||
if re.search('^\s*$', line): continue
|
||||
|
||||
fields = line.split(' ')
|
||||
query['header']['id'] = fields.pop(0)
|
||||
query['header']['qr'] = fields.pop(0)
|
||||
query['header']['opcode'] = int(fields.pop(0))
|
||||
query['header']['aa'] = fields.pop(0)
|
||||
query['header']['tc'] = fields.pop(0)
|
||||
query['header']['rd'] = fields.pop(0)
|
||||
query['header']['ra'] = fields.pop(0)
|
||||
query['header']['z'] = fields.pop(0)
|
||||
query['header']['ad'] = fields.pop(0)
|
||||
query['header']['cd'] = fields.pop(0)
|
||||
query['header']['rcode'] = fields.pop(0)
|
||||
query['header']['qdcount'] = fields.pop(0)
|
||||
query['header']['ancount'] = fields.pop(0)
|
||||
query['header']['nscount'] = fields.pop(0)
|
||||
query['header']['arcount'] = fields.pop(0)
|
||||
|
||||
if query['header']['opcode'] == 0:
|
||||
get_qtuple(query, 'question', fields)
|
||||
|
||||
querylist.append(query)
|
||||
|
||||
fh.close()
|
||||
|
||||
def get_qtuple(query, sectname, list):
|
||||
if sectname == 'question':
|
||||
count = int(query['header']['qdcount'])
|
||||
item = {}
|
||||
i = 0
|
||||
while i < count:
|
||||
query[sectname] = []
|
||||
item['qname'] = list.pop(0)
|
||||
item['qtype'] = list.pop(0)
|
||||
item['qclass'] = list.pop(0)
|
||||
query[sectname].append(item)
|
||||
i += 1
|
||||
|
||||
def print_query(querylist):
|
||||
keylist = ['id', 'qr', 'opcode', 'aa', 'tc', 'rd', 'ra', 'z',
|
||||
'ad', 'cd', 'rcode', 'qdcount', 'ancount', 'nscount',
|
||||
'arcount']
|
||||
for q in querylist:
|
||||
for key in keylist:
|
||||
print(q['header'][key], ' ')
|
||||
print_question(q)
|
||||
|
||||
def print_question(query):
|
||||
i = 0
|
||||
|
||||
while i < len(query['question']):
|
||||
print(query['question'][i]['qname'], \
|
||||
query['question'][i]['qtype'], \
|
||||
query['question'][i]['qclass'], \
|
||||
sep=' ')
|
||||
i += 1
|
||||
|
||||
if __name__ == '__main__':
|
||||
qlist = []
|
||||
read_query(sys.argv[1], qlist)
|
||||
print_query(qlist)
|
||||
|
102
tools/query_cmp/src/query_two_server.py
Executable file
102
tools/query_cmp/src/query_two_server.py
Executable file
@ -0,0 +1,102 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
# Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
||||
#
|
||||
# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
|
||||
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
# AND FITNESS. IN NO EVENT SHALL ISC 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.
|
||||
|
||||
import sys; sys.path.append('lib')
|
||||
from optparse import OptionParser
|
||||
|
||||
from read_query import *
|
||||
import handledns
|
||||
import compare_rrset
|
||||
|
||||
def getopt():
|
||||
"""
|
||||
get options from user.
|
||||
"""
|
||||
usage = "usage: %prog -f <file> -s <svr1> [-p <port1>] -t <svr2> [-q <port2>] [-e] [-u] [--bufsize] [--edns]"
|
||||
parser = OptionParser(usage)
|
||||
parser.add_option("-f", "--file", dest="filename",
|
||||
help="specify the input data filename")
|
||||
parser.add_option("-s", "--svr1", dest="server1",
|
||||
help="specify the tested DNS server 1")
|
||||
parser.add_option("-p",
|
||||
help="specify the port of the tested DNS server 1, default is 53")
|
||||
parser.add_option("-t", "--svr2", dest="server2",
|
||||
help="specify the tested DNS server 2")
|
||||
parser.add_option("-q",
|
||||
help="specify the port of the tested DNS server 2, default is 53")
|
||||
parser.add_option("-e", "--dnssec", action="store_true",
|
||||
default=False, help="turn on dnssec")
|
||||
parser.add_option("", "--edns", action="store_true",
|
||||
default=False, help="turn on edns, if -e is set, --edns will lapse, it must be True")
|
||||
parser.add_option("-u", "--udp", action="store_true", default=False,
|
||||
help="if set, query by udp, otherwise by tcp, default is unset")
|
||||
parser.add_option("", "--bufsize", default=4096,
|
||||
help="if --edns is set, --bufsize specifies payload of edns0, default is 4096")
|
||||
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
if(options.filename == None or options.server1 == None or
|
||||
options.server2 == None):
|
||||
parser.print_help()
|
||||
sys.exit(1)
|
||||
|
||||
return options
|
||||
|
||||
def main():
|
||||
opts = getopt()
|
||||
|
||||
qlist = []
|
||||
read_query(opts.filename, qlist)
|
||||
|
||||
for q in qlist:
|
||||
# initial query
|
||||
query = {}
|
||||
if opts.dnssec:
|
||||
query['edns'] = 1
|
||||
query['dnssec'] = 1
|
||||
elif opts.edns:
|
||||
query['edns'] = 1
|
||||
query['dnssec'] = 0
|
||||
else:
|
||||
query['edns'] = 0
|
||||
query['dnssec'] = 0
|
||||
|
||||
if opts.udp:
|
||||
query['protocol'] = 'udp'
|
||||
else:
|
||||
query['protocol'] = 'tcp'
|
||||
|
||||
query['payload'] = opts.bufsize
|
||||
query['qname'] = q['question'][0]['qname']
|
||||
query['qtype'] = q['question'][0]['qtype']
|
||||
query['qclass'] = q['question'][0]['qclass']
|
||||
query['header'] = q['header']
|
||||
id = q['header']['id']
|
||||
|
||||
# send the query to the 1st and 2nd server, and store the
|
||||
# response in res1 and res2
|
||||
res1 = handledns.send_req(query, opts.server1, opts.p)
|
||||
res2 = handledns.send_req(query, opts.server2, opts.q)
|
||||
|
||||
if res1 != None and res2 != None:
|
||||
# compare res1 and res2, print the different part.
|
||||
res3 = compare_rrset.resp_casecmp(res1, res2, id)
|
||||
else:
|
||||
sys.stderr.write('Empty response.\n')
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
1298
tools/query_cmp/zonefile/example.com.txt
Normal file
1298
tools/query_cmp/zonefile/example.com.txt
Normal file
File diff suppressed because it is too large
Load Diff
6858
tools/query_cmp/zonefile/example.com.txt.signed
Normal file
6858
tools/query_cmp/zonefile/example.com.txt.signed
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user