summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVadim Kochan <vadim4j@gmail.com>2017-06-01 13:12:27 +0300
committerTobias Klauser <tklauser@distanz.ch>2017-06-02 09:15:21 +0200
commita2524f2bc9c0e8651221ba88b6013db55cec0190 (patch)
tree80cca6f9742519e18bbad787042069b8e9ad8810
parent906cb247a831e37665a19e2c6b41b7cfd4c6621b (diff)
str: Add function for converting string into DNS name
Add str2fqdn for converting hostname string into DNS name notation: www.xxxx.yy.com -> 3www4xxxx2yy3com0 Returned string must be freed after use by the caller. Signed-off-by: Vadim Kochan <vadim4j@gmail.com> Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
-rw-r--r--str.c37
-rw-r--r--str.h1
2 files changed, 38 insertions, 0 deletions
diff --git a/str.c b/str.c
index 532058a..1d3e7ac 100644
--- a/str.c
+++ b/str.c
@@ -160,3 +160,40 @@ int str2mac(const char *str, uint8_t *mac, size_t len)
return 0;
}
+
+char *str2fqdn(const char *str)
+{
+ size_t slen = strlen(str);
+ size_t flen = 0;
+ char *fqdn;
+ char *tmp;
+ char *dup;
+ int i = 0;
+ int c = 0;
+
+ dup = xstrdup(str);
+ tmp = dup;
+
+ fqdn = xzmalloc(slen + 2);
+
+ while (tmp <= dup + slen && c++ <= slen) {
+ if (tmp[i] == '.' || tmp[i] == '\0') {
+ size_t dlen;
+
+ tmp[i] = '\0';
+ dlen = strlen(tmp);
+ fqdn[flen] = dlen;
+ memcpy(&fqdn[flen + 1], tmp, dlen);
+ flen += dlen + 1;
+ tmp += dlen + 1;
+ i = 0;
+
+ continue;
+ }
+
+ i++;
+ }
+
+ xfree(dup);
+ return fqdn;
+}
diff --git a/str.h b/str.h
index 7879af6..a362c53 100644
--- a/str.h
+++ b/str.h
@@ -14,5 +14,6 @@ extern char *argv2str(int startind, int argc, char **argv);
extern char **argv_insert(char **argv, size_t *count, const char *str);
extern void argv_free(char **argv);
extern int str2mac(const char *str, uint8_t *mac, size_t len);
+extern char *str2fqdn(const char *str);
#endif /* STR_H */