diff options
author | Vadim Kochan <vadim4j@gmail.com> | 2017-06-01 13:12:27 +0300 |
---|---|---|
committer | Tobias Klauser <tklauser@distanz.ch> | 2017-06-02 09:15:21 +0200 |
commit | a2524f2bc9c0e8651221ba88b6013db55cec0190 (patch) | |
tree | 80cca6f9742519e18bbad787042069b8e9ad8810 | |
parent | 906cb247a831e37665a19e2c6b41b7cfd4c6621b (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.c | 37 | ||||
-rw-r--r-- | str.h | 1 |
2 files changed, 38 insertions, 0 deletions
@@ -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; +} @@ -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 */ |