siputils(k): fix bug introduced in the sl unification
[sip-router] / modules_k / siputils / options.c
1 /*
2  * $Id$
3  *
4  * Options Reply Module
5  *
6  * Copyright (C) 2001-2003 FhG Fokus
7  *
8  * This file is part of SIP-router, a free SIP server.
9  *
10  * SIP-router 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  * SIP-router is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23  *
24  * History:
25  * -------
26  * 2003-11-11: build_lump_rpl() removed, add_lump_rpl() has flags (bogdan)
27  */
28
29 /*!
30  * \file siputils/options.c
31  * \brief SIP-utils :: Options reply modules
32  * \ingroup siputils
33  * Module: \ref siputils
34  */
35
36 #ifdef EXTRA_DEBUG
37 #include <stdlib.h>   /* required by abort() */
38 #endif
39 #include "options.h"
40 #include "../../ut.h"
41 #include "../../mem/mem.h"
42 #include "../../data_lump_rpl.h"
43 #include "../../parser/parse_uri.h"
44
45 static str opt_200_rpl = str_init("OK");
46 static str opt_500_rpl = str_init("Server internal error");
47
48
49 int opt_reply(struct sip_msg* _msg, char* _foo, char* _bar) {
50         str rpl_hf;
51         int offset = 0;
52
53         /* check if it is called for an OPTIONS request */
54         if (_msg->REQ_METHOD!=METHOD_OPTIONS) {
55                 LM_ERR("called for non-OPTIONS request\n");
56                 return -1;
57         }
58         if(_msg->parsed_uri_ok==0 && parse_sip_msg_uri(_msg)<0)
59         {
60                 LM_ERR("ERROR while parsing the R-URI\n");
61                 return -1;
62         }
63         /* FIXME: should we additionally check if ruri == server addresses ?! */
64         if (_msg->parsed_uri.user.len != 0) {
65                 LM_ERR("ruri contains username\n");
66                 return -1;
67         }
68
69         /* calculate the length and allocated the mem */
70         rpl_hf.len = ACPT_STR_LEN + ACPT_ENC_STR_LEN + ACPT_LAN_STR_LEN + 
71                         SUPT_STR_LEN + 4*HF_SEP_STR_LEN + opt_accept.len + opt_accept_enc.len
72                         + opt_accept_lang.len + opt_supported.len;
73         rpl_hf.s = (char*)pkg_malloc(rpl_hf.len);
74         if (!rpl_hf.s) {
75                 LM_CRIT("out of pkg memory\n");
76                 goto error;
77         }
78
79         /* create the header fields */
80         memcpy(rpl_hf.s, ACPT_STR, ACPT_STR_LEN);
81         offset = ACPT_STR_LEN;
82         memcpy(rpl_hf.s + offset, opt_accept.s, opt_accept.len);
83         offset += opt_accept.len;
84         memcpy(rpl_hf.s + offset, HF_SEP_STR, HF_SEP_STR_LEN);
85         offset += HF_SEP_STR_LEN;
86         memcpy(rpl_hf.s + offset, ACPT_ENC_STR, ACPT_ENC_STR_LEN);
87         offset += ACPT_ENC_STR_LEN;
88         memcpy(rpl_hf.s + offset, opt_accept_enc.s, opt_accept_enc.len);
89         offset += opt_accept_enc.len;
90         memcpy(rpl_hf.s + offset, HF_SEP_STR, HF_SEP_STR_LEN);
91         offset += HF_SEP_STR_LEN;
92         memcpy(rpl_hf.s + offset, ACPT_LAN_STR, ACPT_LAN_STR_LEN);
93         offset += ACPT_LAN_STR_LEN;
94         memcpy(rpl_hf.s + offset, opt_accept_lang.s, opt_accept_lang.len);
95         offset += opt_accept_lang.len;
96         memcpy(rpl_hf.s + offset, HF_SEP_STR, HF_SEP_STR_LEN);
97         offset += HF_SEP_STR_LEN;
98         memcpy(rpl_hf.s + offset, SUPT_STR, SUPT_STR_LEN);
99         offset += SUPT_STR_LEN;
100         memcpy(rpl_hf.s + offset, opt_supported.s, opt_supported.len);
101         offset += opt_supported.len;
102         memcpy(rpl_hf.s + offset, HF_SEP_STR, HF_SEP_STR_LEN);
103
104 #ifdef EXTRA_DEBUG
105         offset += HF_SEP_STR_LEN;
106         if (offset != rpl_hf.len) {
107                 LM_CRIT("headerlength (%i) != offset (%i)\n", rpl_hf.len, offset);
108                 abort();
109         }
110 #endif
111
112
113         if (add_lump_rpl( _msg, rpl_hf.s, rpl_hf.len,
114         LUMP_RPL_HDR|LUMP_RPL_NODUP)!=0) {
115                 if (opt_slb.freply(_msg, 200, &opt_200_rpl) == -1) {
116                         LM_ERR("failed to send 200 via send_reply\n");
117                         return -1;
118                 }
119                 else
120                         return 0;
121         } else {
122                 pkg_free(rpl_hf.s);
123                 LM_ERR("add_lump_rpl failed\n");
124         }
125
126 error:
127         if (opt_slb.freply(_msg, 500, &opt_500_rpl) == -1) {
128                 LM_ERR("failed to send 500 via send_reply\n");
129                 return -1;
130         }
131         else
132                 return 0;
133 }
134