From fb9b21144bc28de172ec454aff68bc2e1835b95b Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Sun, 26 Feb 2006 03:13:01 +0000 Subject: [PATCH] mess around on win32 a little git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@675 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/include/switch_core.h | 2 +- src/switch.c | 109 ++++++++++++++++++++++++++++++++------ src/switch_core.c | 45 +++++----------- 3 files changed, 107 insertions(+), 49 deletions(-) diff --git a/src/include/switch_core.h b/src/include/switch_core.h index 6ff20b410f..fb0039067b 100644 --- a/src/include/switch_core.h +++ b/src/include/switch_core.h @@ -106,7 +106,7 @@ struct switch_core_runtime; \param console optional FILE stream for output \note to be called at application startup */ -SWITCH_DECLARE(switch_status) switch_core_init(FILE *console); +SWITCH_DECLARE(switch_status) switch_core_init(char *console); /*! \brief Destroy the core diff --git a/src/switch.c b/src/switch.c index 50acc1bb0a..b20ebd02ac 100644 --- a/src/switch.c +++ b/src/switch.c @@ -30,9 +30,36 @@ * */ #include +#ifndef SWITCH_LOG_DIR +#ifdef WIN32 +#define SWITCH_LOG_DIR ".\\log" +#else +#define SWITCH_LOG_DIR "/usr/local/freeswitch/log" +#endif +#endif static int RUNNING = 0; +static int handle_SIGPIPE(int sig) +{ + switch_console_printf(SWITCH_CHANNEL_CONSOLE, "Sig Pipe!\n"); + return 0; +} +#ifdef TRAP_BUS +static int handle_SIGBUS(int sig) +{ + switch_console_printf(SWITCH_CHANNEL_CONSOLE, "Sig BUS!\n"); + return 0; +} +#endif + +/* no ctl-c mofo */ +static int handle_SIGINT(int sig) +{ + return 0; +} + + static int handle_SIGHUP(int sig) { RUNNING = 0; @@ -41,30 +68,54 @@ static int handle_SIGHUP(int sig) int main(int argc, char *argv[]) { + char *lfile = "freeswitch.log"; + char *pfile = "freeswitch.pid"; + char path[256] = ""; char *err = NULL; switch_event *event; int bg = 0; - FILE *out = NULL; + FILE *f; +#ifdef WIN32 + char sep = '\\'; +#else + char sep = '/'; + int pid; + nice(-20); + + if (argv[1] && !strcmp(argv[1], "-stop")) { + pid_t pid = 0; + snprintf(path, sizeof(path), "%s%c%s", SWITCH_LOG_DIR, sep, pfile); + if ((f = fopen(path, "r")) == 0) { + fprintf(stderr, "Cannot open pid file %s.\n", path); + return 255; + } + fscanf(f, "%d", &pid); + if (pid > 0) { + kill(pid, SIGTERM); + } + + fclose(f); + return 0; + } +#endif + + /* set signal handlers */ + (void) signal(SIGINT, (void *) handle_SIGINT); +#ifdef SIGPIPE + (void) signal(SIGPIPE, (void *) handle_SIGPIPE); +#endif +#ifdef TRAP_BUS + (void) signal(SIGBUS, (void *) handle_SIGBUS); +#endif + if (argv[1] && !strcmp(argv[1], "-nc")) { bg++; } if (bg) { -#ifdef WIN32 - char *path = ".\\freeswitch.log"; -#else - int pid; - char *path = "/var/log/freeswitch.log"; - nice(-20); -#endif - - if ((out = fopen(path, "a")) == 0) { - fprintf(stderr, "Cannot open output file.\n"); - return 255; - } - (void) signal(SIGHUP, (void *) handle_SIGHUP); + (void) signal(SIGTERM, (void *) handle_SIGHUP); #ifdef WIN32 FreeConsole(); @@ -76,7 +127,20 @@ int main(int argc, char *argv[]) #endif } - if (switch_core_init(out) != SWITCH_STATUS_SUCCESS) { + snprintf(path, sizeof(path), "%s%c%s", SWITCH_LOG_DIR, sep, pfile); + if ((f = fopen(path, "w")) == 0) { + fprintf(stderr, "Cannot open pid file %s.\n", path); + return 255; + } + + fprintf(f, "%d", getpid()); + fclose(f); + + if (bg) { + snprintf(path, sizeof(path), "%s%c%s", SWITCH_LOG_DIR, sep, lfile); + } + + if (switch_core_init(bg ? path : NULL) != SWITCH_STATUS_SUCCESS) { err = "Cannot Initilize\n"; } @@ -99,10 +163,22 @@ int main(int argc, char *argv[]) } switch_console_printf(SWITCH_CHANNEL_CONSOLE, "freeswitch Version %s Started\n\n", SWITCH_VERSION_FULL); + snprintf(path, sizeof(path), "%s%c%s", SWITCH_LOG_DIR, sep, pfile); if (bg) { + bg = 0; RUNNING = 1; while(RUNNING) { +#ifdef WIN32 + bg++; + if(bg == 100) { + if ((f = fopen(path, "r")) == 0) { + break; + } + fclose(f); + bg = 0; + } +#endif switch_yield(10000); } } else { @@ -118,8 +194,7 @@ int main(int argc, char *argv[]) switch_console_printf(SWITCH_CHANNEL_CONSOLE, "Clean up modules.\n"); switch_loadable_module_shutdown(); switch_console_printf(SWITCH_CHANNEL_CONSOLE, "Tearing down environment.\n"); - switch_core_destroy(); switch_console_printf(SWITCH_CHANNEL_CONSOLE, "Exiting Now.\n"); + switch_core_destroy(); return 0; - } diff --git a/src/switch_core.c b/src/switch_core.c index 008b8b53e6..0caf5bc188 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -100,8 +100,6 @@ struct switch_core_runtime { }; /* Prototypes */ -static int handle_SIGINT(int sig); -static int handle_SIGPIPE(int sig); static void *SWITCH_THREAD_FUNC switch_core_session_thread(switch_thread *thread, void *obj); static void switch_core_standard_on_init(switch_core_session *session); static void switch_core_standard_on_hangup(switch_core_session *session); @@ -114,24 +112,6 @@ static void switch_core_standard_on_transmit(switch_core_session *session); /* The main runtime obj we keep this hidden for ourselves */ static struct switch_core_runtime runtime; -static int handle_SIGPIPE(int sig) -{ - switch_console_printf(SWITCH_CHANNEL_CONSOLE, "Sig Pipe!\n"); - return 0; -} -#ifdef TRAP_BUS -static int handle_SIGBUS(int sig) -{ - switch_console_printf(SWITCH_CHANNEL_CONSOLE, "Sig BUS!\n"); - return 0; -} -#endif - -/* no ctl-c mofo */ -static int handle_SIGINT(int sig) -{ - return 0; -} static void db_pick_path(char *dbname, char *buf, size_t size) { @@ -2195,13 +2175,19 @@ static void core_event_handler(switch_event *event) } } -SWITCH_DECLARE(switch_status) switch_core_init(FILE *console) +SWITCH_DECLARE(switch_status) switch_core_init(char *console) { #ifdef EMBED_PERL PerlInterpreter *my_perl; #endif - - runtime.console = console ? console : stdout; + if(console) { + if ((runtime.console = fopen(console, "a")) == 0) { + fprintf(stderr, "Cannot open output file %s.\n", console); + return SWITCH_STATUS_FALSE; + } + } else { + runtime.console = stdout; + } /* INIT APR and Create the pool context */ if (apr_initialize() != APR_SUCCESS) { @@ -2252,14 +2238,6 @@ SWITCH_DECLARE(switch_status) switch_core_init(FILE *console) switch_core_hash_init(&runtime.session_table, runtime.memory_pool); - /* set signal handlers and startup time */ - (void) signal(SIGINT, (void *) handle_SIGINT); -#ifdef SIGPIPE - (void) signal(SIGPIPE, (void *) handle_SIGPIPE); -#endif -#ifdef TRAP_BUS - (void) signal(SIGBUS, (void *) handle_SIGBUS); -#endif time(&runtime.initiated); return SWITCH_STATUS_SUCCESS; @@ -2289,6 +2267,11 @@ SWITCH_DECLARE(switch_status) switch_core_destroy(void) apr_pool_destroy(runtime.memory_pool); apr_terminate(); } + + if(runtime.console != stdout && runtime.console != stderr) { + fclose(runtime.console); + runtime.console = NULL; + } return SWITCH_STATUS_SUCCESS; }