[svn] commit: r3055 - in /branches/trac351: ./ src/bin/ src/bin/auth/ src/bin/auth/tests/ src/bin/bind10/ src/bin/bind10/tests/ src/bin/bindctl/ src/bin/cfgmgr/ src/bin/cmdctl/ src/bin/loadzone/ src/bin/msgq/ src/bin/tests/ src/bin/usermgr/ src/bin/xfrin/ src/bin/xfrout/ src/bin/zonemgr/ src/lib/dns/ src/lib/dns/python/ src/lib/dns/python/tests/ src/lib/dns/tests/ src/lib/dns/tests/testdata/ src/lib/exceptions/ src/lib/python/isc/ src/lib/python/isc/utils/
BIND 10 source code commits
bind10-changes at lists.isc.org
Wed Sep 29 01:12:16 UTC 2010
Author: jinmei
Date: Wed Sep 29 01:12:16 2010
New Revision: 3055
Log:
sync with trunk
Added:
branches/trac351/src/bin/tests/
- copied from r3054, trunk/src/bin/tests/
branches/trac351/src/lib/dns/edns.cc
- copied unchanged from r3054, trunk/src/lib/dns/edns.cc
branches/trac351/src/lib/dns/edns.h
- copied unchanged from r3054, trunk/src/lib/dns/edns.h
branches/trac351/src/lib/dns/python/edns_python.cc
- copied unchanged from r3054, trunk/src/lib/dns/python/edns_python.cc
branches/trac351/src/lib/dns/python/tests/edns_python_test.py
- copied unchanged from r3054, trunk/src/lib/dns/python/tests/edns_python_test.py
branches/trac351/src/lib/dns/python/tests/testutil.py
- copied unchanged from r3054, trunk/src/lib/dns/python/tests/testutil.py
branches/trac351/src/lib/dns/tests/edns_unittest.cc
- copied, changed from r3054, trunk/src/lib/dns/tests/edns_unittest.cc
branches/trac351/src/lib/dns/tests/testdata/Makefile.am
- copied unchanged from r3054, trunk/src/lib/dns/tests/testdata/Makefile.am
branches/trac351/src/lib/dns/tests/testdata/edns_toWire1.spec
- copied unchanged from r3054, trunk/src/lib/dns/tests/testdata/edns_toWire1.spec
branches/trac351/src/lib/dns/tests/testdata/edns_toWire2.spec
- copied unchanged from r3054, trunk/src/lib/dns/tests/testdata/edns_toWire2.spec
branches/trac351/src/lib/dns/tests/testdata/edns_toWire3.spec
- copied unchanged from r3054, trunk/src/lib/dns/tests/testdata/edns_toWire3.spec
branches/trac351/src/lib/dns/tests/testdata/edns_toWire4.spec
- copied unchanged from r3054, trunk/src/lib/dns/tests/testdata/edns_toWire4.spec
branches/trac351/src/lib/python/isc/utils/
- copied from r3054, trunk/src/lib/python/isc/utils/
Modified:
branches/trac351/ (props changed)
branches/trac351/ChangeLog
branches/trac351/configure.ac
branches/trac351/src/bin/Makefile.am
branches/trac351/src/bin/auth/auth_srv.cc
branches/trac351/src/bin/auth/tests/auth_srv_unittest.cc
branches/trac351/src/bin/bind10/bind10.8
branches/trac351/src/bin/bind10/bind10.py.in
branches/trac351/src/bin/bind10/bind10.xml
branches/trac351/src/bin/bind10/tests/args_test.py
branches/trac351/src/bin/bindctl/bindctl-source.py.in
branches/trac351/src/bin/cfgmgr/b10-cfgmgr.py.in
branches/trac351/src/bin/cmdctl/cmdctl.py.in
branches/trac351/src/bin/loadzone/b10-loadzone.py.in
branches/trac351/src/bin/msgq/msgq.py.in
branches/trac351/src/bin/usermgr/b10-cmdctl-usermgr.py.in
branches/trac351/src/bin/xfrin/xfrin.py.in
branches/trac351/src/bin/xfrout/xfrout.py.in
branches/trac351/src/bin/zonemgr/zonemgr.py.in
branches/trac351/src/lib/dns/Makefile.am
branches/trac351/src/lib/dns/message.cc
branches/trac351/src/lib/dns/message.h
branches/trac351/src/lib/dns/python/Makefile.am
branches/trac351/src/lib/dns/python/message_python.cc
branches/trac351/src/lib/dns/python/messagerenderer_python.cc
branches/trac351/src/lib/dns/python/pydnspp.cc
branches/trac351/src/lib/dns/python/rdata_python.cc
branches/trac351/src/lib/dns/python/tests/Makefile.am
branches/trac351/src/lib/dns/python/tests/message_python_test.py
branches/trac351/src/lib/dns/python/tests/question_python_test.py
branches/trac351/src/lib/dns/rrclass-placeholder.h
branches/trac351/src/lib/dns/rrtype-placeholder.h
branches/trac351/src/lib/dns/tests/Makefile.am
branches/trac351/src/lib/dns/tests/message_unittest.cc
branches/trac351/src/lib/dns/tests/run_unittests.cc
branches/trac351/src/lib/exceptions/exceptions.h
branches/trac351/src/lib/python/isc/Makefile.am
Modified: branches/trac351/ChangeLog
==============================================================================
--- branches/trac351/ChangeLog (original)
+++ branches/trac351/ChangeLog Wed Sep 29 01:12:16 2010
@@ -1,3 +1,14 @@
+ 100. [func] Michal Vaner
+ Python processes: support naming of python processes so
+ they're not all called python3.
+ (Trac #322, svn r3052)
+
+ 99. [func]* jinmei
+ Introduced a separate EDNS class to encapsulate EDNS related
+ information more cleanly. The related APIs are changed a bit,
+ although it won't affect most of higher level applications.
+ (Trac #311, svn r3020)
+
98. [build] jinmei
The ./configure script now tries to search some common include
paths for boost header files to minimize the need for explicit
Modified: branches/trac351/configure.ac
==============================================================================
--- branches/trac351/configure.ac (original)
+++ branches/trac351/configure.ac Wed Sep 29 01:12:16 2010
@@ -47,6 +47,12 @@
if test $enable_shared = no; then
AC_MSG_ERROR([BIND 10 requires shared libraries to be built])
fi
+
+# allow configuring without setproctitle.
+AC_ARG_ENABLE(setproctitle-check,
+AC_HELP_STRING([--disable-setproctitle-check],
+ [do not check for python setproctitle module (used to give nice names to python processes)]),
+ setproctitle_check=$enableval, setproctitle_check=yes)
# OS dependent configuration
SET_ENV_LIBRARY_PATH=no
@@ -161,6 +167,18 @@
fi
AC_SUBST(PYTHON_LIB)
LDFLAGS=$LDFLAGS_SAVED
+
+# Check for the setproctitle module
+if test "$setproctitle_check" = "yes" ; then
+ AC_MSG_CHECKING(for setproctitle module)
+ if "$PYTHON" -c 'import setproctitle' 2>/dev/null ; then
+ AC_MSG_RESULT(ok)
+ else
+ AC_MSG_RESULT(missing)
+ AC_MSG_ERROR([Missing setproctitle module. Either install it or provide --disable-setproctitle-check.
+In that case we will continue, but naming of python processes will not work.])
+ fi
+fi
# TODO: check for _sqlite3.py module
@@ -451,6 +469,7 @@
src/bin/zonemgr/Makefile
src/bin/zonemgr/tests/Makefile
src/bin/usermgr/Makefile
+ src/bin/tests/Makefile
src/lib/Makefile
src/lib/bench/Makefile
src/lib/bench/example/Makefile
@@ -459,6 +478,8 @@
src/lib/cc/tests/Makefile
src/lib/python/Makefile
src/lib/python/isc/Makefile
+ src/lib/python/isc/utils/Makefile
+ src/lib/python/isc/utils/tests/Makefile
src/lib/python/isc/datasrc/Makefile
src/lib/python/isc/cc/Makefile
src/lib/python/isc/cc/tests/Makefile
@@ -473,6 +494,7 @@
src/lib/config/testdata/Makefile
src/lib/dns/Makefile
src/lib/dns/tests/Makefile
+ src/lib/dns/tests/testdata/Makefile
src/lib/dns/python/Makefile
src/lib/dns/python/tests/Makefile
src/lib/exceptions/Makefile
@@ -516,6 +538,7 @@
src/bin/msgq/run_msgq.sh
src/bin/auth/auth.spec.pre
src/bin/auth/spec_config.h.pre
+ src/bin/tests/process_rename_test.py
src/lib/config/tests/data_def_unittests_config.h
src/lib/python/isc/config/tests/config_test
src/lib/python/isc/cc/tests/cc_test
Modified: branches/trac351/src/bin/Makefile.am
==============================================================================
--- branches/trac351/src/bin/Makefile.am (original)
+++ branches/trac351/src/bin/Makefile.am Wed Sep 29 01:12:16 2010
@@ -1,1 +1,4 @@
-SUBDIRS = bind10 bindctl cfgmgr loadzone msgq host cmdctl auth xfrin xfrout usermgr zonemgr
+SUBDIRS = bind10 bindctl cfgmgr loadzone msgq host cmdctl auth xfrin xfrout \
+ usermgr zonemgr tests
+
+check-recursive: all-recursive
Modified: branches/trac351/src/bin/auth/auth_srv.cc
==============================================================================
--- branches/trac351/src/bin/auth/auth_srv.cc (original)
+++ branches/trac351/src/bin/auth/auth_srv.cc Wed Sep 29 01:12:16 2010
@@ -24,6 +24,7 @@
#include <exceptions/exceptions.h>
#include <dns/buffer.h>
+#include <dns/edns.h>
#include <dns/exceptions.h>
#include <dns/messagerenderer.h>
#include <dns/name.h>
@@ -166,7 +167,6 @@
message.setQid(qid);
message.setOpcode(opcode);
message.setHeaderFlag(MessageFlag::QR());
- message.setUDPSize(AuthSrvImpl::DEFAULT_LOCAL_UDPSIZE);
if (rd) {
message.setHeaderFlag(MessageFlag::RD());
}
@@ -304,14 +304,21 @@
AuthSrvImpl::processNormalQuery(const IOMessage& io_message, Message& message,
MessageRenderer& response_renderer)
{
- const bool dnssec_ok = message.isDNSSECSupported();
- const uint16_t remote_bufsize = message.getUDPSize();
+ ConstEDNSPtr remote_edns = message.getEDNS();
+ const bool dnssec_ok = remote_edns && remote_edns->getDNSSECAwareness();
+ const uint16_t remote_bufsize = remote_edns ? remote_edns->getUDPSize() :
+ Message::DEFAULT_MAX_UDPSIZE;
message.makeResponse();
message.setHeaderFlag(MessageFlag::AA());
message.setRcode(Rcode::NOERROR());
- message.setDNSSECSupported(dnssec_ok);
- message.setUDPSize(AuthSrvImpl::DEFAULT_LOCAL_UDPSIZE);
+
+ if (remote_edns) {
+ EDNSPtr local_edns = EDNSPtr(new EDNS());
+ local_edns->setDNSSECAwareness(dnssec_ok);
+ local_edns->setUDPSize(AuthSrvImpl::DEFAULT_LOCAL_UDPSIZE);
+ message.setEDNS(local_edns);
+ }
try {
Query query(message, cache_, dnssec_ok);
Modified: branches/trac351/src/bin/auth/tests/auth_srv_unittest.cc
==============================================================================
--- branches/trac351/src/bin/auth/tests/auth_srv_unittest.cc (original)
+++ branches/trac351/src/bin/auth/tests/auth_srv_unittest.cc Wed Sep 29 01:12:16 2010
@@ -448,13 +448,20 @@
EXPECT_EQ(true, server.processMessage(*io_message, parse_message,
response_renderer));
- // The response must have an EDNS OPT RR in the additional section.
+ // The response must have an EDNS OPT RR in the additional section, but
+ // it will be added automatically at the render time.
// Note that the DNSSEC DO bit is cleared even if this bit in the query
// is set. This is a limitation of the current implementation.
headerCheck(parse_message, default_qid, Rcode::BADVERS(), opcode.getCode(),
QR_FLAG, 1, 0, 0, 1);
- EXPECT_EQ(4096, parse_message.getUDPSize());
- EXPECT_FALSE(parse_message.isDNSSECSupported());
+ EXPECT_FALSE(parse_message.getEDNS()); // EDNS isn't added at this point
+
+ parse_message.clear(Message::PARSE);
+ InputBuffer ib(response_renderer.getData(), response_renderer.getLength());
+ parse_message.fromWire(ib);
+ EXPECT_EQ(Rcode::BADVERS(), parse_message.getRcode());
+ EXPECT_TRUE(parse_message.getEDNS());
+ EXPECT_FALSE(parse_message.getEDNS()->getDNSSECAwareness());
}
TEST_F(AuthSrvTest, AXFROverUDP) {
Modified: branches/trac351/src/bin/bind10/bind10.8
==============================================================================
--- branches/trac351/src/bin/bind10/bind10.8 (original)
+++ branches/trac351/src/bin/bind10/bind10.8 Wed Sep 29 01:12:16 2010
@@ -1,13 +1,22 @@
'\" t
.\" Title: bind10
.\" Author: [see the "AUTHORS" section]
-.\" Generator: DocBook XSL Stylesheets v1.75.2 <http://docbook.sf.net/>
+.\" Generator: DocBook XSL Stylesheets v1.76.0 <http://docbook.sf.net/>
.\" Date: July 29, 2010
.\" Manual: BIND10
.\" Source: BIND10
.\" Language: English
.\"
.TH "BIND10" "8" "July 29, 2010" "BIND10" "BIND10"
+.\" -----------------------------------------------------------------
+.\" * Define some portability stuff
+.\" -----------------------------------------------------------------
+.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.\" http://bugs.debian.org/507673
+.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
+.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
@@ -22,7 +31,7 @@
bind10 \- BIND 10 boss process
.SH "SYNOPSIS"
.HP \w'\fBbind10\fR\ 'u
-\fBbind10\fR [\fB\-a\ \fR\fB\fIaddress\fR\fR] [\fB\-m\ \fR\fB\fIfile\fR\fR] [\fB\-n\fR] [\fB\-p\ \fR\fB\fInumber\fR\fR] [\fB\-u\ \fR\fB\fIuser\fR\fR] [\fB\-v\fR] [\fB\-\-address\ \fR\fB\fIaddress\fR\fR] [\fB\-\-msgq\-socket\-file\ \fR\fB\fIfile\fR\fR] [\fB\-\-no\-cache\fR] [\fB\-\-port\ \fR\fB\fInumber\fR\fR] [\fB\-\-user\ \fR\fB\fIuser\fR\fR] [\fB\-\-verbose\fR]
+\fBbind10\fR [\fB\-a\ \fR\fB\fIaddress\fR\fR] [\fB\-m\ \fR\fB\fIfile\fR\fR] [\fB\-n\fR] [\fB\-p\ \fR\fB\fInumber\fR\fR] [\fB\-u\ \fR\fB\fIuser\fR\fR] [\fB\-v\fR] [\fB\-\-address\ \fR\fB\fIaddress\fR\fR] [\fB\-\-msgq\-socket\-file\ \fR\fB\fIfile\fR\fR] [\fB\-\-no\-cache\fR] [\fB\-\-port\ \fR\fB\fInumber\fR\fR] [\fB\-\-user\ \fR\fB\fIuser\fR\fR] [\fB\-\-pretty\-name\ \fR\fB\fIname\fR\fR] [\fB\-\-verbose\fR]
.SH "DESCRIPTION"
.PP
The
@@ -86,6 +95,15 @@
must be initially ran as the root user to use this option\&. The default is to run as the current user\&.
.RE
.PP
+\fB\-\-pretty\-name \fR\fB\fIname\fR\fR
+.RS 4
+The name this process should have in tools like
+\fBps\fR
+or
+\fBtop\fR\&. This is handy if you have multiple versions/installations of
+\fBbind10\fR\&.
+.RE
+.PP
\fB\-v\fR, \fB\-\-verbose\fR
.RS 4
Display more about what is going on for
Modified: branches/trac351/src/bin/bind10/bind10.py.in
==============================================================================
--- branches/trac351/src/bin/bind10/bind10.py.in (original)
+++ branches/trac351/src/bin/bind10/bind10.py.in Wed Sep 29 01:12:16 2010
@@ -63,6 +63,10 @@
import posix
import isc.cc
+import isc.utils.process
+
+# Assign this process some longer name
+isc.utils.process.rename(sys.argv[0])
# This is the version that gets displayed to the user.
# The VERSION string consists of the module name, the module version
@@ -620,7 +624,11 @@
parser.values.address = value
else:
raise OptionValueError("Unknown option " + opt_str)
-
+
+def process_rename(option, opt_str, value, parser):
+ """Function that renames the process if it is requested by a option."""
+ isc.utils.process.rename(value)
+
def main():
global options
global boss_of_bind
@@ -646,6 +654,9 @@
help="Change user after startup (must run as root)")
parser.add_option("-v", "--verbose", dest="verbose", action="store_true",
help="display more about what is going on")
+ parser.add_option("--pretty-name", type="string", action="callback",
+ callback=process_rename,
+ help="Set the process name (displayed in ps, top, ...)")
(options, args) = parser.parse_args()
if args:
parser.print_help()
Modified: branches/trac351/src/bin/bind10/bind10.xml
==============================================================================
--- branches/trac351/src/bin/bind10/bind10.xml (original)
+++ branches/trac351/src/bin/bind10/bind10.xml Wed Sep 29 01:12:16 2010
@@ -56,6 +56,7 @@
<arg><option>--no-cache</option></arg>
<arg><option>--port <replaceable>number</replaceable></option></arg>
<arg><option>--user <replaceable>user</replaceable></option></arg>
+ <arg><option>--pretty-name <replaceable>name</replaceable></option></arg>
<arg><option>--verbose</option></arg>
</cmdsynopsis>
</refsynopsisdiv>
@@ -149,6 +150,17 @@
</varlistentry>
<varlistentry>
+ <term><option>--pretty-name <replaceable>name</replaceable></option></term>
+
+ <listitem>
+ <para>The name this process should have in tools like
+ <command>ps</command> or <command>top</command>. This
+ is handy if you have multiple versions/installations
+ of <command>bind10</command>.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><option>-v</option>, <option>--verbose</option></term>
<listitem>
<para>Display more about what is going on for
Modified: branches/trac351/src/bin/bind10/tests/args_test.py
==============================================================================
--- branches/trac351/src/bin/bind10/tests/args_test.py (original)
+++ branches/trac351/src/bin/bind10/tests/args_test.py Wed Sep 29 01:12:16 2010
@@ -130,5 +130,28 @@
x = bob.wait()
self.assertTrue(bob.wait() == 0)
+ def testPrettyName(self):
+ """Try the --pretty-name option."""
+ CMD_PRETTY_NAME = b'bob-name-test'
+ bob = subprocess.Popen(args=(BIND10_EXE, '--pretty-name',
+ CMD_PRETTY_NAME), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ started_ok = self._waitForString(bob, '[bind10] BIND 10 started')
+ self.assertTrue(started_ok)
+ ps = subprocess.Popen(args=("ps", "axo", "pid,comm"),
+ stdout=subprocess.PIPE)
+ s = ps.stdout.readline()
+ command = None
+ while True:
+ s = ps.stdout.readline()
+ if s == '': break
+ (pid,comm) = s.split(None, 1)
+ if int(pid) == bob.pid:
+ command = comm
+ break
+ self.assertEqual(command, CMD_PRETTY_NAME + b'\n')
+ time.sleep(0.1)
+ bob.terminate()
+ bob.wait()
+
if __name__ == '__main__':
unittest.main()
Modified: branches/trac351/src/bin/bindctl/bindctl-source.py.in
==============================================================================
--- branches/trac351/src/bin/bindctl/bindctl-source.py.in (original)
+++ branches/trac351/src/bin/bindctl/bindctl-source.py.in Wed Sep 29 01:12:16 2010
@@ -24,6 +24,9 @@
from bindctl.bindcmd import *
import pprint
from optparse import OptionParser, OptionValueError
+import isc.utils.process
+
+isc.utils.process.rename()
__version__ = 'Bindctl'
Modified: branches/trac351/src/bin/cfgmgr/b10-cfgmgr.py.in
==============================================================================
--- branches/trac351/src/bin/cfgmgr/b10-cfgmgr.py.in (original)
+++ branches/trac351/src/bin/cfgmgr/b10-cfgmgr.py.in Wed Sep 29 01:12:16 2010
@@ -21,8 +21,11 @@
from isc.config.cfgmgr import ConfigManager, ConfigManagerDataReadError
from isc.cc import SessionError
+import isc.utils.process
import signal
import os
+
+isc.utils.process.rename()
# If B10_FROM_SOURCE is set in the environment, we use data files
# from a directory relative to that, otherwise we use the ones
Modified: branches/trac351/src/bin/cmdctl/cmdctl.py.in
==============================================================================
--- branches/trac351/src/bin/cmdctl/cmdctl.py.in (original)
+++ branches/trac351/src/bin/cmdctl/cmdctl.py.in Wed Sep 29 01:12:16 2010
@@ -42,12 +42,15 @@
import time
import signal
from isc.config import ccsession
+import isc.utils.process
from optparse import OptionParser, OptionValueError
from hashlib import sha1
try:
import threading
except ImportError:
import dummy_threading as threading
+
+isc.utils.process.rename()
__version__ = 'BIND10'
URL_PATTERN = re.compile('/([\w]+)(?:/([\w]+))?/?')
Modified: branches/trac351/src/bin/loadzone/b10-loadzone.py.in
==============================================================================
--- branches/trac351/src/bin/loadzone/b10-loadzone.py.in (original)
+++ branches/trac351/src/bin/loadzone/b10-loadzone.py.in Wed Sep 29 01:12:16 2010
@@ -18,9 +18,13 @@
import sys; sys.path.append ('@@PYTHONPATH@@')
import re, getopt
import isc.datasrc
+import isc.utils.process
from isc.datasrc.master import MasterFile
import time
import os
+
+isc.utils.process.rename()
+
#########################################################################
# usage: print usage note and exit
#########################################################################
Modified: branches/trac351/src/bin/msgq/msgq.py.in
==============================================================================
--- branches/trac351/src/bin/msgq/msgq.py.in (original)
+++ branches/trac351/src/bin/msgq/msgq.py.in Wed Sep 29 01:12:16 2010
@@ -31,8 +31,11 @@
import pprint
import random
from optparse import OptionParser, OptionValueError
+import isc.utils.process
import isc.cc
+
+isc.utils.process.rename()
# This is the version that gets displayed to the user.
__version__ = "v20091030 (Paving the DNS Parking Lot)"
Modified: branches/trac351/src/bin/usermgr/b10-cmdctl-usermgr.py.in
==============================================================================
--- branches/trac351/src/bin/usermgr/b10-cmdctl-usermgr.py.in (original)
+++ branches/trac351/src/bin/usermgr/b10-cmdctl-usermgr.py.in Wed Sep 29 01:12:16 2010
@@ -25,6 +25,9 @@
import getpass
import getopt
import sys
+import isc.utils.process
+
+isc.utils.process.rename()
VERSION_NUMBER = 'bind10'
DEFAULT_FILE = 'cmdctl-accounts.csv'
Modified: branches/trac351/src/bin/xfrin/xfrin.py.in
==============================================================================
--- branches/trac351/src/bin/xfrin/xfrin.py.in (original)
+++ branches/trac351/src/bin/xfrin/xfrin.py.in Wed Sep 29 01:12:16 2010
@@ -29,12 +29,15 @@
from optparse import OptionParser, OptionValueError
from isc.config.ccsession import *
from isc.notify import notify_out
+import isc.utils.process
try:
from pydnspp import *
except ImportError as e:
# C++ loadable module may not be installed; even so the xfrin process
# must keep running, so we warn about it and move forward.
sys.stderr.write('[b10-xfrin] failed to import DNS module: %s\n' % str(e))
+
+isc.utils.process.rename()
# If B10_FROM_BUILD is set in the environment, we use data files
# from a directory relative to that, otherwise we use the ones
Modified: branches/trac351/src/bin/xfrout/xfrout.py.in
==============================================================================
--- branches/trac351/src/bin/xfrout/xfrout.py.in (original)
+++ branches/trac351/src/bin/xfrout/xfrout.py.in Wed Sep 29 01:12:16 2010
@@ -29,6 +29,7 @@
from isc.log.log import *
from isc.cc import SessionError, SessionTimeout
from isc.notify import notify_out
+import isc.utils.process
import socket
import select
import errno
@@ -40,6 +41,8 @@
# 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))
+
+isc.utils.process.rename()
if "B10_FROM_BUILD" in os.environ:
SPECFILE_PATH = os.environ["B10_FROM_BUILD"] + "/src/bin/xfrout"
Modified: branches/trac351/src/bin/zonemgr/zonemgr.py.in
==============================================================================
--- branches/trac351/src/bin/zonemgr/zonemgr.py.in (original)
+++ branches/trac351/src/bin/zonemgr/zonemgr.py.in Wed Sep 29 01:12:16 2010
@@ -36,6 +36,9 @@
from isc.datasrc import sqlite3_ds
from optparse import OptionParser, OptionValueError
from isc.config.ccsession import *
+import isc.utils.process
+
+isc.utils.process.rename()
# If B10_FROM_BUILD is set in the environment, we use data files
# from a directory relative to that, otherwise we use the ones
@@ -261,7 +264,7 @@
try:
self._cc.group_sendmsg(msg, module_name)
except socket.error:
- sys.err.write("[b10-zonemgr] Failed to send to module %s, the session has been closed." % module_name)
+ sys.stderr.write("[b10-zonemgr] Failed to send to module %s, the session has been closed." % module_name)
def _find_need_do_refresh_zone(self):
"""Find the first zone need do refresh, if no zone need
Modified: branches/trac351/src/lib/dns/Makefile.am
==============================================================================
--- branches/trac351/src/lib/dns/Makefile.am (original)
+++ branches/trac351/src/lib/dns/Makefile.am Wed Sep 29 01:12:16 2010
@@ -63,6 +63,7 @@
libdns___la_SOURCES += util/base16_from_binary.h util/binary_from_base16.h
libdns___la_SOURCES += buffer.h
libdns___la_SOURCES += dnssectime.h dnssectime.cc
+libdns___la_SOURCES += edns.h edns.cc
libdns___la_SOURCES += exceptions.h exceptions.cc
libdns___la_SOURCES += util/hex.h
libdns___la_SOURCES += message.h message.cc
Modified: branches/trac351/src/lib/dns/message.cc
==============================================================================
--- branches/trac351/src/lib/dns/message.cc (original)
+++ branches/trac351/src/lib/dns/message.cc Wed Sep 29 01:12:16 2010
@@ -28,6 +28,7 @@
#include <exceptions/exceptions.h>
#include <dns/buffer.h>
+#include <dns/edns.h>
#include <dns/exceptions.h>
#include <dns/message.h>
#include <dns/messagerenderer.h>
@@ -63,14 +64,6 @@
const flags_t FLAG_AD = 0x0020;
const flags_t FLAG_CD = 0x0010;
-//
-// EDNS related constants (THESE SHOULD BE REMOVED ON MERGE)
-//
-const uint32_t EXTRCODE_MASK = 0xff000000;
-const flags_t EXTFLAG_MASK = 0xffff;
-const flags_t EXTFLAG_DO = 0x8000;
-const uint32_t EDNSVERSION_MASK = 0x00ff0000;
-
const unsigned int OPCODE_MASK = 0x7800;
const unsigned int OPCODE_SHIFT = 11;
const unsigned int RCODE_MASK = 0x000f;
@@ -113,17 +106,13 @@
Opcode opcode_placeholder_;
flags_t flags_;
- bool dnssec_ok_;
bool header_parsed_;
static const unsigned int SECTION_MAX = 4; // TODO: revisit this design
int counts_[SECTION_MAX]; // TODO: revisit this definition
vector<QuestionPtr> questions_;
vector<RRsetPtr> rrsets_[SECTION_MAX];
- RRsetPtr remote_edns_;
- uint16_t remote_udpsize_;
- RRsetPtr local_edns_;
- uint16_t udpsize_;
+ ConstEDNSPtr edns_;
#ifdef notyet
// tsig/sig0: TODO
@@ -151,11 +140,7 @@
qid_ = 0;
rcode_ = NULL;
opcode_ = NULL;
- dnssec_ok_ = false;
- remote_edns_ = RRsetPtr();
- remote_udpsize_ = Message::DEFAULT_MAX_UDPSIZE;
- local_edns_ = RRsetPtr();
- udpsize_ = Message::DEFAULT_MAX_UDPSIZE;
+ edns_ = EDNSPtr();
for (int i = 0; i < SECTION_MAX; ++i) {
counts_[i] = 0;
@@ -211,38 +196,6 @@
impl_->flags_ &= ~flag.getBit();
}
-bool
-Message::isDNSSECSupported() const {
- return (impl_->dnssec_ok_);
-}
-
-void
-Message::setDNSSECSupported(bool on) {
- if (impl_->mode_ != Message::RENDER) {
- isc_throw(InvalidMessageOperation,
- "setDNSSECSupported performed in non-render mode");
- }
- impl_->dnssec_ok_ = on;
-}
-
-uint16_t
-Message::getUDPSize() const {
- return (impl_->udpsize_);
-}
-
-void
-Message::setUDPSize(uint16_t size) {
- if (impl_->mode_ != Message::RENDER) {
- isc_throw(InvalidMessageOperation,
- "setUDPSize performed in non-render mode");
- }
- if (size < DEFAULT_MAX_UDPSIZE) {
- isc_throw(InvalidMessageUDPSize,
- "Specified UDP message size is too small");
- }
- impl_->udpsize_ = size;
-}
-
qid_t
Message::getQid() const {
return (impl_->qid_);
@@ -289,6 +242,20 @@
"setOpcode performed in non-render mode");
}
impl_->setOpcode(opcode);
+}
+
+ConstEDNSPtr
+Message::getEDNS() const {
+ return (impl_->edns_);
+}
+
+void
+Message::setEDNS(ConstEDNSPtr edns) {
+ if (impl_->mode_ != Message::RENDER) {
+ isc_throw(InvalidMessageOperation,
+ "setEDNS performed in non-render mode");
+ }
+ impl_->edns_ = edns;
}
unsigned int
@@ -373,55 +340,6 @@
};
}
-namespace {
-bool
-addEDNS(MessageImpl* mimpl, MessageRenderer& renderer) {
- const bool is_query = ((mimpl->flags_ & MessageFlag::QR().getBit()) == 0);
-
- // If this is a reply, add EDNS either when the request had it, or
- // if the Rcode is BADVERS, which is EDNS specific.
- // XXX: this logic is tricky. We should revisit this later.
- if (!is_query) {
- if (mimpl->remote_edns_ == NULL &&
- *mimpl->rcode_ != Rcode::BADVERS()) {
- return (false);
- }
- } else {
- // For queries, we add EDNS only when necessary:
- // Local UDP size is not the default value, or
- // DNSSEC DO bit is to be set, or
- // Extended Rcode is to be specified.
- if (mimpl->udpsize_ == Message::DEFAULT_MAX_UDPSIZE &&
- !mimpl->dnssec_ok_ &&
- mimpl->rcode_->getCode() < 0x10) {
- return (false);
- }
- }
-
- // If adding the OPT RR would exceed the size limit, don't do it.
- // 11 = len(".") + type(2byte) + class(2byte) + TTL(4byte) + RDLEN(2byte)
- // (RDATA is empty in this simple implementation)
- if (renderer.getLength() + 11 > renderer.getLengthLimit()) {
- return (false);
- }
-
- // Render EDNS OPT RR
- uint32_t extrcode_flags = ((mimpl->rcode_->getCode() & 0xff0) << 24);
- if (mimpl->dnssec_ok_) {
- extrcode_flags |= 0x8000; // set DO bit
- }
- mimpl->local_edns_ = RRsetPtr(new RRset(Name::ROOT_NAME(),
- RRClass(mimpl->udpsize_),
- RRType::OPT(),
- RRTTL(extrcode_flags)));
- // We don't support any options in this simple implementation
- mimpl->local_edns_->addRdata(ConstRdataPtr(new generic::OPT()));
- mimpl->local_edns_->toWire(renderer);
-
- return (true);
-}
-}
-
void
Message::toWire(MessageRenderer& renderer) {
if (impl_->mode_ != Message::RENDER) {
@@ -469,12 +387,20 @@
RenderSection<RRsetPtr>(renderer, false)).getTotalCount();
}
- // Added EDNS OPT RR if necessary (we want to avoid hardcoding specialized
- // logic, see the parser case)
- if (!renderer.isTruncated() && addEDNS(this->impl_, renderer)) {
- ++arcount;
- }
-
+ // Add EDNS OPT RR if necessary. Basically, we add it only when EDNS
+ // has been explicitly set. However, if the RCODE would require it and
+ // no EDNS has been set we generate a temporary local EDNS and use it.
+ if (!renderer.isTruncated()) {
+ ConstEDNSPtr local_edns = impl_->edns_;
+ if (!local_edns && impl_->rcode_->getExtendedCode() != 0) {
+ local_edns = ConstEDNSPtr(new EDNS());
+ }
+ if (local_edns) {
+ arcount += local_edns->toWire(renderer,
+ impl_->rcode_->getExtendedCode());
+ }
+ }
+
// Adjust the counter buffer.
// XXX: these may not be equal to the number of corresponding entries
// in rrsets_[] or questions_ if truncation occurred or an EDNS OPT RR
@@ -598,6 +524,34 @@
};
}
+// Note about design decision:
+// we need some type specific processing here, including EDNS and TSIG.
+// how much we should generalize/hardcode the special logic is subject
+// to discussion. In terms of modularity it would be ideal to introduce
+// an abstract class (say "MessageAttribute") and let other such
+// concrete notions as EDNS or TSIG inherit from it. Then we would
+// just do:
+// message->addAttribute(rrtype, rrclass, buffer);
+// to create and attach type-specific concrete object to the message.
+//
+// A major downside of this approach is, as usual, complexity due to
+// indirection and performance penalty. Also, it may not be so easy
+// to separate the processing logic because in many cases we'll need
+// parse context for which the message class is responsible (e.g.
+// to check the EDNS OPT RR only appears in the additional section,
+// and appears only once).
+//
+// Another point to consider is that we may not need so many special
+// types other than EDNS and TSIG (and when and if we implement it,
+// SIG(0)); newer optional attributes of the message would more likely
+// be standardized as new flags or options of EDNS. If that's the case,
+// introducing an abstract class with all the overhead and complexity
+// may not make much sense.
+//
+// Conclusion: don't over-generalize type-specific logic for now.
+// introduce separate concrete classes, and move context-independent
+// logic to that class; processing logic dependent on parse context
+// is hardcoded here.
int
MessageImpl::parseSection(const Section& section, InputBuffer& buffer) {
unsigned int added = 0;
@@ -619,60 +573,36 @@
const size_t rdlen = buffer.readUint16();
ConstRdataPtr rdata = createRdata(rrtype, rrclass, buffer, rdlen);
- // XXX: we wanted to avoid hardcoding type-specific logic here,
- // but this would be the fastest way for a proof-of-concept
- // implementation. We'll revisit this part later.
if (rrtype == RRType::OPT()) {
if (section != Section::ADDITIONAL()) {
isc_throw(DNSMessageFORMERR,
"EDNS OPT RR found in an invalid section");
}
- if (remote_edns_ != NULL) {
+ if (edns_) {
isc_throw(DNSMessageFORMERR, "multiple EDNS OPT RR found");
}
- if (((ttl.getValue() & EDNSVERSION_MASK) >> 16) >
- Message::EDNS_SUPPORTED_VERSION) {
- // XXX: we should probably not reject the message yet, because
- // it's better to let the requestor know the responder-side
- // highest version as indicated in Section 4.6 of RFC2671.
- // This is probably because why BIND 9 does the version check
- // in the client code.
- // This is a TODO item. Right now we simply reject it.
- const unsigned int ver =
- (ttl.getValue() & EDNSVERSION_MASK) >> 16;
- isc_throw(DNSMessageBADVERS, "unsupported EDNS version: " <<
- ver);
+
+ uint8_t extended_rcode;
+ edns_ = ConstEDNSPtr(createEDNSFromRR(name, rrclass, rrtype, ttl,
+ *rdata, extended_rcode));
+ setRcode(Rcode(rcode_->getCode(), extended_rcode));
+ continue;
+ } else {
+ vector<RRsetPtr>::iterator it =
+ find_if(rrsets_[sectionCodeToId(section)].begin(),
+ rrsets_[sectionCodeToId(section)].end(),
+ MatchRR(name, rrtype, rrclass));
+ if (it != rrsets_[sectionCodeToId(section)].end()) {
+ (*it)->setTTL(min((*it)->getTTL(), ttl));
+ (*it)->addRdata(rdata);
+ } else {
+ RRsetPtr rrset =
+ RRsetPtr(new RRset(name, rrclass, rrtype, ttl));
+ rrset->addRdata(rdata);
+ rrsets_[sectionCodeToId(section)].push_back(rrset);
}
- if (name != Name::ROOT_NAME()) {
- isc_throw(DNSMessageFORMERR,
- "invalid owner name for EDNS OPT RR");
- }
-
- remote_edns_ = RRsetPtr(new RRset(name, rrclass, rrtype, ttl));
- remote_edns_->addRdata(rdata);
-
- dnssec_ok_ = (((ttl.getValue() & EXTFLAG_MASK) & EXTFLAG_DO) != 0);
- if (rrclass.getCode() > Message::DEFAULT_MAX_UDPSIZE) {
- udpsize_ = rrclass.getCode();
- }
- setRcode(Rcode(((ttl.getValue() & EXTRCODE_MASK) >> 20) |
- rcode_->getCode()));
- continue;
+ ++added;
}
-
- vector<RRsetPtr>::iterator it =
- find_if(rrsets_[sectionCodeToId(section)].begin(),
- rrsets_[sectionCodeToId(section)].end(),
- MatchRR(name, rrtype, rrclass));
- if (it != rrsets_[sectionCodeToId(section)].end()) {
- (*it)->setTTL(min((*it)->getTTL(), ttl));
- (*it)->addRdata(rdata);
- } else {
- RRsetPtr rrset = RRsetPtr(new RRset(name, rrclass, rrtype, ttl));
- rrset->addRdata(rdata);
- rrsets_[sectionCodeToId(section)].push_back(rrset);
- }
- ++added;
}
return (added);
@@ -736,30 +666,14 @@
lexical_cast<string>(impl_->counts_[Section::AUTHORITY().getCode()]);
unsigned int arcount = impl_->counts_[Section::ADDITIONAL().getCode()];
- RRsetPtr edns_rrset;
- if (!getHeaderFlag(MessageFlag::QR()) && impl_->remote_edns_ != NULL) {
- edns_rrset = impl_->remote_edns_;
+ if (impl_->edns_ != NULL) {
++arcount;
}
s += ", ADDITIONAL: " + lexical_cast<string>(arcount) + "\n";
- if (edns_rrset != NULL) {
+ if (impl_->edns_ != NULL) {
s += "\n;; OPT PSEUDOSECTION:\n";
- s += "; EDNS: version: ";
- s += lexical_cast<string>(
- (edns_rrset->getTTL().getValue() & 0x00ff0000) >> 16);
- s += ", flags:";
- if ((edns_rrset->getTTL().getValue() & 0x8000) != 0) {
- s += " do";
- }
- const uint32_t mbz = edns_rrset->getTTL().getValue() & ~0x8000 & 0xffff;
- if (mbz != 0) {
- s += "; MBZ: " + lexical_cast<string>(mbz) + ", udp: ";
- } else {
- s += "; udp: " +
- lexical_cast<string>(edns_rrset->getClass().getCode());
- }
- s += "\n";
+ s += impl_->edns_->toText();
}
if (!impl_->questions_.empty()) {
@@ -810,11 +724,7 @@
impl_->mode_ = Message::RENDER;
- impl_->dnssec_ok_ = false;
- impl_->remote_udpsize_ = impl_->udpsize_;
- impl_->local_edns_ = RRsetPtr();
- impl_->udpsize_ = DEFAULT_MAX_UDPSIZE;
-
+ impl_->edns_ = EDNSPtr();
impl_->flags_ &= MESSAGE_REPLYPRESERVE;
setHeaderFlag(MessageFlag::QR());
Modified: branches/trac351/src/lib/dns/message.h
==============================================================================
--- branches/trac351/src/lib/dns/message.h (original)
+++ branches/trac351/src/lib/dns/message.h Wed Sep 29 01:12:16 2010
@@ -25,6 +25,7 @@
#include <exceptions/exceptions.h>
+#include <dns/edns.h>
#include <dns/question.h>
#include <dns/rrset.h>
@@ -325,45 +326,6 @@
/// \c setHeaderFlag() with an additional argument.
void clearHeaderFlag(const MessageFlag& flag);
- /// \brief Return whether the message sender indicates DNSSEC is supported.
- /// If EDNS is included, this corresponds to the value of the DO bit.
- /// Otherwise, DNSSEC is considered not supported.
- bool isDNSSECSupported() const;
-
- /// \brief Specify whether DNSSEC is supported in the message.
- ///
- /// Only allowed in the \c RENDER mode.
- /// If EDNS is included in the message, the DO bit is set or cleared
- /// according to the specified value of this method.
- void setDNSSECSupported(bool on);
-
- /// \brief Return the maximum buffer size of UDP messages for the sender
- /// of the message.
- ///
- /// The semantics of this value is different based on the mode:
- /// In the \c PARSE mode, it means the buffer size of the remote node;
- /// in the \c RENDER mode, it means the buffer size of the local node.
- ///
- /// In either case, its value is the value of the UDP payload size field
- /// of EDNS (when it's included) or \c DEFAULT_MAX_UDPSIZE.
- ///
- /// Note: this interface may be confusing and may have to be revisited.
- uint16_t getUDPSize() const;
-
- /// \brief Specify the maximum buffer size of UDP messages of the local
- /// node.
- ///
- /// Only allowed in the \c RENDER mode.
- /// If EDNS OPT RR is included in the message, its UDP payload size field
- /// will be set to the specified value.
- ///
- /// Unless explicitly specified, \c DEFAULT_MAX_UDPSIZE will be assumed
- /// for the maximum buffer size, regardless of whether EDNS OPT RR is
- /// included or not. This means if an application wants to send a message
- /// with an EDNS OPT RR for specifying a larger UDP size, it must explicitly
- /// specify the value using this method.
- void setUDPSize(uint16_t size);
-
/// \brief Return the query ID given in the header section of the message.
qid_t getQid() const;
@@ -385,9 +347,10 @@
/// \c InvalidMessageOperation will be thrown.
const Rcode& getRcode() const;
- /// \brief Return the Response Code of the message.
- ///
- /// Only allowed in the \c RENDER mode.
+ /// \brief Set the Response Code of the message.
+ ///
+ /// Only allowed in the \c RENDER mode.
+ ///
/// If the specified code is an EDNS extended RCODE, an EDNS OPT RR will be
/// included in the message.
void setRcode(const Rcode& rcode);
@@ -404,6 +367,23 @@
///
/// Only allowed in the \c RENDER mode.
void setOpcode(const Opcode& opcode);
+
+ /// \brief Return, if any, the EDNS associated with the message.
+ ///
+ /// This method never throws an exception.
+ ///
+ /// \return A shared pointer to the EDNS. This will be a null shared
+ /// pointer if the message is not associated with EDNS.
+ ConstEDNSPtr getEDNS() const;
+
+ /// \brief Set EDNS for the message.
+ ///
+ /// Only allowed in the \c RENDER mode; otherwise an exception of class
+ /// \c InvalidMessageOperation will be thrown.
+ ///
+ /// \param edns A shared pointer to an \c EDNS object to be set in
+ /// \c Message.
+ void setEDNS(ConstEDNSPtr edns);
/// \brief Returns the number of RRs contained in the given section.
unsigned int getRRCount(const Section& section) const;
Modified: branches/trac351/src/lib/dns/python/Makefile.am
==============================================================================
--- branches/trac351/src/lib/dns/python/Makefile.am (original)
+++ branches/trac351/src/lib/dns/python/Makefile.am Wed Sep 29 01:12:16 2010
@@ -11,6 +11,7 @@
# directly included from source files, so these don't have their own
# rules
EXTRA_DIST = pydnspp_common.h
+EXTRA_DIST += edns_python.cc
EXTRA_DIST += messagerenderer_python.cc
EXTRA_DIST += message_python.cc
EXTRA_DIST += rrclass_python.cc
Modified: branches/trac351/src/lib/dns/python/message_python.cc
==============================================================================
--- branches/trac351/src/lib/dns/python/message_python.cc (original)
+++ branches/trac351/src/lib/dns/python/message_python.cc Wed Sep 29 01:12:16 2010
@@ -26,7 +26,6 @@
static PyObject* po_InvalidMessageSection;
static PyObject* po_InvalidMessageOperation;
static PyObject* po_InvalidMessageUDPSize;
-static PyObject* po_DNSMessageBADVERS;
//
// Definition of the classes
@@ -120,7 +119,6 @@
0 // tp_version_tag
};
-
static int
MessageFlag_init(s_MessageFlag* self UNUSED_PARAM,
PyObject* args UNUSED_PARAM)
@@ -394,16 +392,14 @@
static PyObject* Message_getHeaderFlag(s_Message* self, PyObject* args);
static PyObject* Message_setHeaderFlag(s_Message* self, PyObject* args);
static PyObject* Message_clearHeaderFlag(s_Message* self, PyObject* args);
-static PyObject* Message_isDNSSECSupported(s_Message* self);
-static PyObject* Message_setDNSSECSupported(s_Message* self, PyObject* args);
-static PyObject* Message_getUDPSize(s_Message* self);
-static PyObject* Message_setUDPSize(s_Message* self, PyObject* args);
static PyObject* Message_getQid(s_Message* self);
static PyObject* Message_setQid(s_Message* self, PyObject* args);
static PyObject* Message_getRcode(s_Message* self);
static PyObject* Message_setRcode(s_Message* self, PyObject* args);
static PyObject* Message_getOpcode(s_Message* self);
static PyObject* Message_setOpcode(s_Message* self, PyObject* args);
+static PyObject* Message_getEDNS(s_Message* self);
+static PyObject* Message_setEDNS(s_Message* self, PyObject* args);
static PyObject* Message_getRRCount(s_Message* self, PyObject* args);
// use direct iterators for these? (or simply lists for now?)
static PyObject* Message_getQuestion(s_Message* self);
@@ -440,35 +436,6 @@
"Sets the specified header flag bit to 0. The message must be in "
"RENDER mode. If not, an InvalidMessageOperation is raised. "
"Takes a MessageFlag object as the only argument." },
- { "is_dnssec_supported", reinterpret_cast<PyCFunction>(Message_isDNSSECSupported), METH_NOARGS,
- "Returns True if the message sender indicates DNSSEC is supported. "
- "If EDNS is included, this corresponds to the value of the DO bit. "
- "Otherwise, DNSSEC is considered not supported." },
- { "set_dnssec_supported", reinterpret_cast<PyCFunction>(Message_setDNSSECSupported), METH_VARARGS,
- "Specify whether DNSSEC is supported in the message. "
- "The message must be in RENDER mode. If not, an "
- "InvalidMessageOperation is raised."
- "If EDNS is included in the message, the DO bit is set or cleared "
- "according to given argument (True or False) of this method."},
- { "get_udp_size", reinterpret_cast<PyCFunction>(Message_getUDPSize), METH_NOARGS,
- "Return the maximum buffer size of UDP messages for the sender "
- "of the message.\n\n"
- "The semantics of this value is different based on the mode:\n"
- "In the PARSE mode, it means the buffer size of the remote node;\n"
- "in the RENDER mode, it means the buffer size of the local node.\n\n"
- "In either case, its value is the value of the UDP payload size field "
- "of EDNS (when it's included) or DEFAULT_MAX_UDPSIZE." },
- { "set_udp_size", reinterpret_cast<PyCFunction>(Message_setUDPSize), METH_VARARGS,
- "Specify the maximum buffer size of UDP messages of the local "
- "node. If the message is not in RENDER mode, an "
- "InvalidMessageOperation is raised.\n\n"
- "If EDNS OPT RR is included in the message, its UDP payload size field "
- "will be set to the specified value.\n"
- "Unless explicitly specified, DEFAULT_MAX_UDPSIZE will be assumed "
- "for the maximum buffer size, regardless of whether EDNS OPT RR is "
- "included or not. This means if an application wants to send a message "
- "with an EDNS OPT RR for specifying a larger UDP size, it must explicitly "
- "specify the value using this method. "},
{ "get_qid", reinterpret_cast<PyCFunction>(Message_getQid), METH_NOARGS,
"Returns the query id" },
{ "set_qid", reinterpret_cast<PyCFunction>(Message_setQid), METH_VARARGS,
@@ -487,6 +454,12 @@
"Sets the message opcode (an Opcode object).\n"
"If the message is not in RENDER mode, an "
"InvalidMessageOperation is raised."},
+ { "get_edns", reinterpret_cast<PyCFunction>(Message_getEDNS), METH_NOARGS,
+ "Return, if any, the EDNS associated with the message."
+ },
+ { "set_edns", reinterpret_cast<PyCFunction>(Message_setEDNS), METH_VARARGS,
+ "Set EDNS for the message."
+ },
{ "get_rr_count", reinterpret_cast<PyCFunction>(Message_getRRCount), METH_VARARGS,
"Returns the number of RRs contained in the given section." },
{ "get_question", reinterpret_cast<PyCFunction>(Message_getQuestion), METH_NOARGS,
@@ -669,57 +642,6 @@
}
static PyObject*
-Message_isDNSSECSupported(s_Message* self) {
- if (self->message->isDNSSECSupported()) {
- Py_RETURN_TRUE;
- } else {
- Py_RETURN_FALSE;
- }
-}
-
-static PyObject*
-Message_setDNSSECSupported(s_Message* self, PyObject* args) {
- PyObject *b;
- if (!PyArg_ParseTuple(args, "O!", &PyBool_Type, &b)) {
- return (NULL);
- }
- try {
- if (b == Py_True) {
- self->message->setDNSSECSupported(true);
- } else {
- self->message->setDNSSECSupported(false);
- }
- Py_RETURN_NONE;
- } catch (const InvalidMessageOperation& imo) {
- PyErr_SetString(po_InvalidMessageOperation, imo.what());
- return (NULL);
- }
-}
-
-static PyObject*
-Message_getUDPSize(s_Message* self) {
- return (Py_BuildValue("I", self->message->getUDPSize()));
-}
-
-static PyObject*
-Message_setUDPSize(s_Message* self, PyObject* args) {
- uint16_t size;
- if (!PyArg_ParseTuple(args, "H", &size)) {
- return (NULL);
- }
- try {
- self->message->setUDPSize(size);
- Py_RETURN_NONE;
- } catch (const InvalidMessageUDPSize& imus) {
- PyErr_SetString(po_InvalidMessageUDPSize, imus.what());
- return (NULL);
- } catch (const InvalidMessageOperation& imo) {
- PyErr_SetString(po_InvalidMessageOperation, imo.what());
- return (NULL);
- }
-}
-
-static PyObject*
Message_getQid(s_Message* self) {
return (Py_BuildValue("I", self->message->getQid()));
}
@@ -808,6 +730,41 @@
}
try {
self->message->setOpcode(*opcode->opcode);
+ Py_RETURN_NONE;
+ } catch (const InvalidMessageOperation& imo) {
+ PyErr_SetString(po_InvalidMessageOperation, imo.what());
+ return (NULL);
+ }
+}
+
+static PyObject*
+Message_getEDNS(s_Message* self) {
+ s_EDNS* edns;
+ EDNS* edns_body;
+ ConstEDNSPtr src = self->message->getEDNS();
+
+ if (!src) {
+ Py_RETURN_NONE;
+ }
+ if ((edns_body = new(nothrow) EDNS(*src)) == NULL) {
+ return (PyErr_NoMemory());
+ }
+ edns = static_cast<s_EDNS*>(opcode_type.tp_alloc(&edns_type, 0));
+ if (edns != NULL) {
+ edns->edns = edns_body;
+ }
+
+ return (edns);
+}
+
+static PyObject*
+Message_setEDNS(s_Message* self, PyObject* args) {
+ s_EDNS* edns;
+ if (!PyArg_ParseTuple(args, "O!", &edns_type, &edns)) {
+ return (NULL);
+ }
+ try {
+ self->message->setEDNS(EDNSPtr(new EDNS(*edns->edns)));
Py_RETURN_NONE;
} catch (const InvalidMessageOperation& imo) {
PyErr_SetString(po_InvalidMessageOperation, imo.what());
Modified: branches/trac351/src/lib/dns/python/messagerenderer_python.cc
==============================================================================
--- branches/trac351/src/lib/dns/python/messagerenderer_python.cc (original)
+++ branches/trac351/src/lib/dns/python/messagerenderer_python.cc Wed Sep 29 01:12:16 2010
@@ -42,7 +42,7 @@
// TODO: set/get compressmode
static PyObject* MessageRenderer_setTruncated(s_MessageRenderer* self);
static PyObject* MessageRenderer_setLengthLimit(s_MessageRenderer* self, PyObject* args);
-
+static PyObject* MessageRenderer_clear(s_MessageRenderer* self);
static PyMethodDef MessageRenderer_methods[] = {
{ "get_data", reinterpret_cast<PyCFunction>(MessageRenderer_getData), METH_NOARGS,
@@ -57,6 +57,9 @@
"Sets truncated to true" },
{ "set_length_limit", reinterpret_cast<PyCFunction>(MessageRenderer_setLengthLimit), METH_VARARGS,
"Sets the length limit of the data to the given number" },
+ { "clear", reinterpret_cast<PyCFunction>(MessageRenderer_clear),
+ METH_NOARGS,
+ "Clear the internal buffer and other internal resources." },
{ NULL, NULL, 0, NULL }
};
@@ -175,6 +178,12 @@
Py_RETURN_NONE;
}
+static PyObject*
+MessageRenderer_clear(s_MessageRenderer* self) {
+ self->messagerenderer->clear();
+ Py_RETURN_NONE;
+}
+
// end of MessageRenderer
Modified: branches/trac351/src/lib/dns/python/pydnspp.cc
==============================================================================
--- branches/trac351/src/lib/dns/python/pydnspp.cc (original)
+++ branches/trac351/src/lib/dns/python/pydnspp.cc Wed Sep 29 01:12:16 2010
@@ -40,8 +40,12 @@
#include <dns/python/pydnspp_common.h>
-// For our 'general' isc::Exception
+// For our 'general' isc::Exceptions
static PyObject* po_IscException;
+static PyObject* po_InvalidParameter;
+
+// For our own isc::dns::Exception
+static PyObject* po_DNSMessageBADVERS;
// order is important here!
#include <dns/python/messagerenderer_python.cc>
@@ -55,6 +59,7 @@
// Name
#include <dns/python/opcode_python.cc>
#include <dns/python/rcode_python.cc>
+#include <dns/python/edns_python.cc> // needs Messagerenderer, Rcode
#include <dns/python/message_python.cc> // needs RRset, Question
//
@@ -83,8 +88,13 @@
return (NULL);
}
+ // Add the exceptions to the class
po_IscException = PyErr_NewException("pydnspp.IscException", NULL, NULL);
PyModule_AddObject(mod, "IscException", po_IscException);
+
+ po_InvalidParameter = PyErr_NewException("pydnspp.InvalidParameter",
+ NULL, NULL);
+ PyModule_AddObject(mod, "InvalidParameter", po_InvalidParameter);
// for each part included above, we call its specific initializer
@@ -132,6 +142,10 @@
return (NULL);
}
+ if (!initModulePart_EDNS(mod)) {
+ return (NULL);
+ }
+
return (mod);
}
Modified: branches/trac351/src/lib/dns/python/rdata_python.cc
==============================================================================
--- branches/trac351/src/lib/dns/python/rdata_python.cc (original)
+++ branches/trac351/src/lib/dns/python/rdata_python.cc Wed Sep 29 01:12:16 2010
@@ -146,11 +146,20 @@
s_RRType* rrtype;
s_RRClass* rrclass;
const char* s;
-
+ const char* data;
+ Py_ssize_t len;
+
+ // Create from string
if (PyArg_ParseTuple(args, "O!O!s", &rrtype_type, &rrtype,
&rrclass_type, &rrclass,
&s)) {
self->rdata = createRdata(*rrtype->rrtype, *rrclass->rrclass, s);
+ return (0);
+ } else if (PyArg_ParseTuple(args, "O!O!y#", &rrtype_type, &rrtype,
+ &rrclass_type, &rrclass, &data, &len)) {
+ InputBuffer input_buffer(data, len);
+ self->rdata = createRdata(*rrtype->rrtype, *rrclass->rrclass,
+ input_buffer, len);
return (0);
}
Modified: branches/trac351/src/lib/dns/python/tests/Makefile.am
==============================================================================
--- branches/trac351/src/lib/dns/python/tests/Makefile.am (original)
+++ branches/trac351/src/lib/dns/python/tests/Makefile.am Wed Sep 29 01:12:16 2010
@@ -1,4 +1,5 @@
-PYTESTS = message_python_test.py
+PYTESTS = edns_python_test.py
+PYTESTS += message_python_test.py
PYTESTS += messagerenderer_python_test.py
PYTESTS += name_python_test.py
PYTESTS += question_python_test.py
@@ -25,8 +26,8 @@
check-local:
for pytest in $(PYTESTS) ; do \
echo Running test: $$pytest ; \
- env PYTHONPATH=$(abs_top_srcdir)/src/lib/python:$(abs_top_builddir)/src/lib/python:$(abs_top_builddir)/src/lib/dns/python/.libs \
- TESTDATA_PATH=$(abs_top_srcdir)/src/lib/dns/tests/testdata \
+ env PYTHONPATH=$(abs_top_srcdir)/src/lib/dns/.libs:$(abs_top_srcdir)/src/lib/python:$(abs_top_builddir)/src/lib/python:$(abs_top_builddir)/src/lib/dns/python/.libs \
+ TESTDATA_PATH=$(abs_top_srcdir)/src/lib/dns/tests/testdata:$(abs_top_builddir)/src/lib/dns/tests/testdata \
$(LIBRARY_PATH_PLACEHOLDER) \
$(PYCOVERAGE) $(abs_srcdir)/$$pytest || exit ; \
done
Modified: branches/trac351/src/lib/dns/python/tests/message_python_test.py
==============================================================================
--- branches/trac351/src/lib/dns/python/tests/message_python_test.py (original)
+++ branches/trac351/src/lib/dns/python/tests/message_python_test.py Wed Sep 29 01:12:16 2010
@@ -20,7 +20,7 @@
import unittest
import os
from pydnspp import *
-
+from testutil import *
class MessageFlagTest(unittest.TestCase):
def test_init(self):
@@ -83,19 +83,6 @@
else:
testdata_path = "../tests/testdata"
-def read_wire_data(filename):
- data = bytes()
- file = open(testdata_path + os.sep + filename, "r")
- for line in file:
- line = line.strip()
- if line == "" or line.startswith("#"):
- pass
- else:
- cur_data = bytes.fromhex(line)
- data += cur_data
-
- return data
-
def factoryFromFile(message, file):
data = read_wire_data(file)
message.from_wire(data)
@@ -159,28 +146,6 @@
self.assertRaises(InvalidMessageOperation,
self.p.clear_header_flag, MessageFlag.AA())
- def test_set_DNSSEC_supported(self):
- self.assertRaises(TypeError, self.r.set_dnssec_supported, "wrong")
-
- self.assertFalse(self.r.is_dnssec_supported())
- self.r.set_dnssec_supported(True)
- self.assertTrue(self.r.is_dnssec_supported())
- self.r.set_dnssec_supported(False)
- self.assertFalse(self.r.is_dnssec_supported())
-
- self.assertRaises(InvalidMessageOperation,
- self.p.set_dnssec_supported, True)
- self.assertRaises(InvalidMessageOperation,
- self.p.set_dnssec_supported, False)
-
- def test_set_udp_size(self):
- self.assertRaises(TypeError, self.r.set_udp_size, "wrong")
- self.assertRaises(InvalidMessageUDPSize, self.r.set_udp_size, 0)
- self.assertRaises(InvalidMessageUDPSize, self.r.set_udp_size, 65536)
- self.assertRaises(InvalidMessageOperation, self.p.set_udp_size, 1024)
- self.r.set_udp_size(2048)
- self.assertEqual(2048, self.r.get_udp_size())
-
def test_set_qid(self):
self.assertRaises(TypeError, self.r.set_qid, "wrong")
self.assertRaises(InvalidMessageOperation,
@@ -211,6 +176,24 @@
self.p.set_opcode, opcode)
self.assertRaises(InvalidMessageOperation, self.p.get_opcode)
+
+ def test_get_edns(self):
+ self.assertEqual(None, self.p.get_edns())
+
+ message_parse = Message(Message.PARSE)
+ factoryFromFile(message_parse, "message_fromWire10")
+ edns = message_parse.get_edns()
+ self.assertEqual(0, edns.get_version())
+ self.assertEqual(4096, edns.get_udp_size())
+ self.assertTrue(edns.get_dnssec_awareness())
+
+ def test_set_edns(self):
+ self.assertRaises(InvalidMessageOperation, self.p.set_edns, EDNS())
+
+ edns = EDNS()
+ edns.set_udp_size(1024)
+ self.r.set_edns(edns)
+ self.assertEqual(1024, self.r.get_edns().get_udp_size())
def test_get_section(self):
self.assertRaises(TypeError, self.r.get_section, "wrong")
@@ -351,84 +334,6 @@
self.assertEqual("192.0.2.2", rdata[1].to_text())
self.assertEqual(2, len(rdata))
- def test_GetEDNS0DOBit(self):
- message_parse = Message(Message.PARSE)
- ## Without EDNS0, DNSSEC is considered to be unsupported.
- factoryFromFile(message_parse, "message_fromWire1")
- self.assertFalse(message_parse.is_dnssec_supported())
-
- ## If DO bit is on, DNSSEC is considered to be supported.
- message_parse.clear(Message.PARSE)
- factoryFromFile(message_parse, "message_fromWire2")
- self.assertTrue(message_parse.is_dnssec_supported())
-
- ## If DO bit is off, DNSSEC is considered to be unsupported.
- message_parse.clear(Message.PARSE)
- factoryFromFile(message_parse, "message_fromWire3")
- self.assertFalse(message_parse.is_dnssec_supported())
-
- def test_SetEDNS0DOBit(self):
- # By default, it's false, and we can enable/disable it.
- message_parse = Message(Message.PARSE)
- message_render = Message(Message.RENDER)
- self.assertFalse(message_render.is_dnssec_supported())
- message_render.set_dnssec_supported(True)
- self.assertTrue(message_render.is_dnssec_supported())
- message_render.set_dnssec_supported(False)
- self.assertFalse(message_render.is_dnssec_supported())
-
- ## A message in the parse mode doesn't allow this flag to be set.
- self.assertRaises(InvalidMessageOperation,
- message_parse.set_dnssec_supported,
- True)
- ## Once converted to the render mode, it works as above
- message_parse.make_response()
- self.assertFalse(message_parse.is_dnssec_supported())
- message_parse.set_dnssec_supported(True)
- self.assertTrue(message_parse.is_dnssec_supported())
- message_parse.set_dnssec_supported(False)
- self.assertFalse(message_parse.is_dnssec_supported())
-
- def test_GetEDNS0UDPSize(self):
- # Without EDNS0, the default max UDP size is used.
- message_parse = Message(Message.PARSE)
- factoryFromFile(message_parse, "message_fromWire1")
- self.assertEqual(Message.DEFAULT_MAX_UDPSIZE, message_parse.get_udp_size())
-
- ## If the size specified in EDNS0 > default max, use it.
- message_parse.clear(Message.PARSE)
- factoryFromFile(message_parse, "message_fromWire2")
- self.assertEqual(4096, message_parse.get_udp_size())
-
- ## If the size specified in EDNS0 < default max, keep using the default.
- message_parse.clear(Message.PARSE)
- factoryFromFile(message_parse, "message_fromWire8")
- self.assertEqual(Message.DEFAULT_MAX_UDPSIZE, message_parse.get_udp_size())
-
- def test_SetEDNS0UDPSize(self):
- # The default size if unspecified
- message_render = Message(Message.RENDER)
- message_parse = Message(Message.PARSE)
- self.assertEqual(Message.DEFAULT_MAX_UDPSIZE, message_render.get_udp_size())
- # A common buffer size with EDNS, should succeed
- message_render.set_udp_size(4096)
- self.assertEqual(4096, message_render.get_udp_size())
- # Unusual large value, but accepted
- message_render.set_udp_size(0xffff)
- self.assertEqual(0xffff, message_render.get_udp_size())
- # Too small is value is rejected
- self.assertRaises(InvalidMessageUDPSize, message_render.set_udp_size, 511)
-
- # A message in the parse mode doesn't allow the set operation.
- self.assertRaises(InvalidMessageOperation, message_parse.set_udp_size, 4096)
- ## Once converted to the render mode, it works as above.
- message_parse.make_response()
- message_parse.set_udp_size(4096)
- self.assertEqual(4096, message_parse.get_udp_size())
- message_parse.set_udp_size(0xffff)
- self.assertEqual(0xffff, message_parse.get_udp_size())
- self.assertRaises(InvalidMessageUDPSize, message_parse.set_udp_size, 511)
-
def test_EDNS0ExtCode(self):
# Extended Rcode = BADVERS
message_parse = Message(Message.PARSE)
Modified: branches/trac351/src/lib/dns/python/tests/question_python_test.py
==============================================================================
--- branches/trac351/src/lib/dns/python/tests/question_python_test.py (original)
+++ branches/trac351/src/lib/dns/python/tests/question_python_test.py Wed Sep 29 01:12:16 2010
@@ -20,24 +20,12 @@
import unittest
import os
from pydnspp import *
+from testutil import *
if "TESTDATA_PATH" in os.environ:
testdata_path = os.environ["TESTDATA_PATH"]
else:
testdata_path = "../tests/testdata"
-
-def read_wire_data(filename):
- data = bytes()
- file = open(testdata_path + os.sep + filename, "r")
- for line in file:
- line = line.strip()
- if line == "" or line.startswith("#"):
- pass
- else:
- cur_data = bytes.fromhex(line)
- data += cur_data
-
- return data
def question_from_wire(file, position = 0):
data = read_wire_data(file)
@@ -102,7 +90,6 @@
wiredata = read_wire_data("question_toWire2")
self.assertEqual(renderer.get_data(), wiredata)
self.assertRaises(TypeError, self.test_question1.to_wire, 1)
-
if __name__ == '__main__':
unittest.main()
Modified: branches/trac351/src/lib/dns/rrclass-placeholder.h
==============================================================================
--- branches/trac351/src/lib/dns/rrclass-placeholder.h (original)
+++ branches/trac351/src/lib/dns/rrclass-placeholder.h Wed Sep 29 01:12:16 2010
@@ -211,7 +211,7 @@
/// \brief Same as \c equals().
bool operator==(const RRClass& other) const { return (equals(other)); }
- /// \brief Return true iff two RRClasses are equal.
+ /// \brief Return true iff two RRClasses are not equal.
///
/// This method never throws an exception.
///
Modified: branches/trac351/src/lib/dns/rrtype-placeholder.h
==============================================================================
--- branches/trac351/src/lib/dns/rrtype-placeholder.h (original)
+++ branches/trac351/src/lib/dns/rrtype-placeholder.h Wed Sep 29 01:12:16 2010
@@ -223,7 +223,7 @@
/// \brief Same as \c equals().
bool operator==(const RRType& other) const { return (equals(other)); }
- /// \brief Return true iff two RRTypes are equal.
+ /// \brief Return true iff two RRTypes are not equal.
///
/// This method never throws an exception.
///
Modified: branches/trac351/src/lib/dns/tests/Makefile.am
==============================================================================
--- branches/trac351/src/lib/dns/tests/Makefile.am (original)
+++ branches/trac351/src/lib/dns/tests/Makefile.am Wed Sep 29 01:12:16 2010
@@ -1,6 +1,9 @@
+SUBDIRS = testdata .
+
AM_CPPFLAGS = -I$(top_builddir)/src/lib -I$(top_srcdir)/src/lib
AM_CPPFLAGS += -I$(top_srcdir)/src/lib/dns -I$(top_builddir)/src/lib/dns
-AM_CPPFLAGS += -DTEST_DATA_DIR=\"$(srcdir)/testdata\"
+AM_CPPFLAGS += -DTEST_DATA_SRCDIR=\"$(srcdir)/testdata\"
+AM_CPPFLAGS += -DTEST_DATA_BUILDDIR=\"$(top_builddir)/src/lib/dns/tests/testdata\"
AM_CXXFLAGS = $(B10_CXXFLAGS)
if USE_STATIC_LINK
@@ -14,6 +17,7 @@
TESTS += run_unittests
run_unittests_SOURCES = unittest_util.h unittest_util.cc
run_unittests_SOURCES += buffer_unittest.cc name_unittest.cc
+run_unittests_SOURCES += edns_unittest.cc
run_unittests_SOURCES += messagerenderer_unittest.cc
run_unittests_SOURCES += rrclass_unittest.cc rrtype_unittest.cc
run_unittests_SOURCES += rrttl_unittest.cc
@@ -55,6 +59,8 @@
# NOTE: keep this in sync with real file listing
# so is included in tarball
EXTRA_DIST = testdata/gen-wiredata.py.in
+EXTRA_DIST += testdata/edns_toWire1.spec testdata/edns_toWire2.spec
+EXTRA_DIST += testdata/edns_toWire3.spec testdata/edns_toWire4.spec
EXTRA_DIST += testdata/message_fromWire1
EXTRA_DIST += testdata/message_fromWire10
EXTRA_DIST += testdata/message_fromWire10.spec
Modified: branches/trac351/src/lib/dns/tests/message_unittest.cc
==============================================================================
--- branches/trac351/src/lib/dns/tests/message_unittest.cc (original)
+++ branches/trac351/src/lib/dns/tests/message_unittest.cc Wed Sep 29 01:12:16 2010
@@ -17,6 +17,7 @@
#include <exceptions/exceptions.h>
#include <dns/buffer.h>
+#include <dns/edns.h>
#include <dns/exceptions.h>
#include <dns/message.h>
#include <dns/messagerenderer.h>
@@ -78,6 +79,26 @@
message.fromWire(buffer);
}
+TEST_F(MessageTest, getEDNS) {
+ EXPECT_FALSE(message_parse.getEDNS()); // by default EDNS isn't set
+
+ factoryFromFile(message_parse, "message_fromWire10");
+ EXPECT_TRUE(message_parse.getEDNS());
+ EXPECT_EQ(0, message_parse.getEDNS()->getVersion());
+ EXPECT_EQ(4096, message_parse.getEDNS()->getUDPSize());
+ EXPECT_TRUE(message_parse.getEDNS()->getDNSSECAwareness());
+}
+
+TEST_F(MessageTest, setEDNS) {
+ // setEDNS() isn't allowed in the parse mode
+ EXPECT_THROW(message_parse.setEDNS(EDNSPtr(new EDNS())),
+ InvalidMessageOperation);
+
+ EDNSPtr edns = EDNSPtr(new EDNS());
+ message_render.setEDNS(edns);
+ EXPECT_EQ(edns, message_render.getEDNS());
+}
+
TEST_F(MessageTest, fromWire) {
factoryFromFile(message_parse, "message_fromWire1");
EXPECT_EQ(0x1035, message_parse.getQid());
@@ -111,98 +132,7 @@
EXPECT_TRUE(it->isLast());
}
-TEST_F(MessageTest, opcode) { // for get/setOpcode
- EXPECT_THROW(message_parse.setOpcode(Opcode::NOTIFY()),
- InvalidMessageOperation);
- message_render.setOpcode(Opcode::UPDATE());
- EXPECT_EQ(Opcode::UPDATE(), message_render.getOpcode());
- EXPECT_THROW(message_parse.getOpcode(), InvalidMessageOperation);
-}
-
-TEST_F(MessageTest, rcode) { // for get/setRcode
- EXPECT_THROW(message_parse.setRcode(Rcode::BADVERS()),
- InvalidMessageOperation);
- message_render.setRcode(Rcode::BADVERS());
- EXPECT_EQ(Rcode::BADVERS(), message_render.getRcode());
- EXPECT_THROW(message_parse.getRcode(), InvalidMessageOperation);
-}
-
-TEST_F(MessageTest, GetEDNS0DOBit) {
- // Without EDNS0, DNSSEC is considered to be unsupported.
- factoryFromFile(message_parse, "message_fromWire1");
- EXPECT_FALSE(message_parse.isDNSSECSupported());
-
- // If DO bit is on, DNSSEC is considered to be supported.
- message_parse.clear(Message::PARSE);
- factoryFromFile(message_parse, "message_fromWire2");
- EXPECT_TRUE(message_parse.isDNSSECSupported());
-
- // If DO bit is off, DNSSEC is considered to be unsupported.
- message_parse.clear(Message::PARSE);
- factoryFromFile(message_parse, "message_fromWire3");
- EXPECT_FALSE(message_parse.isDNSSECSupported());
-}
-
-TEST_F(MessageTest, SetEDNS0DOBit) {
- // By default, it's false, and we can enable/disable it.
- EXPECT_FALSE(message_render.isDNSSECSupported());
- message_render.setDNSSECSupported(true);
- EXPECT_TRUE(message_render.isDNSSECSupported());
- message_render.setDNSSECSupported(false);
- EXPECT_FALSE(message_render.isDNSSECSupported());
-
- // A message in the parse mode doesn't allow this flag to be set.
- EXPECT_THROW(message_parse.setDNSSECSupported(true),
- InvalidMessageOperation);
- // Once converted to the render mode, it works as above
- message_parse.makeResponse();
- EXPECT_FALSE(message_parse.isDNSSECSupported());
- message_parse.setDNSSECSupported(true);
- EXPECT_TRUE(message_parse.isDNSSECSupported());
- message_parse.setDNSSECSupported(false);
- EXPECT_FALSE(message_parse.isDNSSECSupported());
-}
-
-TEST_F(MessageTest, GetEDNS0UDPSize) {
- // Without EDNS0, the default max UDP size is used.
- factoryFromFile(message_parse, "message_fromWire1");
- EXPECT_EQ(Message::DEFAULT_MAX_UDPSIZE, message_parse.getUDPSize());
-
- // If the size specified in EDNS0 > default max, use it.
- message_parse.clear(Message::PARSE);
- factoryFromFile(message_parse, "message_fromWire2");
- EXPECT_EQ(4096, message_parse.getUDPSize());
-
- // If the size specified in EDNS0 < default max, keep using the default.
- message_parse.clear(Message::PARSE);
- factoryFromFile(message_parse, "message_fromWire8");
- EXPECT_EQ(Message::DEFAULT_MAX_UDPSIZE, message_parse.getUDPSize());
-}
-
-TEST_F(MessageTest, SetEDNS0UDPSize) {
- // The default size if unspecified
- EXPECT_EQ(Message::DEFAULT_MAX_UDPSIZE, message_render.getUDPSize());
- // A common buffer size with EDNS, should succeed
- message_render.setUDPSize(4096);
- EXPECT_EQ(4096, message_render.getUDPSize());
- // Unusual large value, but accepted
- message_render.setUDPSize(0xffff);
- EXPECT_EQ(0xffff, message_render.getUDPSize());
- // Too small is value is rejected
- EXPECT_THROW(message_render.setUDPSize(511), InvalidMessageUDPSize);
-
- // A message in the parse mode doesn't allow the set operation.
- EXPECT_THROW(message_parse.setUDPSize(4096), InvalidMessageOperation);
- // Once converted to the render mode, it works as above.
- message_parse.makeResponse();
- message_parse.setUDPSize(4096);
- EXPECT_EQ(4096, message_parse.getUDPSize());
- message_parse.setUDPSize(0xffff);
- EXPECT_EQ(0xffff, message_parse.getUDPSize());
- EXPECT_THROW(message_parse.setUDPSize(511), InvalidMessageUDPSize);
-}
-
-TEST_F(MessageTest, EDNS0ExtCode) {
+TEST_F(MessageTest, EDNS0ExtRcode) {
// Extended Rcode = BADVERS
factoryFromFile(message_parse, "message_fromWire10");
EXPECT_EQ(Rcode::BADVERS(), message_parse.getRcode());
@@ -221,19 +151,6 @@
message_parse.clear(Message::PARSE);
EXPECT_THROW(factoryFromFile(message_parse, "message_fromWire5"),
DNSMessageFORMERR);
- // OPT RR of a non root name
- message_parse.clear(Message::PARSE);
- EXPECT_THROW(factoryFromFile(message_parse, "message_fromWire6"),
- DNSMessageFORMERR);
- // Compressed owner name of OPT RR points to a root name.
- // Not necessarily bogus, but very unusual and mostly pathological.
- // We accept it, but is it okay?
- message_parse.clear(Message::PARSE);
- EXPECT_NO_THROW(factoryFromFile(message_parse, "message_fromWire7"));
- // Unsupported Version
- message_parse.clear(Message::PARSE);
- EXPECT_THROW(factoryFromFile(message_parse, "message_fromWire9"),
- DNSMessageBADVERS);
}
TEST_F(MessageTest, toWire) {
Modified: branches/trac351/src/lib/dns/tests/run_unittests.cc
==============================================================================
--- branches/trac351/src/lib/dns/tests/run_unittests.cc (original)
+++ branches/trac351/src/lib/dns/tests/run_unittests.cc Wed Sep 29 01:12:16 2010
@@ -21,7 +21,8 @@
int
main(int argc, char* argv[]) {
::testing::InitGoogleTest(&argc, argv);
- isc::UnitTestUtil::addDataPath(TEST_DATA_DIR);
+ isc::UnitTestUtil::addDataPath(TEST_DATA_SRCDIR);
+ isc::UnitTestUtil::addDataPath(TEST_DATA_BUILDDIR);
return (RUN_ALL_TESTS());
}
Modified: branches/trac351/src/lib/exceptions/exceptions.h
==============================================================================
--- branches/trac351/src/lib/exceptions/exceptions.h (original)
+++ branches/trac351/src/lib/exceptions/exceptions.h Wed Sep 29 01:12:16 2010
@@ -103,20 +103,25 @@
const std::string what_;
};
-///
/// \brief A generic exception that is thrown if a parameter given
/// to a method would refer to or modify out-of-range data.
-///
class OutOfRange : public Exception {
public:
OutOfRange(const char* file, size_t line, const char* what) :
isc::Exception(file, line, what) {}
};
-///
+/// \brief A generic exception that is thrown if a parameter given
+/// to a method or function is considered invalid and no other specific
+/// exceptions are suitable to describe the error.
+class InvalidParameter : public Exception {
+public:
+ InvalidParameter(const char* file, size_t line, const char* what) :
+ isc::Exception(file, line, what) {}
+};
+
/// \brief A generic exception that is thrown if a parameter given
/// to a method is considered invalid in that context.
-///
class BadValue : public Exception {
public:
BadValue(const char* file, size_t line, const char* what) :
Modified: branches/trac351/src/lib/python/isc/Makefile.am
==============================================================================
--- branches/trac351/src/lib/python/isc/Makefile.am (original)
+++ branches/trac351/src/lib/python/isc/Makefile.am Wed Sep 29 01:12:16 2010
@@ -1,4 +1,4 @@
-SUBDIRS = datasrc cc config log notify # Util
+SUBDIRS = datasrc cc config log notify utils # Util
python_PYTHON = __init__.py
More information about the bind10-changes
mailing list