summaryrefslogtreecommitdiff
path: root/src/rexmpp_jid.c
diff options
context:
space:
mode:
authordefanor <defanor@uberspace.net>2020-11-17 15:07:05 +0300
committerdefanor <defanor@uberspace.net>2020-11-17 15:18:22 +0300
commit48542332c351d21706e61abbd9cb50ce02afac2d (patch)
tree836aa3365f3de12a14bdd7b5ab4188f09eec8815 /src/rexmpp_jid.c
parent0748958c63052a6c4e0fb20a172ae793fdf8fa6c (diff)
Add initial JID parsing
Diffstat (limited to 'src/rexmpp_jid.c')
-rw-r--r--src/rexmpp_jid.c57
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;
+}