modules/ims_qos: added patch for flow-description bug when request originates from...
[sip-router] / src / core / parser / parse_sipifmatch.c
1 /*
2  * Copyright (C) 2004 Jamey Hicks, jamey dot hicks at hp dot com
3  *
4  * This file is part of Kamailio, a free SIP server.
5  *
6  * Kamailio is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version
10  *
11  * Kamailio is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
19  */
20
21 /*! \file
22  * \brief Parser :: Parse if-match header
23  *
24  * \ingroup parser
25  */
26
27 #include <string.h>
28
29 #include "parse_sipifmatch.h"
30 #include "../dprint.h"
31 #include "parse_def.h"
32 #include "../mem/mem.h"
33 #include "../trim.h"
34
35 static inline char* skip_token(char* _b, int _l)
36 {
37         int i = 0;
38
39         for(i = 0; i < _l; i++) {
40                 switch(_b[i]) {
41                 case ' ':
42                 case '\r':
43                 case '\n':
44                 case '\t':
45                 case ';':
46                         return _b + i;
47                 }
48         }
49
50         return _b + _l;
51 }
52
53
54 int etag_parser(char *_s, int _l, str *_e)
55 {
56         char* end;
57
58         _e->s = _s;
59         _e->len = _l;
60
61         trim_leading(_e);
62
63         if (_e->len == 0) {
64                 LOG(L_ERR, "etag_parser(): Empty body\n");
65                 return -1;
66         }
67
68         end = skip_token(_e->s, _e->len);
69         _e->len = end - _e->s;
70
71         return 0;
72 }
73
74
75 int parse_sipifmatch(struct hdr_field* _h)
76 {
77         str *e;
78
79         DBG("parse_sipifmatch() called\n");
80
81         if (_h->parsed != 0) {
82                 return 0;
83         }
84
85         e = (str*)pkg_malloc(sizeof(str));
86         if (e == 0) {
87                 LOG(L_ERR, "parse_ifsipmatch(): No memory left\n");
88                 return -1;
89         }
90
91         memset(e, 0, sizeof(str));
92
93         if (etag_parser(_h->body.s, _h->body.len, e) < 0) {
94                 LOG(L_ERR, "parse_sipifmatch(): Error in tag_parser\n");
95                 pkg_free(e);
96                 return -2;
97         }
98
99         _h->parsed = (void*)e;
100         return 0;
101 }
102
103
104 void free_sipifmatch(str** _e)
105 {
106         if (*_e)
107                 pkg_free(*_e);
108         *_e = 0;
109 }