spring cleaning

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@4795 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Anthony Minessale committed 2007-03-29 22:31:56 +00:00
1 parent a021945cef
commit 3a54126261
143 files changed
+22413 -31567

No files matched your search

+46 -44
View File
@@ -39,16 +39,17 @@
//#include <gc/gc.h>
#include <switch.h>
#define SWITCH_MONO_MODULES "mono/"
#define SWITCH_MONO_MODULES "mono/"
#define SWITCH_MONO_LIBDIR "lib/"
#define SWITCH_MONO_ASSEMBLY "FreeSwitch.dll"
/* Module functions */
switch_status_t mod_mono_load_modules(const char *module_dir);
MonoClass* mod_mono_find_assembly_class(MonoImage *image);
MonoClass *mod_mono_find_assembly_class(MonoImage * image);
/* Managed functions */
void mod_mono_switch_console_printf(switch_text_channel_t channel, char *file, const char *func, int line, char *fmt, char *msg);
void mod_mono_switch_console_printf(switch_text_channel_t channel, char *file, const char *func, int line, char *fmt,
char *msg);
static const char modname[] = "mod_mono";
static switch_memory_pool_t *mono_pool = NULL;
@@ -61,7 +62,7 @@ static struct {
typedef struct {
MonoAssembly *assembly;
MonoClass *class;
MonoObject *object;
MonoObject *object;
} mono_plugin;
static switch_loadable_module_interface_t mono_module_interface = {
@@ -74,7 +75,8 @@ static switch_loadable_module_interface_t mono_module_interface = {
* This function will initialise the memory pool and plugin hash for this module,
* it will then initialise a new mono domain.
*/
SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_module_interface_t **interface, char *filename)
SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_module_interface_t **interface,
char *filename)
{
*interface = &mono_module_interface;
@@ -83,23 +85,24 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_mod
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not allocate memory pool\n");
return SWITCH_STATUS_FALSE;
}
/* Initialise plugin hash */
if (switch_core_hash_init(&globals.plugins, mono_pool) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not initialise plugins hash\n");
return SWITCH_STATUS_FALSE;
}
}
/* Construct the path to the FreeSwitch assembly, then check to make sure it exists */
switch_size_t assembly_dir_len = strlen(SWITCH_GLOBAL_dirs.base_dir) + strlen(SWITCH_MONO_LIBDIR) + 2; /* Account for / and \0 */
switch_size_t assembly_dir_len = strlen(SWITCH_GLOBAL_dirs.base_dir) + strlen(SWITCH_MONO_LIBDIR) + 2; /* Account for / and \0 */
switch_size_t assembly_file_len = assembly_dir_len + strlen(SWITCH_MONO_ASSEMBLY);
char *assembly_dir = (char *) switch_core_alloc(mono_pool, assembly_dir_len);
char *assembly_dir = (char *) switch_core_alloc(mono_pool, assembly_dir_len);
char *assembly_file = (char *) switch_core_alloc(mono_pool, assembly_file_len);
apr_finfo_t *assembly_finfo = (apr_finfo_t *) switch_core_alloc(mono_pool, sizeof(*assembly_finfo));
snprintf(assembly_dir, assembly_dir_len, "%s/%s", SWITCH_GLOBAL_dirs.base_dir, SWITCH_MONO_LIBDIR);
snprintf(assembly_file, assembly_file_len, "%s/%s%s", SWITCH_GLOBAL_dirs.base_dir, SWITCH_MONO_LIBDIR, SWITCH_MONO_ASSEMBLY);
snprintf(assembly_file, assembly_file_len, "%s/%s%s", SWITCH_GLOBAL_dirs.base_dir, SWITCH_MONO_LIBDIR,
SWITCH_MONO_ASSEMBLY);
if (apr_stat(assembly_finfo, assembly_file, 0, mono_pool) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Could not find FreeSwitch.NET assembly\n");
@@ -108,22 +111,21 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_mod
/* Mono wants to know where it will be able to find the FreeSwitch assembly if it's not in the GAC */
if (getenv("MONO_PATH") != NULL) {
switch_size_t mono_path_len = strlen(getenv("MONO_PATH")) + strlen(assembly_dir) + 2; /* Account for : and \0 */
switch_size_t mono_path_len = strlen(getenv("MONO_PATH")) + strlen(assembly_dir) + 2; /* Account for : and \0 */
char *mono_path = (char *) switch_core_alloc(mono_pool, mono_path_len);
snprintf(mono_path, mono_path_len, "%s:%s", getenv("MONO_PATH"), assembly_dir);
setenv("MONO_PATH", mono_path, 1);
}
else
} else
setenv("MONO_PATH", assembly_dir, 1);
/* Now find where our managed modules are */
switch_size_t module_dir_len = strlen(SWITCH_GLOBAL_dirs.mod_dir) + strlen(SWITCH_MONO_MODULES) + 2; /* Account for / and \0 */
switch_size_t module_dir_len = strlen(SWITCH_GLOBAL_dirs.mod_dir) + strlen(SWITCH_MONO_MODULES) + 2; /* Account for / and \0 */
char *module_dir = (char *) switch_core_alloc(mono_pool, module_dir_len);
snprintf(module_dir, module_dir_len, "%s/%s", SWITCH_GLOBAL_dirs.mod_dir, SWITCH_MONO_MODULES);
/* Initialise the mono domain */
if (!(globals.domain = mono_jit_init("freeswitch"))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error initialising mono runtime\n");
@@ -139,7 +141,7 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_mod
return SWITCH_STATUS_FALSE;
}
/* Finally, go through and initialise each plugin before returning SUCCESS */
/* Finally, go through and initialise each plugin before returning SUCCESS */
switch_hash_index_t *p = NULL;
for (p = switch_hash_first(mono_pool, globals.plugins); p; p = switch_hash_next(p)) {
@@ -150,10 +152,10 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_mod
switch_hash_this(p, &key, key_length, &value);
plugin = (mono_plugin *) value;
mono_runtime_object_init(plugin->object);
}
return SWITCH_STATUS_SUCCESS;
}
@@ -175,16 +177,16 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_shutdown(void)
/*
* This function will load the managed modules
*
*/
*/
switch_status_t mod_mono_load_modules(const char *module_dir)
{
apr_finfo_t *module_finfo = (apr_finfo_t *) switch_core_alloc(mono_pool, sizeof(*module_finfo));
if (apr_stat(module_finfo, module_dir, 0, mono_pool) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not access module dir!.\n");
return SWITCH_STATUS_FALSE;
}
apr_dir_t *module_dir_handle;
char *file;
size_t len;
@@ -196,22 +198,21 @@ switch_status_t mod_mono_load_modules(const char *module_dir)
MonoAssembly *assembly;
MonoImage *image;
gpointer iter;
iter=NULL;
mono_plugin *plugin=NULL;
iter = NULL;
mono_plugin *plugin = NULL;
if (apr_dir_open(&module_dir_handle, module_dir, mono_pool) != SWITCH_STATUS_SUCCESS)
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Could not open directory: %s\n", module_dir);
/* Read the modules directory */
while (apr_dir_read(&finfo, finfo_flags, module_dir_handle) == SWITCH_STATUS_SUCCESS)
{
while (apr_dir_read(&finfo, finfo_flags, module_dir_handle) == SWITCH_STATUS_SUCCESS) {
assembly = (MonoAssembly *) switch_core_alloc(mono_pool, sizeof(assembly));
image = (MonoImage *) switch_core_alloc(mono_pool, sizeof(image));
const char *fname = finfo.fname;
if (finfo.filetype != APR_REG)
continue;
if (!fname)
fname = finfo.name;
@@ -222,7 +223,7 @@ switch_status_t mod_mono_load_modules(const char *module_dir)
continue;
len = strlen(module_dir) + strlen(fname) + 2;
file = (char *)switch_core_alloc(mono_pool, len);
file = (char *) switch_core_alloc(mono_pool, len);
snprintf(file, len, "%s%s", module_dir, fname);
/* Attempt to open the assembly */
@@ -233,53 +234,54 @@ switch_status_t mod_mono_load_modules(const char *module_dir)
continue;
}
/* Get the image from assembly */
/* Get the image from assembly */
image = mono_assembly_get_image(assembly);
plugin = (mono_plugin *)switch_core_alloc(mono_pool, sizeof(*plugin));
plugin = (mono_plugin *) switch_core_alloc(mono_pool, sizeof(*plugin));
plugin->assembly = assembly;
plugin->class = mod_mono_find_assembly_class(mono_assembly_get_image(plugin->assembly));
plugin->class = mod_mono_find_assembly_class(mono_assembly_get_image(plugin->assembly));
if (!plugin->class)
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "No plugin class\n");
plugin->object = mono_object_new(globals.domain, plugin->class);
switch_core_hash_insert(globals.plugins, (char *) mono_image_get_name(mono_assembly_get_image(assembly)), plugin);
switch_core_hash_insert(globals.plugins, (char *) mono_image_get_name(mono_assembly_get_image(assembly)),
plugin);
plugin = NULL;
}
}
return SWITCH_STATUS_SUCCESS;
}
/*
*
*/
MonoClass* mod_mono_find_assembly_class(MonoImage *image)
*/
MonoClass *mod_mono_find_assembly_class(MonoImage * image)
{
MonoClass *class, *parent_class = NULL;
int i, total;
total = mono_image_get_table_rows(image, MONO_TABLE_TYPEDEF);
for (i = 1; i <= total; ++i)
{
for (i = 1; i <= total; ++i) {
class = mono_class_get(image, MONO_TOKEN_TYPE_DEF | i);
parent_class = mono_class_get_parent(class);
if (parent_class)
if (parent_class)
if (!strcmp("Module", mono_class_get_name(parent_class)))
return class;
}
return NULL;
}
/*
*
*/
void mono_switch_console_printf(switch_text_channel_t channel, char *file, const char *func, int line, char *fmt, char *msg)
void mono_switch_console_printf(switch_text_channel_t channel, char *file, const char *func, int line, char *fmt,
char *msg)
{
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, msg);
}
+11 -11
View File
@@ -50,7 +50,7 @@ static struct {
} globals;
static void destroy_perl(PerlInterpreter **to_destroy)
static void destroy_perl(PerlInterpreter ** to_destroy)
{
perl_destruct(*to_destroy);
perl_free(*to_destroy);
@@ -59,7 +59,7 @@ static void destroy_perl(PerlInterpreter **to_destroy)
static PerlInterpreter *clone_perl(void)
{
return perl_clone(globals.my_perl, CLONEf_COPY_STACKS|CLONEf_KEEP_PTR_TABLE);
return perl_clone(globals.my_perl, CLONEf_COPY_STACKS | CLONEf_KEEP_PTR_TABLE);
}
@@ -69,9 +69,7 @@ static void perl_function(switch_core_session_t *session, char *data)
char code[1024];
PerlInterpreter *my_perl = clone_perl();
sprintf(code, "package fs_perl;\n"
"$SWITCH_ENV{UUID} = \"%s\";\n"
"chdir(\"%s/perl\");\n",
uuid, SWITCH_GLOBAL_dirs.base_dir);
"$SWITCH_ENV{UUID} = \"%s\";\n" "chdir(\"%s/perl\");\n", uuid, SWITCH_GLOBAL_dirs.base_dir);
Perl_eval_pv(my_perl, code, TRUE);
@@ -84,8 +82,9 @@ static const switch_application_interface_t perl_application_interface = {
/*.interface_name */ "perl",
/*.application_function */ perl_function,
NULL, NULL, NULL,
/* flags */ SAF_NONE, /* should we support no media mode here? If so, we need to detect the mode, and either disable the media functions or indicate media if/when we need */
/*.next*/ NULL
/* flags */ SAF_NONE,
/* should we support no media mode here? If so, we need to detect the mode, and either disable the media functions or indicate media if/when we need */
/*.next */ NULL
};
static switch_loadable_module_interface_t perl_module_interface = {
@@ -102,7 +101,7 @@ static switch_loadable_module_interface_t perl_module_interface = {
};
SWITCH_MOD_DECLARE(switch_status_t) switch_module_shutdown(void)
SWITCH_MOD_DECLARE(switch_status_t) switch_module_shutdown(void)
{
if (globals.my_perl) {
perl_destruct(globals.my_perl);
@@ -113,12 +112,13 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_shutdown(void)
return SWITCH_STATUS_SUCCESS;
}
SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_module_interface_t **module_interface, char *filename)
SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_module_interface_t **module_interface,
char *filename)
{
PerlInterpreter *my_perl;
char code[1024];
if (!(my_perl = perl_alloc())) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not allocate perl intrepreter\n");
return SWITCH_STATUS_MEMERR;
@@ -131,7 +131,7 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_mod
perl_run(my_perl);
globals.my_perl = my_perl;
sprintf(code, "use lib '%s/perl';use fs_perl;use freeswitch\n", SWITCH_GLOBAL_dirs.base_dir);
Perl_eval_pv(my_perl, code, TRUE);
Perl_eval_pv(my_perl, code, TRUE);
/* connect my internal structure to the blank pointer passed to me */
+3 -4
View File
@@ -4,12 +4,11 @@
#include <EXTERN.h>
#include <perl.h>
EXTERN_C void xs_init (pTHX);
EXTERN_C void xs_init(pTHX);
EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
EXTERN_C void boot_DynaLoader(pTHX_ CV * cv);
EXTERN_C void
xs_init(pTHX)
EXTERN_C void xs_init(pTHX)
{
char *file = __FILE__;
dXSUB_SYS;
File diff suppressed because it is too large. Load diff
@@ -1,4 +1,4 @@
#ifndef FREESWITCH_PYTHON_H
#ifndef FREESWITCH_PYTHON_H
#define FREESWITCH_PYTHON_H
#include <Python.h>
@@ -9,45 +9,41 @@ extern "C" {
#include <switch.h>
extern void *globalDTMFCallbackFunction;
extern switch_status_t PythonDTMFCallback(switch_core_session *session,
void *input,
switch_input_type_t itype,
void *buf,
unsigned int buflen);
extern void *globalDTMFCallbackFunction;
extern switch_status_t PythonDTMFCallback(switch_core_session * session,
void *input, switch_input_type_t itype, void *buf, unsigned int buflen);
class SessionContainer {
private:
switch_core_session_t *session;
switch_channel_t *channel;
char *uuid;
PyObject *dtmfCallbackFunction;
char *tts_name;
char *voice_name;
public:
SessionContainer(char *uuid);
~SessionContainer();
void console_log(char *level_str, char *msg);
void console_clean_log(char *msg);
int answer();
int pre_answer();
void hangup(char *cause);
void set_variable(char *var, char *val);
void get_variable(char *var, char *val);
void set_state(char *state);
int play_file(char *file, char *timer_name);
void set_dtmf_callback(PyObject *pyfunc);
int speak_text(char *text);
void set_tts_parms(char *tts_name, char *voice_name);
int get_digits(char *dtmf_buf, int len, char *terminators, char *terminator, int timeout);
int transfer(char *extensions, char *dialplan, char *context);
int play_and_get_digits(int min_digits, int max_digits, int max_tries, int timeout, char *terminators,
char *audio_files, char *bad_input_audio_files, char *dtmf_buf, char *digits_regex);
protected:
};
class SessionContainer {
private:
switch_core_session_t *session;
switch_channel_t *channel;
char *uuid;
PyObject *dtmfCallbackFunction;
char *tts_name;
char *voice_name;
public:
SessionContainer(char *uuid);
~SessionContainer();
void console_log(char *level_str, char *msg);
void console_clean_log(char *msg);
int answer();
int pre_answer();
void hangup(char *cause);
void set_variable(char *var, char *val);
void get_variable(char *var, char *val);
void set_state(char *state);
int play_file(char *file, char *timer_name);
void set_dtmf_callback(PyObject * pyfunc);
int speak_text(char *text);
void set_tts_parms(char *tts_name, char *voice_name);
int get_digits(char *dtmf_buf, int len, char *terminators, char *terminator, int timeout);
int transfer(char *extensions, char *dialplan, char *context);
int play_and_get_digits(int min_digits, int max_digits, int max_tries, int timeout, char *terminators,
char *audio_files, char *bad_input_audio_files, char *dtmf_buf, char *digits_regex);
protected:
};
#ifdef __cplusplus
}
#endif
#endif
+31 -29
View File
@@ -50,54 +50,55 @@ const char modname[] = "mod_python";
static void python_function(switch_core_session_t *session, char *data)
{
char *uuid = switch_core_session_get_uuid(session);
char *argv[1];
FILE* pythonfile;
char *argv[1];
FILE *pythonfile;
argv[0] = uuid;
pythonfile = fopen(data, "r");
argv[0] = uuid;
pythonfile = fopen(data, "r");
Py_Initialize();
PySys_SetArgv(1, argv);
init_freeswitch();
PyRun_SimpleFile(pythonfile, "");
Py_Finalize();
Py_Initialize();
PySys_SetArgv(1, argv);
init_freeswitch();
PyRun_SimpleFile(pythonfile, "");
Py_Finalize();
}
static switch_status_t launch_python(char *text, switch_core_session_t *session, switch_stream_handle_t *stream)
{
FILE* pythonfile;
FILE *pythonfile;
if (switch_strlen_zero(text)) {
stream->write_function(stream, "USAGE: %s\n", python_run_interface.syntax);
return SWITCH_STATUS_SUCCESS;
}
if (switch_strlen_zero(text)) {
stream->write_function(stream, "USAGE: %s\n", python_run_interface.syntax);
return SWITCH_STATUS_SUCCESS;
}
pythonfile = fopen(text, "r");
pythonfile = fopen(text, "r");
Py_Initialize();
init_freeswitch();
PyRun_SimpleFile(pythonfile, "");
Py_Finalize();
Py_Initialize();
init_freeswitch();
PyRun_SimpleFile(pythonfile, "");
Py_Finalize();
stream->write_function(stream, "OK\n");
return SWITCH_STATUS_SUCCESS;
stream->write_function(stream, "OK\n");
return SWITCH_STATUS_SUCCESS;
}
static const switch_application_interface_t python_application_interface = {
/*.interface_name */ "python",
/*.application_function */ python_function,
NULL, NULL, NULL,
/* flags */ SAF_NONE, /* should we support no media mode here? If so, we need to detect the mode, and either disable the media functions or indicate media if/when we need */
/*.next*/ NULL
/* flags */ SAF_NONE,
/* should we support no media mode here? If so, we need to detect the mode, and either disable the media functions or indicate media if/when we need */
/*.next */ NULL
};
static switch_api_interface_t python_run_interface = {
/*.interface_name */ "python",
/*.desc */ "run a python script",
/*.function */ launch_python,
/*.syntax */ "python </path/to/script>",
/*.next */ NULL
/*.interface_name */ "python",
/*.desc */ "run a python script",
/*.function */ launch_python,
/*.syntax */ "python </path/to/script>",
/*.next */ NULL
};
static switch_loadable_module_interface_t python_module_interface = {
@@ -113,7 +114,8 @@ static switch_loadable_module_interface_t python_module_interface = {
/*.directory_interface */ NULL
};
SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_module_interface_t **module_interface, char *filename)
SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_module_interface_t **module_interface,
char *filename)
{
/* connect my internal structure to the blank pointer passed to me */
*module_interface = &python_module_interface;
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -52,18 +52,14 @@
#include "jsscript.h"
SWITCH_BEGIN_EXTERN_C
#define JS_BUFFER_SIZE 1024 * 32
#define JS_BLOCK_SIZE JS_BUFFER_SIZE
#ifdef __ICC
#pragma warning (disable:310 193 1418)
#endif
#ifdef _MSC_VER
#pragma warning(disable: 4311)
#endif
#ifdef WIN32
#if defined(SWITCH_SM_DECLARE_STATIC)
#define SWITCH_SM_DECLARE(type) type __cdecl
@@ -75,8 +71,7 @@ SWITCH_BEGIN_EXTERN_C
#else //not win32
#define SWITCH_SM_DECLARE(type) type
#endif
int eval_some_js(char *code, JSContext *cx, JSObject *obj, jsval *rval)
int eval_some_js(char *code, JSContext * cx, JSObject * obj, jsval * rval)
{
JSScript *script = NULL;
char *cptr;
@@ -101,22 +96,22 @@ int eval_some_js(char *code, JSContext *cx, JSObject *obj, jsval *rval)
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot Open File: %s\n", script_name);
}
}
}
}
if (script) {
result = JS_ExecuteScript(cx, obj, script, rval) == JS_TRUE ? 1 : 0;
JS_DestroyScript(cx, script);
} else {
result = -1;
}
switch_safe_free(path);
return result;
}
typedef switch_status_t(*spidermonkey_load_t)(JSContext *cx, JSObject *obj);
typedef switch_status_t (*spidermonkey_load_t) (JSContext * cx, JSObject * obj);
struct sm_module_interface {
const char *name;
@@ -125,7 +120,7 @@ struct sm_module_interface {
};
typedef struct sm_module_interface sm_module_interface_t;
typedef switch_status_t(*spidermonkey_init_t)(const sm_module_interface_t **module_interface);
typedef switch_status_t (*spidermonkey_init_t) (const sm_module_interface_t ** module_interface);
struct js_session {
switch_core_session_t *session;
@@ -139,6 +134,4 @@ struct js_session {
SWITCH_END_EXTERN_C
#endif
@@ -34,19 +34,19 @@
static const char modname[] = "CoreDB";
struct db_obj {
switch_memory_pool_t *pool;
switch_core_db_t *db;
switch_core_db_stmt_t *stmt;
char *dbname;
char code_buffer[2048];
JSContext *cx;
JSObject *obj;
switch_memory_pool_t *pool;
switch_core_db_t *db;
switch_core_db_stmt_t *stmt;
char *dbname;
char code_buffer[2048];
JSContext *cx;
JSObject *obj;
};
/* DB Object */
/*********************************************************************************/
static JSBool db_construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
static JSBool db_construct(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
{
switch_memory_pool_t *pool;
switch_core_db_t *db;
@@ -55,7 +55,7 @@ static JSBool db_construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv
if (argc > 0) {
char *dbname = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
switch_core_new_memory_pool(&pool);
if (! (db = switch_core_db_open_file(dbname))) {
if (!(db = switch_core_db_open_file(dbname))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot Open DB!\n");
switch_core_destroy_memory_pool(&pool);
return JS_FALSE;
@@ -73,10 +73,10 @@ static JSBool db_construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv
return JS_FALSE;
}
static void db_destroy(JSContext *cx, JSObject *obj)
static void db_destroy(JSContext * cx, JSObject * obj)
{
struct db_obj *dbo = JS_GetPrivate(cx, obj);
if (dbo) {
switch_memory_pool_t *pool = dbo->pool;
if (dbo->stmt) {
@@ -85,7 +85,7 @@ static void db_destroy(JSContext *cx, JSObject *obj)
}
switch_core_db_close(dbo->db);
switch_core_destroy_memory_pool(&pool);
pool = NULL;
pool = NULL;
}
}
@@ -100,7 +100,7 @@ static int db_callback(void *pArg, int argc, char **argv, char **columnNames)
snprintf(code, sizeof(code), "~var _Db_RoW_ = {}");
eval_some_js(code, dbo->cx, dbo->obj, &rval);
for(x=0; x < argc; x++) {
for (x = 0; x < argc; x++) {
snprintf(code, sizeof(code), "~_Db_RoW_[\"%s\"] = \"%s\"", columnNames[x], argv[x]);
eval_some_js(code, dbo->cx, dbo->obj, &rval);
}
@@ -110,51 +110,51 @@ static int db_callback(void *pArg, int argc, char **argv, char **columnNames)
snprintf(code, sizeof(code), "~delete _Db_RoW_");
eval_some_js(code, dbo->cx, dbo->obj, &rval);
return 0;
}
static JSBool db_exec(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
static JSBool db_exec(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
{
struct db_obj *dbo = JS_GetPrivate(cx, obj);
*rval = BOOLEAN_TO_JSVAL( JS_TRUE );
struct db_obj *dbo = JS_GetPrivate(cx, obj);
*rval = BOOLEAN_TO_JSVAL(JS_TRUE);
if (argc > 0) {
char *sql = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
char *err = NULL;
void *arg = NULL;
switch_core_db_callback_func_t cb_func = NULL;
if (argc > 0) {
char *sql = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
char *err = NULL;
void *arg = NULL;
switch_core_db_callback_func_t cb_func = NULL;
if (argc > 1) {
char *js_func = JS_GetStringBytes(JS_ValueToString(cx, argv[1]));
switch_copy_string(dbo->code_buffer, js_func, sizeof(dbo->code_buffer));
cb_func = db_callback;
arg = dbo;
}
if (argc > 1) {
char *js_func = JS_GetStringBytes(JS_ValueToString(cx, argv[1]));
switch_copy_string(dbo->code_buffer, js_func, sizeof(dbo->code_buffer));
cb_func = db_callback;
arg = dbo;
}
switch_core_db_exec(dbo->db, sql, cb_func, arg, &err);
if (err) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error %s\n", err);
switch_core_db_free(err);
*rval = BOOLEAN_TO_JSVAL( JS_FALSE );
}
}
return JS_TRUE;
switch_core_db_exec(dbo->db, sql, cb_func, arg, &err);
if (err) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error %s\n", err);
switch_core_db_free(err);
*rval = BOOLEAN_TO_JSVAL(JS_FALSE);
}
}
return JS_TRUE;
}
static JSBool db_next(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
static JSBool db_next(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
{
struct db_obj *dbo = JS_GetPrivate(cx, obj);
*rval = BOOLEAN_TO_JSVAL( JS_FALSE );
*rval = BOOLEAN_TO_JSVAL(JS_FALSE);
if (dbo->stmt) {
if (dbo->stmt) {
int running = 1;
while (running < 5000) {
int result = switch_core_db_step(dbo->stmt);
if (result == SWITCH_CORE_DB_ROW) {
*rval = BOOLEAN_TO_JSVAL( JS_TRUE );
*rval = BOOLEAN_TO_JSVAL(JS_TRUE);
break;
} else if (result == SWITCH_CORE_DB_BUSY) {
running++;
@@ -169,7 +169,7 @@ static JSBool db_next(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsv
return JS_TRUE;
}
static JSBool db_fetch(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
static JSBool db_fetch(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
{
struct db_obj *dbo = JS_GetPrivate(cx, obj);
int colcount = switch_core_db_column_count(dbo->stmt);
@@ -179,16 +179,15 @@ static JSBool db_fetch(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, js
snprintf(code, sizeof(code), "~var _dB_RoW_DaTa_ = {}");
eval_some_js(code, dbo->cx, dbo->obj, rval);
if (*rval == JS_FALSE) {
return JS_TRUE;
return JS_TRUE;
}
for (x = 0; x < colcount; x++) {
snprintf(code, sizeof(code), "~_dB_RoW_DaTa_[\"%s\"] = \"%s\"",
(char *) switch_core_db_column_name(dbo->stmt, x),
(char *) switch_core_db_column_text(dbo->stmt, x));
snprintf(code, sizeof(code), "~_dB_RoW_DaTa_[\"%s\"] = \"%s\"",
(char *) switch_core_db_column_name(dbo->stmt, x), (char *) switch_core_db_column_text(dbo->stmt, x));
eval_some_js(code, dbo->cx, dbo->obj, rval);
if (*rval == JS_FALSE) {
return JS_TRUE;
return JS_TRUE;
}
}
@@ -198,11 +197,11 @@ static JSBool db_fetch(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, js
}
static JSBool db_prepare(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
static JSBool db_prepare(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
{
struct db_obj *dbo = JS_GetPrivate(cx, obj);
*rval = BOOLEAN_TO_JSVAL( JS_FALSE );
*rval = BOOLEAN_TO_JSVAL(JS_FALSE);
if (dbo->stmt) {
switch_core_db_finalize(dbo->stmt);
@@ -211,10 +210,10 @@ static JSBool db_prepare(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
if (argc > 0) {
char *sql = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
if(switch_core_db_prepare(dbo->db, sql, -1, &dbo->stmt, 0)) {
if (switch_core_db_prepare(dbo->db, sql, -1, &dbo->stmt, 0)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error %s\n", switch_core_db_errmsg(dbo->db));
} else {
*rval = BOOLEAN_TO_JSVAL( JS_TRUE );
*rval = BOOLEAN_TO_JSVAL(JS_TRUE);
}
}
return JS_TRUE;
@@ -234,27 +233,27 @@ static JSFunctionSpec db_methods[] = {
static JSPropertySpec db_props[] = {
{"path", DB_NAME, JSPROP_READONLY|JSPROP_PERMANENT},
{"path", DB_NAME, JSPROP_READONLY | JSPROP_PERMANENT},
{0}
};
static JSBool db_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
static JSBool db_getProperty(JSContext * cx, JSObject * obj, jsval id, jsval * vp)
{
JSBool res = JS_TRUE;
struct db_obj *dbo = JS_GetPrivate(cx, obj);
char *name;
int param = 0;
name = JS_GetStringBytes(JS_ValueToString(cx, id));
/* numbers are our props anything else is a method */
if (name[0] >= 48 && name[0] <= 57) {
param = atoi(name);
} else {
return JS_TRUE;
}
switch(param) {
/* numbers are our props anything else is a method */
if (name[0] >= 48 && name[0] <= 57) {
param = atoi(name);
} else {
return JS_TRUE;
}
switch (param) {
case DB_NAME:
*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, dbo->dbname));
break;
@@ -264,38 +263,28 @@ static JSBool db_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
}
JSClass db_class = {
modname, JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_PropertyStub, db_getProperty, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, db_destroy, NULL, NULL, NULL,
modname, JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_PropertyStub, db_getProperty, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, db_destroy, NULL, NULL, NULL,
db_construct
};
switch_status_t db_load(JSContext *cx, JSObject *obj)
switch_status_t db_load(JSContext * cx, JSObject * obj)
{
JS_InitClass(cx,
obj,
NULL,
&db_class,
db_construct,
3,
db_props,
db_methods,
db_props,
db_methods
);
JS_InitClass(cx, obj, NULL, &db_class, db_construct, 3, db_props, db_methods, db_props, db_methods);
return SWITCH_STATUS_SUCCESS;
}
const sm_module_interface_t DB_module_interface = {
/*.name = */ modname,
/*.spidermonkey_load*/ db_load,
/*.next*/ NULL
/*.spidermonkey_load */ db_load,
/*.next */ NULL
};
SWITCH_MOD_DECLARE(switch_status_t) spidermonkey_init(const sm_module_interface_t **module_interface)
SWITCH_MOD_DECLARE(switch_status_t) spidermonkey_init(const sm_module_interface_t ** module_interface)
{
*module_interface = &DB_module_interface;
return SWITCH_STATUS_SUCCESS;
@@ -40,9 +40,10 @@ static const char modname[] = "etpan";
#define B64BUFFLEN 1024
static const char c64[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static int write_buf(int fd, char *buf) {
static int write_buf(int fd, char *buf)
{
int len = (int)strlen(buf);
int len = (int) strlen(buf);
if (fd && write(fd, buf, len) != len) {
close(fd);
return 0;
@@ -53,17 +54,17 @@ static int write_buf(int fd, char *buf) {
/* etpan Object */
/*********************************************************************************/
static JSBool etpan_construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
static JSBool etpan_construct(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
{
return JS_TRUE;
}
static void etpan_destroy(JSContext *cx, JSObject *obj)
static void etpan_destroy(JSContext * cx, JSObject * obj)
{
}
#if 0
static JSBool etpan_my_method(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
static JSBool etpan_my_method(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
{
return JS_FALSE;
}
@@ -73,27 +74,26 @@ enum etpan_tinyid {
etpan_NAME
};
static JSBool js_email(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
static JSBool js_email(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
{
char *to = NULL, *from = NULL, *headers, *body = NULL, *file = NULL;
char *bound = "XXXX_boundary_XXXX";
char filename[80], buf[B64BUFFLEN];
int fd = 0, ifd = 0;
int x=0, y=0, bytes=0, ilen=0;
unsigned int b=0, l=0;
int x = 0, y = 0, bytes = 0, ilen = 0;
unsigned int b = 0, l = 0;
unsigned char in[B64BUFFLEN];
unsigned char out[B64BUFFLEN+512];
unsigned char out[B64BUFFLEN + 512];
char *path = NULL;
if (
argc > 3 &&
if (argc > 3 &&
(from = JS_GetStringBytes(JS_ValueToString(cx, argv[0]))) &&
(to = JS_GetStringBytes(JS_ValueToString(cx, argv[1]))) &&
(headers = JS_GetStringBytes(JS_ValueToString(cx, argv[2]))) &&
(body = JS_GetStringBytes(JS_ValueToString(cx, argv[3])))
(body = JS_GetStringBytes(JS_ValueToString(cx, argv[3])))
) {
if ( argc > 4) {
if (argc > 4) {
file = JS_GetStringBytes(JS_ValueToString(cx, argv[4]));
}
snprintf(filename, 80, "%smail.%ld%04x", SWITCH_GLOBAL_dirs.temp_dir, time(NULL), rand() & 0xffff);
@@ -110,22 +110,22 @@ static JSBool js_email(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, js
return JS_FALSE;
}
}
if (!write_buf(fd, headers))
return JS_FALSE;
if (!write_buf(fd, "\n\n"))
return JS_FALSE;
if (file) {
snprintf(buf, B64BUFFLEN, "--%s\nContent-Type: text/plain\n\n", bound);
if (!write_buf(fd, buf))
return JS_FALSE;
}
if (!write_buf(fd, body))
return JS_FALSE;
if (file) {
snprintf(buf, B64BUFFLEN, "\n\n--%s\nContent-Type: application/octet-stream\n"
"Content-Transfer-Encoding: base64\n"
@@ -133,40 +133,41 @@ static JSBool js_email(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, js
"Content-Disposition: attachment; filename=\"%s\"\n\n", bound, file);
if (!write_buf(fd, buf))
return JS_FALSE;
while((ilen=read(ifd, in, B64BUFFLEN))) {
for (x=0;x<ilen;x++) {
b = (b<<8) + in[x];
while ((ilen = read(ifd, in, B64BUFFLEN))) {
for (x = 0; x < ilen; x++) {
b = (b << 8) + in[x];
l += 8;
while (l >= 6) {
out[bytes++] = c64[(b>>(l-=6))%64];
if (++y!=72)
out[bytes++] = c64[(b >> (l -= 6)) % 64];
if (++y != 72)
continue;
out[bytes++] = '\n';
y=0;
y = 0;
}
}
if (write(fd, &out, bytes) != bytes) {
if (write(fd, &out, bytes) != bytes) {
return -1;
} else
bytes=0;
} else
bytes = 0;
}
if (l > 0) {
out[bytes++] = c64[((b%16)<<(6-l))%64];
out[bytes++] = c64[((b % 16) << (6 - l)) % 64];
}
if (l != 0) while (l < 6) {
out[bytes++] = '=', l += 2;
}
if (write(fd, &out, bytes) != bytes) {
if (l != 0)
while (l < 6) {
out[bytes++] = '=', l += 2;
}
if (write(fd, &out, bytes) != bytes) {
return -1;
}
}
if (file) {
snprintf(buf, B64BUFFLEN, "\n\n--%s--\n.\n", bound);
if (!write_buf(fd, buf))
@@ -192,23 +193,23 @@ static JSBool js_email(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, js
}
return JS_TRUE;
}
return JS_FALSE;
}
static JSFunctionSpec etpan_methods[] = {
// {"myMethod", odbc_my_method, 1},
// {"myMethod", odbc_my_method, 1},
{0}
};
static JSPropertySpec etpan_props[] = {
// {"name", etpan_NAME, JSPROP_READONLY|JSPROP_PERMANENT},
// {"name", etpan_NAME, JSPROP_READONLY|JSPROP_PERMANENT},
{0}
};
static JSBool etpan_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
static JSBool etpan_getProperty(JSContext * cx, JSObject * obj, jsval id, jsval * vp)
{
JSBool res = JS_TRUE;
@@ -216,44 +217,35 @@ static JSBool etpan_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *v
}
JSClass etpan_class = {
modname, JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_PropertyStub, etpan_getProperty, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, etpan_destroy, NULL, NULL, NULL,
modname, JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_PropertyStub, etpan_getProperty, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, etpan_destroy, NULL, NULL, NULL,
etpan_construct
};
static JSFunctionSpec etpan_functions[] = {
{"email", js_email, 2},
{"email", js_email, 2},
{0}
};
switch_status_t etpan_load(JSContext *cx, JSObject *obj)
switch_status_t etpan_load(JSContext * cx, JSObject * obj)
{
JS_DefineFunctions(cx, obj, etpan_functions);
JS_InitClass(cx,
obj,
NULL,
&etpan_class,
etpan_construct,
3,
etpan_props,
etpan_methods,
etpan_props,
etpan_methods
);
obj, NULL, &etpan_class, etpan_construct, 3, etpan_props, etpan_methods, etpan_props, etpan_methods);
return SWITCH_STATUS_SUCCESS;
}
const sm_module_interface_t etpan_module_interface = {
/*.name = */ modname,
/*.spidermonkey_load*/ etpan_load,
/*.next*/ NULL
/*.spidermonkey_load */ etpan_load,
/*.next */ NULL
};
SWITCH_MOD_DECLARE(switch_status_t) spidermonkey_init(const sm_module_interface_t **module_interface)
SWITCH_MOD_DECLARE(switch_status_t) spidermonkey_init(const sm_module_interface_t ** module_interface)
{
*module_interface = &etpan_module_interface;
return SWITCH_STATUS_SUCCESS;
@@ -271,259 +263,258 @@ int smtp_tls = 0;
int smtp_esmtp = 1;
struct mem_message {
char *data;
size_t len;
MMAPString *mstring;
char *data;
size_t len;
MMAPString *mstring;
};
#define BLOCKSIZE 4096
int collect(struct mem_message *message) {
struct stat sb;
int len;
int collect(struct mem_message *message)
{
struct stat sb;
int len;
memset(message, 0, sizeof(struct mem_message));
memset(message, 0, sizeof(struct mem_message));
#ifndef MMAP_UNAVAILABLE
/* if stdin is a file whose size is known, try to mmap it */
if (!fstat(0, &sb) && S_ISREG(sb.st_mode) && sb.st_size >= 0) {
message->len = sb.st_size;
if ((message->data = mmap(NULL, message->len, PROT_READ, MAP_SHARED,
STDIN_FILENO, 0)) != MAP_FAILED)
return 0;
}
/* if stdin is a file whose size is known, try to mmap it */
if (!fstat(0, &sb) && S_ISREG(sb.st_mode) && sb.st_size >= 0) {
message->len = sb.st_size;
if ((message->data = mmap(NULL, message->len, PROT_READ, MAP_SHARED, STDIN_FILENO, 0)) != MAP_FAILED)
return 0;
}
#endif
/* read the buffer from stdin by blocks, until EOF or error.
save the message in a mmap_string */
if ((message->mstring = mmap_string_sized_new(BLOCKSIZE)) == NULL) {
perror("mmap_string_new");
goto error;
}
message->len = 0;
/* read the buffer from stdin by blocks, until EOF or error.
save the message in a mmap_string */
if ((message->mstring = mmap_string_sized_new(BLOCKSIZE)) == NULL) {
perror("mmap_string_new");
goto error;
}
message->len = 0;
while ((len = read(STDIN_FILENO,
message->mstring->str + message->len, BLOCKSIZE)) > 0) {
message->len += len;
/* reserve room for next block */
if ((mmap_string_set_size(message->mstring,
message->len + BLOCKSIZE)) == NULL) {
perror("mmap_string_set_size");
goto error;
}
}
while ((len = read(STDIN_FILENO, message->mstring->str + message->len, BLOCKSIZE)) > 0) {
message->len += len;
/* reserve room for next block */
if ((mmap_string_set_size(message->mstring, message->len + BLOCKSIZE)) == NULL) {
perror("mmap_string_set_size");
goto error;
}
}
if (len == 0) {
message->data = message->mstring->str;
return 0; /* OK */
}
if (len == 0) {
message->data = message->mstring->str;
return 0; /* OK */
}
perror("read");
perror("read");
error:
if (message->mstring != NULL)
mmap_string_free(message->mstring);
return -1;
error:
if (message->mstring != NULL)
mmap_string_free(message->mstring);
return -1;
}
char *guessfrom() {
char *guessfrom()
{
#ifndef _MSC_VER
uid_t uid;
struct passwd *pw;
char hostname[256];
int len;
char *gfrom;
uid_t uid;
struct passwd *pw;
char hostname[256];
int len;
char *gfrom;
if (gethostname(hostname, sizeof(hostname))) {
perror("gethostname");
return NULL;
}
hostname[sizeof(hostname) - 1] = '\0';
if (gethostname(hostname, sizeof(hostname))) {
perror("gethostname");
return NULL;
}
hostname[sizeof(hostname) - 1] = '\0';
uid = getuid();
pw = getpwuid(uid);
len = ((pw != NULL) ? strlen(pw->pw_name) : 12)
+ strlen(hostname) + 2;
uid = getuid();
pw = getpwuid(uid);
if ((gfrom = malloc(len)) == NULL) {
perror("malloc");
return NULL;
}
if (pw != NULL && pw->pw_name != NULL)
snprintf(gfrom, len, "%s@%s", pw->pw_name, hostname);
else
snprintf(gfrom, len, "#%u@%s", uid, hostname);
return gfrom;
len = ((pw != NULL) ? strlen(pw->pw_name) : 12)
+ strlen(hostname) + 2;
if ((gfrom = malloc(len)) == NULL) {
perror("malloc");
return NULL;
}
if (pw != NULL && pw->pw_name != NULL)
snprintf(gfrom, len, "%s@%s", pw->pw_name, hostname);
else
snprintf(gfrom, len, "#%u@%s", uid, hostname);
return gfrom;
#else
return NULL;
#endif
}
void release(struct mem_message *message) {
if (message->mstring != NULL)
mmap_string_free(message->mstring);
void release(struct mem_message *message)
{
if (message->mstring != NULL)
mmap_string_free(message->mstring);
#ifndef MMAP_UNAVAILABLE
else if (message->data != NULL)
munmap(message->data, message->len);
else if (message->data != NULL)
munmap(message->data, message->len);
#endif
}
int send_message(char *data, size_t len, char**rcpts) {
int s = -1;
int ret;
char **r;
int esmtp = 0;
mailsmtp *smtp = NULL;
int send_message(char *data, size_t len, char **rcpts)
{
int s = -1;
int ret;
char **r;
int esmtp = 0;
mailsmtp *smtp = NULL;
if ((smtp = mailsmtp_new(0, NULL)) == NULL) {
perror("mailsmtp_new");
goto error;
}
if ((smtp = mailsmtp_new(0, NULL)) == NULL) {
perror("mailsmtp_new");
goto error;
}
/* first open the stream */
if ((ret = mailsmtp_socket_connect(smtp,
(smtp_server != NULL ? smtp_server : "localhost"),
smtp_port)) != MAILSMTP_NO_ERROR) {
fprintf(stderr, "mailsmtp_socket_connect: %s\n", mailsmtp_strerror(ret));
goto error;
}
/* then introduce ourselves */
if (smtp_esmtp && (ret = mailesmtp_ehlo(smtp)) == MAILSMTP_NO_ERROR)
esmtp = 1;
else if (!smtp_esmtp || ret == MAILSMTP_ERROR_NOT_IMPLEMENTED)
ret = mailsmtp_helo(smtp);
if (ret != MAILSMTP_NO_ERROR) {
fprintf(stderr, "mailsmtp_helo: %s\n", mailsmtp_strerror(ret));
goto error;
}
/* first open the stream */
if ((ret = mailsmtp_socket_connect(smtp,
(smtp_server != NULL ? smtp_server : "localhost"),
smtp_port)) != MAILSMTP_NO_ERROR) {
fprintf(stderr, "mailsmtp_socket_connect: %s\n", mailsmtp_strerror(ret));
goto error;
}
if (esmtp && smtp_tls &&
(ret = mailsmtp_socket_starttls(smtp)) != MAILSMTP_NO_ERROR) {
fprintf(stderr, "mailsmtp_starttls: %s\n", mailsmtp_strerror(ret));
goto error;
}
if (esmtp && smtp_user != NULL &&
(ret = mailsmtp_auth(smtp, smtp_user,
(smtp_password != NULL) ? smtp_password : ""))
!= MAILSMTP_NO_ERROR) {
fprintf(stderr, "mailsmtp_auth: %s: %s\n", smtp_user, mailsmtp_strerror(ret));
goto error;
}
/* then introduce ourselves */
if (smtp_esmtp && (ret = mailesmtp_ehlo(smtp)) == MAILSMTP_NO_ERROR)
esmtp = 1;
else if (!smtp_esmtp || ret == MAILSMTP_ERROR_NOT_IMPLEMENTED)
ret = mailsmtp_helo(smtp);
if (ret != MAILSMTP_NO_ERROR) {
fprintf(stderr, "mailsmtp_helo: %s\n", mailsmtp_strerror(ret));
goto error;
}
/* source */
if ((ret = (esmtp ?
mailesmtp_mail(smtp, smtp_from, 1, "etPanSMTPTest") :
mailsmtp_mail(smtp, smtp_from))) != MAILSMTP_NO_ERROR) {
fprintf(stderr, "mailsmtp_mail: %s, %s\n", smtp_from, mailsmtp_strerror(ret));
goto error;
}
/* recipients */
for (r = rcpts; *r != NULL; r++) {
if ((ret = (esmtp ?
mailesmtp_rcpt(smtp, *r,
MAILSMTP_DSN_NOTIFY_FAILURE|MAILSMTP_DSN_NOTIFY_DELAY,
NULL) :
mailsmtp_rcpt(smtp, *r))) != MAILSMTP_NO_ERROR) {
fprintf(stderr, "mailsmtp_rcpt: %s: %s\n", *r, mailsmtp_strerror(ret));
goto error;
}
}
/* message */
if ((ret = mailsmtp_data(smtp)) != MAILSMTP_NO_ERROR) {
fprintf(stderr, "mailsmtp_data: %s\n", mailsmtp_strerror(ret));
goto error;
}
if ((ret = mailsmtp_data_message(smtp, data, len)) != MAILSMTP_NO_ERROR) {
fprintf(stderr, "mailsmtp_data_message: %s\n", mailsmtp_strerror(ret));
goto error;
}
mailsmtp_free(smtp);
return 0;
if (esmtp && smtp_tls && (ret = mailsmtp_socket_starttls(smtp)) != MAILSMTP_NO_ERROR) {
fprintf(stderr, "mailsmtp_starttls: %s\n", mailsmtp_strerror(ret));
goto error;
}
error:
if (smtp != NULL)
mailsmtp_free(smtp);
if (s >= 0)
close(s);
return -1;
if (esmtp && smtp_user != NULL &&
(ret = mailsmtp_auth(smtp, smtp_user, (smtp_password != NULL) ? smtp_password : ""))
!= MAILSMTP_NO_ERROR) {
fprintf(stderr, "mailsmtp_auth: %s: %s\n", smtp_user, mailsmtp_strerror(ret));
goto error;
}
/* source */
if ((ret = (esmtp ?
mailesmtp_mail(smtp, smtp_from, 1, "etPanSMTPTest") :
mailsmtp_mail(smtp, smtp_from))) != MAILSMTP_NO_ERROR) {
fprintf(stderr, "mailsmtp_mail: %s, %s\n", smtp_from, mailsmtp_strerror(ret));
goto error;
}
/* recipients */
for (r = rcpts; *r != NULL; r++) {
if ((ret = (esmtp ?
mailesmtp_rcpt(smtp, *r,
MAILSMTP_DSN_NOTIFY_FAILURE | MAILSMTP_DSN_NOTIFY_DELAY,
NULL) : mailsmtp_rcpt(smtp, *r))) != MAILSMTP_NO_ERROR) {
fprintf(stderr, "mailsmtp_rcpt: %s: %s\n", *r, mailsmtp_strerror(ret));
goto error;
}
}
/* message */
if ((ret = mailsmtp_data(smtp)) != MAILSMTP_NO_ERROR) {
fprintf(stderr, "mailsmtp_data: %s\n", mailsmtp_strerror(ret));
goto error;
}
if ((ret = mailsmtp_data_message(smtp, data, len)) != MAILSMTP_NO_ERROR) {
fprintf(stderr, "mailsmtp_data_message: %s\n", mailsmtp_strerror(ret));
goto error;
}
mailsmtp_free(smtp);
return 0;
error:
if (smtp != NULL)
mailsmtp_free(smtp);
if (s >= 0)
close(s);
return -1;
}
int main(int argc, char **argv) {
struct mem_message message;
int index, r;
int main(int argc, char **argv)
{
struct mem_message message;
int index, r;
static struct option long_options[] = {
{"server", 1, 0, 's'},
{"port", 1, 0, 'p'},
{"user", 1, 0, 'u'},
{"password", 1, 0, 'v'},
{"from", 1, 0, 'f'},
{"tls", 0, 0, 'S'},
{"no-esmtp", 0, 0, 'E'},
};
static struct option long_options[] = {
{"server", 1, 0, 's'},
{"port", 1, 0, 'p'},
{"user", 1, 0, 'u'},
{"password", 1, 0, 'v'},
{"from", 1, 0, 'f'},
{"tls", 0, 0, 'S'},
{"no-esmtp", 0, 0, 'E'},
};
while(1) {
if ((r = getopt_long(argc, argv, "s:p:u:v:f:SE", long_options, &index)) < 0)
break;
switch (r) {
case 's':
if (smtp_server != NULL)
free(smtp_server);
smtp_server = strdup(optarg);
break;
case 'p':
smtp_port = (uint16_t) strtoul(optarg, NULL, 10);
break;
case 'u':
if (smtp_user != NULL)
free(smtp_user);
smtp_user = strdup(optarg);
break;
case 'v':
if (smtp_password != NULL)
free(smtp_password);
smtp_password = strdup(optarg);
break;
case 'f':
if (smtp_from != NULL)
free(smtp_from);
smtp_from = strdup(optarg);
break;
case 'S':
smtp_tls = 1;
break;
case 'E':
smtp_esmtp = 0;
break;
}
}
while (1) {
if ((r = getopt_long(argc, argv, "s:p:u:v:f:SE", long_options, &index)) < 0)
break;
switch (r) {
case 's':
if (smtp_server != NULL)
free(smtp_server);
smtp_server = strdup(optarg);
break;
case 'p':
smtp_port = (uint16_t) strtoul(optarg, NULL, 10);
break;
case 'u':
if (smtp_user != NULL)
free(smtp_user);
smtp_user = strdup(optarg);
break;
case 'v':
if (smtp_password != NULL)
free(smtp_password);
smtp_password = strdup(optarg);
break;
case 'f':
if (smtp_from != NULL)
free(smtp_from);
smtp_from = strdup(optarg);
break;
case 'S':
smtp_tls = 1;
break;
case 'E':
smtp_esmtp = 0;
break;
}
}
argc -= optind;
argv += optind;
argc -= optind;
argv += optind;
if (argc < 1) {
fprintf(stderr, "usage: smtpsend [-f from] [-u user] [-v password] [-s server] [-p port] [-S] <rcpts>...\n");
return EXIT_FAILURE;
}
if (argc < 1) {
fprintf(stderr, "usage: smtpsend [-f from] [-u user] [-v password] [-s server] [-p port] [-S] <rcpts>...\n");
return EXIT_FAILURE;
}
if (smtp_from == NULL && (smtp_from = guessfrom()) == NULL) {
fprintf(stderr, "can't guess a valid from, please use -f option.\n");
return EXIT_FAILURE;
}
/* reads message from stdin */
if (collect(&message))
return EXIT_FAILURE;
send_message(message.data, message.len, argv);
if (smtp_from == NULL && (smtp_from = guessfrom()) == NULL) {
fprintf(stderr, "can't guess a valid from, please use -f option.\n");
return EXIT_FAILURE;
}
release(&message);
return EXIT_SUCCESS;
/* reads message from stdin */
if (collect(&message))
return EXIT_FAILURE;
send_message(message.data, message.len, argv);
release(&message);
return EXIT_SUCCESS;
}
#endif
@@ -46,30 +46,30 @@
static const char modname[] = "ODBC";
struct odbc_obj {
char *dsn;
char *username;
char *password;
SQLHENV env;
SQLHDBC con;
SQLHSTMT stmt;
uint32_t state;
SQLCHAR *colbuf;
int32 cblen;
SQLCHAR *code;
int32 codelen;
char *dsn;
char *username;
char *password;
SQLHENV env;
SQLHDBC con;
SQLHSTMT stmt;
uint32_t state;
SQLCHAR *colbuf;
int32 cblen;
SQLCHAR *code;
int32 codelen;
};
typedef enum {
ODBC_STATE_INIT,
ODBC_STATE_DOWN,
ODBC_STATE_CONNECTED,
ODBC_STATE_ERROR
ODBC_STATE_INIT,
ODBC_STATE_DOWN,
ODBC_STATE_CONNECTED,
ODBC_STATE_ERROR
} odbc_state_t;
typedef struct odbc_obj odbc_obj_t;
typedef enum {
ODBC_SUCCESS = 0,
ODBC_FAIL = -1
ODBC_SUCCESS = 0,
ODBC_FAIL = -1
} odbc_status_t;
@@ -77,59 +77,59 @@ static odbc_obj_t *new_odbc_obj(char *dsn, char *username, char *password)
{
odbc_obj_t *new_obj;
if (!(new_obj = malloc(sizeof(*new_obj)))) {
goto err;
}
if (!(new_obj->dsn = strdup(dsn))) {
goto err;
}
if (!(new_obj = malloc(sizeof(*new_obj)))) {
goto err;
}
if (!(new_obj->username = strdup(username))) {
goto err;
}
if (!(new_obj->dsn = strdup(dsn))) {
goto err;
}
if (!(new_obj->password = strdup(password))) {
goto err;
}
if (!(new_obj->username = strdup(username))) {
goto err;
}
if (!(new_obj->password = strdup(password))) {
goto err;
}
new_obj->env = SQL_NULL_HANDLE;
new_obj->state = ODBC_STATE_INIT;
return new_obj;
err:
err:
if (new_obj) {
switch_safe_free(new_obj->dsn);
switch_safe_free(new_obj->username);
switch_safe_free(new_obj->password);
switch_safe_free(new_obj);
switch_safe_free(new_obj);
}
return NULL;
}
odbc_status_t odbc_obj_disconnect(odbc_obj_t *obj)
odbc_status_t odbc_obj_disconnect(odbc_obj_t * obj)
{
int result;
if (obj->state == ODBC_STATE_CONNECTED) {
result = SQLDisconnect(obj->con);
if (result == ODBC_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Disconnected %d from [%s]\n", result, obj->dsn);
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Disconnectiong [%s]\n", obj->dsn);
}
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "[%s] already disconnected\n", obj->dsn);
}
if (obj->state == ODBC_STATE_CONNECTED) {
result = SQLDisconnect(obj->con);
if (result == ODBC_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Disconnected %d from [%s]\n", result, obj->dsn);
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Disconnectiong [%s]\n", obj->dsn);
}
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "[%s] already disconnected\n", obj->dsn);
}
obj->state = ODBC_STATE_DOWN;
return ODBC_SUCCESS;
}
odbc_status_t odbc_obj_connect(odbc_obj_t *obj)
odbc_status_t odbc_obj_connect(odbc_obj_t * obj)
{
int result;
SQLINTEGER err;
@@ -140,14 +140,14 @@ odbc_status_t odbc_obj_connect(odbc_obj_t *obj)
result = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &obj->env);
if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Error AllocHandle\n");
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Error AllocHandle\n");
return ODBC_FAIL;
}
result = SQLSetEnvAttr(obj->env, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0);
if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Error SetEnv\n");
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Error SetEnv\n");
SQLFreeHandle(SQL_HANDLE_ENV, obj->env);
return ODBC_FAIL;
}
@@ -155,7 +155,7 @@ odbc_status_t odbc_obj_connect(odbc_obj_t *obj)
result = SQLAllocHandle(SQL_HANDLE_DBC, obj->env, &obj->con);
if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Error AllocHDB %d\n", result);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Error AllocHDB %d\n", result);
SQLFreeHandle(SQL_HANDLE_ENV, obj->env);
return ODBC_FAIL;
}
@@ -169,14 +169,14 @@ odbc_status_t odbc_obj_connect(odbc_obj_t *obj)
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Connecting %s\n", obj->dsn);
result = SQLConnect(obj->con,
(SQLCHAR *) obj->dsn, SQL_NTS,
(SQLCHAR *) obj->username, SQL_NTS,
(SQLCHAR *) obj->password, SQL_NTS);
(SQLCHAR *) obj->dsn, SQL_NTS,
(SQLCHAR *) obj->username, SQL_NTS, (SQLCHAR *) obj->password, SQL_NTS);
if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {
SQLGetDiagRec(SQL_HANDLE_DBC, obj->con, 1, stat, &err, msg, 100, &mlen);
SQLFreeHandle(SQL_HANDLE_ENV, obj->env);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Error SQLConnect=%d errno=%d %s\n", result, (int)err, msg);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Error SQLConnect=%d errno=%d %s\n", result, (int) err,
msg);
return ODBC_FAIL;
} else {
@@ -187,9 +187,9 @@ odbc_status_t odbc_obj_connect(odbc_obj_t *obj)
return ODBC_SUCCESS;
}
static void destroy_odbc_obj(odbc_obj_t **objp)
static void destroy_odbc_obj(odbc_obj_t ** objp)
{
odbc_obj_t *obj = *objp;
odbc_obj_t *obj = *objp;
odbc_obj_disconnect(obj);
@@ -198,282 +198,284 @@ static void destroy_odbc_obj(odbc_obj_t **objp)
SQLFreeHandle(SQL_HANDLE_ENV, obj->env);
switch_safe_free(obj->dsn);
switch_safe_free(obj->username);
switch_safe_free(obj->password);
switch_safe_free(obj->username);
switch_safe_free(obj->password);
switch_safe_free(obj->colbuf);
switch_safe_free(obj->code);
switch_safe_free(obj);
switch_safe_free(obj);
}
/* ODBC Object */
/*********************************************************************************/
static JSBool odbc_construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
static JSBool odbc_construct(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
{
odbc_obj_t *odbc_obj = NULL;
char *dsn, *username, *password;
int32 blen = 1024;
odbc_obj_t *odbc_obj = NULL;
char *dsn, *username, *password;
int32 blen = 1024;
if (argc < 3) {
return JS_FALSE;
}
if (argc < 3) {
return JS_FALSE;
}
dsn = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
username = JS_GetStringBytes(JS_ValueToString(cx, argv[1]));
password = JS_GetStringBytes(JS_ValueToString(cx, argv[2]));
dsn = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
username = JS_GetStringBytes(JS_ValueToString(cx, argv[1]));
password = JS_GetStringBytes(JS_ValueToString(cx, argv[2]));
if (argc > 3) {
int32 len;
JS_ValueToInt32(cx, argv[3], &len);
if (argc > 3) {
int32 len;
JS_ValueToInt32(cx, argv[3], &len);
if (len > 0) {
blen = len;
}
}
if (dsn && username && password) {
odbc_obj = new_odbc_obj(dsn, username, password);
}
if (len > 0) {
blen = len;
}
}
if (!odbc_obj) {
return JS_FALSE;
}
if (dsn && username && password) {
odbc_obj = new_odbc_obj(dsn, username, password);
}
if (!(odbc_obj->colbuf = (SQLCHAR *) malloc(blen))) {
destroy_odbc_obj(&odbc_obj);
return JS_FALSE;
}
if (!odbc_obj) {
return JS_FALSE;
}
odbc_obj->cblen = blen;
if (!(odbc_obj->colbuf = (SQLCHAR *) malloc(blen))) {
destroy_odbc_obj(&odbc_obj);
return JS_FALSE;
}
blen += 1536;
odbc_obj->cblen = blen;
if (!(odbc_obj->code = (SQLCHAR *) malloc(blen))) {
destroy_odbc_obj(&odbc_obj);
return JS_FALSE;
}
odbc_obj->codelen = blen;
blen += 1536;
if (!(odbc_obj->code = (SQLCHAR *) malloc(blen))) {
destroy_odbc_obj(&odbc_obj);
return JS_FALSE;
}
odbc_obj->codelen = blen;
JS_SetPrivate(cx, obj, odbc_obj);
return JS_TRUE;
}
static void odbc_destroy(JSContext *cx, JSObject *obj)
static void odbc_destroy(JSContext * cx, JSObject * obj)
{
odbc_obj_t *odbc_obj = (odbc_obj_t *) JS_GetPrivate(cx, obj);
odbc_obj_t *odbc_obj = (odbc_obj_t *) JS_GetPrivate(cx, obj);
if (odbc_obj) {
destroy_odbc_obj(&odbc_obj);
}
if (odbc_obj) {
destroy_odbc_obj(&odbc_obj);
}
}
static JSBool odbc_connect(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
static JSBool odbc_connect(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
{
odbc_obj_t *odbc_obj = (odbc_obj_t *) JS_GetPrivate(cx, obj);
JSBool tf = JS_TRUE;
odbc_obj_t *odbc_obj = (odbc_obj_t *) JS_GetPrivate(cx, obj);
JSBool tf = JS_TRUE;
if (odbc_obj) {
if (odbc_obj_connect(odbc_obj) == ODBC_SUCCESS) {
tf = JS_TRUE;
} else {
tf = JS_FALSE;
}
}
*rval = BOOLEAN_TO_JSVAL( tf );
if (odbc_obj) {
if (odbc_obj_connect(odbc_obj) == ODBC_SUCCESS) {
tf = JS_TRUE;
} else {
tf = JS_FALSE;
}
}
*rval = BOOLEAN_TO_JSVAL(tf);
return JS_TRUE;
}
static JSBool odbc_exec(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
static JSBool odbc_exec(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
{
odbc_obj_t *odbc_obj = (odbc_obj_t *) JS_GetPrivate(cx, obj);
char *sql;
JSBool tf = JS_FALSE;
int result;
odbc_obj_t *odbc_obj = (odbc_obj_t *) JS_GetPrivate(cx, obj);
char *sql;
JSBool tf = JS_FALSE;
int result;
if (argc < 1) {
goto done;
}
if (argc < 1) {
goto done;
}
if (odbc_obj->state != ODBC_STATE_CONNECTED) {
goto done;
}
if (odbc_obj->state != ODBC_STATE_CONNECTED) {
goto done;
}
if (odbc_obj->stmt) {
SQLFreeHandle (SQL_HANDLE_STMT, odbc_obj->stmt);
odbc_obj->stmt = NULL;
}
sql = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
if (odbc_obj->stmt) {
SQLFreeHandle(SQL_HANDLE_STMT, odbc_obj->stmt);
odbc_obj->stmt = NULL;
}
if (SQLAllocHandle(SQL_HANDLE_STMT, odbc_obj->con, &odbc_obj->stmt) != SQL_SUCCESS) {
goto done;
}
sql = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
if (SQLPrepare(odbc_obj->stmt, (unsigned char *)sql, SQL_NTS) != SQL_SUCCESS) {
goto done;
}
if (SQLAllocHandle(SQL_HANDLE_STMT, odbc_obj->con, &odbc_obj->stmt) != SQL_SUCCESS) {
goto done;
}
result = SQLExecute(odbc_obj->stmt);
if (SQLPrepare(odbc_obj->stmt, (unsigned char *) sql, SQL_NTS) != SQL_SUCCESS) {
goto done;
}
if (result != SQL_SUCCESS && result != SQL_SUCCESS_WITH_INFO) {
goto done;
}
tf = JS_TRUE;
done:
result = SQLExecute(odbc_obj->stmt);
*rval = BOOLEAN_TO_JSVAL( tf );
if (result != SQL_SUCCESS && result != SQL_SUCCESS_WITH_INFO) {
goto done;
}
return JS_TRUE;
tf = JS_TRUE;
done:
*rval = BOOLEAN_TO_JSVAL(tf);
return JS_TRUE;
}
static JSBool odbc_num_rows(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
static JSBool odbc_num_rows(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
{
odbc_obj_t *odbc_obj = (odbc_obj_t *) JS_GetPrivate(cx, obj);
odbc_obj_t *odbc_obj = (odbc_obj_t *) JS_GetPrivate(cx, obj);
SQLSMALLINT rows = 0;
SQLSMALLINT rows = 0;
if (odbc_obj->state != ODBC_STATE_CONNECTED) {
goto done;
}
if (odbc_obj->state != ODBC_STATE_CONNECTED) {
goto done;
}
if (odbc_obj->stmt) {
SQLNumResultCols(odbc_obj->stmt, &rows);
}
if (odbc_obj->stmt) {
SQLNumResultCols(odbc_obj->stmt, &rows);
}
done:
done:
*rval = INT_TO_JSVAL( rows );
*rval = INT_TO_JSVAL(rows);
return JS_TRUE;
return JS_TRUE;
}
static JSBool odbc_next_row(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
static JSBool odbc_next_row(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
{
odbc_obj_t *odbc_obj = (odbc_obj_t *) JS_GetPrivate(cx, obj);
int result = 0;
JSBool tf = JS_FALSE;
odbc_obj_t *odbc_obj = (odbc_obj_t *) JS_GetPrivate(cx, obj);
int result = 0;
JSBool tf = JS_FALSE;
if (odbc_obj->state != ODBC_STATE_CONNECTED) {
goto done;
}
if (odbc_obj->state != ODBC_STATE_CONNECTED) {
goto done;
}
if (odbc_obj->stmt) {
if ((result = SQLFetch(odbc_obj->stmt) == SQL_SUCCESS)) {
tf = JS_TRUE;
}
}
if (odbc_obj->stmt) {
if ((result = SQLFetch(odbc_obj->stmt) == SQL_SUCCESS)) {
tf = JS_TRUE;
}
}
done:
done:
*rval = BOOLEAN_TO_JSVAL( tf );
*rval = BOOLEAN_TO_JSVAL(tf);
return JS_TRUE;
return JS_TRUE;
}
static char *escape_data(char *in)
{
switch_size_t nlen = strlen(in);
uint32_t qc = 0;
char *p, *q, *r;
switch_size_t nlen = strlen(in);
uint32_t qc = 0;
char *p, *q, *r;
for(p = in; p && *p; p++) {
if (*p == '"') {
qc += 2;
}
}
nlen += qc + 1;
for (p = in; p && *p; p++) {
if (*p == '"') {
qc += 2;
}
}
if (!(q = (char *) malloc(nlen))) {
return NULL;
}
nlen += qc + 1;
r = q;
qc = 0;
for(p = in; p && *p; p++) {
if (*p == '"') {
*r++ = '\\';
}
*r++ = *p;
if (++qc > nlen) {
break;
}
}
*r++ = '\0';
if (!(q = (char *) malloc(nlen))) {
return NULL;
}
r = q;
qc = 0;
for (p = in; p && *p; p++) {
if (*p == '"') {
*r++ = '\\';
}
*r++ = *p;
if (++qc > nlen) {
break;
}
}
*r++ = '\0';
return q;
return q;
}
static JSBool odbc_get_data(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
static JSBool odbc_get_data(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
{
odbc_obj_t *odbc_obj = (odbc_obj_t *) JS_GetPrivate(cx, obj);
JSBool tf = JS_FALSE;
odbc_obj_t *odbc_obj = (odbc_obj_t *) JS_GetPrivate(cx, obj);
JSBool tf = JS_FALSE;
if (odbc_obj->state != ODBC_STATE_CONNECTED) {
goto done;
}
if (odbc_obj->state != ODBC_STATE_CONNECTED) {
goto done;
}
if (odbc_obj->stmt) {
SQLSMALLINT c = 0, x = 0;
int result;
char code[66560];
if (odbc_obj->stmt) {
SQLSMALLINT c = 0, x = 0;
int result;
char code[66560];
snprintf(code, sizeof(code), "~var _oDbC_dB_RoW_DaTa_ = {}");
eval_some_js(code, cx, obj, rval);
if (*rval == JS_FALSE) {
return JS_TRUE;
}
snprintf(code, sizeof(code), "~var _oDbC_dB_RoW_DaTa_ = {}");
eval_some_js(code, cx, obj, rval);
if (*rval == JS_FALSE) {
return JS_TRUE;
}
result = SQLNumResultCols(odbc_obj->stmt, &c);
if (result == SQL_SUCCESS || result == SQL_SUCCESS_WITH_INFO) {
for (x = 1; x <= c; x++) {
SQLSMALLINT NameLength, DataType, DecimalDigits, Nullable;
SQLUINTEGER ColumnSize;
SQLCHAR name[1024] = "";
SQLCHAR *data = odbc_obj->colbuf;
SQLCHAR *esc = NULL;
result = SQLNumResultCols(odbc_obj->stmt, &c);
if (result == SQL_SUCCESS || result == SQL_SUCCESS_WITH_INFO) {
for (x = 1; x <= c; x++) {
SQLSMALLINT NameLength, DataType, DecimalDigits, Nullable;
SQLUINTEGER ColumnSize;
SQLCHAR name[1024] = "";
SQLCHAR *data = odbc_obj->colbuf;
SQLCHAR *esc = NULL;
SQLDescribeCol(odbc_obj->stmt, x, name, sizeof(name), &NameLength, &DataType, &ColumnSize, &DecimalDigits, &Nullable);
SQLGetData(odbc_obj->stmt, x, SQL_C_CHAR, odbc_obj->colbuf, odbc_obj->cblen, NULL);
if (strchr((char *)odbc_obj->colbuf, '"')) { /* please don't */
esc = (SQLCHAR *) escape_data((char *)odbc_obj->colbuf);
data = esc;
}
SQLDescribeCol(odbc_obj->stmt, x, name, sizeof(name), &NameLength, &DataType, &ColumnSize,
&DecimalDigits, &Nullable);
SQLGetData(odbc_obj->stmt, x, SQL_C_CHAR, odbc_obj->colbuf, odbc_obj->cblen, NULL);
snprintf((char *)odbc_obj->code, odbc_obj->codelen, "~_oDbC_dB_RoW_DaTa_[\"%s\"] = \"%s\"", name, data);
switch_safe_free(esc);
if (strchr((char *) odbc_obj->colbuf, '"')) { /* please don't */
esc = (SQLCHAR *) escape_data((char *) odbc_obj->colbuf);
data = esc;
}
eval_some_js((char *)odbc_obj->code, cx, obj, rval);
snprintf((char *) odbc_obj->code, odbc_obj->codelen, "~_oDbC_dB_RoW_DaTa_[\"%s\"] = \"%s\"", name,
data);
switch_safe_free(esc);
if (*rval == JS_FALSE) {
return JS_TRUE;
}
}
eval_some_js((char *) odbc_obj->code, cx, obj, rval);
JS_GetProperty(cx, obj, "_oDbC_dB_RoW_DaTa_", rval);
return JS_TRUE;
}
if (*rval == JS_FALSE) {
return JS_TRUE;
}
}
}
JS_GetProperty(cx, obj, "_oDbC_dB_RoW_DaTa_", rval);
return JS_TRUE;
}
done:
}
*rval = BOOLEAN_TO_JSVAL( tf );
done:
return JS_TRUE;
*rval = BOOLEAN_TO_JSVAL(tf);
return JS_TRUE;
}
@@ -492,50 +494,40 @@ static JSFunctionSpec odbc_methods[] = {
static JSPropertySpec odbc_props[] = {
// {"name", odbc_NAME, JSPROP_READONLY|JSPROP_PERMANENT},
// {"name", odbc_NAME, JSPROP_READONLY|JSPROP_PERMANENT},
{0}
};
static JSBool odbc_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
static JSBool odbc_getProperty(JSContext * cx, JSObject * obj, jsval id, jsval * vp)
{
JSBool res = JS_TRUE;
return res;
}
JSClass odbc_class = {
modname, JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_PropertyStub, odbc_getProperty, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, odbc_destroy, NULL, NULL, NULL,
modname, JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_PropertyStub, odbc_getProperty, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, odbc_destroy, NULL, NULL, NULL,
odbc_construct
};
switch_status_t odbc_load(JSContext *cx, JSObject *obj)
switch_status_t odbc_load(JSContext * cx, JSObject * obj)
{
JS_InitClass(cx,
obj,
NULL,
&odbc_class,
odbc_construct,
3,
odbc_props,
odbc_methods,
odbc_props,
odbc_methods
);
JS_InitClass(cx, obj, NULL, &odbc_class, odbc_construct, 3, odbc_props, odbc_methods, odbc_props, odbc_methods);
return SWITCH_STATUS_SUCCESS;
}
const sm_module_interface_t odbc_module_interface = {
/*.name = */ modname,
/*.spidermonkey_load*/ odbc_load,
/*.next*/ NULL
/*.spidermonkey_load */ odbc_load,
/*.next */ NULL
};
SWITCH_MOD_DECLARE(switch_status_t) spidermonkey_init(const sm_module_interface_t **module_interface)
SWITCH_MOD_DECLARE(switch_status_t) spidermonkey_init(const sm_module_interface_t ** module_interface)
{
*module_interface = &odbc_module_interface;
return SWITCH_STATUS_SUCCESS;
@@ -35,16 +35,16 @@ static const char modname[] = "Skel";
/* Skel Object */
/*********************************************************************************/
static JSBool skel_construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
static JSBool skel_construct(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
{
return JS_TRUE;
}
static void skel_destroy(JSContext *cx, JSObject *obj)
static void skel_destroy(JSContext * cx, JSObject * obj)
{
}
static JSBool skel_my_method(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
static JSBool skel_my_method(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
{
return JS_FALSE;
}
@@ -60,12 +60,12 @@ static JSFunctionSpec skel_methods[] = {
static JSPropertySpec skel_props[] = {
{"name", SKEL_NAME, JSPROP_READONLY|JSPROP_PERMANENT},
{"name", SKEL_NAME, JSPROP_READONLY | JSPROP_PERMANENT},
{0}
};
static JSBool skel_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
static JSBool skel_getProperty(JSContext * cx, JSObject * obj, jsval id, jsval * vp)
{
JSBool res = JS_TRUE;
@@ -73,37 +73,27 @@ static JSBool skel_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp
}
JSClass skel_class = {
modname, JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_PropertyStub, skel_getProperty, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, skel_destroy, NULL, NULL, NULL,
modname, JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_PropertyStub, skel_getProperty, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, skel_destroy, NULL, NULL, NULL,
skel_construct
};
switch_status_t spidermonkey_load(JSContext *cx, JSObject *obj)
switch_status_t spidermonkey_load(JSContext * cx, JSObject * obj)
{
JS_InitClass(cx,
obj,
NULL,
&skel_class,
skel_construct,
3,
skel_props,
skel_methods,
skel_props,
skel_methods
);
JS_InitClass(cx, obj, NULL, &skel_class, skel_construct, 3, skel_props, skel_methods, skel_props, skel_methods);
return SWITCH_STATUS_SUCCESS;
}
const sm_module_interface_t skel_module_interface = {
/*.name = */ modname,
/*.spidermonkey_load*/ spidermonkey_load,
/*.next*/ NULL
/*.spidermonkey_load */ spidermonkey_load,
/*.next */ NULL
};
SWITCH_MOD_DECLARE(switch_status_t) spidermonkey_init(const sm_module_interface_t **module_interface)
SWITCH_MOD_DECLARE(switch_status_t) spidermonkey_init(const sm_module_interface_t ** module_interface)
{
*module_interface = &skel_module_interface;
return SWITCH_STATUS_SUCCESS;
@@ -57,7 +57,7 @@ struct teletone_obj {
};
static int teletone_handler(teletone_generation_session_t *ts, teletone_tone_map_t *map)
static int teletone_handler(teletone_generation_session_t * ts, teletone_tone_map_t * map)
{
struct teletone_obj *tto = ts->user_data;
int wrote;
@@ -74,7 +74,7 @@ static int teletone_handler(teletone_generation_session_t *ts, teletone_tone_map
/* TeleTone Object */
/*********************************************************************************/
static JSBool teletone_construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
static JSBool teletone_construct(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
{
JSObject *session_obj;
struct teletone_obj *tto = NULL;
@@ -129,8 +129,8 @@ static JSBool teletone_construct(JSContext *cx, JSObject *obj, uintN argc, jsval
if (switch_core_timer_init(&tto->timer_base,
timer_name,
ms,
(read_codec->implementation->samples_per_second / 50) * read_codec->implementation->number_of_channels,
pool) == SWITCH_STATUS_SUCCESS) {
(read_codec->implementation->samples_per_second / 50) *
read_codec->implementation->number_of_channels, pool) == SWITCH_STATUS_SUCCESS) {
tto->timer = &tto->timer_base;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Timer INIT Success %u\n", ms);
} else {
@@ -149,7 +149,7 @@ static JSBool teletone_construct(JSContext *cx, JSObject *obj, uintN argc, jsval
return JS_TRUE;
}
static void teletone_destroy(JSContext *cx, JSObject *obj)
static void teletone_destroy(JSContext * cx, JSObject * obj)
{
struct teletone_obj *tto = JS_GetPrivate(cx, obj);
switch_memory_pool_t *pool;
@@ -169,26 +169,26 @@ static void teletone_destroy(JSContext *cx, JSObject *obj)
}
}
static JSBool teletone_add_tone(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
static JSBool teletone_add_tone(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
{
struct teletone_obj *tto = JS_GetPrivate(cx, obj);
if (argc > 2) {
if (argc > 2) {
int x;
char *fval;
char *map_str;
map_str = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
for(x = 1; x < TELETONE_MAX_TONES; x++) {
for (x = 1; x < TELETONE_MAX_TONES; x++) {
fval = JS_GetStringBytes(JS_ValueToString(cx, argv[x]));
tto->ts.TONES[(int)*map_str].freqs[x-1] = strtod(fval, NULL);
tto->ts.TONES[(int) *map_str].freqs[x - 1] = strtod(fval, NULL);
}
return JS_TRUE;
}
return JS_FALSE;
}
static JSBool teletone_on_dtmf(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
static JSBool teletone_on_dtmf(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
{
struct teletone_obj *tto = JS_GetPrivate(cx, obj);
if (argc > 0) {
@@ -201,7 +201,7 @@ static JSBool teletone_on_dtmf(JSContext *cx, JSObject *obj, uintN argc, jsval *
return JS_TRUE;
}
static JSBool teletone_generate(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
static JSBool teletone_generate(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
{
struct teletone_obj *tto = JS_GetPrivate(cx, obj);
int32 loops = 0;
@@ -209,7 +209,7 @@ static JSBool teletone_generate(JSContext *cx, JSObject *obj, uintN argc, jsval
if (argc > 0) {
char *script;
switch_core_session_t *session;
switch_frame_t write_frame = {0};
switch_frame_t write_frame = { 0 };
unsigned char *fdata[1024];
switch_frame_t *read_frame;
int stream_id;
@@ -225,7 +225,7 @@ static JSBool teletone_generate(JSContext *cx, JSObject *obj, uintN argc, jsval
if (!tto->loop_buffer) {
switch_buffer_create_dynamic(&tto->loop_buffer, JS_BLOCK_SIZE, JS_BUFFER_SIZE, 0);
}
}
}
if (tto->audio_buffer) {
switch_buffer_zero(tto->audio_buffer);
@@ -244,14 +244,14 @@ static JSBool teletone_generate(JSContext *cx, JSObject *obj, uintN argc, jsval
write_frame.data = fdata;
channel = switch_core_session_get_channel(session);
if (tto->timer) {
for (stream_id = 0; stream_id < switch_core_session_get_stream_count(session); stream_id++) {
switch_core_service_session(session, &thread_session, stream_id);
}
}
for(;;) {
for (;;) {
if (switch_test_flag(tto, TTF_DTMF)) {
char dtmf[128];
@@ -262,7 +262,7 @@ static JSBool teletone_generate(JSContext *cx, JSObject *obj, uintN argc, jsval
jsval aargv[4];
switch_channel_dequeue_dtmf(channel, dtmf, sizeof(dtmf));
aargv[aargc++] = STRING_TO_JSVAL (JS_NewStringCopyZ(cx, dtmf));
aargv[aargc++] = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, dtmf));
JS_CallFunction(cx, obj, tto->function, aargc, aargv, &tto->ret);
ret = JS_GetStringBytes(JS_ValueToString(cx, tto->ret));
if (strcmp(ret, "true") && strcmp(ret, "undefined")) {
@@ -271,7 +271,7 @@ static JSBool teletone_generate(JSContext *cx, JSObject *obj, uintN argc, jsval
}
}
}
if (tto->timer) {
if (switch_core_timer_next(tto->timer) != SWITCH_STATUS_SUCCESS) {
break;
@@ -280,23 +280,26 @@ static JSBool teletone_generate(JSContext *cx, JSObject *obj, uintN argc, jsval
} else {
switch_status_t status;
status = switch_core_session_read_frame(session, &read_frame, -1, 0);
if (!SWITCH_READ_ACCEPTABLE(status)) {
break;
}
}
if ((write_frame.datalen = (uint32_t)switch_buffer_read(tto->audio_buffer, fdata, write_frame.codec->implementation->bytes_per_frame)) <= 0) {
if (loops) {
if ((write_frame.datalen =
(uint32_t) switch_buffer_read(tto->audio_buffer, fdata,
write_frame.codec->implementation->bytes_per_frame)) <= 0) {
if (loops) {
switch_buffer_t *tmp;
/* Switcharoo*/
/* Switcharoo */
tmp = tto->audio_buffer;
tto->audio_buffer = tto->loop_buffer;
tto->loop_buffer = tmp;
loops--;
/* try again */
if ((write_frame.datalen =
(uint32_t)switch_buffer_read(tto->audio_buffer, fdata, write_frame.codec->implementation->bytes_per_frame)) <= 0) {
if ((write_frame.datalen =
(uint32_t) switch_buffer_read(tto->audio_buffer, fdata,
write_frame.codec->implementation->bytes_per_frame)) <= 0) {
break;
}
} else {
@@ -321,7 +324,7 @@ static JSBool teletone_generate(JSContext *cx, JSObject *obj, uintN argc, jsval
}
return JS_TRUE;
}
return JS_FALSE;
}
@@ -332,18 +335,18 @@ enum teletone_tinyid {
static JSFunctionSpec teletone_methods[] = {
{"generate", teletone_generate, 1},
{"onDTMF", teletone_on_dtmf, 1},
{"addTone", teletone_add_tone, 10},
{"addTone", teletone_add_tone, 10},
{0}
};
static JSPropertySpec teletone_props[] = {
{"name", TELETONE_NAME, JSPROP_READONLY|JSPROP_PERMANENT},
{"name", TELETONE_NAME, JSPROP_READONLY | JSPROP_PERMANENT},
{0}
};
static JSBool teletone_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
static JSBool teletone_getProperty(JSContext * cx, JSObject * obj, jsval id, jsval * vp)
{
JSBool res = JS_TRUE;
@@ -351,37 +354,31 @@ static JSBool teletone_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval
}
JSClass teletone_class = {
modname, JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_PropertyStub, teletone_getProperty, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, teletone_destroy, NULL, NULL, NULL,
modname, JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_PropertyStub, teletone_getProperty, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, teletone_destroy, NULL, NULL, NULL,
teletone_construct
};
switch_status_t teletone_load(JSContext *cx, JSObject *obj)
switch_status_t teletone_load(JSContext * cx, JSObject * obj)
{
JS_InitClass(cx,
obj,
NULL,
&teletone_class,
teletone_construct,
3,
teletone_props,
teletone_methods,
teletone_props,
teletone_methods
);
teletone_construct, 3, teletone_props, teletone_methods, teletone_props, teletone_methods);
return SWITCH_STATUS_SUCCESS;
}
const sm_module_interface_t teletone_module_interface = {
/*.name = */ modname,
/*.spidermonkey_load*/ teletone_load,
/*.next*/ NULL
/*.spidermonkey_load */ teletone_load,
/*.next */ NULL
};
SWITCH_MOD_DECLARE(switch_status_t) spidermonkey_init(const sm_module_interface_t **module_interface)
SWITCH_MOD_DECLARE(switch_status_t) spidermonkey_init(const sm_module_interface_t ** module_interface)
{
*module_interface = &teletone_module_interface;
return SWITCH_STATUS_SUCCESS;