511b05626aa2a11f9dc9c6a08f35eb93a6867692
[sip-router] / flags.c
1 /*
2  * $Id$
3  */
4
5 #include <limits.h>
6 #include "sr_module.h"
7 #include "dprint.h"
8 #include "parser/msg_parser.h"
9 #include "flags.h"
10 #include "error.h"
11 #include "stdlib.h"
12
13 int setflag( struct sip_msg* msg, flag_t flag ) {
14         msg->flags |= 1 << flag;
15         return 1;
16 }
17
18 int resetflag( struct sip_msg* msg, flag_t flag ) {
19         msg->flags &= ~ (1 << flag);
20         return 1;
21 }
22
23 int isflagset( struct sip_msg* msg, flag_t flag ) {
24         return (msg->flags & (1<<flag)) ? 1 : -1;
25 }
26
27 int flag_in_range( flag_t flag ) {
28         if (flag > MAX_FLAG ) {
29                 LOG(L_ERR, "ERROR: message flag %d too high; MAX=%d\n",
30                         flag, MAX_FLAG );
31                 return 0;
32         }
33         if (flag<=0) {
34                 LOG(L_ERR, "ERROR: message flag (%d) must be in range %d..%d\n",
35                         flag, 1, MAX_FLAG );
36                 return 0;
37         }
38         return 1;
39 }
40
41
42 #ifdef _GET_AWAY
43
44 /* wrapping functions for flag processing  */
45 static int fixup_t_flag(void** param, int param_no)
46 {
47     unsigned int *code;
48         char *c;
49         int token;
50
51         DBG("DEBUG: fixing flag: %s\n", (char *) (*param));
52
53         if (param_no!=1) {
54                 LOG(L_ERR, "ERROR: TM module: only parameter #1 for flags can be fixed\n");
55                 return E_BUG;
56         };
57
58         if ( !(code = malloc( sizeof( unsigned int) )) ) return E_OUT_OF_MEM;
59
60         *code = 0;
61         c = *param;
62         while ( *c && (*c==' ' || *c=='\t')) c++; /* intial whitespaces */
63
64         token=1;
65         if (strcasecmp(c, "white")==0) *code=FL_WHITE;
66         else if (strcasecmp(c, "yellow")==0) *code=FL_YELLOW;
67         else if (strcasecmp(c, "green")==0) *code=FL_GREEN;
68         else if (strcasecmp(c, "red")==0) *code=FL_RED;
69         else if (strcasecmp(c, "blue")==0) *code=FL_BLUE;
70         else if (strcasecmp(c, "magenta")==0) *code=FL_MAGENTA;
71         else if (strcasecmp(c, "brown")==0) *code=FL_BROWN;
72         else if (strcasecmp(c, "black")==0) *code=FL_BLACK;
73         else if (strcasecmp(c, "acc")==0) *code=FL_ACC;
74         else {
75                 token=0;
76                 while ( *c && *c>='0' && *c<='9' ) {
77                         *code = *code*10+ *c-'0';
78                         if (*code > (sizeof( flag_t ) * CHAR_BIT - 1 )) {
79                                 LOG(L_ERR, "ERROR: TM module: too big flag number: %s; MAX=%d\n",
80                                         (char *) (*param), sizeof( flag_t ) * CHAR_BIT - 1 );
81                                 goto error;
82                         }
83                         c++;
84                 }
85         }
86         while ( *c && (*c==' ' || *c=='\t')) c++; /* terminating whitespaces */
87
88         if ( *code == 0 ) {
89                 LOG(L_ERR, "ERROR: TM module: bad flag number: %s\n", (char *) (*param));
90                 goto error;
91         }
92
93         if (*code < FL_MAX && token==0) {
94                 LOG(L_ERR, "ERROR: TM module: too high flag number: %s (%d)\n; lower number"
95                         " bellow %d reserved\n", (char *) (*param), *code, FL_MAX );
96                 goto error;
97         }
98
99         /* free string */
100         free( *param );
101         /* fix now */
102         *param = code;
103         
104         return 0;
105
106 error:
107         free( code );
108         return E_CFG;
109 }
110
111
112 #endif