iov[1].iov_len=replen;
int ret=Utility::writev(outsock,iov,2);
- if(ret<0) // "EOF is error" - we can't deal with EAGAIN errors at this stage yet
+ if(ret <= 0) // "EOF is error" - we can't deal with EAGAIN errors at this stage yet
return -1;
if(ret!=replen+2) {
return ret;
}
}
+
+string stripDot(const string& dom)
+{
+ if(dom.empty())
+ return dom;
+
+ if(dom[dom.size()-1]!='.')
+ return dom;
+
+ return dom.substr(0,dom.size()-1);
+}
#include <boost/algorithm/string.hpp>
#include <boost/lexical_cast.hpp>
-ZoneParserTNG::ZoneParserTNG(const string& fname, const string& zname) : d_zonename(zname), d_defaultttl(3600)
+ZoneParserTNG::ZoneParserTNG(const string& fname, const string& zname, const string& reldir) : d_reldir(reldir), d_zonename(zname), d_defaultttl(3600)
{
stackFile(fname);
}
if(command=="$TTL" && parts.size() > 1)
d_defaultttl=makeTTLFromZone(makeString(d_line,parts[1]));
else if(command=="$INCLUDE" && parts.size() > 1) {
- stackFile(unquotify(makeString(d_line, parts[1])));
+ string fname=unquotify(makeString(d_line, parts[1]));
+ if(!fname.empty() && fname[0]!='/' && !d_reldir.empty())
+ fname=d_reldir+"/"+fname;
+ stackFile(fname);
}
else if(command=="$ORIGIN" && parts.size() > 1) {
d_zonename = toCanonic("", makeString(d_line, parts[1]));
class ZoneParserTNG
{
public:
- ZoneParserTNG(const string& fname, const string& zname="");
+ ZoneParserTNG(const string& fname, const string& zname="", const string& reldir="");
~ZoneParserTNG();
bool getTemplateLine();
void stackFile(const std::string& fname);
stack<FILE *> d_fps;
+ string d_reldir;
string d_line;
string d_prevqname;
string d_zonename;