/* aestetics: I like keywords separated from user attributes */
static AVPL* all_keywords = NULL;
+/* configuration error */
+GString* config_error;
+
+static void report_error(guint8* fmt, ...) {
+ static guint8 error_buffer[DEBUG_BUFFER_SIZE];
+
+ va_list list;
+
+ va_start( list, fmt );
+ g_vsnprintf(error_buffer,DEBUG_BUFFER_SIZE,fmt,list);
+ va_end( list );
+
+ g_string_append(config_error,error_buffer);
+ g_string_append_c(config_error,'\n');
+
+}
+
/* use as: setting = extract_named_xxx(avpl,keyword,default_value); */
static int extract_named_int(AVPL* avpl, guint8* keyword, int value) {
AVP* avp = NULL;
if (action) {
if ( ! action(avpl) ) {
- g_warning("MATE: Error on: %s",avpl->name);
+ report_error("MATE: Error on: %s",avpl->name);
return FALSE;
}
} else {
- g_warning("MATE: action '%s' unknown in: %s",name,avpl->name);
+ report_error("MATE: action '%s' unknown in: %s",name,avpl->name);
return FALSE;
}
}
return TRUE;
} else {
- g_warning("MATE: error reading config file: %s",loal->name);
+ report_error("MATE: error reading config file: %s",loal->name);
return FALSE;
}
}
if (( as = g_hash_table_lookup(where,ip) )) {
g_free(ip);
if (! g_str_equal(as,how)) {
- g_warning("MATE Error: add field to Pdu: attempt to add %s(%i) as %s"
+ report_error("MATE Error: add field to Pdu: attempt to add %s(%i) as %s"
" failed: field already added as '%s'",what,hfi->id,how,as);
return FALSE;
}
}
if (! exists) {
- g_warning("MATE Error: cannot find field %s",what);
+ report_error("MATE Error: cannot find field %s",what);
}
return exists;
AVP* attr_avp;
if (! name ) {
- g_warning("MATE: PduDef: No Name in: %s",avpl->name);
+ report_error("MATE: PduDef: No Name in: %s",avpl->name);
return FALSE;
}
if (! cfg) {
cfg = new_pducfg(name);
} else {
- g_warning("MATE: PduDef: No such PDU: '%s' in: %s",cfg->name,avpl->name);
+ report_error("MATE: PduDef: No such PDU: '%s' in: %s",cfg->name,avpl->name);
return FALSE;
}
if (hfi) {
cfg->hfid_proto = hfi->id;
} else {
- g_warning("MATE: PduDef: no such proto: '%s' in: %s",proto,avpl->name);
+ report_error("MATE: PduDef: no such proto: '%s' in: %s",proto,avpl->name);
return FALSE;
}
g_ptr_array_add(cfg->hfid_ranges,(gpointer)hfidp);
g_string_sprintfa(matecfg->mate_attrs_filter, "||%s",transports[i]);
} else {
- g_warning("MATE: PduDef: no such proto: '%s' for Transport in: %s",proto,avpl->name);
+ report_error("MATE: PduDef: no such proto: '%s' for Transport in: %s",proto,avpl->name);
g_strfreev(transports);
return FALSE;
}
g_strfreev(transports);
}
} else {
- g_warning("MATE: PduDef: no Transport for '%s' in: %s",cfg->name,avpl->name);
+ report_error("MATE: PduDef: no Transport for '%s' in: %s",cfg->name,avpl->name);
return FALSE;
}
while (( attr_avp = extract_first_avp(avpl) )) {
if ( ! add_hfid(attr_avp->v,attr_avp->n,cfg->hfids_attr) ) {
- g_warning("MATE: PduDef: failed to set PDU attribute '%s' in: %s",attr_avp->n,avpl->name);
+ report_error("MATE: PduDef: failed to set PDU attribute '%s' in: %s",attr_avp->n,avpl->name);
return FALSE;
}
g_string_sprintfa(matecfg->mate_attrs_filter, "||%s",attr_avp->v);
mate_cfg_pdu* cfg = lookup_using_index_avp(avpl,KEYWORD_FOR,matecfg->pducfgs,&name);
if (! name ) {
- g_warning("MATE: PduExtra: No For in: %s",avpl->name);
+ report_error("MATE: PduExtra: No For in: %s",avpl->name);
return FALSE;
}
if (! cfg) {
- g_warning("MATE: PduExtra: no such Pdu '%s' in: %s",name,avpl->name);
+ report_error("MATE: PduExtra: no such Pdu '%s' in: %s",name,avpl->name);
return FALSE;
}
while (( attr_avp = extract_first_avp(avpl) )) {
if ( ! add_hfid(attr_avp->v,attr_avp->n,cfg->hfids_attr) ) {
- g_warning("MATE: PduExtra: failed to set attr '%s' in: %s",attr_avp->n,avpl->name);
+ report_error("MATE: PduExtra: failed to set attr '%s' in: %s",attr_avp->n,avpl->name);
delete_avp(attr_avp);
return FALSE;
}
guint8* mode = extract_named_str(avpl, KEYWORD_MODE, NULL);
if (! name ) {
- g_warning("MATE: PduCriteria: No For in: %s",avpl->name);
+ report_error("MATE: PduCriteria: No For in: %s",avpl->name);
return FALSE;
}
if (!cfg) {
- g_warning("MATE: PduCriteria: Pdu '%s' does not exist in: %s",name,avpl->name);
+ report_error("MATE: PduCriteria: Pdu '%s' does not exist in: %s",name,avpl->name);
return FALSE;
}
} else if ( g_strcasecmp(mode,KEYWORD_REJECT) == 0 ) {
mode = matecfg->reject;
} else {
- g_warning("MATE: PduCriteria: no such criteria mode: '%s' in %s",mode,avpl->name);
+ report_error("MATE: PduCriteria: no such criteria mode: '%s' in %s",mode,avpl->name);
return FALSE;
}
} else {
} else if ( g_strcasecmp(match,KEYWORD_STRICT) == 0 ) {
match_mode = AVPL_STRICT;
} else {
- g_warning("MATE: PduCriteria: Config error: no such match mode '%s' in: %s",match,avpl->name);
+ report_error("MATE: PduCriteria: Config error: no such match mode '%s' in: %s",match,avpl->name);
return FALSE;
}
}
if (cfg->criterium) {
/* FEATURE: more criteria */
- g_warning("MATE: PduCriteria: PduCriteria alredy exists for '%s' in: %s",name,avpl->name);
+ report_error("MATE: PduCriteria: PduCriteria alredy exists for '%s' in: %s",name,avpl->name);
return FALSE;
}
guint8* lib = extract_named_str(avpl,KEYWORD_LIB,NULL);
if ( ! filename && ! lib ) {
- g_warning("MATE: Include: no Filename or Lib given in: %s",avpl->name);
+ report_error("MATE: Include: no Filename or Lib given in: %s",avpl->name);
return FALSE;
}
if ( filename && lib ) {
- g_warning("MATE: Include: use either Filename or Lib, not both. in: %s",avpl->name);
+ report_error("MATE: Include: use either Filename or Lib, not both. in: %s",avpl->name);
return FALSE;
}
/* FIXME: stop recursion */
if ( ! mate_load_config(filename) ) {
- g_warning("MATE: Include: Error Loading '%s' in: %s",filename,avpl->name);
+ report_error("MATE: Include: Error Loading '%s' in: %s",filename,avpl->name);
if (lib) g_free(filename);
return FALSE;
}
} else if ( g_strcasecmp(match,KEYWORD_STRICT) == 0 ) {
match_mode = AVPL_STRICT;
} else {
- g_warning("MATE: Transform: no such match mode: '%s' in: %s",match,avpl->name);
+ report_error("MATE: Transform: no such match mode: '%s' in: %s",match,avpl->name);
return FALSE;
}
} else {
} else if ( g_strcasecmp(mode,KEYWORD_REPLACE) == 0 ) {
replace_mode = AVPL_REPLACE;
} else {
- g_warning("MATE: Transform: no such replace mode: '%s' in: %s",mode,avpl->name);
+ report_error("MATE: Transform: no such replace mode: '%s' in: %s",mode,avpl->name);
return FALSE;
}
}
if (! name) {
- g_warning("MATE: Transform: no Name in: %s",avpl->name);
+ report_error("MATE: Transform: no Name in: %s",avpl->name);
return FALSE;
}
mate_cfg_pdu* cfg = lookup_using_index_avp(avpl,KEYWORD_FOR,hash,&cfg_name);;
if (! name ) {
- g_warning("MATE: %s: no Name in: %s",keyword,avpl->name);
+ report_error("MATE: %s: no Name in: %s",keyword,avpl->name);
return FALSE;
}
if (! cfg_name ) {
- g_warning("MATE: %s: no For in: %s",keyword,avpl->name);
+ report_error("MATE: %s: no For in: %s",keyword,avpl->name);
return FALSE;
}
if (! cfg ) {
- g_warning("MATE: %s: '%s' doesn't exist in: %s",keyword,cfg_name,avpl->name);
+ report_error("MATE: %s: '%s' doesn't exist in: %s",keyword,cfg_name,avpl->name);
return FALSE;
}
if (!transf) {
- g_warning("MATE: %s: Transform '%s' doesn't exist in: %s",keyword,name,avpl->name);
+ report_error("MATE: %s: Transform '%s' doesn't exist in: %s",keyword,name,avpl->name);
return FALSE;
}
guint8* on = extract_named_str(avpl,KEYWORD_ON,NULL);
if (! name ) {
- g_warning("MATE: GopDef: no Name in: %s",avpl->name);
+ report_error("MATE: GopDef: no Name in: %s",avpl->name);
return FALSE;
}
if (!cfg) {
cfg = new_gopcfg(name);
} else {
- g_warning("MATE: GopDef: Gop '%s' exists already in: %s",name,avpl->name);
+ report_error("MATE: GopDef: Gop '%s' exists already in: %s",name,avpl->name);
return FALSE;
}
if (! on ) {
- g_warning("MATE: GopDef: no On in: %s",avpl->name);
+ report_error("MATE: GopDef: no On in: %s",avpl->name);
return FALSE;
}
if (g_hash_table_lookup(matecfg->gops_by_pduname,on) ) {
- g_warning("MATE: GopDef: Gop for Pdu '%s' exists already in: %s",on,avpl->name);
+ report_error("MATE: GopDef: Gop for Pdu '%s' exists already in: %s",on,avpl->name);
return FALSE;
} else {
g_hash_table_insert(matecfg->gops_by_pduname,on,cfg);
mate_cfg_gop* cfg = lookup_using_index_avp(avpl, KEYWORD_FOR,matecfg->gopcfgs,&name);;
if (! name ) {
- g_warning("MATE: GopStart: no For in: %s",avpl->name);
+ report_error("MATE: GopStart: no For in: %s",avpl->name);
return FALSE;
}
if (!cfg) {
- g_warning("MATE: GopStart: Gop '%s' doesn't exist in: %s",name,avpl->name);
+ report_error("MATE: GopStart: Gop '%s' doesn't exist in: %s",name,avpl->name);
return FALSE;
}
if (cfg->start) {
/* FEATURE: more start conditions */
- g_warning("MATE: GopStart: GopStart for '%s' exists already in: %s",name,avpl->name);
+ report_error("MATE: GopStart: GopStart for '%s' exists already in: %s",name,avpl->name);
return FALSE;
}
mate_cfg_gop* cfg = lookup_using_index_avp(avpl, KEYWORD_FOR,matecfg->gopcfgs,&name);;
if (! name ) {
- g_warning("MATE: GopStop: no For in: %s",avpl->name);
+ report_error("MATE: GopStop: no For in: %s",avpl->name);
return FALSE;
}
if (!cfg) {
- g_warning("MATE: GopStop: Gop '%s' doesn't exist in: %s",name,avpl->name);
+ report_error("MATE: GopStop: Gop '%s' doesn't exist in: %s",name,avpl->name);
return FALSE;
}
if (cfg->stop) {
- g_warning("MATE: GopStop: GopStop alredy exists for '%s' in: %s",name,avpl->name);
+ report_error("MATE: GopStop: GopStop alredy exists for '%s' in: %s",name,avpl->name);
return FALSE;
}
mate_cfg_gop* cfg = lookup_using_index_avp(avpl, KEYWORD_FOR,matecfg->gopcfgs,&name);;
if (! name ) {
- g_warning("MATE: GopExtra: no For in: %s",avpl->name);
+ report_error("MATE: GopExtra: no For in: %s",avpl->name);
return FALSE;
}
if (!cfg) {
- g_warning("MATE: GopExtra: Gop '%s' does not exist in: %s",name,avpl->name);
+ report_error("MATE: GopExtra: Gop '%s' does not exist in: %s",name,avpl->name);
return FALSE;
}
mate_cfg_gog* cfg = NULL;
if (! name ) {
- g_warning("MATE: GogDef: no Name in: %s",avpl->name);
+ report_error("MATE: GogDef: no Name in: %s",avpl->name);
return FALSE;
}
if ( g_hash_table_lookup(matecfg->gogcfgs,name) ) {
- g_warning("MATE: GogDef: Gog '%s' exists already in: %s",name,avpl->name);
+ report_error("MATE: GogDef: Gog '%s' exists already in: %s",name,avpl->name);
return FALSE;
}
if ( ! name || ! cfg ) {
if ( ! name )
- g_warning("MATE: GogKey: no Name in %s",avpl->name);
+ report_error("MATE: GogKey: no Name in %s",avpl->name);
else
- g_warning("MATE: GogKey: no such Gop '%s' in %s",name,avpl->name);
+ report_error("MATE: GogKey: no such Gop '%s' in %s",name,avpl->name);
return FALSE;
}
if (! on ) {
- g_warning("MATE: GogKey: no On in %s",avpl->name);
+ report_error("MATE: GogKey: no On in %s",avpl->name);
return FALSE;
}
if ( ! name || ! cfg ) {
if ( ! name )
- g_warning("MATE: GogExtra: no Name in %s",avpl->name);
+ report_error("MATE: GogExtra: no Name in %s",avpl->name);
else
- g_warning("MATE: GogExtra: no such Gop '%s' in %s",name,avpl->name);
+ report_error("MATE: GogExtra: no such Gop '%s' in %s",name,avpl->name);
return FALSE;
}
matecfg->show_pdu_tree = matecfg->frame_tree;
+ config_error = g_string_new("");
+
if ( mate_load_config(filename) ) {
analyze_config();
dbg_print (dbg_cfg,3,dbg_facility,"mate_make_config: OK");
if (dbg_cfg_lvl > 0) print_config();
} else {
+ report_failure("%s",config_error->str);
+ g_string_free(config_error,TRUE);
if (matecfg) destroy_mate_config(matecfg,FALSE);
matecfg = NULL;
return NULL;
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-#include "config.h"
-#include <glib.h>
-#include <stdio.h>
-#include <string.h>
#include "mate.h"
-#include "mate_util.h"
-
-/* TODO:
-+ fix debug_print levels
-+ chunks for scs_strings (do I realy need em??)
- + checking bounds in (almost) every operator
-- operators
- + rethink '&' operator
- - bounds check on op_match()
- ? change &{} into []
- ? add {xxx} to get avps named xxxx from the src avpl
- ? add (yyy) to do aaa+31 or and similar stuff
- - add perlre operator?
- - transform
- + map (N->M hash)
-*/
-
/***************************************************************************
* dbg_print
* @avpl: a pointer to the level of debugging of facility "avpl"
* @avpl_op: a pointer to the level of debugging of facility "avpl_op"
*
- * (If enabled set's up the debug facilities for the avp library.
+ * If enabled set's up the debug facilities for the avp library.
*
**/
extern void setup_avp_debug(FILE* fp, int* general, int* avp, int* avp_op, int* avpl, int* avpl_op) {
**/
extern void avp_init(void) {
+ if (avp_strings) destroy_scs_collection(avp_strings);
avp_strings = scs_init();
-
- if ( avp_chunk ) {
- g_mem_chunk_destroy(avp_chunk);
- }
-
+ if ( avp_chunk ) g_mem_chunk_destroy(avp_chunk);
avp_chunk = g_mem_chunk_new("avp_chunk", sizeof(any_avp_type),
AVP_CHUNK_SIZE, G_ALLOC_AND_FREE);
return newavpl;
}
-
-#define TRANS_NUM '-': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '0'
-
-/* BROKEN, makes no sense right now */
-/* FIXME: Use subscribe/unsubscribe */
-#if 0
-static AVP* avp_transform(AVP* src, AVP* op) {
- unsigned int i;
- guint8 c;
-
- GString* replace_str = NULL;
- GString* num_str = NULL;
- GString* return_str = NULL;
- guint8* v;
- long num = 0;
-
- enum _tranf_state {
- START,
- IN_NUM,
- IN_REPLACE,
- END
- } state;
-
- state = START;
-
- for(i = 0; i < strlen(op->v); i++) {
- c= op->v[i];
-
- if (state == END) break;
-
- switch(state) {
- case START:
- switch(c) {
- case '{':
- num_str = g_string_new("");
- state = IN_NUM;
- continue;
- default:
- continue;
- };
- case IN_NUM:
- switch(c) {
- case TRANS_NUM:
- g_string_append_c(num_str,c);
- continue;
- case ':':
- num = strtol(num_str->str,NULL,10);
- g_string_free(num_str,TRUE);
- replace_str = g_string_new("");
- state = IN_REPLACE;
- continue;
- default:
- /* will ignore any char that is not a number */
- continue;
- };
- case IN_REPLACE:
- switch(c) {
- case '\\':
- continue;
- case '}':
- state = END;
- continue;
- default :
- g_string_append_c(replace_str,c);
- continue;
- }
- case END:
- /* it will never reach */
- continue;
- }
-
- }
-
- v = src->v;
-
- if (num > 0) {
- return_str = g_string_new(v);
- g_string_erase(return_str,0,num);
- g_string_prepend(return_str,replace_str->str);
- } else if (num < 0) {
- return_str = g_string_new(v);
- g_string_truncate(return_str,return_str->len+num);
- g_string_append(return_str,replace_str->str);
-
- } else {
- return_str = g_string_new(replace_str->str);
- }
-
- g_mem_chunk_free(avp_chunk,v);
- g_string_free(replace_str,TRUE);
-
- src->o = '=';
- src->v = return_str->str;
- g_string_free(return_str,FALSE);
-
- return src;
-}
-
-#endif
-
/**
* match_avp:
* @src: an src to be compared agains an "op" avp
#ifndef _WIN32
if (! getuid()) {
- g_warning( "MATE Will not run as root");
- return NULL;
+ return load_loal_error(fp,loal,curr,linenum,"MATE Will not run as root");
}
#endif
if ( feof(fp) ) {
if ( ferror(fp) ) {
+ report_read_failure(filename,errno);
return load_loal_error(fp,loal,curr,linenum,"Error while reading '%f'",filename);
}
break;
return loal;
} else {
+ report_open_failure(filename,errno,FALSE);
return load_loal_error(NULL,loal,NULL,0,"Cannot Open file '%s'",filename);
}
}