soa_6.cc 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. // Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
  2. //
  3. // Permission to use, copy, modify, and/or distribute this software for any
  4. // purpose with or without fee is hereby granted, provided that the above
  5. // copyright notice and this permission notice appear in all copies.
  6. //
  7. // THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
  8. // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  9. // AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
  10. // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  11. // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  12. // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  13. // PERFORMANCE OF THIS SOFTWARE.
  14. #include <config.h>
  15. #include <string>
  16. #include <boost/lexical_cast.hpp>
  17. #include <exceptions/exceptions.h>
  18. #include <util/buffer.h>
  19. #include <dns/name.h>
  20. #include <dns/messagerenderer.h>
  21. #include <dns/rdata.h>
  22. #include <dns/rdataclass.h>
  23. using namespace std;
  24. using namespace boost;
  25. using namespace isc::util;
  26. // BEGIN_ISC_NAMESPACE
  27. // BEGIN_RDATA_NAMESPACE
  28. SOA::SOA(InputBuffer& buffer, size_t) :
  29. mname_(buffer), rname_(buffer)
  30. {
  31. // we don't need rdata_len for parsing. if necessary, the caller will
  32. // check consistency.
  33. buffer.readData(numdata_, sizeof(numdata_));
  34. }
  35. SOA::SOA(const string& soastr) :
  36. mname_("."), rname_(".") // quick hack workaround
  37. {
  38. istringstream iss(soastr);
  39. string token;
  40. iss >> token;
  41. if (iss.bad() || iss.fail()) {
  42. isc_throw(InvalidRdataText, "Invalid SOA MNAME");
  43. }
  44. mname_ = Name(token);
  45. iss >> token;
  46. if (iss.bad() || iss.fail()) {
  47. isc_throw(InvalidRdataText, "Invalid SOA RNAME");
  48. }
  49. rname_ = Name(token);
  50. uint32_t serial, refresh, retry, expire, minimum;
  51. iss >> serial >> refresh >> retry >> expire >> minimum;
  52. if (iss.rdstate() != ios::eofbit) {
  53. isc_throw(InvalidRdataText, "Invalid SOA format");
  54. }
  55. OutputBuffer buffer(20);
  56. buffer.writeUint32(serial);
  57. buffer.writeUint32(refresh);
  58. buffer.writeUint32(retry);
  59. buffer.writeUint32(expire);
  60. buffer.writeUint32(minimum);
  61. memcpy(numdata_, buffer.getData(), buffer.getLength());
  62. }
  63. SOA::SOA(const Name& mname, const Name& rname, uint32_t serial,
  64. uint32_t refresh, uint32_t retry, uint32_t expire, uint32_t minimum) :
  65. mname_(mname), rname_(rname)
  66. {
  67. OutputBuffer b(20);
  68. b.writeUint32(serial);
  69. b.writeUint32(refresh);
  70. b.writeUint32(retry);
  71. b.writeUint32(expire);
  72. b.writeUint32(minimum);
  73. assert(b.getLength() == sizeof(numdata_));
  74. memcpy(numdata_, b.getData(), sizeof(numdata_));
  75. }
  76. SOA::SOA(const SOA& other) :
  77. Rdata(), mname_(other.mname_), rname_(other.rname_)
  78. {
  79. memcpy(numdata_, other.numdata_, sizeof(numdata_));
  80. }
  81. void
  82. SOA::toWire(OutputBuffer& buffer) const {
  83. mname_.toWire(buffer);
  84. rname_.toWire(buffer);
  85. buffer.writeData(numdata_, sizeof(numdata_));
  86. }
  87. void
  88. SOA::toWire(AbstractMessageRenderer& renderer) const {
  89. renderer.writeName(mname_);
  90. renderer.writeName(rname_);
  91. renderer.writeData(numdata_, sizeof(numdata_));
  92. }
  93. uint32_t
  94. SOA::getSerial() const {
  95. InputBuffer b(numdata_, sizeof(numdata_));
  96. return (b.readUint32());
  97. }
  98. string
  99. SOA::toText() const {
  100. InputBuffer b(numdata_, sizeof(numdata_));
  101. uint32_t serial = b.readUint32();
  102. uint32_t refresh = b.readUint32();
  103. uint32_t retry = b.readUint32();
  104. uint32_t expire = b.readUint32();
  105. uint32_t minimum = b.readUint32();
  106. return (mname_.toText() + " " + rname_.toText() + " " +
  107. lexical_cast<string>(serial) + " " +
  108. lexical_cast<string>(refresh) + " " +
  109. lexical_cast<string>(retry) + " " +
  110. lexical_cast<string>(expire) + " " +
  111. lexical_cast<string>(minimum));
  112. }
  113. int
  114. SOA::compare(const Rdata& other) const {
  115. const SOA& other_soa = dynamic_cast<const SOA&>(other);
  116. int order = compareNames(mname_, other_soa.mname_);
  117. if (order != 0) {
  118. return (order);
  119. }
  120. order = compareNames(rname_, other_soa.rname_);
  121. if (order != 0) {
  122. return (order);
  123. }
  124. return (memcmp(numdata_, other_soa.numdata_, sizeof(numdata_)));
  125. }
  126. // END_RDATA_NAMESPACE
  127. // END_ISC_NAMESPACE