Alien-cares

 view release on metacpan or  search on metacpan

libcares/test/dns-proto.cc  view on Meta::CPAN

        unsigned long order = DNS__16BIT(p);
        unsigned long pref = DNS__16BIT(p + 2);
        p += 4;
        ss << order << " " << pref;

        int len = *p++;
        std::string flags(p, p + len);
        ss << " " << flags;
        p += len;

        len = *p++;
        std::string service(p, p + len);
        ss << " '" << service << "'";
        p += len;

        len = *p++;
        std::string regexp(p, p + len);
        ss << " '" << regexp << "'";
        p += len;

        int rc = ares_expand_name(p, packet.data(), packet.size(), &name, &enclen);
        if (rc != ARES_SUCCESS) {
          ss << "(error from ares_expand_name)";
          break;
        }
        ss << " '" << name << "'";
        ares_free_string(name);
      } else {
        ss << "(RR too short)";
      }
      break;
    }
    default:
      ss << " " << HexDump(*data, rdatalen);
      break;
    }
  }
  *data += rdatalen;
  *len -= rdatalen;

  ss << "}";
  return ss.str();
}

void PushInt32(std::vector<byte>* data, int value) {
  data->push_back((value & 0xff000000) >> 24);
  data->push_back((value & 0x00ff0000) >> 16);
  data->push_back((value & 0x0000ff00) >> 8);
  data->push_back(value & 0x000000ff);
}

void PushInt16(std::vector<byte>* data, int value) {
  data->push_back((value & 0xff00) >> 8);
  data->push_back(value & 0x00ff);
}

std::vector<byte> EncodeString(const std::string& name) {
  std::vector<byte> data;
  std::stringstream ss(name);
  std::string label;
  // TODO: cope with escapes
  while (std::getline(ss, label, '.')) {
    data.push_back(label.length());
    data.insert(data.end(), label.begin(), label.end());
  }
  data.push_back(0);
  return data;
}

std::vector<byte> DNSQuestion::data() const {
  std::vector<byte> data;
  std::vector<byte> encname = EncodeString(name_);
  data.insert(data.end(), encname.begin(), encname.end());
  PushInt16(&data, rrtype_);
  PushInt16(&data, qclass_);
  return data;
}

std::vector<byte> DNSRR::data() const {
  std::vector<byte> data = DNSQuestion::data();
  PushInt32(&data, ttl_);
  return data;
}

std::vector<byte> DNSSingleNameRR::data() const {
  std::vector<byte> data = DNSRR::data();
  std::vector<byte> encname = EncodeString(other_);
  int len = encname.size();
  PushInt16(&data, len);
  data.insert(data.end(), encname.begin(), encname.end());
  return data;
}

std::vector<byte> DNSTxtRR::data() const {
  std::vector<byte> data = DNSRR::data();
  int len = 0;
  for (const std::string& txt : txt_) {
    len += (1 + txt.size());
  }
  PushInt16(&data, len);
  for (const std::string& txt : txt_) {
    data.push_back(txt.size());
    data.insert(data.end(), txt.begin(), txt.end());
  }
  return data;
}

std::vector<byte> DNSMxRR::data() const {
  std::vector<byte> data = DNSRR::data();
  std::vector<byte> encname = EncodeString(other_);
  int len = 2 + encname.size();
  PushInt16(&data, len);
  PushInt16(&data, pref_);
  data.insert(data.end(), encname.begin(), encname.end());
  return data;
}

std::vector<byte> DNSSrvRR::data() const {
  std::vector<byte> data = DNSRR::data();
  std::vector<byte> encname = EncodeString(target_);
  int len = 6 + encname.size();



( run in 1.597 second using v1.01-cache-2.11-cpan-6fb7bf0f510 )