00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef _SER_USR_AVP_H_
00035 #define _SER_USR_AVP_H_
00036
00037 #include <sys/types.h>
00038 #include <regex.h>
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 #include "str.h"
00060
00061
00062 #define AVP_UID "uid"
00063 #define AVP_DID "did"
00064 #define AVP_REALM "digest_realm"
00065 #define AVP_FR_TIMER "fr_timer"
00066 #define AVP_FR_INV_TIMER "fr_inv_timer"
00067 #define AVP_RPID "rpid"
00068 #define AVP_GFLAGS "gflags"
00069
00070 struct str_int_data {
00071 str name;
00072 int val;
00073 };
00074
00075 struct str_str_data {
00076 str name;
00077 str val;
00078 };
00079
00080 typedef union {
00081 int n;
00082 str s;
00083 regex_t* re;
00084 } int_str;
00085
00086 #define avp_id_t unsigned short
00087 #define avp_flags_t unsigned int
00088 #define avp_name_t int_str
00089 #define avp_value_t int_str
00090 #define avp_index_t unsigned short
00091
00092 union usr_avp_data{
00093 void *p;
00094 long l;
00095 char data[sizeof(void*)];
00096 };
00097
00098 typedef struct usr_avp {
00099 avp_id_t id;
00100
00101 avp_flags_t flags;
00102 struct usr_avp *next;
00103 union usr_avp_data d;
00104 } avp_t;
00105
00106 typedef avp_t* avp_list_t;
00107
00108
00109 typedef struct avp_ident {
00110 avp_flags_t flags;
00111 avp_name_t name;
00112 avp_index_t index;
00113 } avp_ident_t;
00114
00115
00116
00117
00118 struct search_state {
00119 avp_flags_t flags;
00120 avp_id_t id;
00121 avp_name_t name;
00122 avp_t* avp;
00123
00124 };
00125
00126
00127 typedef struct avp_spec {
00128 avp_flags_t type;
00129 avp_name_t name;
00130 avp_index_t index;
00131 } avp_spec_t;
00132
00133
00134 #define AVP_NAME_STR (1<<0)
00135 #define AVP_VAL_STR (1<<1)
00136 #define AVP_NAME_RE (1<<2)
00137
00138
00139 #define AVP_CLASS_URI (1<<4)
00140 #define AVP_CLASS_USER (1<<5)
00141 #define AVP_CLASS_DOMAIN (1<<6)
00142 #define AVP_CLASS_GLOBAL (1<<7)
00143
00144
00145 #define AVP_TRACK_FROM (1<<8)
00146 #define AVP_TRACK_TO (1<<9)
00147 #define AVP_TRACK_ALL (AVP_TRACK_FROM|AVP_TRACK_TO)
00148
00149 #define AVP_CLASS_ALL (AVP_CLASS_URI|AVP_CLASS_USER|AVP_CLASS_DOMAIN|AVP_CLASS_GLOBAL)
00150
00151
00152 #define AVP_INDEX_FORWARD (1<<10)
00153 #define AVP_INDEX_BACKWARD (1<<11)
00154 #define AVP_INDEX_ALL (AVP_INDEX_FORWARD | AVP_INDEX_BACKWARD)
00155
00156
00157
00158
00159
00160 #define AVP_CUSTOM_FLAGS 13
00161
00162 #define GALIAS_CHAR_MARKER '$'
00163
00164 #define AVP_NAME_VALUE_MASK 0x0007
00165 #define AVP_CORE_MASK 0x00ff
00166 #define AVP_SCRIPT_MASK 0xff00
00167 #define avp_core_flags(f) ((f)&0x00ff)
00168 #define avp_script_flags(f) (((f)<<8)&0xff00)
00169 #define avp_get_script_flags(f) (((f)&0xff00)>>8)
00170
00171 #define is_avp_str_name(a) ((a)->flags&AVP_NAME_STR)
00172 #define is_avp_str_val(a) ((a)->flags&AVP_VAL_STR)
00173
00174
00175 #define AVP_IS_ASSIGNABLE(ident) ( ((ident).flags & AVP_NAME_RE) == 0 && (((ident).flags & AVP_NAME) == 0 || (((ident)->flags & AVP_NAME) && (ident).name.s.len)) )
00176
00177 int init_avps(void);
00178
00179
00180 int add_avp(avp_flags_t flags, avp_name_t name, avp_value_t val);
00181 int add_avp_before(avp_t *avp, avp_flags_t flags, avp_name_t name, avp_value_t val);
00182 int add_avp_list(avp_list_t* list, avp_flags_t flags, avp_name_t name, avp_value_t val);
00183
00184
00185 void delete_avp(avp_flags_t flags, avp_name_t name);
00186
00187 int destroy_avps(avp_flags_t flags, avp_name_t name, int all);
00188
00189
00190 avp_t *search_first_avp( avp_flags_t flags, avp_name_t name,
00191 avp_value_t *val, struct search_state* state);
00192 avp_t *search_avp_by_index( avp_flags_t flags, avp_name_t name,
00193 avp_value_t *val, avp_index_t index);
00194
00195 avp_t *search_avp (avp_ident_t ident, avp_value_t* val, struct search_state* state);
00196 avp_t *search_next_avp(struct search_state* state, avp_value_t *val);
00197
00198
00199 int reset_avp_list(int flags);
00200
00201
00202 void reset_avps(void);
00203
00204 void destroy_avp(avp_t *avp);
00205 void destroy_avp_list(avp_list_t *list );
00206 void destroy_avp_list_unsafe(avp_list_t *list );
00207
00208
00209 void get_avp_val(avp_t *avp, avp_value_t *val );
00210 str* get_avp_name(avp_t *avp);
00211
00212 avp_list_t get_avp_list(avp_flags_t flags);
00213 avp_list_t* set_avp_list(avp_flags_t flags, avp_list_t* list);
00214
00215
00216
00217 int add_avp_galias_str(char *alias_definition);
00218 int lookup_avp_galias(str *alias, int *type, int_str *avp_name);
00219 int add_avp_galias(str *alias, int type, int_str avp_name);
00220 int parse_avp_ident( str *name, avp_ident_t* attr);
00221 int parse_avp_name( str *name, int *type, int_str *avp_name, int *index);
00222 int parse_avp_spec( str *name, int *type, int_str *avp_name, int *index);
00223 int km_parse_avp_spec( str *name, int *type, int_str *avp_name);
00224 void free_avp_name( avp_flags_t *type, int_str *avp_name);
00225
00226 void free_avp_ident(avp_ident_t* attr);
00227
00228
00229 #define MAX_AVPFLAG ((unsigned int)( sizeof(avp_flags_t) * CHAR_BIT - 1 - AVP_CUSTOM_FLAGS))
00230
00231 avp_flags_t register_avpflag(char* name);
00232 avp_flags_t get_avpflag_no(char* name);
00233
00234 #endif