diff options
author | defanor <defanor@uberspace.net> | 2020-11-17 15:07:05 +0300 |
---|---|---|
committer | defanor <defanor@uberspace.net> | 2020-11-17 15:18:22 +0300 |
commit | 48542332c351d21706e61abbd9cb50ce02afac2d (patch) | |
tree | 836aa3365f3de12a14bdd7b5ab4188f09eec8815 /src/rexmpp_jid.c | |
parent | 0748958c63052a6c4e0fb20a172ae793fdf8fa6c (diff) |
Add initial JID parsing
Diffstat (limited to 'src/rexmpp_jid.c')
-rw-r--r-- | src/rexmpp_jid.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/rexmpp_jid.c b/src/rexmpp_jid.c new file mode 100644 index 0000000..44e2754 --- /dev/null +++ b/src/rexmpp_jid.c @@ -0,0 +1,57 @@ +/** + @file rexmpp_jid.c + @brief JID parsing and manipulation + @author defanor <defanor@uberspace.net> + @date 2020 + @copyright MIT license. +*/ + +#include <stddef.h> +#include <string.h> +#include "rexmpp_jid.h" + +int rexmpp_jid_parse (const char *str, struct rexmpp_jid *jid) { + const char *resource = NULL, *domain = NULL; + size_t i; + size_t resource_len = 0, local_len = 0; + size_t domain_len, bare_len, full_len = strlen(str); + domain_len = full_len; + bare_len = full_len; + + /* Find the separators. */ + for (i = 0; i < full_len; i++) { + if (local_len == 0 && str[i] == '@') { + local_len = i; + domain_len -= local_len + 1; + domain = str + i + 1; + } + if (str[i] == '/') { + resource_len = full_len - i - 1; + domain_len -= resource_len + 1; + bare_len -= resource_len + 1; + resource = str + i + 1; + break; + } + } + + /* Check all the lengths. */ + if (full_len > 3071 || bare_len > 2047 || + local_len > 1023 || resource_len > 1023 || + domain_len > 1023 || domain_len < 1) { + return -1; + } + + /* Copy all the parts. */ + strncpy(jid->full, str, full_len); + jid->full[full_len] = '\0'; + strncpy(jid->bare, str, bare_len); + jid->bare[bare_len] = '\0'; + strncpy(jid->local, str, local_len); + jid->local[local_len] = '\0'; + strncpy(jid->domain, domain, domain_len); + jid->domain[domain_len] = '\0'; + strncpy(jid->resource, resource, resource_len); + jid->resource[resource_len] = '\0'; + + return 0; +} |