Coverage Report

Created: 2023-09-25 07:00

/src/pdns/pdns/zoneparser-tng.hh
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * This file is part of PowerDNS or dnsdist.
3
 * Copyright -- PowerDNS.COM B.V. and its contributors
4
 *
5
 * This program is free software; you can redistribute it and/or modify
6
 * it under the terms of version 2 of the GNU General Public License as
7
 * published by the Free Software Foundation.
8
 *
9
 * In addition, for the avoidance of any doubt, permission is granted to
10
 * link this program with OpenSSL and to (re)distribute the binaries
11
 * produced as the result of such linking.
12
 *
13
 * This program is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 * GNU General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU General Public License
19
 * along with this program; if not, write to the Free Software
20
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21
 */
22
#pragma once
23
#include <string>
24
#include <cstdio>
25
#include <stdexcept>
26
#include <stack>
27
#include <deque>
28
29
#include "namespaces.hh"
30
31
class ZoneParserTNG
32
{
33
public:
34
  ZoneParserTNG(const string& fname, DNSName  zname=g_rootdnsname, string  reldir="", bool upgradeContent=false);
35
  ZoneParserTNG(const vector<string>& zonedata, DNSName  zname, bool upgradeContent=false);
36
37
  ~ZoneParserTNG();
38
  bool get(DNSResourceRecord& rr, std::string* comment=0);
39
  typedef runtime_error exception;
40
  typedef std::deque<pair<string::size_type, string::size_type> > parts_t;
41
  DNSName getZoneName();
42
  string getLineOfFile(); // for error reporting purposes
43
  pair<string,int> getLineNumAndFile(); // idem
44
  void disableGenerate()
45
0
  {
46
0
    d_generateEnabled = false;
47
0
  }
48
  void setMaxGenerateSteps(size_t max)
49
4.93k
  {
50
4.93k
    d_maxGenerateSteps = max;
51
4.93k
  }
52
  void setMaxIncludes(size_t max)
53
4.93k
  {
54
4.93k
    d_maxIncludes = max;
55
4.93k
  }
56
private:
57
  bool getLine();
58
  bool getTemplateLine();
59
  void stackFile(const std::string& fname);
60
  unsigned makeTTLFromZone(const std::string& str);
61
62
  struct filestate {
63
0
    filestate(FILE* fp, string filename) : d_fp(fp), d_filename(std::move(filename)), d_lineno(0){}
64
    FILE *d_fp;
65
    string d_filename;
66
    int d_lineno;
67
  };
68
69
  parts_t d_parts;
70
  string d_reldir;
71
  string d_line;
72
  DNSName d_prevqname;
73
  DNSName d_zonename;
74
  string d_templateline;
75
  vector<string> d_zonedata;
76
  vector<string>::iterator d_zonedataline;
77
  std::stack<filestate> d_filestates;
78
  parts_t d_templateparts;
79
  size_t d_maxGenerateSteps{0};
80
  size_t d_maxIncludes{20};
81
  int d_defaultttl;
82
  uint32_t d_templatecounter, d_templatestop, d_templatestep;
83
  bool d_havedollarttl;
84
  bool d_fromfile;
85
  bool d_generateEnabled{true};
86
  bool d_upgradeContent;
87
  bool d_templateCounterWrapped{false};
88
};