~ubuntu-branches/ubuntu/precise/pdns-recursor/precise

« back to all changes in this revision

Viewing changes to misc.cc

  • Committer: Bazaar Package Importer
  • Author(s): Matthijs Möhlmann
  • Date: 2011-01-22 16:39:02 UTC
  • mto: (1.1.8 upstream) (4.2.10 sid)
  • mto: This revision was merged to the branch mainline in revision 21.
  • Revision ID: james.westby@ubuntu.com-20110122163902-ee067v1pnad3f1zl
Import upstream version 3.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
2
    PowerDNS Versatile Database Driven Nameserver
3
 
    Copyright (C) 2002 - 2006  PowerDNS.COM BV
 
3
    Copyright (C) 2002 - 2010  PowerDNS.COM BV
4
4
 
5
5
    This program is free software; you can redistribute it and/or modify
6
6
    it under the terms of the GNU General Public License version 2
621
621
 
622
622
  return dom.substr(0,dom.size()-1);
623
623
}
 
624
 
 
625
 
 
626
string labelReverse(const std::string& qname)
 
627
{
 
628
  if(qname.empty())
 
629
    return qname;
 
630
 
 
631
  bool dotName = qname.find('.') != string::npos;
 
632
 
 
633
  vector<string> labels;
 
634
  stringtok(labels, qname, ". ");
 
635
  if(labels.size()==1)
 
636
    return qname;
 
637
 
 
638
  string ret;  // vv const_reverse_iter http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11729
 
639
  for(vector<string>::reverse_iterator iter = labels.rbegin(); iter != labels.rend(); ++iter) {
 
640
    if(iter != labels.rbegin())
 
641
      ret.append(1, dotName ? ' ' : '.');
 
642
    ret+=*iter;
 
643
  }
 
644
  return ret;
 
645
}
 
646
 
 
647
// do NOT feed trailing dots!
 
648
// www.powerdns.com, powerdns.com -> www
 
649
string makeRelative(const std::string& fqdn, const std::string& zone)
 
650
{
 
651
  if(zone.empty())
 
652
    return fqdn;  
 
653
  if(fqdn != zone)
 
654
    return fqdn.substr(0, fqdn.size() - zone.length() - 1); // strip domain name
 
655
  return "";
 
656
}
 
657
 
 
658
string dotConcat(const std::string& a, const std::string &b)
 
659
{
 
660
  if(a.empty() || b.empty())
 
661
    return a+b;
 
662
  else 
 
663
    return a+"."+b;
 
664
}
 
665
 
 
666
int makeIPv6sockaddr(const std::string& addr, struct sockaddr_in6* ret)
 
667
{
 
668
  struct addrinfo* res;
 
669
  struct addrinfo hints;
 
670
  memset(&hints, 0, sizeof(hints));
 
671
  
 
672
  hints.ai_family = AF_INET6;
 
673
  hints.ai_flags = AI_NUMERICHOST;
 
674
  
 
675
  if(getaddrinfo(addr.c_str(), 0, &hints, &res) < 0) {
 
676
    perror("getaddrinfo");
 
677
    return -1;
 
678
  }
 
679
  
 
680
  memcpy(ret, res->ai_addr, sizeof(*ret));
 
681
  
 
682
  freeaddrinfo(res);
 
683
  return 0;
 
684
}
 
685
 
 
686
//! read a line of text from a FILE* to a std::string, returns false on 'no data'
 
687
bool stringfgets(FILE* fp, std::string& line)
 
688
{
 
689
  char buffer[1024];
 
690
  line.clear();
 
691
  
 
692
  do {
 
693
    if(!fgets(buffer, sizeof(buffer), fp))
 
694
      return !line.empty();
 
695
    
 
696
    line.append(buffer); 
 
697
  } while(!strchr(buffer, '\n'));
 
698
  return true;
 
699
}