diff --git a/pdns/qtype.cc b/pdns/qtype.cc index a0d5732cd10e..710421f97770 100644 --- a/pdns/qtype.cc +++ b/pdns/qtype.cc @@ -166,7 +166,23 @@ QType &QType::operator=(const string &s) return *this; } -const std::string QClass::toString() const +static const std::map s_classMap = { + {"IN", QClass::IN}, + {"CHAOS", QClass::CHAOS}, + {"NONE", QClass::NONE}, + {"ANY", QClass::ANY}, +}; + +QClass::QClass(const std::string& code) +{ + auto mapIt = s_classMap.find(code); + if (mapIt == s_classMap.end()) { + throw std::runtime_error("Invalid QClass '" + code + "'"); + } + qclass = mapIt->second; +} + +std::string QClass::toString() const { switch (qclass) { case IN: diff --git a/pdns/qtype.hh b/pdns/qtype.hh index f5a879bef8f5..dd2761a65f29 100644 --- a/pdns/qtype.hh +++ b/pdns/qtype.hh @@ -178,6 +178,7 @@ inline size_t hash_value(const QType qtype) { struct QClass { constexpr QClass(uint16_t code = 0) : qclass(code) {} + explicit QClass(const std::string& code); constexpr operator uint16_t() const { return qclass; @@ -186,7 +187,7 @@ struct QClass { return qclass; } - const std::string toString() const; + std::string toString() const; static const QClass IN; static const QClass CHAOS;