123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- /*
- * Copyright (c) 2004 Juha Heinanen
- *
- * This file is part of ser, a free SIP server.
- *
- * ser is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version
- *
- * ser is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
- /*! \file
- * \brief Parser :: Allow header
- *
- * \ingroup parser
- */
- #include <stdlib.h>
- #include <string.h>
- #include "../dprint.h"
- #include "../mem/mem.h"
- #include "parse_allow.h"
- #include "parse_methods.h"
- #include "msg_parser.h"
-
- /*! \brief
- * This method is used to parse Allow header.
- *
- * \param _hf message header field
- * \return 0 on success, -1 on failure.
- */
- int parse_allow_header(struct hdr_field* _hf)
- {
- struct allow_body* ab = 0;
- if (!_hf) {
- LOG(L_ERR, "parse_allow_header: Invalid parameter value\n");
- return -1;
- }
-
- /* maybe the header is already parsed! */
- if (_hf->parsed) {
- return 0;
- }
- ab = (struct allow_body*)pkg_malloc(sizeof(struct allow_body));
- if (ab == 0) {
- LOG(L_ERR, "ERROR:parse_allow_header: out of pkg_memory\n");
- return -1;
- }
- memset(ab,'\0', sizeof(struct allow_body));
-
- if (parse_methods(&(_hf->body), &(ab->allow)) !=0 ) {
- LOG(L_ERR, "ERROR:parse_allow_header: bad allow body header\n");
- goto error;
- }
-
- ab->allow_all = 0;
- _hf->parsed = (void*)ab;
- return 0;
- error:
- if (ab) pkg_free(ab);
- return -1;
- }
- /*!
- * \brief This method is used to parse all Allow HF body.
- * \param msg sip msg
- * \return 0 on success,-1 on failure.
- */
- int parse_allow(struct sip_msg *msg)
- {
- unsigned int allow;
- struct hdr_field *hdr;
- /* maybe the header is already parsed! */
- if (msg->allow && msg->allow->parsed) {
- return 0;
- }
- /* parse to the end in order to get all ALLOW headers */
- if (parse_headers(msg,HDR_EOH_F,0)==-1 || !msg->allow) {
- return -1;
- }
- allow = 0;
- for(hdr = msg->allow ; hdr ; hdr = next_sibling_hdr(hdr)) {
- if (hdr->parsed == 0) {
- if(parse_allow_header(hdr) < 0) {
- return -1;
- }
- }
- allow |= ((struct allow_body*)hdr->parsed)->allow;
- }
-
- ((struct allow_body*)msg->allow->parsed)->allow_all = allow;
- return 0;
- }
- /*
- * Release memory
- */
- void free_allow_body(struct allow_body **ab)
- {
- if (ab && *ab) {
- pkg_free(*ab);
- *ab = 0;
- }
- }
- void free_allow_header(struct hdr_field* hf)
- {
- free_allow_body((struct allow_body**)(void*)(&(hf->parsed)));
- }
|