|
@@ -17,6 +17,7 @@
|
|
|
#include <sys/types.h>
|
|
|
#include <sys/socket.h>
|
|
|
#include <netdb.h>
|
|
|
+#include <stdlib.h>
|
|
|
|
|
|
#include <set>
|
|
|
#include <iostream>
|
|
@@ -28,25 +29,23 @@
|
|
|
|
|
|
#include "common.h"
|
|
|
|
|
|
-using std::string;
|
|
|
-using std::pair;
|
|
|
+using namespace std;
|
|
|
|
|
|
using namespace isc::dns;
|
|
|
-using isc::dns::Rdata::IN::A;
|
|
|
-using isc::dns::Rdata::IN::AAAA;
|
|
|
-using isc::dns::Rdata::Generic::NS;
|
|
|
+using namespace isc::dns::Rdata::IN;
|
|
|
+using namespace isc::dns::Rdata::Generic;
|
|
|
|
|
|
const string PROGRAM = "parkinglot";
|
|
|
const int DNSPORT = 53;
|
|
|
|
|
|
static void
|
|
|
usage() {
|
|
|
- std::cerr << "Usage: parkinglot [-p port]" << std::endl;
|
|
|
+ cerr << "Usage: parkinglot [-p port]" << endl;
|
|
|
exit(1);
|
|
|
}
|
|
|
|
|
|
typedef pair<string, void*> Record;
|
|
|
-typedef std::set<string> ZoneSet;
|
|
|
+typedef set<string> ZoneSet;
|
|
|
ZoneSet zones;
|
|
|
|
|
|
static void
|
|
@@ -67,7 +66,7 @@ static int
|
|
|
start_server(int port) {
|
|
|
int s = socket(AF_INET, SOCK_DGRAM, 0);
|
|
|
if (s < 0)
|
|
|
- fatal("failed to open socket");
|
|
|
+ throw FatalError("failed to open socket");
|
|
|
|
|
|
struct sockaddr_in sin;
|
|
|
sin.sin_family = AF_INET;
|
|
@@ -85,21 +84,26 @@ start_server(int port) {
|
|
|
|
|
|
static void
|
|
|
run_server(int s) {
|
|
|
+ Rdata::RdataPtr ns1, ns2, ns3;
|
|
|
+ ns1 = Rdata::RdataPtr(new NS("ns1.parking.com"));
|
|
|
+ ns2 = Rdata::RdataPtr(new NS("ns2.parking.com"));
|
|
|
+ ns3 = Rdata::RdataPtr(new NS("ns3.parking.com"));
|
|
|
+
|
|
|
+ struct sockaddr_storage ss;
|
|
|
+ socklen_t sa_len = sizeof(ss);
|
|
|
+ struct sockaddr* sa = static_cast<struct sockaddr*>((void*)&ss);
|
|
|
+
|
|
|
while (true) {
|
|
|
Message msg;
|
|
|
- struct sockaddr_storage ss;
|
|
|
- socklen_t sa_len = sizeof(ss);
|
|
|
- struct sockaddr* sa = static_cast<struct sockaddr*>((void*)&ss);
|
|
|
- int cc = msg.getBuffer().recvFrom(s, sa, &sa_len);
|
|
|
- if (cc > 0) {
|
|
|
+ if (msg.getBuffer().recvFrom(s, sa, &sa_len) > 0) {
|
|
|
try {
|
|
|
msg.fromWire();
|
|
|
} catch (...) {
|
|
|
- std::cerr << "parse failed" << std::endl;
|
|
|
+ cerr << "parse failed" << endl;
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- std::cout << "received a message:\n" << msg.toText() << std::endl;
|
|
|
+ cout << "received a message:\n" << msg.toText() << endl;
|
|
|
|
|
|
if (msg.getSection(SECTION_QUESTION).size() != 1)
|
|
|
continue;
|
|
@@ -110,11 +114,6 @@ run_server(int s) {
|
|
|
RRsetPtr query = msg.getSection(SECTION_QUESTION)[0];
|
|
|
|
|
|
if (zones.find(query->getName().toText(true)) != zones.end()) {
|
|
|
- Rdata::RdataPtr ns1, ns2, ns3;
|
|
|
- ns1 = Rdata::RdataPtr(new NS("ns1.parking.com"));
|
|
|
- ns2 = Rdata::RdataPtr(new NS("ns2.parking.com"));
|
|
|
- ns3 = Rdata::RdataPtr(new NS("ns3.parking.com"));
|
|
|
-
|
|
|
msg.setRcode(Message::RCODE_NOERROR);
|
|
|
RRset* nsset = new RRset(query->getName(), query->getClass(),
|
|
|
RRType::NS, TTL(3600));
|
|
@@ -123,24 +122,22 @@ run_server(int s) {
|
|
|
nsset->addRdata(ns2);
|
|
|
nsset->addRdata(ns3);
|
|
|
|
|
|
- section_t section;
|
|
|
if (query->getType() == RRType::NS)
|
|
|
- section = SECTION_ANSWER;
|
|
|
+ msg.addRRset(SECTION_ANSWER, RRsetPtr(nsset));
|
|
|
else
|
|
|
- section = SECTION_AUTHORITY;
|
|
|
-
|
|
|
- msg.addRRset(section, RRsetPtr(nsset));
|
|
|
+ msg.addRRset(SECTION_AUTHORITY, RRsetPtr(nsset));
|
|
|
|
|
|
if (query->getType() == RRType::A) {
|
|
|
- msg.addRR(SECTION_ANSWER,
|
|
|
- RR(query->getName(), query->getClass(),
|
|
|
- RRType::A, TTL(3600),
|
|
|
- Rdata::RdataPtr(new A("127.0.0.1"))));
|
|
|
+ RR arr(query->getName(), query->getClass(),
|
|
|
+ RRType::A, TTL(3600),
|
|
|
+ Rdata::RdataPtr(new A("127.0.0.1")));
|
|
|
+
|
|
|
+ msg.addRR(SECTION_ANSWER, arr);
|
|
|
} else if (query->getType() == RRType::AAAA) {
|
|
|
- msg.addRR(SECTION_ANSWER,
|
|
|
- RR(query->getName(), query->getClass(),
|
|
|
- RRType::AAAA, TTL(3600),
|
|
|
- Rdata::RdataPtr(new AAAA("::1"))));
|
|
|
+ RR aaaarr(query->getName(), query->getClass(),
|
|
|
+ RRType::AAAA, TTL(3600),
|
|
|
+ Rdata::RdataPtr(new AAAA("::1")));
|
|
|
+ msg.addRR(SECTION_ANSWER, aaaarr);
|
|
|
}
|
|
|
} else {
|
|
|
msg.setRcode(Message::RCODE_NXDOMAIN);
|
|
@@ -148,9 +145,9 @@ run_server(int s) {
|
|
|
}
|
|
|
|
|
|
msg.toWire();
|
|
|
- std::cout << "sending a response (" <<
|
|
|
+ cout << "sending a response (" <<
|
|
|
boost::lexical_cast<string>(msg.getBuffer().getSize())
|
|
|
- << " bytes):\n" << msg.toText() << std::endl;
|
|
|
+ << " bytes):\n" << msg.toText() << endl;
|
|
|
msg.getBuffer().sendTo(s, *sa, sa_len);
|
|
|
}
|
|
|
}
|
|
@@ -183,8 +180,11 @@ main(int argc, char* argv[])
|
|
|
|
|
|
// start the server
|
|
|
int s = start_server(port);
|
|
|
+ if (s < 0)
|
|
|
+ throw FatalError("unable to start the server");
|
|
|
|
|
|
// main server loop
|
|
|
+ cout << "server running" << endl;
|
|
|
run_server(s);
|
|
|
|
|
|
return (0);
|