[asterisk-commits] murf: branch murf/cel2cdr r179218 - in /team/murf/cel2cdr: cel/ include/aster...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Sat Feb 28 14:15:42 CST 2009
Author: murf
Date: Sat Feb 28 14:15:38 2009
New Revision: 179218
URL: http://svn.digium.com/svn-view/asterisk?view=rev&rev=179218
Log:
Straighten up/ clean up things here and there
Modified:
team/murf/cel2cdr/cel/cel_cel2cdr.c
team/murf/cel2cdr/include/asterisk/extconf.h
team/murf/cel2cdr/utils/Makefile
team/murf/cel2cdr/utils/csv2ev.c
Modified: team/murf/cel2cdr/cel/cel_cel2cdr.c
URL: http://svn.digium.com/svn-view/asterisk/team/murf/cel2cdr/cel/cel_cel2cdr.c?view=diff&rev=179218&r1=179217&r2=179218
==============================================================================
--- team/murf/cel2cdr/cel/cel_cel2cdr.c (original)
+++ team/murf/cel2cdr/cel/cel_cel2cdr.c Sat Feb 28 14:15:38 2009
@@ -19,8 +19,12 @@
/* for simple CDRs:
*/
+#include "asterisk.h"
+
#include "asterisk/dlinkedlists.h"
#include "asterisk/hashtab.h"
+#include "asterisk/event.h"
+#include "asterisk/module.h"
struct event_list_member
{
@@ -48,7 +52,7 @@
as they are 'used up' (a CDR posted). This should
be fast & painless
*/
- AST_DLLIST_ENTRY(event_list_member) list;
+ AST_DLLIST_HEAD(list, event_list_member) list;
};
/* this hashtab is the central theme to the CDR approach.
@@ -61,32 +65,33 @@
static int table_compare_func(const void *a, const void *b)
{
- struct event_list *ev_a = a;
- struct event list *ev_b = b;
- return strcmp(ev_b->linkedid, ev_b->linkedid);
+ const struct event_list *ev_a = a;
+ const struct event_list *ev_b = b;
+ return strcmp(ev_a->linkedid, ev_b->linkedid);
}
static unsigned int table_hash_func(const void *obj)
{
- struct event_list *obj_a = obj;
- ast_hashtab_hash_string(obj_a->linkedid);
+ const struct event_list *obj_a = obj;
+ return ast_hashtab_hash_string(obj_a->linkedid);
}
/* destruction is really boring stuff....
until it doesn't work, or doesn't work right! */
-void destroy_event_list_member(struct event_list_member *m)
+static void destroy_event_list_member(struct event_list_member *m)
{
ast_event_destroy(m->ev);
m->ev = NULL;
free(m);
}
-void destroy_event_list(struct event_list *l)
+static void destroy_event_list(void *lv)
{
+ struct event_list *l = lv;
struct event_list_member *m;
- AST_DLLIST_TRAVERSE_SAFE_BEGIN(&l->list, m, list) {
+ AST_DLLIST_TRAVERSE_SAFE_BEGIN(&(l->list), m, list) {
AST_DLLIST_REMOVE_CURRENT(list);
destroy_event_list_member(m);
}
@@ -106,30 +111,41 @@
enum cdr_mode_type cdr_mode = CEL2CDR_MODE_SIMPLE;
static int cel2cdr_enabled = 0;
-static mod_load_func()
+static int mod_load_func(void)
{
/* read the config file, set all the control variables. */
/* set up the master table */
if (cel2cdr_enabled) {
if (!master_table) {
- master_table = ast_hashtab_create(1001, table_compare_func, table_resize_func,
- table_newsize_func, table_hash_func, 1 /* do locking */);
+ master_table = ast_hashtab_create(1001, table_compare_func, ast_hashtab_resize_java,
+ ast_hashtab_newsize_java, table_hash_func, 1 /* do locking */);
} else {
/* this shouldn't happen? or should I just remove all the
stuff from the table and leave it initialized? */
}
}
+ return AST_MODULE_LOAD_SUCCESS;
}
-static mod_unload_func()
+static int mod_unload_func(void)
{
if (master_table) {
ast_hashtab_destroy(master_table, destroy_event_list);
master_table = NULL;
}
+ return AST_MODULE_LOAD_SUCCESS;
}
+static int mod_reload_func(void)
+{
+ mod_unload_func();
+ mod_load_func();
+ return AST_MODULE_LOAD_SUCCESS;
+}
+
+
+void cel2cdr_handle_event(const struct ast_event *event, void *userdata);
void cel2cdr_handle_event(const struct ast_event *event, void *userdata)
{
@@ -142,3 +158,9 @@
}
}
}
+
+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "This turns CEL events into CDR structs in realtime",
+ .load = mod_load_func,
+ .unload = mod_unload_func,
+ .reload = mod_reload_func,
+ );
Modified: team/murf/cel2cdr/include/asterisk/extconf.h
URL: http://svn.digium.com/svn-view/asterisk/team/murf/cel2cdr/include/asterisk/extconf.h?view=diff&rev=179218&r1=179217&r2=179218
==============================================================================
--- team/murf/cel2cdr/include/asterisk/extconf.h (original)
+++ team/murf/cel2cdr/include/asterisk/extconf.h Sat Feb 28 14:15:38 2009
@@ -72,6 +72,10 @@
};
/* ================== above: the config world; below, the dialplan world */
+enum ast_doc_src {
+ AST_XML_DOC, /*!< From XML documentation */
+ AST_STATIC_DOC /*!< From application/function registration */
+};
/*! \brief A registered application */
struct ast_app {
@@ -83,7 +87,7 @@
AST_STRING_FIELD(arguments); /*!< Arguments description */
AST_STRING_FIELD(seealso); /*!< See also */
);
- enum ast_xmldoc_src docsrc; /*!< Where the documentation come from. */
+ enum ast_doc_src docsrc; /*!< Where the documentation come from. */
AST_RWLIST_ENTRY(ast_app) list; /*!< Next app in list */
void *module; /*!< Module this app belongs to */
char name[0]; /*!< Name of the application */
@@ -111,6 +115,16 @@
char stuff[0];
};
/* from pbx.h */
+enum ast_extension_states {
+ AST_EXTENSION_REMOVED = -2, /*!< Extension removed */
+ AST_EXTENSION_DEACTIVATED = -1, /*!< Extension hint removed */
+ AST_EXTENSION_NOT_INUSE = 0, /*!< No device INUSE or BUSY */
+ AST_EXTENSION_INUSE = 1 << 0, /*!< One or more devices INUSE */
+ AST_EXTENSION_BUSY = 1 << 1, /*!< All devices BUSY */
+ AST_EXTENSION_UNAVAILABLE = 1 << 2, /*!< All devices UNAVAILABLE/UNREGISTERED */
+ AST_EXTENSION_RINGING = 1 << 3, /*!< All devices RINGING */
+ AST_EXTENSION_ONHOLD = 1 << 4, /*!< All devices ONHOLD */
+};
typedef int (*ast_state_cb_type)(char *context, char* id, enum ast_extension_states state, void *data);
struct ast_timing {
int hastime; /*!< If time construct exists */
@@ -141,7 +155,7 @@
char stuff[0];
};
-*! \brief Ignore patterns in dial plan */
+/*! \brief Ignore patterns in dial plan */
struct ast_ignorepat {
const char *registrar;
struct ast_ignorepat *next;
Modified: team/murf/cel2cdr/utils/Makefile
URL: http://svn.digium.com/svn-view/asterisk/team/murf/cel2cdr/utils/Makefile?view=diff&rev=179218&r1=179217&r2=179218
==============================================================================
--- team/murf/cel2cdr/utils/Makefile (original)
+++ team/murf/cel2cdr/utils/Makefile Sat Feb 28 14:15:38 2009
@@ -132,6 +132,7 @@
$(ECHO_PREFIX) echo " [CP] $(subst $(ASTTOPDIR)/,,$<) -> $@"
$(CMD_PREFIX) cp "$<" "$@"
+csv2ev.o: ASTCFLAGS+=-DSTANDALONE
csv2ev.o : csv2ev.c
ael_main.o: ASTCFLAGS+=-DSTANDALONE
Modified: team/murf/cel2cdr/utils/csv2ev.c
URL: http://svn.digium.com/svn-view/asterisk/team/murf/cel2cdr/utils/csv2ev.c?view=diff&rev=179218&r1=179217&r2=179218
==============================================================================
--- team/murf/cel2cdr/utils/csv2ev.c (original)
+++ team/murf/cel2cdr/utils/csv2ev.c Sat Feb 28 14:15:38 2009
@@ -23,16 +23,21 @@
*
* \author Steve Murphy <murf at digium.com>
*/
-
+#include "asterisk.h"
#include "asterisk/event.h" /* which will include the event_defs.h also */
#include "asterisk/linkedlists.h"
+#include "asterisk/stringfields.h"
+#include "asterisk/xmldoc.h"
+#define NOTYET
#include "asterisk/extconf.h"
#include "asterisk/cel.h"
/* a simple linked list will represent what the user put in his cel_custom
config file... basically, we need the order of each field type.
- we can then rocket the data off to the event calls */
+ we can then rocket the data off to the event calls
*/
+
+void cel2cdr_handle_event(const struct ast_event *event, void *userdata);
struct csv_list_mem
{
@@ -42,10 +47,10 @@
struct csv_list
{
- AST_LIST_HEAD_NOLOCK(list, csv_list_mem);
+ AST_LIST_HEAD_NOLOCK(list, csv_list_mem) list;
};
-enum ast_event_ie_type csv2ev_str2eventietype(char *str)
+static enum ast_event_ie_type csv2ev_str2eventietype(char *str)
{
/* hmmm, could we do a perfect hash of some sort? */
/* later maybe */
@@ -94,10 +99,10 @@
}
-struct csv_list *parse_mappings(char *val)
+static struct csv_list *parse_mappings(char *val)
{
struct csv_list *x = calloc(sizeof(struct csv_list),1);
- char *beg1, *end1;
+ char *beg1;
if (!x) {
printf("Couldn't allocate a csv_list struct!\n");
@@ -110,15 +115,15 @@
strcat(val,",\""); /* now every field is ended with the same char sequence! */
}
- while (beg1 = strstr(val,"\",\"")) {
+ while ((beg1 = strstr(val,"\",\""))) {
+ struct csv_list_mem *m = calloc(sizeof(struct csv_list_mem),1);
*beg1 = 0;
/* val now points to the single entry, stripped of quotes */
- struct csv_list_mem *m = calloc(sizeof(struct csv_list_mem),1);
if (!m) {
printf("Couldn't allocate a csv_list_mem struct!\n");
return NULL;
}
- AST_LIST_INSERT_TAIL(x, m, list);
+ AST_LIST_INSERT_TAIL(&(x->list), m, list);
m->type = csv2ev_str2eventietype(val);
val = beg1+3;
}
@@ -126,11 +131,12 @@
return x;
}
-char *get_mappings(char *fname, char **fname)
-{
+static char *get_mappings(char **fname)
+{
+ struct ast_config *f;
/* open the cel_custom file and get the first mappings value */
localized_use_conf_dir();
- struct ast_config *f = localized_config_load(fname);
+ f = localized_config_load("cel_csv.conf");
if (f) {
struct ast_category *m = localized_category_get(f, "mappings");
if (m) {
@@ -138,7 +144,7 @@
if (m->root) {
printf("Found '%s => %s' in mappings!\n", m->root->name, m->root->name);
*fname = m->root->name;
- return m->root->val;
+ return strdup(m->root->value);
} else {
printf("Sorry, but the mappings category was empty!\n");
return NULL;
@@ -153,15 +159,18 @@
}
}
+void csv2events(void);
+
void csv2events(void)
{
/* load the config file, then the csv file, and generate the events */
- struct csv_list *csvlist, *csvptr;
- char *fname;
- char *mappings = get_mappings("cel_custom.conf", &fname);
+ struct csv_list *csvlist;
+ struct csv_list_mem *csvptr;
+ char *fname = 0;
+ char *mappings = get_mappings(&fname);
if (mappings) {
- csvlist = parse_mappings(char *val);
+ csvlist = parse_mappings(mappings);
if (csvlist) {
/* OK, we know the order of each field. Watch out for usecs.
Now, let's open the log file and begin event generation */
@@ -172,18 +181,21 @@
snprintf(filename, 512, "/var/log/asterisk/cel-custom/%s", fname);
f = fopen(filename, "r");
if (f) {
- while (r=fgets(buf, sizeof(buf), f)) {
+ struct ast_event *ev;
+
+ while ((r=fgets(buf, sizeof(buf), f))) {
char *beg1, *val;
- char *e_udef, *e_cid_name, *e_cid_num, *e_cid_ani, *e_cid_rdnis,
- *e_cid_dnid, *e_exten, *e_context, *e_name, *e_appl, *e_appdata, *e_acctcode,
- *e_peeracct, *e_uniqueid, *e_linkedid, *e_userfield, *e_extra, *e_peername;
- unsigned int i_tvsec, i_tvusec, i_ama;
- int i_type;
- char *decptr;
+ char *e_udef = NULL, *e_cid_name = NULL, *e_cid_num = NULL, *e_cid_ani = NULL, *e_cid_rdnis = NULL,
+ *e_cid_dnid = NULL, *e_exten = NULL, *e_context = NULL, *e_name = NULL, *e_appl = NULL, *e_appdata = NULL, *e_acctcode = NULL,
+ *e_peeracct = NULL, *e_uniqueid = NULL, *e_linkedid = NULL, *e_userfield = NULL, *e_extra = NULL, *e_peername = NULL;
+ unsigned int i_tvsec = 0, i_tvusec = 0, i_ama = 0;
+ int i_type = 0;
+ char *decptr = NULL;
if (buf[strlen(buf)-1] != '\n') {
- printf("Buffer size of %d was not large enough; tossing out input\n");
- fgets(buf, sizeof(buf), f); /* hopefully, that was all there's left! */
+ char *fgets_result;
+ printf("Buffer size of %zd was not large enough; tossing out input\n", sizeof(buf));
+ fgets_result = fgets(buf, sizeof(buf), f); /* hopefully, that was all there's left! I know this is ugly, but, I'll get back it to it someday!! XXXXXtodoXXXXX */
continue;
} else {
buf[strlen(buf)-1] = 0;
@@ -203,9 +215,9 @@
generate the event structs, so we don't have dependencies
on taskprocessors and who knows what else in the asterisk
core! */
- csvptr = AST_LIST_FIRST(csvlist);
+ csvptr = AST_LIST_FIRST(&(csvlist->list));
/* gather up the fields, and prepare for a the event call */
- while (beg1 = strstr(val,"\",\"")) {
+ while ((beg1 = strstr(val,"\",\""))) {
*beg1 = 0;
/* val now points to the single entry, stripped of quotes */
switch(csvptr->type)
@@ -224,7 +236,7 @@
i_tvsec = strtol(val, NULL, 10);
decptr = strchr(val,'.');
if (decptr) {
- i_tvusec = strlol(decptr+1, NULL, 10);
+ i_tvusec = strtol(decptr+1, NULL, 10);
} else {
i_tvusec = 0;
}
@@ -299,6 +311,9 @@
case AST_EVENT_IE_CEL_EXTRA:
e_extra = val;
+ break;
+ default:
+ printf("what in the...? are we calling with this IE type: %d\n", csvptr->type);
break;
}
csvptr = AST_LIST_NEXT(csvptr,list);
More information about the asterisk-commits
mailing list