}
}
- if(!d_trc.d_algoName.empty())
+ if(d_trc.d_algoName.countLabels())
addTSIG(pw, &d_trc, d_tsigkeyname, d_tsigsecret, d_tsigprevious, d_tsigtimersonly);
d_rawpacket.assign((char*)&packet[0], packet.size());
}
- void xfrName(string &label, bool compress=false)
+ void xfrName(DNSName &label, bool compress=false)
{
label=getName();
}
if (size>0) conv.xfrBlobNoSpaces(d_otherData, size);
);
-MXRecordContent::MXRecordContent(uint16_t preference, const string& mxname) : DNSRecordContent(QType::MX), d_preference(preference), d_mxname(mxname)
+MXRecordContent::MXRecordContent(uint16_t preference, const DNSName& mxname) : DNSRecordContent(QType::MX), d_preference(preference), d_mxname(mxname)
{
}
)
-SRVRecordContent::SRVRecordContent(uint16_t preference, uint16_t weight, uint16_t port, const string& target)
+SRVRecordContent::SRVRecordContent(uint16_t preference, uint16_t weight, uint16_t port, const DNSName& target)
: DNSRecordContent(QType::SRV), d_preference(preference), d_weight(weight), d_port(port), d_target(target)
{}
conv.xfrName(d_target);
)
-SOARecordContent::SOARecordContent(const string& mname, const string& rname, const struct soatimes& st)
+SOARecordContent::SOARecordContent(const DNSName& mname, const DNSName& rname, const struct soatimes& st)
: DNSRecordContent(QType::SOA), d_mname(mname), d_rname(rname)
{
d_st=st;
class NAPTRRecordContent : public DNSRecordContent
{
public:
- NAPTRRecordContent(uint16_t order, uint16_t preference, string flags, string services, string regexp, string replacement);
+ NAPTRRecordContent(uint16_t order, uint16_t preference, string flags, string services, string regexp, DNSName replacement);
includeboilerplate(NAPTR);
template<class Convertor> void xfrRecordContent(Convertor& conv);
private:
uint16_t d_order, d_preference;
- string d_flags, d_services, d_regexp, d_replacement;
+ string d_flags, d_services, d_regexp;
+ DNSName d_replacement;
};
}
// this is the absolute hottest function in the pdns recursor
-void DNSPacketWriter::xfrName(const string& Label, bool compress)
+void DNSPacketWriter::xfrName(const DNSName& Label, bool compress)
{
string label = d_lowerCase ? toLower(Label) : Label;
labelparts_t parts;
#include <vector>
#include <map>
#include "dns.hh"
+#include "dnsname.hh"
#include "namespaces.hh"
#include <arpa/inet.h>
/** this class can be used to write DNS packets. It knows about DNS in the sense that it makes
void xfr8BitInt(uint8_t val);
- void xfrName(const string& label, bool compress=false);
+ void xfrName(const DNSName& label, bool compress=false);
void xfrText(const string& text, bool multi=false);
void xfrBlob(const string& blob, int len=-1);
void xfrBlobNoSpaces(const string& blob, int len=-1);
struct tm tm;
memset(&tm, 0, sizeof(tm));
- string tmp;
- xfrName(tmp); // ends on number, so this works
+ uint64_t itmp;
+ xfr64BitInt(itmp); // ends on number, so this works
+
+ ostringstream tmp;
+
+ tmp<<itmp;
- sscanf(tmp.c_str(), "%04d%02d%02d" "%02d%02d%02d",
+ sscanf(tmp.str().c_str(), "%04d%02d%02d" "%02d%02d%02d",
&tm.tm_year, &tm.tm_mon, &tm.tm_mday,
&tm.tm_hour, &tm.tm_min, &tm.tm_sec);
}
// this code should leave all the escapes around
-void RecordTextReader::xfrName(string& val, bool)
+void RecordTextReader::xfrName(DNSName& val, bool)
{
skipSpaces();
- val.clear();
- val.reserve(d_end - d_pos);
+ string sval;
+ sval.reserve(d_end - d_pos);
const char* strptr=d_string.c_str();
string::size_type begin_pos = d_pos;
d_pos++;
}
- val.append(strptr+begin_pos, strptr+d_pos);
+ sval.append(strptr+begin_pos, strptr+d_pos);
- if(val.empty())
- val=d_zone;
+ if(sval.empty())
+ sval=d_zone;
else if(!d_zone.empty()) {
- char last=val[val.size()-1];
+ char last=sval[sval.size()-1];
if(last =='.')
- val.resize(val.size()-1);
+ sval.resize(sval.size()-1);
else if(last != '.' && !isdigit(last)) // don't add zone to IP address
- val+="."+d_zone;
+ sval+="."+d_zone;
}
+ val = DNSName(sval);
}
static bool isbase64(char c, bool acceptspace)
}
// should not mess with the escapes
-void RecordTextWriter::xfrName(const string& val, bool)
+void RecordTextWriter::xfrName(const DNSName& val, bool)
{
if(!d_string.empty())
d_string.append(1,' ');
- d_string+=val;
+ d_string+=val.toString();
}
void RecordTextWriter::xfrBlobNoSpaces(const string& val, int size)
#include <stdexcept>
#include "namespaces.hh"
+#include "dnsname.hh"
class RecordTextException : public runtime_error
{
void xfrIP6(std::string& val);
void xfrTime(uint32_t& val);
- void xfrName(string& val, bool compress=false);
+ void xfrName(DNSName& val, bool compress=false);
void xfrText(string& val, bool multi=false);
void xfrHexBlob(string& val, bool keepReading=false);
void xfrBase32HexBlob(string& val);
void xfrBase32HexBlob(const string& val);
void xfrType(const uint16_t& val);
- void xfrName(const string& val, bool compress=false);
+ void xfrName(const DNSName& val, bool compress=false);
void xfrText(const string& val, bool multi=false);
void xfrBlobNoSpaces(const string& val, int len=-1);
void xfrBlob(const string& val, int len=-1);
TSIGHashEnum algo;
if (!getTSIGHashEnum(d_trc.d_algoName, algo)) {
- throw ResolverException("Unsupported TSIG HMAC algorithm " + d_trc.d_algoName);
+ throw ResolverException("Unsupported TSIG HMAC algorithm " + d_trc.d_algoName.toString());
}
if (algo == TSIG_GSS) {
if(!tsigkeyname.empty()) {
string tsig64;
- string algorithm=toLowerCanonic(trc.d_algoName);
+ string algorithm=trc.d_algoName.toString(); // FIXME: check
if (algorithm == "hmac-md5.sig-alg.reg.int")
algorithm = "hmac-md5";
if (algorithm != "gss-tsig") {
if(!tsigkeyname.empty()) {
string tsig64;
- string algorithm=toLowerCanonic(trc.d_algoName);
+ string algorithm=trc.d_algoName.toString(); // FIXME: was toLowerCanonic, compare output
if (algorithm == "hmac-md5.sig-alg.reg.int")
algorithm = "hmac-md5";
Lock l(&s_plock);