GPLization banner introduced to *.[hc] files
[sip-router] / parser / contact / parse_contact.c
1 /*
2  * $Id$
3  *
4  * Contact header field body parser
5  *
6  * Copyright (C) 2001-2003 Fhg Fokus
7  *
8  * This file is part of ser, a free SIP server.
9  *
10  * ser is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version
14  *
15  * For a license to use the ser software under conditions
16  * other than those described here, or to purchase support for this
17  * software, please contact iptel.org by e-mail at the following addresses:
18  *    info@iptel.org
19  *
20  * ser is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23  * GNU General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public License 
26  * along with this program; if not, write to the Free Software 
27  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
28  */
29
30
31 #include "parse_contact.h"
32 #include "../hf.h"     
33 #include "../../mem/mem.h"   /* pkg_malloc, pkg_free */
34 #include "../../dprint.h"
35 #include <stdio.h>           /* printf */
36 #include "../../trim.h"      /* trim_leading */
37 #include <string.h>          /* memset */
38
39
40 static inline int contact_parser(char* _s, int _l, contact_body_t* _c)
41 {
42         str tmp;
43
44         tmp.s = _s;
45         tmp.len = _l;
46
47         trim_leading(&tmp);
48
49         if (tmp.len == 0) {
50                 LOG(L_ERR, "contact_parser(): Empty body\n");
51                 return -1;
52         }
53
54         if (tmp.s[0] == '*') {
55                 _c->star = 1;
56         } else {
57                 if (parse_contacts(&tmp, &(_c->contacts)) < 0) {
58                         LOG(L_ERR, "contact_parser(): Error while parsing contacts\n");
59                         return -2;
60                 }
61         }
62
63         return 0;
64 }
65
66
67 /*
68  * Parse contact header field body
69  */
70 int parse_contact(struct hdr_field* _h)
71 {
72         contact_body_t* b;
73
74         if (_h->parsed != 0) {
75                 return 0;  /* Already parsed */
76         }
77
78         b = (contact_body_t*)pkg_malloc(sizeof(contact_body_t));
79         if (b == 0) {
80                 LOG(L_ERR, "parse_contact(): No memory left\n");
81                 return -1;
82         }
83
84         memset(b, 0, sizeof(contact_body_t));
85
86         if (contact_parser(_h->body.s, _h->body.len, b) < 0) {
87                 LOG(L_ERR, "parse_contact(): Error while parsing\n");
88                 pkg_free(b);
89                 return -2;
90         }
91
92         _h->parsed = (void*)b;
93         return 0;
94 }
95
96
97 /*
98  * Free all memory
99  */
100 void free_contact(contact_body_t** _c)
101 {
102         if ((*_c)->contacts) {
103                 free_contacts(&((*_c)->contacts));
104         }
105         
106         pkg_free(*_c);
107         *_c = 0;
108 }
109
110
111 /*
112  * Print structure, for debugging only
113  */
114 void print_contact(contact_body_t* _c)
115 {
116         printf("===Contact body===\n");
117         printf("star: %d\n", _c->star);
118         print_contacts(_c->contacts);
119         printf("===/Contact body===\n");
120 }