Change priority from extra to optional in debian/control.
[debian/iodine.git] / src / encoding.c
index 127e87190050b9697cf1c023855ae3b6af9d7fe6..af7620ea5919084b211c6e3db356fe87427b7cd1 100644 (file)
@@ -1,5 +1,6 @@
 /*
- * Copyright (c) 2006-2007 Bjorn Andersson <flex@kryo.se>, Erik Ekman <yarrick@kryo.se>
+ * Copyright (c) 2006-2014 Erik Ekman <yarrick@kryo.se>,
+ * 2006-2009 Bjorn Andersson <flex@kryo.se>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
  */
 
 #include <string.h>
+#include "common.h"
 #include "encoding.h"
 
+int
+build_hostname(char *buf, size_t buflen,
+               const char *data, const size_t datalen,
+               const char *topdomain, struct encoder *encoder, int maxlen)
+{
+       size_t space;
+       char *b;
+
+       space = MIN((size_t)maxlen, buflen) - strlen(topdomain) - 8;
+       /* 8 = 5 max header length + 1 dot before topdomain + 2 safety */
+
+       if (!encoder->places_dots())
+               space -= (space / 57); /* space for dots */
+
+       memset(buf, 0, buflen);
+
+       encoder->encode(buf, &space, data, datalen);
+
+       if (!encoder->places_dots())
+               inline_dotify(buf, buflen);
+
+       b = buf;
+       b += strlen(buf);
+
+       /* move b back one step to see if the dot is there */
+       b--;
+       if (*b != '.')
+               *++b = '.';
+       b++;
+       /* move b ahead of the string so we can copy to it */
+
+       strncpy(b, topdomain, strlen(topdomain)+1);
+
+       return space;
+}
 
 int
 unpack_data(char *buf, size_t buflen, char *data, size_t datalen, struct encoder *enc)
@@ -26,7 +63,7 @@ unpack_data(char *buf, size_t buflen, char *data, size_t datalen, struct encoder
        return enc->decode(buf, &buflen, data, datalen);
 }
 
-int 
+int
 inline_dotify(char *buf, size_t buflen)
 {
        unsigned dots;
@@ -35,7 +72,7 @@ inline_dotify(char *buf, size_t buflen)
        char *reader, *writer;
 
        total = strlen(buf);
-       dots = total / 62;
+       dots = total / 57;
 
        writer = buf;
        writer += total;
@@ -52,19 +89,19 @@ inline_dotify(char *buf, size_t buflen)
        pos = (unsigned) (reader - buf) + 1;
 
        while (dots) {
-               if (pos % 62 == 0) {
+               *writer-- = *reader--;
+               pos--;
+               if (pos % 57 == 0) {
                        *writer-- = '.';
                        dots--;
                }
-               *writer-- = *reader--;
-               pos--;
        }
 
        /* return new length of string */
        return total;
 }
 
-int 
+int
 inline_undotify(char *buf, size_t len)
 {
        unsigned pos;
@@ -87,7 +124,7 @@ inline_undotify(char *buf, size_t len)
                *writer++ = *reader++;
                pos++;
        }
-       
+
        /* return new length of string */
        return len - dots;
 }