diff --git a/libs/freetdm/Makefile.am b/libs/freetdm/Makefile.am index c63cefc7ec..30e8b99800 100644 --- a/libs/freetdm/Makefile.am +++ b/libs/freetdm/Makefile.am @@ -77,7 +77,8 @@ library_include_HEADERS = \ $(SRC)/include/freetdm.h \ $(SRC)/include/ftdm_declare.h \ $(SRC)/include/ftdm_threadmutex.h \ -$(SRC)/include/ftdm_os.h +$(SRC)/include/ftdm_os.h \ +$(SRC)/include/ftdm_dso.h lib_LTLIBRARIES = libfreetdm.la libfreetdm_la_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS) diff --git a/libs/freetdm/sample/dso/Makefile b/libs/freetdm/sample/dso/Makefile new file mode 100644 index 0000000000..330bef0959 --- /dev/null +++ b/libs/freetdm/sample/dso/Makefile @@ -0,0 +1,13 @@ +CC=gcc +CFLAGS=-Wall -I/usr/local/freeswitch/include +LDFLAGS=-L/usr/local/freeswitch/lib -lfreetdm + +ftdmload: ftdmload.o + +clean: + rm -rf ftdmload.o + +export: + export LD_LIBRARY_PATH=/usr/local/freeswitch/lib + + diff --git a/libs/freetdm/sample/dso/ftdmload.c b/libs/freetdm/sample/dso/ftdmload.c new file mode 100644 index 0000000000..9d313b382d --- /dev/null +++ b/libs/freetdm/sample/dso/ftdmload.c @@ -0,0 +1,108 @@ +#include +#include +#include +#include + +#define ARRLEN(obj) (sizeof(obj)/sizeof(obj[0])) + +struct dso_entry { + char name[25]; + ftdm_dso_lib_t lib; +}; + +struct dso_entry loaded[10]; + +int load(char *name) +{ + char path[255]; + char *err; + struct dso_entry *entry = NULL; + int i; + + for (i = 0; i < ARRLEN(loaded); i++) { + if (!loaded[i].lib) { + entry = &loaded[i]; + break; + } + } + + if (!entry) { + ftdm_log(FTDM_LOG_CRIT, "Cannot load more libraries\n"); + return -1; + } + + ftdm_build_dso_path(name, path, sizeof(path)); + ftdm_log(FTDM_LOG_DEBUG, "Loading %s!\n", path); + entry->lib = ftdm_dso_open(path, &err); + if (!entry->lib) { + ftdm_log(FTDM_LOG_CRIT, "Cannot load library '%s': %s\n", path, err); + return -1; + } + strncpy(entry->name, name, sizeof(entry->name)-1); + entry->name[sizeof(entry->name)-1] = 0; + return 0; +} + +int unload(char *name) +{ + int i; + struct dso_entry *entry = NULL; + ftdm_log(FTDM_LOG_DEBUG, "Unloading %s!\n", name); + for (i = 0; i < ARRLEN(loaded); i++) { + if (loaded[i].lib && !strcasecmp(loaded[i].name, name)) { + entry = &loaded[i]; + break; + } + } + + if (!entry) { + ftdm_log(FTDM_LOG_CRIT, "Library %s not found\n", name); + return -1; + } + + ftdm_dso_destroy(&entry->lib); + entry->lib = NULL; + return 0; +} + +int main(int argc, char *argv[]) +{ + char cmdline[255]; + char name[255]; + + ftdm_global_set_default_logger(FTDM_LOG_LEVEL_DEBUG); + + ftdm_cpu_monitor_disable(); + + if (ftdm_global_init() != FTDM_SUCCESS) { + fprintf(stderr, "Error loading FreeTDM\n"); + exit(-1); + } + + memset(loaded, 0, sizeof(loaded)); + + printf("CLI> "); + while (fgets(cmdline, sizeof(cmdline), stdin)) { + if (sscanf(cmdline, "load=%s\n", name) == 1) { + load(name); + } else if (sscanf(cmdline, "unload=%s\n", name) == 1) { + unload(name); + } else if (!strncasecmp(cmdline, "exit", sizeof("exit")-1)) { + printf("Quitting ...\n"); + sleep(1); + break; + } else { + fprintf(stderr, "load= | unload= | exit\n"); + } + printf("\nCLI> "); + } + + + ftdm_global_destroy(); + + printf("Done, press any key to die!\n"); + + getchar(); + return 0; +} + diff --git a/libs/freetdm/src/include/private/ftdm_dso.h b/libs/freetdm/src/include/ftdm_dso.h similarity index 100% rename from libs/freetdm/src/include/private/ftdm_dso.h rename to libs/freetdm/src/include/ftdm_dso.h