aboutsummaryrefslogtreecommitdiff
path: root/dns_dtda.c
diff options
context:
space:
mode:
Diffstat (limited to 'dns_dtda.c')
-rw-r--r--dns_dtda.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/dns_dtda.c b/dns_dtda.c
new file mode 100644
index 0000000..ba1db4f
--- /dev/null
+++ b/dns_dtda.c
@@ -0,0 +1,35 @@
+#include "stralloc.h"
+#include "dns.h"
+
+int dns_domain_todot_cat(stralloc *out,const char *d)
+{
+ char ch;
+ char ch2;
+ unsigned char ch3;
+ char buf[4];
+
+ if (!*d)
+ return stralloc_append(out,".");
+
+ for (;;) {
+ ch = *d++;
+ while (ch--) {
+ ch2 = *d++;
+ if ((ch2 >= 'A') && (ch2 <= 'Z'))
+ ch2 += 32;
+ if (((ch2 >= 'a') && (ch2 <= 'z')) || ((ch2 >= '0') && (ch2 <= '9')) || (ch2 == '-') || (ch2 == '_')) {
+ if (!stralloc_append(out,&ch2)) return 0;
+ }
+ else {
+ ch3 = ch2;
+ buf[3] = '0' + (ch3 & 7); ch3 >>= 3;
+ buf[2] = '0' + (ch3 & 7); ch3 >>= 3;
+ buf[1] = '0' + (ch3 & 7);
+ buf[0] = '\\';
+ if (!stralloc_catb(out,buf,4)) return 0;
+ }
+ }
+ if (!*d) return 1;
+ if (!stralloc_append(out,".")) return 0;
+ }
+}