[svn] commit: r1918 - /branches/feng-authnotify/src/bin/auth/main.cc
BIND 10 source code commits
bind10-changes at lists.isc.org
Tue May 25 13:50:55 UTC 2010
Author: hanfeng
Date: Tue May 25 13:50:55 2010
New Revision: 1918
Log:
quick hack add ixfr-in support
Modified:
branches/feng-authnotify/src/bin/auth/main.cc
Modified: branches/feng-authnotify/src/bin/auth/main.cc
==============================================================================
--- branches/feng-authnotify/src/bin/auth/main.cc (original)
+++ branches/feng-authnotify/src/bin/auth/main.cc Tue May 25 13:50:55 2010
@@ -143,6 +143,47 @@
}
}
#endif
+
+bool isNotifyMessage(const uint8_t *data)
+{
+ int opcode = (*(data + 2) & 0x78) >> 3;
+ return opcode == 4;
+}
+
+void handleNotify(udp::endpoint &sender, uint8_t *data, size_t data_len)
+{
+#define MIN_NOTIFY_HEAD_LEN 12
+ if (data_len < MIN_NOTIFY_HEAD_LEN)
+ return;
+ //get updated zone name and remote master's ip address and send to xfrin module
+ InputBuffer name_buffer(data + MIN_NOTIFY_HEAD_LEN, data_len - MIN_NOTIFY_HEAD_LEN);
+ Name name(name_buffer);
+ Session tmp_session_with_xfr;
+ tmp_session_with_xfr.establish();
+ tmp_session_with_xfr.subscribe("Ben", "*");
+ const string remote_ip_address = sender.address().to_string();
+ ElementPtr notify_command = Element::createFromString("{\"command\": [\"notify\", {\"zone_name\" : \""
+ + name.toText()
+ + "\", \"master_ip\" : \""
+ + remote_ip_address
+ + "\"}]}");
+ tmp_session_with_xfr.group_sendmsg(notify_command, "Xfrin");
+ ElementPtr env, answer;
+ tmp_session_with_xfr.group_recvmsg(env, answer, false);
+ cerr << "before parse answer \n";
+ int rcode;
+ ElementPtr err = parseAnswer(rcode, answer);
+ if (rcode != 0)
+ {
+ std::cerr << "notify send failed" << std::endl;
+ }
+ cerr << "after parse answer \n";
+ tmp_session_with_xfr.disconnect();
+ //set the qr bit
+ uint8_t *qr_start_byte = data + 2;
+ *qr_start_byte |= 0x80;
+}
+
#ifdef HAVE_BOOST_SYSTEM
//
@@ -318,20 +359,36 @@
if (!error && bytes_recvd > 0) {
InputBuffer request_buffer(data_, bytes_recvd);
- dns_message_.clear(Message::PARSE);
- response_renderer_.clear();
- if (auth_server->processMessage(request_buffer, dns_message_,
- response_renderer_, true)) {
+ if (isNotifyMessage((const uint8_t *)data_))
+ {
+ handleNotify(sender_endpoint_, (uint8_t *)data_, bytes_recvd);
socket_.async_send_to(
- boost::asio::buffer(response_buffer_.getData(),
- response_buffer_.getLength()),
- sender_endpoint_,
- boost::bind(&UDPServer::sendCompleted,
+ boost::asio::buffer(data_, bytes_recvd),
+ sender_endpoint_,
+ boost::bind(&UDPServer::sendCompleted,
+ this,
+ placeholders::error,
+ placeholders::bytes_transferred));
+
+ }
+ else
+ {
+
+ dns_message_.clear(Message::PARSE);
+ response_renderer_.clear();
+ if (auth_server->processMessage(request_buffer, dns_message_,
+ response_renderer_, true)) {
+ socket_.async_send_to(
+ boost::asio::buffer(response_buffer_.getData(),
+ response_buffer_.getLength()),
+ sender_endpoint_,
+ boost::bind(&UDPServer::sendCompleted,
this,
placeholders::error,
placeholders::bytes_transferred));
- } else {
- startReceive();
+ } else {
+ startReceive();
+ }
}
} else {
startReceive();
More information about the bind10-changes
mailing list