- Spelling checked
[sip-router] / flags.c
1 /*
2  * $Id$
3  *
4  * Copyright (C) 2001-2003 FhG Fokus
5  *
6  * This file is part of ser, a free SIP server.
7  *
8  * ser is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version
12  *
13  * For a license to use the ser software under conditions
14  * other than those described here, or to purchase support for this
15  * software, please contact iptel.org by e-mail at the following addresses:
16  *    info@iptel.org
17  *
18  * ser is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License 
24  * along with this program; if not, write to the Free Software 
25  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26  */
27 /*
28  * History:
29  * --------
30  *  2003-03-19  replaced all mallocs/frees w/ pkg_malloc/pkg_free (andrei)
31  */
32
33
34 #include <limits.h>
35 #include "sr_module.h"
36 #include "dprint.h"
37 #include "parser/msg_parser.h"
38 #include "flags.h"
39 #include "error.h"
40 #include "stdlib.h"
41
42 int setflag( struct sip_msg* msg, flag_t flag ) {
43         msg->flags |= 1 << flag;
44         return 1;
45 }
46
47 int resetflag( struct sip_msg* msg, flag_t flag ) {
48         msg->flags &= ~ (1 << flag);
49         return 1;
50 }
51
52 int isflagset( struct sip_msg* msg, flag_t flag ) {
53         return (msg->flags & (1<<flag)) ? 1 : -1;
54 }
55
56 int flag_in_range( flag_t flag ) {
57         if (flag > MAX_FLAG ) {
58                 LOG(L_ERR, "ERROR: message flag %d too high; MAX=%d\n",
59                         flag, MAX_FLAG );
60                 return 0;
61         }
62         if (flag<=0) {
63                 LOG(L_ERR, "ERROR: message flag (%d) must be in range %d..%d\n",
64                         flag, 1, MAX_FLAG );
65                 return 0;
66         }
67         return 1;
68 }
69
70
71 #ifdef _GET_AWAY
72
73 /* wrapping functions for flag processing  */
74 static int fixup_t_flag(void** param, int param_no)
75 {
76     unsigned int *code;
77         char *c;
78         int token;
79
80         DBG("DEBUG: fixing flag: %s\n", (char *) (*param));
81
82         if (param_no!=1) {
83                 LOG(L_ERR, "ERROR: TM module: only parameter #1 for flags can be"
84                                         " fixed\n");
85                 return E_BUG;
86         };
87
88         if ( !(code =pkg_malloc( sizeof( unsigned int) )) ) return E_OUT_OF_MEM;
89
90         *code = 0;
91         c = *param;
92         while ( *c && (*c==' ' || *c=='\t')) c++; /* initial whitespaces */
93
94         token=1;
95         if (strcasecmp(c, "white")==0) *code=FL_WHITE;
96         else if (strcasecmp(c, "yellow")==0) *code=FL_YELLOW;
97         else if (strcasecmp(c, "green")==0) *code=FL_GREEN;
98         else if (strcasecmp(c, "red")==0) *code=FL_RED;
99         else if (strcasecmp(c, "blue")==0) *code=FL_BLUE;
100         else if (strcasecmp(c, "magenta")==0) *code=FL_MAGENTA;
101         else if (strcasecmp(c, "brown")==0) *code=FL_BROWN;
102         else if (strcasecmp(c, "black")==0) *code=FL_BLACK;
103         else if (strcasecmp(c, "acc")==0) *code=FL_ACC;
104         else {
105                 token=0;
106                 while ( *c && *c>='0' && *c<='9' ) {
107                         *code = *code*10+ *c-'0';
108                         if (*code > (sizeof( flag_t ) * CHAR_BIT - 1 )) {
109                                 LOG(L_ERR, "ERROR: TM module: too big flag number: %s; MAX=%d\n",
110                                         (char *) (*param), sizeof( flag_t ) * CHAR_BIT - 1 );
111                                 goto error;
112                         }
113                         c++;
114                 }
115         }
116         while ( *c && (*c==' ' || *c=='\t')) c++; /* terminating whitespaces */
117
118         if ( *code == 0 ) {
119                 LOG(L_ERR, "ERROR: TM module: bad flag number: %s\n", (char *) (*param));
120                 goto error;
121         }
122
123         if (*code < FL_MAX && token==0) {
124                 LOG(L_ERR, "ERROR: TM module: too high flag number: %s (%d)\n; lower number"
125                         " bellow %d reserved\n", (char *) (*param), *code, FL_MAX );
126                 goto error;
127         }
128
129         /* free string */
130         pkg_free( *param );
131         /* fix now */
132         *param = code;
133         
134         return 0;
135
136 error:
137         pkg_free( code );
138         return E_CFG;
139 }
140
141
142 #endif