comparison libsip/uas_basic.c @ 46:5427b26525cd

libsip: beginning to flesh out
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 06 Sep 2022 20:29:44 -0800
parents
children
comparison
equal deleted inserted replaced
45:f1cf80c7e243 46:5427b26525cd
1 /*
2 * Here we implement some essential UAS functions.
3 */
4
5 #include <ctype.h>
6 #include <string.h>
7 #include <strings.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include "parse.h"
11 #include "uas_basic.h"
12 #include "out_msg.h"
13
14 extern char *get_single_header();
15
16 uas_get_basic_headers(msg, ess)
17 struct sip_pkt_rx *msg;
18 struct uas_parse_hdrs *ess;
19 {
20 char *hval, *cp;
21 int dup_flag = 0;
22
23 hval = get_single_header(msg, "Call-ID", "i", &dup_flag);
24 if (!hval || dup_flag) {
25 ess->error_field = "Call-ID";
26 return(-1);
27 }
28 ess->call_id = hval;
29 hval = get_single_header(msg, "CSeq", (char *) 0, &dup_flag);
30 if (!hval || dup_flag) {
31 bad_cseq: ess->error_field = "CSeq";
32 return(-1);
33 }
34 if (!isdigit(*hval))
35 goto bad_cseq;
36 ess->cseq_num = strtoul(hval, &cp, 10);
37 if (*cp) {
38 if (!isspace(*cp))
39 goto bad_cseq;
40 while (isspace(*cp))
41 cp++;
42 if (strcmp(cp, msg->req_method))
43 goto bad_cseq;
44 }
45 hval = get_single_header(msg, "From", "f", &dup_flag);
46 if (!hval || dup_flag) {
47 ess->error_field = "From";
48 return(-1);
49 }
50 ess->from = hval;
51 hval = get_single_header(msg, "To", "t", &dup_flag);
52 if (!hval || dup_flag) {
53 ess->error_field = "To";
54 return(-1);
55 }
56 ess->to = hval;
57 hval = get_single_header(msg, "Via", "v", &dup_flag);
58 if (!hval || dup_flag) {
59 ess->error_field = "Via";
60 return(-1);
61 }
62 ess->via = hval;
63 return(0);
64 }
65
66 add_resp_basic_headers(msg, ess, req_method)
67 struct sip_msg_out *msg;
68 struct uas_parse_hdrs *ess;
69 char *req_method;
70 {
71 char cseq_str[80];
72 int rc;
73
74 rc = out_msg_add_header(msg, "From", ess->from);
75 if (rc < 0)
76 return rc;
77 rc = out_msg_add_header(msg, "To", ess->to);
78 if (rc < 0)
79 return rc;
80 rc = out_msg_add_header(msg, "Call-ID", ess->call_id);
81 if (rc < 0)
82 return rc;
83 sprintf(cseq_str, "%u %.64s", ess->cseq_num, req_method);
84 rc = out_msg_add_header(msg, "CSeq", cseq_str);
85 if (rc < 0)
86 return rc;
87 return out_msg_add_header(msg, "Via", ess->via);
88 }