modules/ims_qos: added patch for flow-description bug when request originates from...
[sip-router] / parser / parse_rpid.c
1 /*
2  * Copyright (C) 2001-2003 Juha Heinanen
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 :: Remote-party-id: header parser
23  *
24  * \ingroup parser
25  */
26  
27 #include "parse_from.h"
28 #include "parse_to.h"
29 #include <stdlib.h>
30 #include <string.h>
31 #include "../dprint.h"
32 #include "msg_parser.h"
33 #include "../ut.h"
34 #include "../mem/mem.h"
35
36  
37 /*! \brief
38  * This method is used to parse RPID header.
39  *
40  * params: msg : sip msg
41  * returns 0 on success,
42  *        -1 on failure.
43  */
44 int parse_rpid_header( struct sip_msg *msg )
45 {
46         struct to_body* rpid_b;
47         
48         if ( !msg->rpid && (parse_headers(msg, HDR_RPID_F, 0)==-1 || !msg->rpid)) {
49                 goto error;
50         }
51  
52         /* maybe the header is already parsed! */
53         if (msg->rpid->parsed)
54                 return 0;
55  
56         /* bad luck! :-( - we have to parse it */
57         /* first, get some memory */
58         rpid_b = pkg_malloc(sizeof(struct to_body));
59         if (rpid_b == 0) {
60                 LOG(L_ERR, "ERROR:parse_rpid_header: out of pkg_memory\n");
61                 goto error;
62         }
63  
64         /* now parse it!! */
65         memset(rpid_b, 0, sizeof(struct to_body));
66         parse_to(msg->rpid->body.s,msg->rpid->body.s+msg->rpid->body.len+1,rpid_b);
67         if (rpid_b->error == PARSE_ERROR) {
68                 LOG(L_ERR, "ERROR:parse_rpid_header: bad rpid header\n");
69                 free_to(rpid_b);
70                 goto error;
71         }
72         msg->rpid->parsed = rpid_b;
73  
74         return 0;
75  error:
76         return -1;
77 }