ucspi-ssl  0.99e
TLS encryption for IPv6 communication
dns_ipq.c
Go to the documentation of this file.
1 #include "stralloc.h"
2 #include "case.h"
3 #include "byte.h"
4 #include "str.h"
5 #include "dns.h"
6 
7 static int doit(stralloc *work,const char *rule)
8 {
9  char ch;
10  unsigned int colon;
11  unsigned int prefixlen;
12 
13  ch = *rule++;
14  if ((ch != '?') && (ch != '=') && (ch != '*') && (ch != '-')) return 1;
15  colon = str_chr(rule,':');
16  if (!rule[colon]) return 1;
17 
18  if (work->len < colon) return 1;
19  prefixlen = work->len - colon;
20  if ((ch == '=') && prefixlen) return 1;
21  if (case_diffb(rule,colon,work->s + prefixlen)) return 1;
22  if (ch == '?') {
23  if (byte_chr(work->s,prefixlen,'.') < prefixlen) return 1;
24  if (byte_chr(work->s,prefixlen,'[') < prefixlen) return 1;
25  if (byte_chr(work->s,prefixlen,']') < prefixlen) return 1;
26  }
27 
28  work->len = prefixlen;
29  if (ch == '-') work->len = 0;
30  return stralloc_cats(work,rule + colon + 1);
31 }
32 
33 int dns_ip4_qualify_rules(stralloc *out,stralloc *fqdn,const stralloc *in,const stralloc *rules)
34 {
35  unsigned int i;
36  unsigned int j;
37  unsigned int plus;
38  unsigned int fqdnlen;
39 
40  if (!stralloc_copy(fqdn,in)) return -1;
41 
42  for (j = i = 0;j < rules->len;++j)
43  if (!rules->s[j]) {
44  if (!doit(fqdn,rules->s + i)) return -1;
45  i = j + 1;
46  }
47 
48  fqdnlen = fqdn->len;
49  plus = byte_chr(fqdn->s,fqdnlen,'+');
50  if (plus >= fqdnlen)
51  return dns_ip4(out,fqdn);
52 
53  i = plus + 1;
54  for (;;) {
55  j = byte_chr(fqdn->s + i,fqdnlen - i,'+');
56  byte_copy(fqdn->s + plus,j,fqdn->s + i);
57  fqdn->len = plus + j;
58  if (dns_ip4(out,fqdn) == -1) return -1;
59  if (out->len) return 0;
60  i += j;
61  if (i >= fqdnlen) return 0;
62  ++i;
63  }
64 }
65 
66 int dns_ip4_qualify(stralloc *out,stralloc *fqdn,const stralloc *in)
67 {
68  static stralloc rules;
69  if (dns_resolvconfrewrite(&rules) == -1) return -1;
70  return dns_ip4_qualify_rules(out,fqdn,in,&rules);
71 }
int stralloc_copy(stralloc *, const stralloc *)
Definition: stralloc_copy.c:4
void byte_copy(void *, unsigned int, const void *)
int stralloc_cats(stralloc *, const char *)
Definition: stralloc_cats.c:7
int case_diffb(const char *, unsigned int, const char *)
int dns_ip4(stralloc *, const stralloc *)
Definition: dns_ip.c:39
int rules(void(*callback)(char *, unsigned int), int fd, char *ip, char *host, char *info)
Definition: rules.c:137
int dns_ip4_qualify_rules(stralloc *out, stralloc *fqdn, const stralloc *in, const stralloc *rules)
Definition: dns_ipq.c:33
int dns_ip4_qualify(stralloc *out, stralloc *fqdn, const stralloc *in)
Definition: dns_ipq.c:66
unsigned int str_chr(const char *, int)
unsigned int byte_chr(const char *, unsigned int n, int)
int dns_resolvconfrewrite(stralloc *)
Definition: dns_rcrw.c:112