int wake_pipe[2];
struct lcr_fd wake_fd;
-int quit;
-
int glob_channel = 0;
int lcr_sock = -1;
ast_text[sizeof(ast_text)-1] = '\0';
// ast_log(type, file, line, function, "[call=%s ast=%s] %s", call_text, ast_text, buffer);
- printf("[call=%s ast=%s] %s", call_text, ast_text, buffer);
+ printf("[call=%s ast=%s line=%d] %s", call_text, ast_text, line, buffer);
ast_mutex_unlock(&log_lock);
}
return;
#ifdef AST_1_8_OR_HIGHER
- CDEBUG(call, call->ast, "Sending setup to LCR. (interface=%s dialstring=%s, cid=%s)\n", call->interface, call->dialstring, ast->caller.id.number.str);
+ CDEBUG(call, call->ast, "Sending setup to LCR. (interface=%s dialstring=%s, cid=%s)\n", call->interface, call->dialstring, call->callerinfo.id);
#else
CDEBUG(call, call->ast, "Sending setup to LCR. (interface=%s dialstring=%s, cid=%s)\n", call->interface, call->dialstring, call->cid_num);
#endif
call->display[0] = '\0';
#ifdef AST_1_8_OR_HIGHER
- /* caller ID */
- if (ast->caller.id.number.valid) {
- if (ast->caller.id.number.str)
- strncpy(newparam.setup.callerinfo.id, ast->caller.id.number.str, sizeof(newparam.setup.callerinfo.id)-1);
- switch(ast->caller.id.number.presentation & AST_PRES_RESTRICTION) {
- case AST_PRES_RESTRICTED:
- newparam.setup.callerinfo.present = INFO_PRESENT_RESTRICTED;
- break;
- case AST_PRES_UNAVAILABLE:
- newparam.setup.callerinfo.present = INFO_PRESENT_NOTAVAIL;
- break;
- case AST_PRES_ALLOWED:
- default:
- newparam.setup.callerinfo.present = INFO_PRESENT_ALLOWED;
- }
- switch(ast->caller.id.number.presentation & AST_PRES_NUMBER_TYPE) {
- case AST_PRES_USER_NUMBER_UNSCREENED:
- newparam.setup.callerinfo.screen = INFO_SCREEN_USER;
- break;
- case AST_PRES_USER_NUMBER_PASSED_SCREEN:
- newparam.setup.callerinfo.screen = INFO_SCREEN_USER_VERIFIED_PASSED;
- break;
- case AST_PRES_USER_NUMBER_FAILED_SCREEN:
- newparam.setup.callerinfo.screen = INFO_SCREEN_USER_VERIFIED_FAILED;
- break;
- default:
- newparam.setup.callerinfo.screen = INFO_SCREEN_NETWORK;
- }
- switch((ast->caller.id.number.plan >> 4) & 7) {
- case 4:
- newparam.setup.callerinfo.ntype = INFO_NTYPE_SUBSCRIBER;
- break;
- case 2:
- newparam.setup.callerinfo.ntype = INFO_NTYPE_NATIONAL;
- break;
- case 1:
- newparam.setup.callerinfo.ntype = INFO_NTYPE_INTERNATIONAL;
- break;
- default:
- newparam.setup.callerinfo.ntype = INFO_NTYPE_UNKNOWN;
- }
- } else
- newparam.setup.callerinfo.present = INFO_PRESENT_NOTAVAIL;
-
- /* caller ID 2 */
- if (ast->caller.ani.number.valid) {
- if (ast->caller.ani.number.str)
- strncpy(newparam.setup.callerinfo.id2, ast->caller.ani.number.str, sizeof(newparam.setup.callerinfo.id2)-1);
- switch(ast->caller.ani.number.presentation & AST_PRES_RESTRICTION) {
- case AST_PRES_RESTRICTED:
- newparam.setup.callerinfo.present2 = INFO_PRESENT_RESTRICTED;
- break;
- case AST_PRES_UNAVAILABLE:
- newparam.setup.callerinfo.present2 = INFO_PRESENT_NOTAVAIL;
- break;
- case AST_PRES_ALLOWED:
- default:
- newparam.setup.callerinfo.present2 = INFO_PRESENT_ALLOWED;
- }
- switch(ast->caller.ani.number.presentation & AST_PRES_NUMBER_TYPE) {
- case AST_PRES_USER_NUMBER_UNSCREENED:
- newparam.setup.callerinfo.screen2 = INFO_SCREEN_USER;
- break;
- case AST_PRES_USER_NUMBER_PASSED_SCREEN:
- newparam.setup.callerinfo.screen2 = INFO_SCREEN_USER_VERIFIED_PASSED;
- break;
- case AST_PRES_USER_NUMBER_FAILED_SCREEN:
- newparam.setup.callerinfo.screen2 = INFO_SCREEN_USER_VERIFIED_FAILED;
- break;
- default:
- newparam.setup.callerinfo.screen2 = INFO_SCREEN_NETWORK;
- }
- switch((ast->caller.ani.number.plan >> 4) & 7) {
- case 4:
- newparam.setup.callerinfo.ntype2 = INFO_NTYPE_SUBSCRIBER;
- break;
- case 2:
- newparam.setup.callerinfo.ntype2 = INFO_NTYPE_NATIONAL;
- break;
- case 1:
- newparam.setup.callerinfo.ntype2 = INFO_NTYPE_INTERNATIONAL;
- break;
- default:
- newparam.setup.callerinfo.ntype2 = INFO_NTYPE_UNKNOWN;
- }
- } else
- newparam.setup.callerinfo.present2 = INFO_PRESENT_NOTAVAIL;
-
- /* caller name */
- if (ast->caller.id.name.valid) {
- if (ast->caller.id.name.str)
- strncpy(newparam.setup.callerinfo.name, ast->caller.id.name.str, sizeof(newparam.setup.callerinfo.name)-1);
- }
-
- /* redir number */
- if (ast->redirecting.from.number.valid) {
- newparam.setup.redirinfo.itype = INFO_ITYPE_CHAN;
- if (ast->redirecting.from.number.str)
- strncpy(newparam.setup.redirinfo.id, ast->redirecting.from.number.str, sizeof(newparam.setup.redirinfo.id)-1);
- switch(ast->redirecting.from.number.presentation & AST_PRES_RESTRICTION) {
- case AST_PRES_RESTRICTED:
- newparam.setup.redirinfo.present = INFO_PRESENT_RESTRICTED;
- break;
- case AST_PRES_UNAVAILABLE:
- newparam.setup.redirinfo.present = INFO_PRESENT_NOTAVAIL;
- break;
- case AST_PRES_ALLOWED:
- default:
- newparam.setup.redirinfo.present = INFO_PRESENT_ALLOWED;
- }
- switch(ast->redirecting.from.number.presentation & AST_PRES_NUMBER_TYPE) {
- case AST_PRES_USER_NUMBER_UNSCREENED:
- newparam.setup.redirinfo.screen = INFO_SCREEN_USER;
- break;
- case AST_PRES_USER_NUMBER_PASSED_SCREEN:
- newparam.setup.redirinfo.screen = INFO_SCREEN_USER_VERIFIED_PASSED;
- break;
- case AST_PRES_USER_NUMBER_FAILED_SCREEN:
- newparam.setup.redirinfo.screen = INFO_SCREEN_USER_VERIFIED_FAILED;
- break;
- default:
- newparam.setup.redirinfo.screen = INFO_SCREEN_NETWORK;
- }
- switch((ast->redirecting.from.number.plan >> 4) & 7) {
- case 4:
- newparam.setup.redirinfo.ntype = INFO_NTYPE_SUBSCRIBER;
- break;
- case 2:
- newparam.setup.redirinfo.ntype = INFO_NTYPE_NATIONAL;
- break;
- case 1:
- newparam.setup.redirinfo.ntype = INFO_NTYPE_INTERNATIONAL;
- break;
- default:
- newparam.setup.redirinfo.ntype = INFO_NTYPE_UNKNOWN;
- }
- }
+ /* set stored call information */
+ memcpy(&newparam.setup.callerinfo, &call->callerinfo, sizeof(struct caller_info));
+ memcpy(&newparam.setup.redirinfo, &call->redirinfo, sizeof(struct redir_info));
#else
if (call->cid_num[0])
strncpy(newparam.setup.callerinfo.id, call->cid_num, sizeof(newparam.setup.callerinfo.id)-1);
call = find_call_ref(0);
if (!call) {
/* send release, if ref does not exist */
- CDEBUG(NULL, NULL, "No call found, that requests a ref.\n");
- send_release_and_import(call, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL);
+ CERROR(NULL, NULL, "No call found, that requests a ref.\n");
return 0;
}
/* store new ref */
ast_mutex_lock(&chan_lock);
- while(!quit) {
+ while(1) {
handle_queue();
select_main(0, &global_change, lock_chan, unlock_chan);
}
- close_socket();
-
- del_timer(&socket_retry);
-
- unregister_fd(&wake_fd);
- close(wake_pipe[0]);
- close(wake_pipe[1]);
-
- CERROR(NULL, NULL, "Thread exit.\n");
-
- ast_mutex_unlock(&chan_lock);
-
return NULL;
}
#ifdef AST_1_8_OR_HIGHER
// clone_variables(requestor, ast);
+#if 0
ast->caller.ani.number.valid= requestor->caller.ani.number.valid;
if (requestor->caller.ani.number.valid)
if (requestor->caller.ani.number.str)
ast->redirecting.to.number.plan= requestor->redirecting.to.number.plan;
ast->redirecting.to.number.presentation= requestor->redirecting.to.number.presentation;
#endif
+ /* store call information for setup */
+
+ /* caller ID */
+ if (requestor->caller.id.number.valid) {
+ if (requestor->caller.id.number.str)
+ strncpy(call->callerinfo.id, requestor->caller.id.number.str, sizeof(call->callerinfo.id)-1);
+ switch(requestor->caller.id.number.presentation & AST_PRES_RESTRICTION) {
+ case AST_PRES_RESTRICTED:
+ call->callerinfo.present = INFO_PRESENT_RESTRICTED;
+ break;
+ case AST_PRES_UNAVAILABLE:
+ call->callerinfo.present = INFO_PRESENT_NOTAVAIL;
+ break;
+ case AST_PRES_ALLOWED:
+ default:
+ call->callerinfo.present = INFO_PRESENT_ALLOWED;
+ }
+ switch(requestor->caller.id.number.presentation & AST_PRES_NUMBER_TYPE) {
+ case AST_PRES_USER_NUMBER_UNSCREENED:
+ call->callerinfo.screen = INFO_SCREEN_USER;
+ break;
+ case AST_PRES_USER_NUMBER_PASSED_SCREEN:
+ call->callerinfo.screen = INFO_SCREEN_USER_VERIFIED_PASSED;
+ break;
+ case AST_PRES_USER_NUMBER_FAILED_SCREEN:
+ call->callerinfo.screen = INFO_SCREEN_USER_VERIFIED_FAILED;
+ break;
+ default:
+ call->callerinfo.screen = INFO_SCREEN_NETWORK;
+ }
+ switch((requestor->caller.id.number.plan >> 4) & 7) {
+ case 4:
+ call->callerinfo.ntype = INFO_NTYPE_SUBSCRIBER;
+ break;
+ case 2:
+ call->callerinfo.ntype = INFO_NTYPE_NATIONAL;
+ break;
+ case 1:
+ call->callerinfo.ntype = INFO_NTYPE_INTERNATIONAL;
+ break;
+ default:
+ call->callerinfo.ntype = INFO_NTYPE_UNKNOWN;
+ }
+ } else
+ call->callerinfo.present = INFO_PRESENT_NOTAVAIL;
+
+ /* caller ID 2 */
+ if (requestor->caller.ani.number.valid) {
+ if (requestor->caller.ani.number.str)
+ strncpy(call->callerinfo.id2, requestor->caller.ani.number.str, sizeof(call->callerinfo.id2)-1);
+ switch(requestor->caller.ani.number.presentation & AST_PRES_RESTRICTION) {
+ case AST_PRES_RESTRICTED:
+ call->callerinfo.present2 = INFO_PRESENT_RESTRICTED;
+ break;
+ case AST_PRES_UNAVAILABLE:
+ call->callerinfo.present2 = INFO_PRESENT_NOTAVAIL;
+ break;
+ case AST_PRES_ALLOWED:
+ default:
+ call->callerinfo.present2 = INFO_PRESENT_ALLOWED;
+ }
+ switch(requestor->caller.ani.number.presentation & AST_PRES_NUMBER_TYPE) {
+ case AST_PRES_USER_NUMBER_UNSCREENED:
+ call->callerinfo.screen2 = INFO_SCREEN_USER;
+ break;
+ case AST_PRES_USER_NUMBER_PASSED_SCREEN:
+ call->callerinfo.screen2 = INFO_SCREEN_USER_VERIFIED_PASSED;
+ break;
+ case AST_PRES_USER_NUMBER_FAILED_SCREEN:
+ call->callerinfo.screen2 = INFO_SCREEN_USER_VERIFIED_FAILED;
+ break;
+ default:
+ call->callerinfo.screen2 = INFO_SCREEN_NETWORK;
+ }
+ switch((requestor->caller.ani.number.plan >> 4) & 7) {
+ case 4:
+ call->callerinfo.ntype2 = INFO_NTYPE_SUBSCRIBER;
+ break;
+ case 2:
+ call->callerinfo.ntype2 = INFO_NTYPE_NATIONAL;
+ break;
+ case 1:
+ call->callerinfo.ntype2 = INFO_NTYPE_INTERNATIONAL;
+ break;
+ default:
+ call->callerinfo.ntype2 = INFO_NTYPE_UNKNOWN;
+ }
+ } else
+ call->callerinfo.present2 = INFO_PRESENT_NOTAVAIL;
+
+ /* caller name */
+ if (requestor->caller.id.name.valid) {
+ if (requestor->caller.id.name.str)
+ strncpy(call->callerinfo.name, requestor->caller.id.name.str, sizeof(call->callerinfo.name)-1);
+ }
+
+ /* redir number */
+ if (requestor->redirecting.from.number.valid) {
+ call->redirinfo.itype = INFO_ITYPE_CHAN;
+ if (requestor->redirecting.from.number.str)
+ strncpy(call->redirinfo.id, requestor->redirecting.from.number.str, sizeof(call->redirinfo.id)-1);
+ switch(requestor->redirecting.from.number.presentation & AST_PRES_RESTRICTION) {
+ case AST_PRES_RESTRICTED:
+ call->redirinfo.present = INFO_PRESENT_RESTRICTED;
+ break;
+ case AST_PRES_UNAVAILABLE:
+ call->redirinfo.present = INFO_PRESENT_NOTAVAIL;
+ break;
+ case AST_PRES_ALLOWED:
+ default:
+ call->redirinfo.present = INFO_PRESENT_ALLOWED;
+ }
+ switch(requestor->redirecting.from.number.presentation & AST_PRES_NUMBER_TYPE) {
+ case AST_PRES_USER_NUMBER_UNSCREENED:
+ call->redirinfo.screen = INFO_SCREEN_USER;
+ break;
+ case AST_PRES_USER_NUMBER_PASSED_SCREEN:
+ call->redirinfo.screen = INFO_SCREEN_USER_VERIFIED_PASSED;
+ break;
+ case AST_PRES_USER_NUMBER_FAILED_SCREEN:
+ call->redirinfo.screen = INFO_SCREEN_USER_VERIFIED_FAILED;
+ break;
+ default:
+ call->redirinfo.screen = INFO_SCREEN_NETWORK;
+ }
+ switch((requestor->redirecting.from.number.plan >> 4) & 7) {
+ case 4:
+ call->redirinfo.ntype = INFO_NTYPE_SUBSCRIBER;
+ break;
+ case 2:
+ call->redirinfo.ntype = INFO_NTYPE_NATIONAL;
+ break;
+ case 1:
+ call->redirinfo.ntype = INFO_NTYPE_INTERNATIONAL;
+ break;
+ default:
+ call->redirinfo.ntype = INFO_NTYPE_UNKNOWN;
+ }
+ }
+#endif
ast_mutex_unlock(&chan_lock);
return ast;
ast_cli_register(&cli_port_unload);
#endif
- quit = 0;
if ((pthread_create(&chan_tid, NULL, chan_thread, NULL)<0)) {
/* failed to create thread */
bchannel_deinitialize();
int unload_module(void)
{
/* First, take us out of the channel loop */
- CDEBUG(NULL, NULL, "-- Unregistering mISDN Channel Driver --\n");
+ CDEBUG(NULL, NULL, "-- Unregistering Linux-Call-Router Channel Driver --\n");
+
+ pthread_cancel(chan_tid);
+
+ close_socket();
- quit = 1;
- pthread_join(chan_tid, NULL);
+ del_timer(&socket_retry);
+
+ unregister_fd(&wake_fd);
+ close(wake_pipe[0]);
+ close(wake_pipe[1]);
+
+// ast_mutex_unlock(&chan_lock);
ast_channel_unregister(&lcr_tech);
ast_unregister_application("lcr_config");
-
if (mISDN_created) {
bchannel_deinitialize();
mISDN_created = 0;