Bug Summary

File:mod_dialplan_asterisk.c
Warning:line 224, column 12
Although the value stored to 'proceed' is used in the enclosing expression, the value is never actually read from 'proceed'

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name mod_dialplan_asterisk.c -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -mframe-pointer=none -menable-no-infs -menable-no-nans -menable-unsafe-fp-math -fno-signed-zeros -mreassociate -freciprocal-math -fdenormal-fp-math=preserve-sign,preserve-sign -ffp-contract=fast -fno-rounding-math -ffast-math -ffinite-math-only -mconstructor-aliases -munwind-tables -target-cpu x86-64 -fno-split-dwarf-inlining -debugger-tuning=gdb -resource-dir /usr/lib/llvm-11/lib/clang/11.0.1 -D HAVE_CONFIG_H -I . -I ../../../../src/include -I ../../../../libs/esl/src/include -I ../../../../libs/xmlrpc-c -I /drone/src/src/include -I /drone/src/src/include -I /drone/src/libs/libteletone/src -D SWITCH_API_VISIBILITY=1 -D CJSON_API_VISIBILITY=1 -D HAVE_VISIBILITY=1 -I /usr/include/uuid -I /drone/src/src/include -I /drone/src/src/include -I /drone/src/libs/libteletone/src -D SWITCH_API_VISIBILITY=1 -D CJSON_API_VISIBILITY=1 -D HAVE_VISIBILITY=1 -D HAVE_OPENSSL -D PIC -internal-isystem /usr/local/include -internal-isystem /usr/lib/llvm-11/lib/clang/11.0.1/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-unused-result -Wno-misleading-indentation -std=c99 -fdebug-compilation-dir /drone/src/src/mod/dialplans/mod_dialplan_asterisk -ferror-limit 19 -fvisibility hidden -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-output=html -faddrsig -o /drone/src/scan-build/2023-11-03-195916-462-1 -x c mod_dialplan_asterisk.c
1/*
2 * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
3 * Copyright (C) 2005-2014, Anthony Minessale II <anthm@freeswitch.org>
4 *
5 * Version: MPL 1.1
6 *
7 * The contents of this file are subject to the Mozilla Public License Version
8 * 1.1 (the "License"); you may not use this file except in compliance with
9 * the License. You may obtain a copy of the License at
10 * http://www.mozilla.org/MPL/
11 *
12 * Software distributed under the License is distributed on an "AS IS" basis,
13 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
14 * for the specific language governing rights and limitations under the
15 * License.
16 *
17 * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
18 *
19 * The Initial Developer of the Original Code is
20 * Anthony Minessale II <anthm@freeswitch.org>
21 * Portions created by the Initial Developer are Copyright (C)
22 * the Initial Developer. All Rights Reserved.
23 *
24 * Contributor(s):
25 *
26 * Anthony Minessale II <anthm@freeswitch.org>
27 *
28 * mod_dialplan_asterisk.c -- Asterisk extensions.conf style dialplan parser.
29 *
30 */
31#include <switch.h>
32#include <sys/types.h>
33#include <sys/stat.h>
34#include <fcntl.h>
35
36SWITCH_MODULE_LOAD_FUNCTION(mod_dialplan_asterisk_load)switch_status_t mod_dialplan_asterisk_load (switch_loadable_module_interface_t
**module_interface, switch_memory_pool_t *pool)
;
37SWITCH_MODULE_DEFINITION(mod_dialplan_asterisk, mod_dialplan_asterisk_load, NULL, NULL)static const char modname[] = "mod_dialplan_asterisk" ; __attribute__
((visibility("default"))) switch_loadable_module_function_table_t
mod_dialplan_asterisk_module_interface = { 5, mod_dialplan_asterisk_load
, ((void*)0), ((void*)0), SMODF_NONE }
;
38
39static switch_status_t exec_app(switch_core_session_t *session, char *app, char *arg)
40{
41 switch_application_interface_t *application_interface;
42 switch_status_t status = SWITCH_STATUS_FALSE;
43
44 if ((application_interface = switch_loadable_module_get_application_interface(app))) {
45 status = switch_core_session_exec(session, application_interface, arg);
46 UNPROTECT_INTERFACE(application_interface)if (application_interface) {switch_mutex_lock(application_interface
->reflock); application_interface->refs--; application_interface
->parent->refs--; switch_mutex_unlock(application_interface
->reflock); switch_thread_rwlock_unlock(application_interface
->rwlock); switch_thread_rwlock_unlock(application_interface
->parent->rwlock);}
;
47 }
48
49 return status;
50}
51
52SWITCH_STANDARD_APP(dial_function)static void dial_function (switch_core_session_t *session, const
char *data)
53{
54 int argc;
55 char *argv[4] = { 0 };
56 char *mydata;
57 switch_channel_t *channel = switch_core_session_get_channel(session);
58
59 if (data && (mydata = switch_core_session_strdup(session, data)switch_core_perform_session_strdup(session, data, "mod_dialplan_asterisk.c"
, (const char *)__func__, 59)
)) {
60 if ((argc = switch_separate_string(mydata, '|', argv, (sizeof(argv) / sizeof(argv[0])))) < 2) {
61 goto error;
62 }
63
64 if (argc > 1) {
65 switch_channel_set_variable(channel, "call_timeout", argv[1])switch_channel_set_variable_var_check(channel, "call_timeout"
, argv[1], SWITCH_TRUE)
;
66 }
67
68 switch_replace_char(argv[0], '&', ',', SWITCH_FALSE);
69
70 if (exec_app(session, "bridge", argv[0]) != SWITCH_STATUS_SUCCESS) {
71 goto error;
72 }
73
74 goto ok;
75 }
76
77 error:
78 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_dialplan_asterisk.c", (const char
*)__func__, 78, ((void*)0)
, SWITCH_LOG_ERROR, "Error!\n");
79
80 ok:
81
82 return;
83}
84
85SWITCH_STANDARD_APP(avoid_function)static void avoid_function (switch_core_session_t *session, const
char *data)
86{
87#if 0
88 void *y = NULL((void*)0);
89#endif
90 int x = 0;
91 switch_channel_t *channel = switch_core_session_get_channel(session);
92
93 for (x = 0; x < 5; x++) {
94 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_dialplan_asterisk.c", (const char
*)__func__, 94, ((void*)0)
, SWITCH_LOG_WARNING, "Avoiding initial deadlock on channel %s.\n", switch_channel_get_name(channel));
95 switch_yield(100000)switch_sleep(100000);;
96 }
97
98 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_dialplan_asterisk.c", (const char
*)__func__, 98, ((void*)0)
, SWITCH_LOG_WARNING, "I should never be called!.\n");
99#if 0
100 memset((void *) y, 0, 1000);
101#endif
102}
103
104SWITCH_STANDARD_APP(goto_function)static void goto_function (switch_core_session_t *session, const
char *data)
105{
106 char *argv[3] = { 0 };
107 char *mydata;
108
109 if (data && (mydata = switch_core_session_strdup(session, data)switch_core_perform_session_strdup(session, data, "mod_dialplan_asterisk.c"
, (const char *)__func__, 109)
)) {
110 if (switch_separate_string(mydata, '|', argv, (sizeof(argv) / sizeof(argv[0]))) < 1) {
111 goto error;
112 }
113
114 switch_ivr_session_transfer(session, argv[1], "asterisk", argv[0]);
115 goto ok;
116 }
117
118 error:
119 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_dialplan_asterisk.c", (const char
*)__func__, 119, ((void*)0)
, SWITCH_LOG_ERROR, "Error!\n");
120
121 ok:
122
123 return;
124}
125
126SWITCH_STANDARD_DIALPLAN(asterisk_dialplan_hunt)static switch_caller_extension_t *asterisk_dialplan_hunt (switch_core_session_t
*session, void *arg, switch_caller_profile_t *caller_profile
)
127{
128 switch_caller_extension_t *extension = NULL((void*)0);
129 switch_channel_t *channel = switch_core_session_get_channel(session);
130 char *cf = "extensions.conf";
131 switch_config_t cfg;
132 char *var, *val;
133 const char *context = NULL((void*)0);
134
135 if (arg) {
136 cf = arg;
137 }
138
139 if (!caller_profile) {
140 caller_profile = switch_channel_get_caller_profile(channel);
141 }
142
143 if (!caller_profile || zstr(caller_profile->destination_number)_zstr(caller_profile->destination_number)) {
144 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_dialplan_asterisk.c", (const char
*)__func__, 144, ((void*)0)
, SWITCH_LOG_ERROR, "Error Obtaining Profile!\n");
145
146 return NULL((void*)0);
147 }
148
149 context = caller_profile->context ? caller_profile->context : "default";
150
151 if (!switch_config_open_file(&cfg, cf)) {
152 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_dialplan_asterisk.c", (const char
*)__func__, 152, ((void*)0)
, SWITCH_LOG_ERROR, "Open of %s failed\n", cf);
153 switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER)switch_channel_perform_hangup(channel, "mod_dialplan_asterisk.c"
, (const char *)__func__, 153, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER
)
;
154
155 return NULL((void*)0);
156 }
157
158 while (switch_config_next_pair(&cfg, &var, &val)) {
159 if (!strcasecmp(cfg.category, context)) {
160 char *field_expanded = NULL((void*)0);
161
162 if (!strcasecmp(var, "include")) {
163 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_dialplan_asterisk.c", (const char
*)__func__, 163, ((void*)0)
, SWITCH_LOG_ERROR, "param '%s' not implemented at line %d!\n", var, cfg.lineno);
164 } else {
165 int argc;
166 char *argv[3] = { 0 };
167 char *pattern = NULL((void*)0);
168 char *app = NULL((void*)0);
169 char *argument = NULL((void*)0);
170 char *expression = NULL((void*)0), expression_buf[1024] = { 0 };
171 char substituted[2048] = "";
172 const char *field_data = caller_profile->destination_number;
173 int proceed = 0;
174 switch_regex_t *re = NULL((void*)0);
175 switch_regex_match_data_t *match_data = NULL((void*)0);
176 char *cid = NULL((void*)0);
177
178 expression = expression_buf;
179
180 argc = switch_separate_string(val, ',', argv, (sizeof(argv) / sizeof(argv[0])));
181 if (argc < 3) {
182 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_dialplan_asterisk.c", (const char
*)__func__, 182, ((void*)0)
, SWITCH_LOG_ERROR, "Parse error line %d!\n", cfg.lineno);
183 continue;
184 }
185
186 pattern = argv[0];
187
188 if (!strcasecmp(var, "exten")) {
189 char *p;
190 if (pattern && (p = strchr(pattern, '/'))) {
191 *p++ = '\0';
192 cid = pattern;
193 pattern = p;
194 }
195 } else {
196 if (strchr(var, '$')) {
197 if ((field_expanded = switch_channel_expand_variables(channel, var)switch_channel_expand_variables_check(channel, var, ((void*)0
), ((void*)0), 0)
) == var) {
198 field_expanded = NULL((void*)0);
199 field_data = var;
200 } else {
201 field_data = field_expanded;
202 }
203 } else {
204 field_data = switch_caller_get_field_by_name(caller_profile, var);
205 }
206 }
207
208 if (pattern && (*pattern == '_' || *pattern == '~')) {
209 if (*pattern == '_') {
210 pattern++;
211 if (switch_ast2regex(pattern, expression_buf, sizeof(expression_buf))) {
212 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_dialplan_asterisk.c", (const char
*)__func__, 212, ((void*)0)
, SWITCH_LOG_DEBUG, "Converting [%s] to real regex [%s] you should try them!\n",
213 pattern, expression_buf);
214 }
215 } else {
216 pattern++;
217 expression = pattern;
218 }
219
220 if (!field_data) {
221 field_data = "";
222 }
223
224 if (!(proceed = switch_regex_perform(field_data, expression, &re, &match_data))) {
Although the value stored to 'proceed' is used in the enclosing expression, the value is never actually read from 'proceed'
225 switch_regex_safe_free(re, match_data)if (re) { switch_regex_match_free(match_data); switch_regex_free
(re); re = ((void*)0); }
;
226 switch_safe_free(field_expanded)if (field_expanded) {free(field_expanded);field_expanded=((void
*)0);}
;
227 continue;
228 }
229 } else {
230 if (pattern && strcasecmp(pattern, field_data)) {
231 switch_safe_free(field_expanded)if (field_expanded) {free(field_expanded);field_expanded=((void
*)0);}
;
232 continue;
233 }
234 }
235
236 if (cid) {
237 if (strcasecmp(cid, caller_profile->caller_id_number)) {
238 switch_safe_free(field_expanded)if (field_expanded) {free(field_expanded);field_expanded=((void
*)0);}
;
239 continue;
240 }
241 }
242
243 switch_channel_set_variable(channel, "EXTEN", caller_profile->destination_number)switch_channel_set_variable_var_check(channel, "EXTEN", caller_profile
->destination_number, SWITCH_TRUE)
;
244 switch_channel_set_variable(channel, "CHANNEL", switch_channel_get_name(channel))switch_channel_set_variable_var_check(channel, "CHANNEL", switch_channel_get_name
(channel), SWITCH_TRUE)
;
245 switch_channel_set_variable(channel, "UNIQUEID", switch_core_session_get_uuid(session))switch_channel_set_variable_var_check(channel, "UNIQUEID", switch_core_session_get_uuid
(session), SWITCH_TRUE)
;
246
247 //pri = argv[1];
248 app = argv[2];
249
250 if ((argument = strchr(app, '('))) {
251 char *p;
252 *argument++ = '\0';
253 p = strrchr(argument, ')');
254 if (p) {
255 *p = '\0';
256 }
257 } else if ((argument = strchr(app, ','))) {
258 *argument++ = '\0';
259 }
260
261 if (!argument) {
262 argument = "";
263 }
264
265 if (!field_data) {
266 field_data = "";
267 }
268
269 if (strchr(expression, '(')) {
270 switch_perform_substitution(match_data, argument, substituted, sizeof(substituted));
271 argument = substituted;
272 }
273
274 switch_regex_safe_free(re, match_data)if (re) { switch_regex_match_free(match_data); switch_regex_free
(re); re = ((void*)0); }
;
275
276 if (!extension) {
277 if (zstr(field_data)_zstr(field_data)) {
278 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_dialplan_asterisk.c", (const char
*)__func__, 278, ((void*)0)
, SWITCH_LOG_CRIT, "No extension!\n");
279 switch_safe_free(field_expanded)if (field_expanded) {free(field_expanded);field_expanded=((void
*)0);}
;
280 break;
281 }
282
283 if ((extension = switch_caller_extension_new(session, field_data, field_data)) == 0) {
284 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_dialplan_asterisk.c", (const char
*)__func__, 284, ((void*)0)
, SWITCH_LOG_CRIT, "Memory Error!\n");
285 switch_safe_free(field_expanded)if (field_expanded) {free(field_expanded);field_expanded=((void
*)0);}
;
286 break;
287 }
288 }
289
290 switch_caller_extension_add_application(session, extension, app, argument);
291 }
292
293 switch_safe_free(field_expanded)if (field_expanded) {free(field_expanded);field_expanded=((void
*)0);}
;
294 }
295 }
296
297 switch_config_close_file(&cfg);
298
299 return extension;
300}
301
302/* fake chan_sip */
303switch_endpoint_interface_t *sip_endpoint_interface;
304static switch_call_cause_t sip_outgoing_channel(switch_core_session_t *session, switch_event_t *var_event,
305 switch_caller_profile_t *outbound_profile,
306 switch_core_session_t **new_session, switch_memory_pool_t **pool, switch_originate_flag_t flags,
307 switch_call_cause_t *cancel_cause);
308switch_io_routines_t sip_io_routines = {
309 /*.outgoing_channel */ sip_outgoing_channel
310};
311
312static switch_call_cause_t sip_outgoing_channel(switch_core_session_t *session, switch_event_t *var_event,
313 switch_caller_profile_t *outbound_profile,
314 switch_core_session_t **new_session, switch_memory_pool_t **pool, switch_originate_flag_t flags,
315 switch_call_cause_t *cancel_cause)
316{
317 const char *profile;
318 char *dup_profile = NULL((void*)0);
319
320 if (session) {
321 profile = switch_channel_get_variable(switch_core_session_get_channel(session), "sip_profile")switch_channel_get_variable_dup(switch_core_session_get_channel
(session), "sip_profile", SWITCH_TRUE, -1)
;
322 } else {
323 dup_profile = switch_core_get_variable_dup("sip_profile");
324 profile = dup_profile;
325 }
326 if (zstr(profile)_zstr(profile)) {
327 profile = "default";
328 }
329
330 outbound_profile->destination_number = switch_core_sprintf(outbound_profile->pool, "%s/%s", profile, outbound_profile->destination_number);
331
332 UNPROTECT_INTERFACE(sip_endpoint_interface)if (sip_endpoint_interface) {switch_mutex_lock(sip_endpoint_interface
->reflock); sip_endpoint_interface->refs--; sip_endpoint_interface
->parent->refs--; switch_mutex_unlock(sip_endpoint_interface
->reflock); switch_thread_rwlock_unlock(sip_endpoint_interface
->rwlock); switch_thread_rwlock_unlock(sip_endpoint_interface
->parent->rwlock);}
;
333
334 switch_safe_free(dup_profile)if (dup_profile) {free(dup_profile);dup_profile=((void*)0);};
335
336 return switch_core_session_outgoing_channel(session, var_event, "sofia", outbound_profile, new_session, pool, SOF_NONE, cancel_cause);
337}
338
339
340
341
342/* fake chan_iax2 */
343switch_endpoint_interface_t *iax2_endpoint_interface;
344static switch_call_cause_t iax2_outgoing_channel(switch_core_session_t *session, switch_event_t *var_event,
345 switch_caller_profile_t *outbound_profile,
346 switch_core_session_t **new_session, switch_memory_pool_t **pool, switch_originate_flag_t flags,
347 switch_call_cause_t *cancel_cause);
348switch_io_routines_t iax2_io_routines = {
349 /*.outgoing_channel */ iax2_outgoing_channel
350};
351
352static switch_call_cause_t iax2_outgoing_channel(switch_core_session_t *session, switch_event_t *var_event,
353 switch_caller_profile_t *outbound_profile,
354 switch_core_session_t **new_session, switch_memory_pool_t **pool, switch_originate_flag_t flags,
355 switch_call_cause_t *cancel_cause)
356{
357 UNPROTECT_INTERFACE(iax2_endpoint_interface)if (iax2_endpoint_interface) {switch_mutex_lock(iax2_endpoint_interface
->reflock); iax2_endpoint_interface->refs--; iax2_endpoint_interface
->parent->refs--; switch_mutex_unlock(iax2_endpoint_interface
->reflock); switch_thread_rwlock_unlock(iax2_endpoint_interface
->rwlock); switch_thread_rwlock_unlock(iax2_endpoint_interface
->parent->rwlock);}
;
358
359 return switch_core_session_outgoing_channel(session, var_event, "iax", outbound_profile, new_session, pool, SOF_NONE, cancel_cause);
360}
361
362SWITCH_MODULE_LOAD_FUNCTION(mod_dialplan_asterisk_load)switch_status_t mod_dialplan_asterisk_load (switch_loadable_module_interface_t
**module_interface, switch_memory_pool_t *pool)
363{
364 switch_dialplan_interface_t *dp_interface;
365 switch_application_interface_t *app_interface;
366 int x = 0;
367
368 /* connect my internal structure to the blank pointer passed to me */
369 *module_interface = switch_loadable_module_create_module_interface(pool, modname);
370 /* add a dialplan interface */
371 SWITCH_ADD_DIALPLAN(dp_interface, "asterisk", asterisk_dialplan_hunt)for (;;) { dp_interface = (switch_dialplan_interface_t *)switch_loadable_module_create_interface
(*module_interface, SWITCH_DIALPLAN_INTERFACE); dp_interface->
hunt_function = asterisk_dialplan_hunt; dp_interface->interface_name
= "asterisk"; break; }
;
372
373 /* a few fake apps for the sake of emulation */
374 SWITCH_ADD_APP(app_interface, "Dial", "Dial", "Dial", dial_function, "Dial", SAF_SUPPORT_NOMEDIA)for (;;) { app_interface = (switch_application_interface_t *)
switch_loadable_module_create_interface(*module_interface, SWITCH_APPLICATION_INTERFACE
); app_interface->interface_name = "Dial"; app_interface->
application_function = dial_function; app_interface->short_desc
= "Dial"; app_interface->long_desc = "Dial"; app_interface
->syntax = "Dial"; app_interface->flags = SAF_SUPPORT_NOMEDIA
; break; }
;
375 SWITCH_ADD_APP(app_interface, "Goto", "Goto", "Goto", goto_function, "Goto", SAF_SUPPORT_NOMEDIA)for (;;) { app_interface = (switch_application_interface_t *)
switch_loadable_module_create_interface(*module_interface, SWITCH_APPLICATION_INTERFACE
); app_interface->interface_name = "Goto"; app_interface->
application_function = goto_function; app_interface->short_desc
= "Goto"; app_interface->long_desc = "Goto"; app_interface
->syntax = "Goto"; app_interface->flags = SAF_SUPPORT_NOMEDIA
; break; }
;
376 SWITCH_ADD_APP(app_interface, "AvoidingDeadlock", "Avoid", "Avoid", avoid_function, "Avoid", SAF_SUPPORT_NOMEDIA)for (;;) { app_interface = (switch_application_interface_t *)
switch_loadable_module_create_interface(*module_interface, SWITCH_APPLICATION_INTERFACE
); app_interface->interface_name = "AvoidingDeadlock"; app_interface
->application_function = avoid_function; app_interface->
short_desc = "Avoid"; app_interface->long_desc = "Avoid"; app_interface
->syntax = "Avoid"; app_interface->flags = SAF_SUPPORT_NOMEDIA
; break; }
;
377
378 /* fake chan_sip facade */
379 sip_endpoint_interface = switch_loadable_module_create_interface(*module_interface, SWITCH_ENDPOINT_INTERFACE);
380 sip_endpoint_interface->interface_name = "SIP";
381 sip_endpoint_interface->io_routines = &sip_io_routines;
382
383 /* fake chan_iax2 facade */
384 iax2_endpoint_interface = switch_loadable_module_create_interface(*module_interface, SWITCH_ENDPOINT_INTERFACE);
385 iax2_endpoint_interface->interface_name = "IAX2";
386 iax2_endpoint_interface->io_routines = &iax2_io_routines;
387
388 if (getenv("FAITHFUL_EMULATION")) {
389 for (x = 0; x < 10; x++) {
390 switch_log_printf(SWITCH_CHANNEL_LOGSWITCH_CHANNEL_ID_LOG, "mod_dialplan_asterisk.c", (const char
*)__func__, 390, ((void*)0)
, SWITCH_LOG_WARNING, "Avoiding Deadlock.\n");
391 switch_yield(100000)switch_sleep(100000);;
392 }
393 }
394
395 /* indicate that the module should continue to be loaded */
396 return SWITCH_STATUS_SUCCESS;
397}
398
399/* For Emacs:
400 * Local Variables:
401 * mode:c
402 * indent-tabs-mode:t
403 * tab-width:4
404 * c-basic-offset:4
405 * End:
406 * For VIM:
407 * vim:set softtabstop=4 shiftwidth=4 tabstop=4 noet:
408 */