rm -f tests/*.o
rm -f $(PROG_TARGETS)
rm -rf autom4te.cache/
- rm -f config.status
- rm -f config.log
rm -f tags
realclean: clean docclean libclean
#include <ldns/buffer.h>
#include <ctype.h>
+/**
+ * Returns true if the given string represent an IPv4 address
+ */
+bool ldns_is_ipv4_addr(const char *str);
+
+/**
+ * Returns true if the given string represent an IPv6 address
+ */
+bool ldns_is_ipv6_addr(const char *str);
+
/**
* convert a byte into wireformat
* \param[in] rd the rdf where to put the data
for (i = 0; i < res->_searchlist_count; i++) {
ldns_rdf_deep_free(res->_searchlist[i]);
}
+ LDNS_FREE(res->_searchlist);
}
if (res->_nameservers) {
for (i = 0; i < res->_nameserver_count; i++) {
ldns_rdf_deep_free(res->_nameservers[i]);
}
+ LDNS_FREE(res->_nameservers);
}
- LDNS_FREE(res->_searchlist);
- LDNS_FREE(res->_nameservers);
if (ldns_resolver_domain(res)) {
ldns_rdf_deep_free(ldns_resolver_domain(res));
}
#include <sys/param.h>
#endif
+bool
+ldns_is_ipv4_addr(const char *str)
+{
+ int a, i;
+ const char *dot = str;
+
+ if (strlen(str) < 7 || strlen(str) > 16) {
+ return false;
+ }
+
+ for (i = 0; i < 3; i++) {
+ a = atoi(dot);
+ if (a < 0 || a > 255) {
+ return false;
+ }
+ dot = strchr(dot, '.');
+ if (!dot) {
+ return false;
+ }
+ }
+ a = atoi(dot);
+ if (a < 0 || a > 255) {
+ return false;
+ }
+
+ return true;
+}
+
+/* todo: check for more errors (like ffffff:f etc) */
+bool
+ldns_is_ipv6_addr(const char *str)
+{
+ int a;
+ size_t i;
+ const char *dot = str;
+
+ if (strlen(str) < 3 || strlen(str) > 40) {
+ return false;
+ }
+
+ for (i = 0; i < strlen(str); i++) {
+ if (str[i] != ':' &&
+ ldns_hexdigit_to_int(str[i]) < 0) {
+ return false;
+ }
+ }
+ a = atoi(dot);
+ if (a < 0 || a > 255) {
+ return false;
+ }
+
+ return true;
+}
+
ldns_status
ldns_str2rdf_int16(ldns_rdf **rd, const char *shortstr)
{
}
return NULL;
}
-
int
ldns_get_bit(uint8_t bits[], size_t index)
{
case 'e': case 'E': return 14;
case 'f': case 'F': return 15;
default:
- abort();
+ return -1;
}
}