summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 */