diff libsip/to_tag.c @ 72:9ca6f0708237

libsip: add extract_to_tag() function
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 20 Sep 2022 10:54:10 -0800
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libsip/to_tag.c	Tue Sep 20 10:54:10 2022 -0800
@@ -0,0 +1,76 @@
+/*
+ * The function implemented in this module extracts the tag
+ * from the To header of a SIP destination server's response.
+ */
+
+#include <ctype.h>
+#include <string.h>
+#include <strings.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "parse.h"
+
+extern char *get_single_header();
+
+char *
+extract_to_tag(msg, expect_uri)
+	struct sip_pkt_rx *msg;
+	char *expect_uri;
+{
+	char *cp, *tag;
+	int bracketed, c;
+	unsigned expect_uri_len;
+
+	cp = get_single_header(msg, "To", "t", (int *) 0);
+	if (!cp)
+		return 0;
+	if (*cp == '<') {
+		cp++;
+		bracketed = 1;
+	} else
+		bracketed = 0;
+	expect_uri_len = strlen(expect_uri);
+	if (strncasecmp(cp, expect_uri, expect_uri_len))
+		return 0;
+	cp += expect_uri_len;
+	if (bracketed) {
+		if (*cp++ != '>')
+			return 0;
+	}
+	while (isspace(*cp))
+		cp++;
+	if (*cp++ != ';')
+		return 0;
+	while (isspace(*cp))
+		cp++;
+	if (strncasecmp(cp, "tag", 3))
+		return 0;
+	cp += 3;
+	while (isspace(*cp))
+		cp++;
+	if (*cp++ != '=')
+		return 0;
+	while (isspace(*cp))
+		cp++;
+	tag = cp;
+	for (; c = *cp; cp++) {
+		switch (c) {
+		case '-':
+		case '.':
+		case '!':
+		case '%':
+		case '*':
+		case '_':
+		case '+':
+		case '`':
+		case '\'':
+		case '~':
+			continue;
+		default:
+			if (isalnum(c))
+				continue;
+			return 0;
+		}
+	}
+	return tag;
+}