/* * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application * Copyright (C) 2005/2006, Anthony Minessale II * * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application * * The Initial Developer of the Original Code is * Anthony Minessale II * Portions created by the Initial Developer are Copyright (C) * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Anthony Minessale II * * * switch.c -- Main * */ #include 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; return 0; } int main(int argc, char *argv[]) { char *lfile = "freeswitch.log"; char *pfile = "freeswitch.pid"; char path[256] = ""; char *ppath = NULL; char *err = NULL; switch_event *event; int bg = 0; FILE *f; #ifdef WIN32 SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS); #else int pid; nice(-20); #endif #ifndef WIN32 if (argv[1] && !strcmp(argv[1], "-stop")) { pid_t pid = 0; switch_core_set_globals(); snprintf(path, sizeof(path), "%s%s%s", SWITCH_GLOBAL_dirs.log_dir, SWITCH_PATH_SEPARATOR, 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) { fprintf(stderr, "Killing %d\n", (int) pid); kill(pid, SIGTERM); } fclose(f); return 0; } #endif if (argv[1] && !strcmp(argv[1], "-nc")) { bg++; } if (bg) { //snprintf(path, sizeof(path), "%s%c%s", SWITCH_GLOBAL_dirs.log_dir, sep, lfile); ppath = lfile; } if (switch_core_init(ppath) != SWITCH_STATUS_SUCCESS) { fprintf(stderr, "Cannot Initilize\n"); return 255; } /* 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 (bg) { (void) signal(SIGHUP, (void *) handle_SIGHUP); (void) signal(SIGTERM, (void *) handle_SIGHUP); #ifdef WIN32 FreeConsole(); #else if ((pid = fork())) { fprintf(stderr, "%d Backgrounding.\n", (int)pid); exit(0); } #endif } snprintf(path, sizeof(path), "%s%s%s", SWITCH_GLOBAL_dirs.log_dir, SWITCH_PATH_SEPARATOR, 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 (!err) { switch_console_printf(SWITCH_CHANNEL_CONSOLE, "Bringing up environment.\n"); switch_console_printf(SWITCH_CHANNEL_CONSOLE, "Loading Modules.\n"); if (switch_loadable_module_init() != SWITCH_STATUS_SUCCESS) { err = "Cannot load modules"; } } if (err) { switch_console_printf(SWITCH_CHANNEL_CONSOLE, "Error: %s", err); exit(-1); } if (switch_event_create(&event, SWITCH_EVENT_STARTUP) == SWITCH_STATUS_SUCCESS) { switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Event-Info", "System Ready"); switch_event_fire(&event); } switch_console_printf(SWITCH_CHANNEL_CONSOLE, "freeswitch Version %s Started\n\n", SWITCH_VERSION_FULL); snprintf(path, sizeof(path), "%s%s%s", SWITCH_GLOBAL_dirs.log_dir, SWITCH_PATH_SEPARATOR, 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 { /* wait for console input */ switch_console_loop(); } if (switch_event_create(&event, SWITCH_EVENT_SHUTDOWN) == SWITCH_STATUS_SUCCESS) { switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Event-Info", "System Shutting Down"); switch_event_fire(&event); } 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_console_printf(SWITCH_CHANNEL_CONSOLE, "Exiting Now.\n"); switch_core_destroy(); return 0; }