changeset 72:9ca6f0708237

libsip: add extract_to_tag() function
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 20 Sep 2022 10:54:10 -0800
parents d74b545a3c2a
children d7b6b8973a83
files libsip/Makefile libsip/to_tag.c
diffstat 2 files changed, 77 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/libsip/Makefile	Tue Sep 20 10:14:18 2022 -0800
+++ b/libsip/Makefile	Tue Sep 20 10:54:10 2022 -0800
@@ -1,7 +1,7 @@
 CC=	gcc
 CFLAGS=	-O2
 OBJS=	get_header.o grok_from.o out_msg.o primary_parse.o req_supp.o sdp_gen.o\
-	sdp_parse.o uas_basic.o uri_utils.o
+	sdp_parse.o to_tag.o uas_basic.o uri_utils.o
 LIB=	libsip.a
 
 all:	${LIB}
--- /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;
+}