Browse Source

git-svn-id: svn://bind10.isc.org/svn/bind10/branches/f2f200910@207 e5f2f494-b856-4b98-b285-d166d9295462

Evan Hunt 15 years ago
parent
commit
11a536115f
3 changed files with 49 additions and 54 deletions
  1. 0 17
      src/bin/parkinglot/common.cc
  2. 14 2
      src/bin/parkinglot/common.h
  3. 35 35
      src/bin/parkinglot/main.cc

+ 0 - 17
src/bin/parkinglot/common.cc

@@ -14,20 +14,3 @@
 
 // $Id$
 
-#include <iostream>
-#include <stdarg.h>
-
-#include "common.h"
-
-extern const std::string PROGRAM;
-
-void
-fatal(const char* format, ...) {
-    va_list args;
-    fprintf(stderr, "%s: fatal: ", PROGRAM);
-    va_start(args, format);
-    vfprintf(stderr, format, args);
-    va_end(args);
-    putc('\n', stderr);
-    exit(1);
-}

+ 14 - 2
src/bin/parkinglot/common.h

@@ -14,5 +14,17 @@
 
 // $Id$
 
-void
-fatal(const char* format, ...);
+#include <stdlib.h>
+
+class FatalError : public std::exception {
+    public:
+        FatalError(std::string m = "fatal error") {
+            msg = m;
+            std::cerr << msg << std::endl;
+            exit(1);
+        }
+        ~FatalError() throw() {}
+        const char* what() const throw() { return msg.c_str(); }
+    private:
+        std::string msg;
+};

+ 35 - 35
src/bin/parkinglot/main.cc

@@ -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);