Asterisk - The Open Source Telephony Project GIT-master-7988d11
Loading...
Searching...
No Matches
channel.c
Go to the documentation of this file.
1/*
2 * Asterisk -- An open source telephony toolkit.
3 *
4 * Copyright (C) 1999 - 2006, Digium, Inc.
5 *
6 * Mark Spencer <markster@digium.com>
7 *
8 * See http://www.asterisk.org for more information about
9 * the Asterisk project. Please do not directly contact
10 * any of the maintainers of this project for assistance;
11 * the project provides a web site, mailing lists and IRC
12 * channels for your use.
13 *
14 * This program is free software, distributed under the terms of
15 * the GNU General Public License Version 2. See the LICENSE file
16 * at the top of the source tree.
17 */
18
19/*! \file
20 *
21 * \brief Channel Management
22 *
23 * \author Mark Spencer <markster@digium.com>
24 */
25
26/*** MODULEINFO
27 <support_level>core</support_level>
28 ***/
29
30#include "asterisk.h"
31
32#include "asterisk/_private.h"
33
34#include <sys/time.h>
35#include <signal.h>
36#include <math.h>
37
38#include "asterisk/paths.h" /* use ast_config_AST_SYSTEM_NAME */
39
40#include "asterisk/pbx.h"
41#include "asterisk/frame.h"
42#include "asterisk/mod_format.h"
43#include "asterisk/sched.h"
44#include "asterisk/channel.h"
45#include "asterisk/cel.h"
47#include "asterisk/say.h"
48#include "asterisk/file.h"
49#include "asterisk/cli.h"
50#include "asterisk/translate.h"
51#include "asterisk/manager.h"
52#include "asterisk/chanvars.h"
55#include "asterisk/causes.h"
56#include "asterisk/callerid.h"
57#include "asterisk/utils.h"
58#include "asterisk/lock.h"
59#include "asterisk/app.h"
60#include "asterisk/transcap.h"
64#include "asterisk/audiohook.h"
65#include "asterisk/framehook.h"
66#include "asterisk/timing.h"
67#include "asterisk/autochan.h"
71#include "asterisk/features.h"
72#include "asterisk/bridge.h"
73#include "asterisk/test.h"
76#include "asterisk/stream.h"
77#include "asterisk/message.h"
78#include "asterisk/rtp_engine.h"
79
80#include "channelstorage.h"
81
82/*** DOCUMENTATION
83 ***/
84
85#if defined(KEEP_TILL_CHANNEL_PARTY_NUMBER_INFO_NEEDED)
86#if defined(HAVE_PRI)
87#include "libpri.h"
88#endif /* defined(HAVE_PRI) */
89#endif /* defined(KEEP_TILL_CHANNEL_PARTY_NUMBER_INFO_NEEDED) */
90
91/* uncomment if you have problems with 'monitoring' synchronized files */
92#if 0
93#define MONITOR_CONSTANT_DELAY
94#define MONITOR_DELAY 150 * 8 /*!< 150 ms of MONITORING DELAY */
95#endif
96
97static int chancount;
98
99unsigned long global_fin, global_fout;
100
101AST_THREADSTORAGE(state2str_threadbuf);
102#define STATE2STR_BUFSIZE 32
103
104/*! Default amount of time to use when emulating a DTMF digit as a begin and end
105 * 100ms */
106#define AST_DEFAULT_EMULATE_DTMF_DURATION 100
107
108/*! Default amount of time to use when emulating an MF digit as a begin and end
109 * 55ms */
110#define DEFAULT_EMULATE_MF_DURATION 55
111
112#define DEFAULT_AMA_FLAGS AST_AMA_DOCUMENTATION
113
114/*! Minimum amount of time between the end of the last digit and the beginning
115 * of a new one - 45ms */
116#define AST_MIN_DTMF_GAP 45
117
118/*! \brief List of channel drivers */
119struct chanlist {
120 const struct ast_channel_tech *tech;
122};
123
124/*! \brief the list of registered channel types */
126
127/*! \brief map AST_CAUSE's to readable string representations
128 *
129 * \ref causes.h
130*/
132 int cause;
133 const char *name;
134 const char *desc;
135};
136
137static const struct causes_map causes[] = {
138 { AST_CAUSE_UNALLOCATED, "UNALLOCATED", "Unallocated (unassigned) number" },
139 { AST_CAUSE_NO_ROUTE_TRANSIT_NET, "NO_ROUTE_TRANSIT_NET", "No route to specified transmit network" },
140 { AST_CAUSE_NO_ROUTE_DESTINATION, "NO_ROUTE_DESTINATION", "No route to destination" },
141 { AST_CAUSE_MISDIALLED_TRUNK_PREFIX, "MISDIALLED_TRUNK_PREFIX", "Misdialed trunk prefix" },
142 { AST_CAUSE_CHANNEL_UNACCEPTABLE, "CHANNEL_UNACCEPTABLE", "Channel unacceptable" },
143 { AST_CAUSE_CALL_AWARDED_DELIVERED, "CALL_AWARDED_DELIVERED", "Call awarded and being delivered in an established channel" },
144 { AST_CAUSE_PRE_EMPTED, "PRE_EMPTED", "Pre-empted" },
145 { AST_CAUSE_NUMBER_PORTED_NOT_HERE, "NUMBER_PORTED_NOT_HERE", "Number ported elsewhere" },
146 { AST_CAUSE_NORMAL_CLEARING, "NORMAL_CLEARING", "Normal Clearing" },
147 { AST_CAUSE_USER_BUSY, "USER_BUSY", "User busy" },
148 { AST_CAUSE_NO_USER_RESPONSE, "NO_USER_RESPONSE", "No user responding" },
149 { AST_CAUSE_NO_ANSWER, "NO_ANSWER", "User alerting, no answer" },
150 { AST_CAUSE_SUBSCRIBER_ABSENT, "SUBSCRIBER_ABSENT", "Subscriber absent" },
151 { AST_CAUSE_CALL_REJECTED, "CALL_REJECTED", "Call Rejected" },
152 { AST_CAUSE_NUMBER_CHANGED, "NUMBER_CHANGED", "Number changed" },
153 { AST_CAUSE_REDIRECTED_TO_NEW_DESTINATION, "REDIRECTED_TO_NEW_DESTINATION", "Redirected to new destination" },
154 { AST_CAUSE_ANSWERED_ELSEWHERE, "ANSWERED_ELSEWHERE", "Answered elsewhere" },
155 { AST_CAUSE_DESTINATION_OUT_OF_ORDER, "DESTINATION_OUT_OF_ORDER", "Destination out of order" },
156 { AST_CAUSE_INVALID_NUMBER_FORMAT, "INVALID_NUMBER_FORMAT", "Invalid number format" },
157 { AST_CAUSE_FACILITY_REJECTED, "FACILITY_REJECTED", "Facility rejected" },
158 { AST_CAUSE_RESPONSE_TO_STATUS_ENQUIRY, "RESPONSE_TO_STATUS_ENQUIRY", "Response to STATus ENQuiry" },
159 { AST_CAUSE_NORMAL_UNSPECIFIED, "NORMAL_UNSPECIFIED", "Normal, unspecified" },
160 { AST_CAUSE_NORMAL_CIRCUIT_CONGESTION, "NORMAL_CIRCUIT_CONGESTION", "Circuit/channel congestion" },
161 { AST_CAUSE_NETWORK_OUT_OF_ORDER, "NETWORK_OUT_OF_ORDER", "Network out of order" },
162 { AST_CAUSE_NORMAL_TEMPORARY_FAILURE, "NORMAL_TEMPORARY_FAILURE", "Temporary failure" },
163 { AST_CAUSE_SWITCH_CONGESTION, "SWITCH_CONGESTION", "Switching equipment congestion" },
164 { AST_CAUSE_ACCESS_INFO_DISCARDED, "ACCESS_INFO_DISCARDED", "Access information discarded" },
165 { AST_CAUSE_REQUESTED_CHAN_UNAVAIL, "REQUESTED_CHAN_UNAVAIL", "Requested channel not available" },
166 { AST_CAUSE_FACILITY_NOT_SUBSCRIBED, "FACILITY_NOT_SUBSCRIBED", "Facility not subscribed" },
167 { AST_CAUSE_OUTGOING_CALL_BARRED, "OUTGOING_CALL_BARRED", "Outgoing call barred" },
168 { AST_CAUSE_INCOMING_CALL_BARRED, "INCOMING_CALL_BARRED", "Incoming call barred" },
169 { AST_CAUSE_BEARERCAPABILITY_NOTAUTH, "BEARERCAPABILITY_NOTAUTH", "Bearer capability not authorized" },
170 { AST_CAUSE_BEARERCAPABILITY_NOTAVAIL, "BEARERCAPABILITY_NOTAVAIL", "Bearer capability not available" },
171 { AST_CAUSE_BEARERCAPABILITY_NOTIMPL, "BEARERCAPABILITY_NOTIMPL", "Bearer capability not implemented" },
172 { AST_CAUSE_CHAN_NOT_IMPLEMENTED, "CHAN_NOT_IMPLEMENTED", "Channel not implemented" },
173 { AST_CAUSE_FACILITY_NOT_IMPLEMENTED, "FACILITY_NOT_IMPLEMENTED", "Facility not implemented" },
174 { AST_CAUSE_INVALID_CALL_REFERENCE, "INVALID_CALL_REFERENCE", "Invalid call reference value" },
175 { AST_CAUSE_INCOMPATIBLE_DESTINATION, "INCOMPATIBLE_DESTINATION", "Incompatible destination" },
176 { AST_CAUSE_INVALID_MSG_UNSPECIFIED, "INVALID_MSG_UNSPECIFIED", "Invalid message unspecified" },
177 { AST_CAUSE_MANDATORY_IE_MISSING, "MANDATORY_IE_MISSING", "Mandatory information element is missing" },
178 { AST_CAUSE_MESSAGE_TYPE_NONEXIST, "MESSAGE_TYPE_NONEXIST", "Message type nonexist." },
179 { AST_CAUSE_WRONG_MESSAGE, "WRONG_MESSAGE", "Wrong message" },
180 { AST_CAUSE_IE_NONEXIST, "IE_NONEXIST", "Info. element nonexist or not implemented" },
181 { AST_CAUSE_INVALID_IE_CONTENTS, "INVALID_IE_CONTENTS", "Invalid information element contents" },
182 { AST_CAUSE_WRONG_CALL_STATE, "WRONG_CALL_STATE", "Message not compatible with call state" },
183 { AST_CAUSE_RECOVERY_ON_TIMER_EXPIRE, "RECOVERY_ON_TIMER_EXPIRE", "Recover on timer expiry" },
184 { AST_CAUSE_MANDATORY_IE_LENGTH_ERROR, "MANDATORY_IE_LENGTH_ERROR", "Mandatory IE length error" },
185 { AST_CAUSE_PROTOCOL_ERROR, "PROTOCOL_ERROR", "Protocol error, unspecified" },
186 { AST_CAUSE_INTERWORKING, "INTERWORKING", "Interworking, unspecified" },
187};
188
190{
191 struct chanlist *cl;
192 struct ast_variable *var = NULL, *prev = NULL;
193
195 AST_RWLIST_TRAVERSE(&backends, cl, list) {
196 if (prev) {
197 if ((prev->next = ast_variable_new(cl->tech->type, cl->tech->description, "")))
198 prev = prev->next;
199 } else {
200 var = ast_variable_new(cl->tech->type, cl->tech->description, "");
201 prev = var;
202 }
203 }
205
206 return var;
207}
208
209#if defined(KEEP_TILL_CHANNEL_PARTY_NUMBER_INFO_NEEDED)
210static const char *party_number_ton2str(int ton)
211{
212#if defined(HAVE_PRI)
213 switch ((ton >> 4) & 0x07) {
214 case PRI_TON_INTERNATIONAL:
215 return "International";
216 case PRI_TON_NATIONAL:
217 return "National";
218 case PRI_TON_NET_SPECIFIC:
219 return "Network Specific";
220 case PRI_TON_SUBSCRIBER:
221 return "Subscriber";
222 case PRI_TON_ABBREVIATED:
223 return "Abbreviated";
224 case PRI_TON_RESERVED:
225 return "Reserved";
226 case PRI_TON_UNKNOWN:
227 default:
228 break;
229 }
230#endif /* defined(HAVE_PRI) */
231 return "Unknown";
232}
233#endif /* defined(KEEP_TILL_CHANNEL_PARTY_NUMBER_INFO_NEEDED) */
234
235#if defined(KEEP_TILL_CHANNEL_PARTY_NUMBER_INFO_NEEDED)
236static const char *party_number_plan2str(int plan)
237{
238#if defined(HAVE_PRI)
239 switch (plan & 0x0F) {
240 default:
241 case PRI_NPI_UNKNOWN:
242 break;
243 case PRI_NPI_E163_E164:
244 return "Public (E.163/E.164)";
245 case PRI_NPI_X121:
246 return "Data (X.121)";
247 case PRI_NPI_F69:
248 return "Telex (F.69)";
249 case PRI_NPI_NATIONAL:
250 return "National Standard";
251 case PRI_NPI_PRIVATE:
252 return "Private";
253 case PRI_NPI_RESERVED:
254 return "Reserved";
255 }
256#endif /* defined(HAVE_PRI) */
257 return "Unknown";
258}
259#endif /* defined(KEEP_TILL_CHANNEL_PARTY_NUMBER_INFO_NEEDED) */
260
261/*! \brief Show channel types - CLI command */
262static char *handle_cli_core_show_channeltypes(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
263{
264#define FORMAT "%-15.15s %-40.40s %-13.13s %-13.13s %-13.13s %-13.13s\n"
265 struct chanlist *cl;
266 int count_chan = 0;
267
268 switch (cmd) {
269 case CLI_INIT:
270 e->command = "core show channeltypes";
271 e->usage =
272 "Usage: core show channeltypes\n"
273 " Lists available channel types registered in your\n"
274 " Asterisk server.\n";
275 return NULL;
276 case CLI_GENERATE:
277 return NULL;
278 }
279
280 if (a->argc != 3)
281 return CLI_SHOWUSAGE;
282
283 ast_cli(a->fd, FORMAT, "Type", "Description", "Devicestate", "Presencestate", "Indications", "Transfer");
284 ast_cli(a->fd, FORMAT, "-------------", "-------------", "-------------", "-------------", "-------------", "-------------");
285
288 ast_cli(a->fd, FORMAT, cl->tech->type, cl->tech->description,
289 (cl->tech->devicestate) ? "yes" : "no",
290 (cl->tech->presencestate) ? "yes" : "no",
291 (cl->tech->indicate) ? "yes" : "no",
292 (cl->tech->transfer) ? "yes" : "no");
293 count_chan++;
294 }
296
297 ast_cli(a->fd, "----------\n%d channel drivers registered.\n", count_chan);
298
299 return CLI_SUCCESS;
300
301#undef FORMAT
302}
303
305{
306 struct chanlist *cl;
307 int wordlen;
308
309 if (a->pos != 3) {
310 return NULL;
311 }
312
313 wordlen = strlen(a->word);
314
317 if (!strncasecmp(a->word, cl->tech->type, wordlen)) {
319 }
320 }
322
323 return NULL;
324}
325
326/*! \brief Show details about a channel driver - CLI command */
327static char *handle_cli_core_show_channeltype(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
328{
329 struct chanlist *cl = NULL;
331
332 switch (cmd) {
333 case CLI_INIT:
334 e->command = "core show channeltype";
335 e->usage =
336 "Usage: core show channeltype <name>\n"
337 " Show details about the specified channel type, <name>.\n";
338 return NULL;
339 case CLI_GENERATE:
340 return complete_channeltypes(a);
341 }
342
343 if (a->argc != 4)
344 return CLI_SHOWUSAGE;
345
347
348 AST_RWLIST_TRAVERSE(&backends, cl, list) {
349 if (!strncasecmp(cl->tech->type, a->argv[3], strlen(cl->tech->type)))
350 break;
351 }
352
353
354 if (!cl) {
355 ast_cli(a->fd, "\n%s is not a registered channel driver.\n", a->argv[3]);
357 return CLI_FAILURE;
358 }
359
360 ast_cli(a->fd,
361 "-- Info about channel driver: %s --\n"
362 " Device State: %s\n"
363 "Presence State: %s\n"
364 " Indication: %s\n"
365 " Transfer : %s\n"
366 " Capabilities: %s\n"
367 " Digit Begin: %s\n"
368 " Digit End: %s\n"
369 " Send HTML : %s\n"
370 " Image Support: %s\n"
371 " Text Support: %s\n",
372 cl->tech->type,
373 (cl->tech->devicestate) ? "yes" : "no",
374 (cl->tech->presencestate) ? "yes" : "no",
375 (cl->tech->indicate) ? "yes" : "no",
376 (cl->tech->transfer) ? "yes" : "no",
377 ast_format_cap_get_names(cl->tech->capabilities, &codec_buf),
378 (cl->tech->send_digit_begin) ? "yes" : "no",
379 (cl->tech->send_digit_end) ? "yes" : "no",
380 (cl->tech->send_html) ? "yes" : "no",
381 (cl->tech->send_image) ? "yes" : "no",
382 (cl->tech->send_text) ? "yes" : "no"
383
384 );
385
387
388 return CLI_SUCCESS;
389}
390
391static struct ast_cli_entry cli_channel[] = {
392 AST_CLI_DEFINE(handle_cli_core_show_channeltypes, "List available channel types"),
393 AST_CLI_DEFINE(handle_cli_core_show_channeltype, "Give more details on that channel type")
394};
395
396static struct ast_frame *kill_read(struct ast_channel *chan)
397{
398 /* Hangup channel. */
399 return NULL;
400}
401
402static struct ast_frame *kill_exception(struct ast_channel *chan)
403{
404 /* Hangup channel. */
405 return NULL;
406}
407
408static int kill_write(struct ast_channel *chan, struct ast_frame *frame)
409{
410 /* Hangup channel. */
411 return -1;
412}
413
414static int kill_fixup(struct ast_channel *oldchan, struct ast_channel *newchan)
415{
416 /* No problem fixing up the channel. */
417 return 0;
418}
419
420static int kill_hangup(struct ast_channel *chan)
421{
423 return 0;
424}
425
426/*!
427 * \brief Kill the channel channel driver technology descriptor.
428 *
429 * \details
430 * The purpose of this channel technology is to encourage the
431 * channel to hangup as quickly as possible.
432 *
433 * \note Used by DTMF atxfer and zombie channels.
434 */
436 .type = "Kill",
437 .description = "Kill channel (should not see this)",
438 .read = kill_read,
439 .exception = kill_exception,
440 .write = kill_write,
441 .fixup = kill_fixup,
442 .hangup = kill_hangup,
443};
444
445/*! \brief Checks to see if a channel is needing hang up */
447{
448 if (ast_channel_softhangup_internal_flag(chan)) /* yes if soft hangup flag set */
449 return 1;
450 if (ast_tvzero(*ast_channel_whentohangup(chan))) /* no if no hangup scheduled */
451 return 0;
452 if (ast_tvdiff_ms(*ast_channel_whentohangup(chan), ast_tvnow()) > 0) /* no if hangup time has not come yet. */
453 return 0;
454 ast_debug(4, "Hangup time has come: %" PRIi64 "\n", ast_tvdiff_ms(*ast_channel_whentohangup(chan), ast_tvnow()));
455 ast_test_suite_event_notify("HANGUP_TIME", "Channel: %s", ast_channel_name(chan));
457 return 1;
458}
459
461{
462 int res;
463 ast_channel_lock(chan);
464 res = ast_check_hangup(chan);
465 ast_channel_unlock(chan);
466 return res;
467}
468
470{
471 ast_channel_lock(chan);
472
473 if (causecode > 0) {
474 ast_debug(1, "Setting hangupcause of channel %s to %d (is %d now)\n",
475 ast_channel_name(chan), causecode, ast_channel_hangupcause(chan));
476
477 ast_channel_hangupcause_set(chan, causecode);
478 }
479
481
482 ast_channel_unlock(chan);
483}
484
485static int ast_channel_softhangup_cb(void *obj, void *arg, void *data, int flags)
486{
487 struct ast_channel *chan = obj;
488
490
491 return 0;
492}
493
498
499/*! \brief returns number of active/allocated channels */
504
506{
508}
509
510/*! \brief Set when to hangup channel */
511void ast_channel_setwhentohangup_tv(struct ast_channel *chan, struct timeval offset)
512{
513 if (ast_tvzero(offset)) {
514 ast_channel_whentohangup_set(chan, &offset);
515 } else {
516 struct timeval tv = ast_tvadd(offset, ast_tvnow());
518 }
520 return;
521}
522
523/*! \brief Compare a offset with when to hangup channel */
524int ast_channel_cmpwhentohangup_tv(struct ast_channel *chan, struct timeval offset)
525{
526 struct timeval whentohangup;
527
529 return ast_tvzero(offset) ? 0 : -1;
530
531 if (ast_tvzero(offset))
532 return 1;
533
534 whentohangup = ast_tvadd(offset, ast_tvnow());
535
536 return ast_tvdiff_ms(whentohangup, *ast_channel_whentohangup(chan));
537}
538
539/*! \brief Register a new telephony channel in Asterisk */
541{
542 struct chanlist *chan;
543
545
547 if (!strcasecmp(tech->type, chan->tech->type)) {
548 ast_log(LOG_WARNING, "Already have a handler for type '%s'\n", tech->type);
550 return -1;
551 }
552 }
553
554 if (!(chan = ast_calloc(1, sizeof(*chan)))) {
556 return -1;
557 }
558 chan->tech = tech;
560
561 ast_debug(5, "Registered handler for '%s' (%s)\n", chan->tech->type, chan->tech->description);
562
563 ast_verb(5, "Registered channel type '%s' (%s)\n", chan->tech->type, chan->tech->description);
564
566
567 return 0;
568}
569
570/*! \brief Unregister channel driver */
572{
573 struct chanlist *chan;
574
575 ast_debug(5, "Unregistering channel type '%s'\n", tech->type);
576
578
580 if (chan->tech == tech) {
582 ast_free(chan);
583 ast_verb(5, "Unregistered channel type '%s'\n", tech->type);
584 break;
585 }
586 }
588
590}
591
592/*! \brief Get handle to channel driver based on name */
594{
595 struct chanlist *chanls;
596 const struct ast_channel_tech *ret = NULL;
597
599
600 AST_RWLIST_TRAVERSE(&backends, chanls, list) {
601 if (!strcasecmp(name, chanls->tech->type)) {
602 ret = chanls->tech;
603 break;
604 }
605 }
606
608
609 return ret;
610}
611
612/*! \brief Gives the string form of a given hangup cause */
613const char *ast_cause2str(int cause)
614{
615 int x;
616
617 for (x = 0; x < ARRAY_LEN(causes); x++) {
618 if (causes[x].cause == cause)
619 return causes[x].desc;
620 }
621
622 return "Unknown";
623}
624
625/*! \brief Convert a symbolic hangup cause to number */
626int ast_str2cause(const char *name)
627{
628 int x;
629
630 for (x = 0; x < ARRAY_LEN(causes); x++)
631 if (!strncasecmp(causes[x].name, name, strlen(causes[x].name)))
632 return causes[x].cause;
633
634 return -1;
635}
636
638{
639 char *buf;
640
641 switch (state) {
642 case AST_STATE_DOWN:
643 return "Down";
645 return "Rsrvd";
647 return "OffHook";
649 return "Dialing";
650 case AST_STATE_RING:
651 return "Ring";
653 return "Ringing";
654 case AST_STATE_UP:
655 return "Up";
656 case AST_STATE_BUSY:
657 return "Busy";
659 return "Dialing Offhook";
661 return "Pre-ring";
662 case AST_STATE_MUTE:
663 return "Mute";
664 default:
665 if (!(buf = ast_threadstorage_get(&state2str_threadbuf, STATE2STR_BUFSIZE)))
666 return "Unknown";
667 snprintf(buf, STATE2STR_BUFSIZE, "Unknown (%u)", state);
668 return buf;
669 }
670}
671
672/*! \brief Gives the string form of a given transfer capability */
673char *ast_transfercapability2str(int transfercapability)
674{
675 switch (transfercapability) {
677 return "SPEECH";
679 return "DIGITAL";
681 return "RESTRICTED_DIGITAL";
683 return "3K1AUDIO";
685 return "DIGITAL_W_TONES";
687 return "VIDEO";
688 default:
689 return "UNKNOWN";
690 }
691}
692
693/*! \brief Channel technology used to extract a channel from a running application. The
694 * channel created with this technology will be immediately hung up - most external
695 * applications won't ever want to see this.
696 */
697static const struct ast_channel_tech surrogate_tech = {
698 .type = "Surrogate",
699 .description = "Surrogate channel used to pull channel from an application",
700 .properties = AST_CHAN_TP_INTERNAL,
701};
702
703static const struct ast_channel_tech null_tech = {
704 .type = "NULL",
705 .description = "Null channel (should not see this)",
706};
707
708static void ast_channel_destructor(void *obj);
709static void ast_dummy_channel_destructor(void *obj);
710
711static int do_ids_conflict(const struct ast_assigned_ids *assignedids, int rdlock)
712{
713 struct ast_channel *conflict;
714
715 if (!assignedids) {
716 return 0;
717 }
718
719 if (!ast_strlen_zero(assignedids->uniqueid)) {
721 get_by_uniqueid, assignedids->uniqueid, rdlock);
722 if (conflict) {
723 ast_log(LOG_ERROR, "Channel Unique ID '%s' already in use by channel %s(%p)\n",
724 assignedids->uniqueid, ast_channel_name(conflict), conflict);
725 ast_channel_unref(conflict);
726 return 1;
727 }
728 }
729
730 if (!ast_strlen_zero(assignedids->uniqueid2)) {
732 get_by_uniqueid, assignedids->uniqueid2, rdlock);
733 if (conflict) {
734 ast_log(LOG_ERROR, "Channel Unique ID2 '%s' already in use by channel %s(%p)\n",
735 assignedids->uniqueid2, ast_channel_name(conflict), conflict);
736 ast_channel_unref(conflict);
737 return 1;
738 }
739 }
740
741 return 0;
742}
743
744/*! \brief Create a new channel structure */
745static struct ast_channel *__attribute__((format(printf, 15, 0)))
746__ast_channel_alloc_ap(int needqueue, int state, const char *cid_num, const char *cid_name,
747 const char *acctcode, const char *exten, const char *context, const struct ast_assigned_ids *assignedids,
748 const struct ast_channel *requestor, enum ama_flags amaflag, struct ast_endpoint *endpoint,
749 struct ast_channel_initializers *initializers, const char *file, int line,
750 const char *function, const char *name_fmt, va_list ap)
751{
752 struct ast_channel *tmp;
753 struct varshead *headp;
754 char *tech = "", *tech2 = NULL;
755 struct ast_format_cap *nativeformats;
756 struct ast_sched_context *schedctx;
757 struct ast_timer *timer;
758 struct timeval now;
759 const struct ast_channel_tech *channel_tech;
760 struct ast_stream_topology *topology;
761
762 /* If shutting down, don't allocate any new channels */
763 if (ast_shutting_down()) {
764 ast_log(LOG_WARNING, "Channel allocation failed: Refusing due to active shutdown\n");
765 return NULL;
766 }
767
768 tmp = __ast_channel_internal_alloc_with_initializers(ast_channel_destructor, assignedids, requestor, initializers,
769 file, line, function);
770 if (!tmp) {
771 /* Channel structure allocation failure. */
772 return NULL;
773 }
774
776
777 /*
778 * Init file descriptors to unopened state so
779 * the destructor can know not to close them.
780 */
784
786 if (!nativeformats) {
787 /*
788 * Aborting the channel creation. We do not need to complete staging
789 * the channel snapshot because the channel has not been finalized or
790 * linked into the channels container yet. Nobody else knows about
791 * this channel nor will anybody ever know about it.
792 */
793 return ast_channel_unref(tmp);
794 }
795 ast_format_cap_append(nativeformats, ast_format_none, 0);
796 ast_channel_nativeformats_set(tmp, nativeformats);
797 ao2_ref(nativeformats, -1);
798
803
804 if (!(schedctx = ast_sched_context_create())) {
805 ast_log(LOG_WARNING, "Channel allocation failed: Unable to create schedule context\n");
806 /* See earlier channel creation abort comment above. */
807 return ast_channel_unref(tmp);
808 }
809 ast_channel_sched_set(tmp, schedctx);
810
816
817 if (cid_name) {
819 ast_channel_caller(tmp)->id.name.str = ast_strdup(cid_name);
820 if (!ast_channel_caller(tmp)->id.name.str) {
821 /* See earlier channel creation abort comment above. */
822 return ast_channel_unref(tmp);
823 }
824 }
825 if (cid_num) {
827 ast_channel_caller(tmp)->id.number.str = ast_strdup(cid_num);
828 if (!ast_channel_caller(tmp)->id.number.str) {
829 /* See earlier channel creation abort comment above. */
830 return ast_channel_unref(tmp);
831 }
832 }
833
834 if ((timer = ast_timer_open())) {
836 if (strcmp(ast_timer_get_name(ast_channel_timer(tmp)), "timerfd")) {
837 needqueue = 0;
838 }
840 }
841
842 if (needqueue && ast_channel_internal_alertpipe_init(tmp)) {
843 /* See earlier channel creation abort comment above. */
844 return ast_channel_unref(tmp);
845 }
846
847 if (!(topology = ast_stream_topology_alloc())) {
848 return ast_channel_unref(tmp);
849 }
851
852 /* Always watch the alertpipe */
854 /* And timing pipe */
856
857 /* Initial state */
860
863
866
867 now = ast_tvnow();
869
871
872 if (!ast_strlen_zero(name_fmt)) {
873 char *slash, *slash2;
874 /* Almost every channel is calling this function, and setting the name via the ast_string_field_build() call.
875 * And they all use slightly different formats for their name string.
876 * This means, to set the name here, we have to accept variable args, and call the string_field_build from here.
877 * This means, that the stringfields must have a routine that takes the va_lists directly, and
878 * uses them to build the string, instead of forming the va_lists internally from the vararg ... list.
879 * This new function was written so this can be accomplished.
880 */
881 ast_channel_name_build_va(tmp, name_fmt, ap);
882 tech = ast_strdupa(ast_channel_name(tmp));
883 if ((slash = strchr(tech, '/'))) {
884 if ((slash2 = strchr(slash + 1, '/'))) {
885 tech2 = slash + 1;
886 *slash2 = '\0';
887 }
888 *slash = '\0';
889 }
890 } else {
891 /*
892 * Start the string with '-' so it becomes an empty string
893 * in the destructor.
894 */
895 ast_channel_name_set(tmp, "-**Unknown**");
896 }
897
898 if (amaflag != AST_AMA_NONE) {
899 ast_channel_amaflags_set(tmp, amaflag);
900 } else {
902 }
903
904 if (!ast_strlen_zero(acctcode)) {
905 ast_channel_accountcode_set(tmp, acctcode);
906 }
907 ast_channel_language_set(tmp, ast_defaultlanguage);
908
909 ast_channel_context_set(tmp, S_OR(context, "default"));
910 ast_channel_exten_set(tmp, S_OR(exten, "s"));
912
913 headp = ast_channel_varshead(tmp);
915
919
920 channel_tech = ast_get_channel_tech(tech);
921 if (!channel_tech && !ast_strlen_zero(tech2)) {
922 channel_tech = ast_get_channel_tech(tech2);
923 }
924 if (channel_tech) {
925 ast_channel_tech_set(tmp, channel_tech);
926 } else {
928 }
929
930 /* You might scream "locking inversion" at seeing this but it is actually perfectly fine.
931 * Since the channel was just created nothing can know about it yet or even acquire it.
932 */
933 ast_channel_lock(tmp);
934
936
937 if (do_ids_conflict(assignedids, 0)) {
941 /* See earlier channel creation abort comment above. */
942 return ast_channel_unref(tmp);
943 }
944
945 /* Finalize and link into the channels container. */
950
951
952 if (endpoint) {
953 ast_channel_endpoint_set(tmp, endpoint);
954 }
955
956 /*
957 * And now, since the channel structure is built, and has its name, let
958 * the world know of its existence
959 */
961
962 ast_debug(1, "Channel %p '%s' allocated\n", tmp, ast_channel_name(tmp));
963
964 return tmp;
965}
966
967struct ast_channel *__ast_channel_alloc(int needqueue, int state, const char *cid_num,
968 const char *cid_name, const char *acctcode,
969 const char *exten, const char *context, const struct ast_assigned_ids *assignedids,
970 const struct ast_channel *requestor, enum ama_flags amaflag,
971 struct ast_endpoint *endpoint,
972 const char *file, int line, const char *function,
973 const char *name_fmt, ...)
974{
975 va_list ap;
976 struct ast_channel *result;
977
978 va_start(ap, name_fmt);
979 result = __ast_channel_alloc_ap(needqueue, state, cid_num, cid_name, acctcode, exten, context,
980 assignedids, requestor, amaflag, endpoint, NULL, file, line, function, name_fmt, ap);
981 va_end(ap);
982
983 return result;
984}
985
986struct ast_channel *__ast_channel_alloc_with_initializers(int needqueue, int state, const char *cid_num,
987 const char *cid_name, const char *acctcode,
988 const char *exten, const char *context, const struct ast_assigned_ids *assignedids,
989 const struct ast_channel *requestor, enum ama_flags amaflag,
990 struct ast_endpoint *endpoint, struct ast_channel_initializers *initializers,
991 const char *file, int line, const char *function,
992 const char *name_fmt, ...)
993{
994 va_list ap;
995 struct ast_channel *result;
996
997 va_start(ap, name_fmt);
998 result = __ast_channel_alloc_ap(needqueue, state, cid_num, cid_name, acctcode, exten, context,
999 assignedids, requestor, amaflag, endpoint, initializers, file, line, function, name_fmt, ap);
1000 va_end(ap);
1001
1002 return result;
1003}
1004
1005/* only do the minimum amount of work needed here to make a channel
1006 * structure that can be used to expand channel vars */
1007struct ast_channel *__ast_dummy_channel_alloc(const char *file, int line, const char *function)
1008{
1009 struct ast_channel *tmp;
1010 struct varshead *headp;
1011
1013 file, line, function);
1014 if (!tmp) {
1015 /* Dummy channel structure allocation failure. */
1016 return NULL;
1017 }
1018
1021
1022 /*
1023 * Init file descriptors to unopened state just in case
1024 * autoservice is called on the channel or something tries to
1025 * read a frame from it.
1026 */
1027 ast_channel_timingfd_set(tmp, -1);
1030
1032
1034
1035 headp = ast_channel_varshead(tmp);
1037
1038 return tmp;
1039}
1040
1041static int __ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin, int head, struct ast_frame *after)
1042{
1043 struct ast_frame *f;
1044 struct ast_frame *cur;
1045 unsigned int new_frames = 0;
1046 unsigned int new_voice_frames = 0;
1047 unsigned int queued_frames = 0;
1048 unsigned int queued_voice_frames = 0;
1050
1051 ast_channel_lock(chan);
1052
1053 /*
1054 * Check the last frame on the queue if we are queuing the new
1055 * frames after it.
1056 */
1057 cur = AST_LIST_LAST(ast_channel_readq(chan));
1058 if (cur && cur->frametype == AST_FRAME_CONTROL && !head && (!after || after == cur)) {
1059 switch (cur->subclass.integer) {
1061 if (fin->frametype == AST_FRAME_CONTROL
1062 && fin->subclass.integer == AST_CONTROL_HANGUP) {
1063 /*
1064 * Destroy the end-of-Q marker frame so we can queue the hangup
1065 * frame in its place.
1066 */
1068 ast_frfree(cur);
1069
1070 /*
1071 * This has degenerated to a normal queue append anyway. Since
1072 * we just destroyed the last frame in the queue we must make
1073 * sure that "after" is NULL or bad things will happen.
1074 */
1075 after = NULL;
1076 break;
1077 }
1078 /* Fall through */
1079 case AST_CONTROL_HANGUP:
1080 /* Don't queue anything. */
1081 ast_channel_unlock(chan);
1082 return 0;
1083 default:
1084 break;
1085 }
1086 }
1087
1088 /* Build copies of all the new frames and count them */
1090 for (cur = fin; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
1091 if (!(f = ast_frdup(cur))) {
1092 if (AST_LIST_FIRST(&frames)) {
1094 }
1095 ast_channel_unlock(chan);
1096 return -1;
1097 }
1098
1100 new_frames++;
1101 if (f->frametype == AST_FRAME_VOICE) {
1102 new_voice_frames++;
1103 }
1104 }
1105
1106 /* Count how many frames exist on the queue */
1108 queued_frames++;
1109 if (cur->frametype == AST_FRAME_VOICE) {
1110 queued_voice_frames++;
1111 }
1112 }
1113
1114 if ((queued_frames + new_frames > 128 || queued_voice_frames + new_voice_frames > 96)) {
1115 int total_queued = queued_frames + new_frames;
1116 int total_voice = queued_voice_frames + new_voice_frames;
1117 int count = 0;
1118 ast_log(LOG_WARNING, "Exceptionally long %squeue length (%d voice / %d total) queuing to %s\n",
1119 queued_frames + new_frames > 128 ? "" : "voice ", total_voice, total_queued, ast_channel_name(chan));
1121 /* Save the most recent frame */
1122 if (!AST_LIST_NEXT(cur, frame_list)) {
1123 break;
1124 } else if (cur->frametype == AST_FRAME_VOICE || cur->frametype == AST_FRAME_VIDEO || cur->frametype == AST_FRAME_NULL) {
1125 if (++count > 64) {
1126 break;
1127 }
1129 ast_frfree(cur);
1130
1131 /* Read from the alert pipe for each flushed frame. */
1133 }
1134 }
1136 if (count) {
1137 ast_debug(4, "Discarded %d frame%s due to queue overload on %s\n", count, ESS(count), ast_channel_name(chan));
1138 }
1139 }
1140
1141 if (after) {
1143 } else {
1144 if (head) {
1147 }
1149 }
1150
1151 if (ast_channel_alert_writable(chan)) {
1152 /* Write to the alert pipe for each added frame */
1153 while (new_frames--) {
1154 if (ast_channel_alert_write(chan)) {
1155 ast_log(LOG_WARNING, "Unable to write to alert pipe on %s (qlen = %u): %s!\n",
1156 ast_channel_name(chan), queued_frames, strerror(errno));
1157 break;
1158 }
1159 }
1160 } else if (ast_channel_timingfd(chan) > -1) {
1163 pthread_kill(ast_channel_blocker(chan), SIGURG);
1164 }
1165
1166 ast_channel_unlock(chan);
1167
1168 return 0;
1169}
1170
1171int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
1172{
1173 return __ast_queue_frame(chan, fin, 0, NULL);
1174}
1175
1176int ast_queue_frame_head(struct ast_channel *chan, struct ast_frame *fin)
1177{
1178 return __ast_queue_frame(chan, fin, 1, NULL);
1179}
1180
1181/*! \brief Queue a hangup frame for channel */
1183{
1186 int res, cause, tech_cause;
1187
1188 if (!blob) {
1189 return -1;
1190 }
1191
1192 /* Yeah, let's not change a lock-critical value without locking */
1193 ast_channel_lock(chan);
1195
1196 cause = ast_channel_hangupcause(chan);
1197 if (cause) {
1198 ast_json_object_set(blob, "cause", ast_json_integer_create(cause));
1199 }
1200 tech_cause = ast_channel_tech_hangupcause(chan);
1201 if (tech_cause) {
1202 ast_json_object_set(blob, "tech_cause", ast_json_integer_create(tech_cause));
1203 }
1204
1206
1207 res = ast_queue_frame(chan, &f);
1208 ast_channel_unlock(chan);
1209 return res;
1210}
1211
1212/*! \brief Queue a hangup frame for channel */
1213int ast_queue_hangup_with_cause(struct ast_channel *chan, int cause)
1214{
1215 RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
1217 int res;
1218 int tech_cause = 0;
1219
1220 if (cause >= 0) {
1221 f.data.uint32 = cause;
1222 }
1223
1224 /* Yeah, let's not change a lock-critical value without locking */
1225 ast_channel_lock(chan);
1227 if (cause < 0) {
1229 }
1230 blob = ast_json_pack("{s: i}",
1231 "cause", cause);
1232 if (!blob) {
1233 ast_channel_unlock(chan);
1234 return -1;
1235 }
1236
1237 tech_cause = ast_channel_tech_hangupcause(chan);
1238 if (tech_cause) {
1239 ast_json_object_set(blob, "tech_cause", ast_json_integer_create(tech_cause));
1240 }
1241
1243
1244 res = ast_queue_frame(chan, &f);
1245 ast_channel_unlock(chan);
1246 return res;
1247}
1248
1249int ast_queue_hold(struct ast_channel *chan, const char *musicclass)
1250{
1252 struct ast_json *blob = NULL;
1253 int res;
1254
1255 if (!ast_strlen_zero(musicclass)) {
1256 f.data.ptr = (void *) musicclass;
1257 f.datalen = strlen(musicclass) + 1;
1258
1259 blob = ast_json_pack("{s: s}",
1260 "musicclass", musicclass);
1261 }
1262
1263 ast_channel_lock(chan);
1265 ast_channel_unlock(chan);
1266
1267 res = ast_queue_frame(chan, &f);
1268
1269 ast_json_unref(blob);
1270
1271 return res;
1272}
1273
1275{
1277 int res;
1278
1279 ast_channel_lock(chan);
1281 ast_channel_unlock(chan);
1282
1283 res = ast_queue_frame(chan, &f);
1284
1285 return res;
1286}
1287
1288/*! \brief Queue a control frame */
1290{
1291 struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = control };
1292 return ast_queue_frame(chan, &f);
1293}
1294
1295/*! \brief Queue a control frame with payload */
1297 const void *data, size_t datalen)
1298{
1299 struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = control, .data.ptr = (void *) data, .datalen = datalen };
1300 return ast_queue_frame(chan, &f);
1301}
1302
1303/*! \brief Queue an ANSWER control frame with topology */
1304int ast_queue_answer(struct ast_channel *chan, const struct ast_stream_topology *topology)
1305{
1306 struct ast_frame f = {
1309 .subclass.topology = (struct ast_stream_topology *)topology,
1310 };
1311 return ast_queue_frame(chan, &f);
1312}
1313
1314/*! \brief Set defer DTMF flag on channel */
1316{
1317 int pre = 0;
1318
1319 if (chan) {
1320 ast_channel_lock(chan);
1323 ast_channel_unlock(chan);
1324 }
1325 return pre;
1326}
1327
1328/*! \brief Unset defer DTMF flag on channel */
1330{
1331 if (chan) {
1333 }
1334}
1335
1337 ao2_callback_data_fn *cb_fn, void *arg, void *data, int ao2_flags)
1338{
1340 return NULL;
1341 }
1342 if (!cb_fn) {
1343 ast_log(LOG_ERROR, "callback function must be provided\n");
1344 return NULL;
1345 }
1346 return CHANNELSTORAGE_API(current_channel_storage_instance, callback, cb_fn, arg, data, ao2_flags, 1);
1347}
1348
1356
1357struct ast_channel_iterator *ast_channel_iterator_by_exten_new(const char *exten, const char *context)
1358{
1360 return NULL;
1361 }
1362 if (ast_strlen_zero(exten) || ast_strlen_zero(context)) {
1363 ast_log(LOG_ERROR, "exten and context must be provided\n");
1364 return NULL;
1365 }
1367}
1369{
1371 return NULL;
1372 }
1373 if (ast_strlen_zero(name)) {
1374 ast_log(LOG_ERROR, "name must be provided\n");
1375 return NULL;
1376 }
1378}
1379
1387
1395
1396/*
1397 * REMINDER: Historically, this function can be provided a channel name
1398 * or uniqueid. This is a bit confusing, but it is what it is.
1399 */
1400struct ast_channel *ast_channel_get_by_name_prefix(const char *name, size_t name_len)
1401{
1403 return NULL;
1404 }
1405 if (ast_strlen_zero(name)) {
1406 ast_log(LOG_ERROR, "name must be provided\n");
1407 return NULL;
1408 }
1409
1410 return CHANNELSTORAGE_API(current_channel_storage_instance, get_by_name_prefix_or_uniqueid, name, name_len, 1);
1411}
1412
1413/*
1414 * REMINDER: Historically, this function can be provided a channel name
1415 * or uniqueid. This is a bit confusing, but it is what it is.
1416 */
1418{
1420 return NULL;
1421 }
1422 if (ast_strlen_zero(name)) {
1423 ast_log(LOG_ERROR, "name must be provided\n");
1424 return NULL;
1425 }
1426
1427 return CHANNELSTORAGE_API(current_channel_storage_instance, get_by_name_prefix_or_uniqueid, name, 0, 1);
1428}
1429
1430struct ast_channel *ast_channel_get_by_exten(const char *exten, const char *context)
1431{
1433 return NULL;
1434 }
1436 ast_log(LOG_ERROR, "exten and context must be provided\n");
1437 return NULL;
1438 }
1440}
1441
1443{
1445 return NULL;
1446 }
1448 ast_log(LOG_ERROR, "uniqueid must be provided\n");
1449 return NULL;
1450 }
1452}
1453
1454int ast_is_deferrable_frame(const struct ast_frame *frame)
1455{
1456 /* Do not add a default entry in this switch statement. Each new
1457 * frame type should be addressed directly as to whether it should
1458 * be queued up or not.
1459 */
1460 switch (frame->frametype) {
1463 case AST_FRAME_CONTROL:
1464 case AST_FRAME_TEXT:
1466 case AST_FRAME_IMAGE:
1467 case AST_FRAME_HTML:
1468 return 1;
1469
1470 case AST_FRAME_DTMF_END:
1472 case AST_FRAME_VOICE:
1473 case AST_FRAME_VIDEO:
1474 case AST_FRAME_NULL:
1475 case AST_FRAME_IAX:
1476 case AST_FRAME_CNG:
1477 case AST_FRAME_MODEM:
1478 case AST_FRAME_RTCP:
1479 return 0;
1480 }
1481 return 0;
1482}
1483
1484/*! \brief Wait, look for hangups and condition arg */
1485static int safe_sleep_conditional(struct ast_channel *chan, int timeout_ms, int (*cond)(void*), void *data, unsigned int generate_silence)
1486{
1487 struct ast_frame *f;
1488 struct ast_silence_generator *silgen = NULL;
1489 int res = 0;
1490 struct timeval start;
1491 int ms;
1492 AST_LIST_HEAD_NOLOCK(, ast_frame) deferred_frames;
1493
1494 AST_LIST_HEAD_INIT_NOLOCK(&deferred_frames);
1495
1496 /* If no other generator is present, start silencegen while waiting */
1497 if (generate_silence && ast_opt_transmit_silence && !ast_channel_generatordata(chan)) {
1499 }
1500
1501 start = ast_tvnow();
1502 while ((ms = ast_remaining_ms(start, timeout_ms))) {
1503 struct ast_frame *dup_f = NULL;
1504
1505 if (cond && ((*cond)(data) == 0)) {
1506 break;
1507 }
1508 ms = ast_waitfor(chan, ms);
1509 if (ms < 0) {
1510 res = -1;
1511 break;
1512 }
1513 if (ms > 0) {
1514 f = ast_read(chan);
1515 if (!f) {
1516 res = -1;
1517 break;
1518 }
1519
1520 if (!ast_is_deferrable_frame(f)) {
1521 ast_frfree(f);
1522 continue;
1523 }
1524
1525 if ((dup_f = ast_frisolate(f))) {
1526 if (dup_f != f) {
1527 ast_frfree(f);
1528 }
1529 AST_LIST_INSERT_HEAD(&deferred_frames, dup_f, frame_list);
1530 }
1531 }
1532 }
1533
1534 /* stop silgen if present */
1535 if (silgen) {
1537 }
1538
1539 /* We need to free all the deferred frames, but we only need to
1540 * queue the deferred frames if there was no error and no
1541 * hangup was received
1542 */
1543 ast_channel_lock(chan);
1544 while ((f = AST_LIST_REMOVE_HEAD(&deferred_frames, frame_list))) {
1545 if (!res) {
1546 ast_queue_frame_head(chan, f);
1547 }
1548 ast_frfree(f);
1549 }
1550 ast_channel_unlock(chan);
1551
1552 return res;
1553}
1554
1555int ast_safe_sleep_conditional(struct ast_channel *chan, int timeout_ms, int (*cond)(void*), void *data)
1556{
1557 return safe_sleep_conditional(chan, timeout_ms, cond, data, 1);
1558}
1559
1560/*! \brief Wait, look for hangups */
1561int ast_safe_sleep(struct ast_channel *chan, int ms)
1562{
1563 return safe_sleep_conditional(chan, ms, NULL, NULL, 1);
1564}
1565
1567{
1568 return safe_sleep_conditional(chan, ms, NULL, NULL, 0);
1569}
1570
1572{
1573 /* Safe, even if already unlinked. */
1574 ast_channel_unlink(chan);
1575 return ast_channel_unref(chan);
1576}
1577
1579{
1580 init->str = NULL;
1583 init->valid = 0;
1584}
1585
1586void ast_party_name_copy(struct ast_party_name *dest, const struct ast_party_name *src)
1587{
1588 if (dest == src) {
1589 /* Don't copy to self */
1590 return;
1591 }
1592
1593 ast_free(dest->str);
1594 dest->str = ast_strdup(src->str);
1595 dest->char_set = src->char_set;
1596 dest->presentation = src->presentation;
1597 dest->valid = src->valid;
1598}
1599
1600void ast_party_name_set_init(struct ast_party_name *init, const struct ast_party_name *guide)
1601{
1602 init->str = NULL;
1603 init->char_set = guide->char_set;
1604 init->presentation = guide->presentation;
1605 init->valid = guide->valid;
1606}
1607
1608void ast_party_name_set(struct ast_party_name *dest, const struct ast_party_name *src)
1609{
1610 if (dest == src) {
1611 /* Don't set to self */
1612 return;
1613 }
1614
1615 if (src->str && src->str != dest->str) {
1616 ast_free(dest->str);
1617 dest->str = ast_strdup(src->str);
1618 }
1619
1620 dest->char_set = src->char_set;
1621 dest->presentation = src->presentation;
1622 dest->valid = src->valid;
1623}
1624
1626{
1627 ast_free(doomed->str);
1628 doomed->str = NULL;
1629}
1630
1632{
1633 init->str = NULL;
1634 init->plan = 0;/* Unknown */
1636 init->valid = 0;
1637}
1638
1639void ast_party_number_copy(struct ast_party_number *dest, const struct ast_party_number *src)
1640{
1641 if (dest == src) {
1642 /* Don't copy to self */
1643 return;
1644 }
1645
1646 ast_free(dest->str);
1647 dest->str = ast_strdup(src->str);
1648 dest->plan = src->plan;
1649 dest->presentation = src->presentation;
1650 dest->valid = src->valid;
1651}
1652
1653void ast_party_number_set_init(struct ast_party_number *init, const struct ast_party_number *guide)
1654{
1655 init->str = NULL;
1656 init->plan = guide->plan;
1657 init->presentation = guide->presentation;
1658 init->valid = guide->valid;
1659}
1660
1661void ast_party_number_set(struct ast_party_number *dest, const struct ast_party_number *src)
1662{
1663 if (dest == src) {
1664 /* Don't set to self */
1665 return;
1666 }
1667
1668 if (src->str && src->str != dest->str) {
1669 ast_free(dest->str);
1670 dest->str = ast_strdup(src->str);
1671 }
1672
1673 dest->plan = src->plan;
1674 dest->presentation = src->presentation;
1675 dest->valid = src->valid;
1676}
1677
1679{
1680 ast_free(doomed->str);
1681 doomed->str = NULL;
1682}
1683
1685{
1686 init->str = NULL;
1687 init->type = 0;
1688 init->odd_even_indicator = 0;
1689 init->valid = 0;
1690}
1691
1693{
1694 if (dest == src) {
1695 /* Don't copy to self */
1696 return;
1697 }
1698
1699 ast_free(dest->str);
1700 dest->str = ast_strdup(src->str);
1701 dest->type = src->type;
1703 dest->valid = src->valid;
1704}
1705
1707{
1708 init->str = NULL;
1709 init->type = guide->type;
1711 init->valid = guide->valid;
1712}
1713
1715{
1716 if (dest == src) {
1717 /* Don't set to self */
1718 return;
1719 }
1720
1721 if (src->str && src->str != dest->str) {
1722 ast_free(dest->str);
1723 dest->str = ast_strdup(src->str);
1724 }
1725
1726 dest->type = src->type;
1728 dest->valid = src->valid;
1729}
1730
1732{
1733 ast_free(doomed->str);
1734 doomed->str = NULL;
1735}
1736
1738{
1739 update_id->name = 1;
1740 update_id->number = 1;
1741 update_id->subaddress = 1;
1742}
1743
1745{
1746 ast_party_name_init(&init->name);
1749 init->tag = NULL;
1750}
1751
1752void ast_party_id_copy(struct ast_party_id *dest, const struct ast_party_id *src)
1753{
1754 if (dest == src) {
1755 /* Don't copy to self */
1756 return;
1757 }
1758
1759 ast_party_name_copy(&dest->name, &src->name);
1760 ast_party_number_copy(&dest->number, &src->number);
1762
1763 ast_free(dest->tag);
1764 dest->tag = ast_strdup(src->tag);
1765}
1766
1767void ast_party_id_set_init(struct ast_party_id *init, const struct ast_party_id *guide)
1768{
1769 ast_party_name_set_init(&init->name, &guide->name);
1770 ast_party_number_set_init(&init->number, &guide->number);
1772 init->tag = NULL;
1773}
1774
1775void ast_party_id_set(struct ast_party_id *dest, const struct ast_party_id *src, const struct ast_set_party_id *update)
1776{
1777 if (dest == src) {
1778 /* Don't set to self */
1779 return;
1780 }
1781
1782 if (!update || update->name) {
1783 ast_party_name_set(&dest->name, &src->name);
1784 }
1785 if (!update || update->number) {
1786 ast_party_number_set(&dest->number, &src->number);
1787 }
1788 if (!update || update->subaddress) {
1790 }
1791
1792 if (src->tag && src->tag != dest->tag) {
1793 ast_free(dest->tag);
1794 dest->tag = ast_strdup(src->tag);
1795 }
1796}
1797
1799{
1800 ast_party_name_free(&doomed->name);
1801 ast_party_number_free(&doomed->number);
1803
1804 ast_free(doomed->tag);
1805 doomed->tag = NULL;
1806}
1807
1809{
1810 int number_priority;
1811 int number_value;
1812 int number_screening;
1813 int name_priority;
1814 int name_value;
1815
1816 /* Determine name presentation priority. */
1817 if (!id->name.valid) {
1818 name_value = AST_PRES_UNAVAILABLE;
1819 name_priority = 3;
1820 } else {
1821 name_value = id->name.presentation & AST_PRES_RESTRICTION;
1822 switch (name_value) {
1824 name_priority = 0;
1825 break;
1826 case AST_PRES_ALLOWED:
1827 name_priority = 1;
1828 break;
1830 name_priority = 2;
1831 break;
1832 default:
1833 name_value = AST_PRES_UNAVAILABLE;
1834 name_priority = 3;
1835 break;
1836 }
1837 }
1838
1839 /* Determine number presentation priority. */
1840 if (!id->number.valid) {
1841 number_screening = AST_PRES_USER_NUMBER_UNSCREENED;
1842 number_value = AST_PRES_UNAVAILABLE;
1843 number_priority = 3;
1844 } else {
1845 number_screening = id->number.presentation & AST_PRES_NUMBER_TYPE;
1846 number_value = id->number.presentation & AST_PRES_RESTRICTION;
1847 switch (number_value) {
1849 number_priority = 0;
1850 break;
1851 case AST_PRES_ALLOWED:
1852 number_priority = 1;
1853 break;
1855 number_priority = 2;
1856 break;
1857 default:
1858 number_screening = AST_PRES_USER_NUMBER_UNSCREENED;
1859 number_value = AST_PRES_UNAVAILABLE;
1860 number_priority = 3;
1861 break;
1862 }
1863 }
1864
1865 /* Select the wining presentation value. */
1866 if (name_priority < number_priority) {
1867 number_value = name_value;
1868 }
1869 if (number_value == AST_PRES_UNAVAILABLE) {
1871 }
1872
1873 return number_value | number_screening;
1874}
1875
1877{
1878 id->name.valid = 0;
1879 id->number.valid = 0;
1880 id->subaddress.valid = 0;
1881}
1882
1884{
1887}
1888
1889struct ast_party_id ast_party_id_merge(struct ast_party_id *base, struct ast_party_id *overlay)
1890{
1891 struct ast_party_id merged;
1892
1893 merged = *base;
1894 if (overlay->name.valid) {
1895 merged.name = overlay->name;
1896 }
1897 if (overlay->number.valid) {
1898 merged.number = overlay->number;
1899 }
1900 if (overlay->subaddress.valid) {
1901 merged.subaddress = overlay->subaddress;
1902 }
1903 /* Note the actual structure is returned and not a pointer to it! */
1904 return merged;
1905}
1906
1907void ast_party_id_merge_copy(struct ast_party_id *dest, struct ast_party_id *base, struct ast_party_id *overlay)
1908{
1909 struct ast_party_id merged;
1910
1911 merged = ast_party_id_merge(base, overlay);
1912 ast_party_id_copy(dest, &merged);
1913}
1914
1916{
1917 init->number.str = NULL;
1918 init->number.plan = 0;/* Unknown */
1920 init->transit_network_select = 0;
1921}
1922
1923void ast_party_dialed_copy(struct ast_party_dialed *dest, const struct ast_party_dialed *src)
1924{
1925 if (dest == src) {
1926 /* Don't copy to self */
1927 return;
1928 }
1929
1930 ast_free(dest->number.str);
1931 dest->number.str = ast_strdup(src->number.str);
1932 dest->number.plan = src->number.plan;
1935}
1936
1937void ast_party_dialed_set_init(struct ast_party_dialed *init, const struct ast_party_dialed *guide)
1938{
1939 init->number.str = NULL;
1940 init->number.plan = guide->number.plan;
1943}
1944
1945void ast_party_dialed_set(struct ast_party_dialed *dest, const struct ast_party_dialed *src)
1946{
1947 if (src->number.str && src->number.str != dest->number.str) {
1948 ast_free(dest->number.str);
1949 dest->number.str = ast_strdup(src->number.str);
1950 }
1951 dest->number.plan = src->number.plan;
1952
1954
1956}
1957
1959{
1960 ast_free(doomed->number.str);
1961 doomed->number.str = NULL;
1963}
1964
1966{
1967 ast_party_id_init(&init->id);
1968 ast_party_id_init(&init->ani);
1969 ast_party_id_init(&init->priv);
1970 init->ani2 = 0;
1971}
1972
1973void ast_party_caller_copy(struct ast_party_caller *dest, const struct ast_party_caller *src)
1974{
1975 if (dest == src) {
1976 /* Don't copy to self */
1977 return;
1978 }
1979
1980 ast_party_id_copy(&dest->id, &src->id);
1981 ast_party_id_copy(&dest->ani, &src->ani);
1982 ast_party_id_copy(&dest->priv, &src->priv);
1983 dest->ani2 = src->ani2;
1984}
1985
1986void ast_party_caller_set_init(struct ast_party_caller *init, const struct ast_party_caller *guide)
1987{
1988 ast_party_id_set_init(&init->id, &guide->id);
1989 ast_party_id_set_init(&init->ani, &guide->ani);
1990 ast_party_id_set_init(&init->priv, &guide->priv);
1991 init->ani2 = guide->ani2;
1992}
1993
1994void ast_party_caller_set(struct ast_party_caller *dest, const struct ast_party_caller *src, const struct ast_set_party_caller *update)
1995{
1996 ast_party_id_set(&dest->id, &src->id, update ? &update->id : NULL);
1997 ast_party_id_set(&dest->ani, &src->ani, update ? &update->ani : NULL);
1998 ast_party_id_set(&dest->priv, &src->priv, update ? &update->priv : NULL);
1999 dest->ani2 = src->ani2;
2000}
2001
2003{
2004 ast_party_id_free(&doomed->id);
2005 ast_party_id_free(&doomed->ani);
2006 ast_party_id_free(&doomed->priv);
2007}
2008
2010{
2011 ast_party_id_init(&init->id);
2012 ast_party_id_init(&init->ani);
2013 ast_party_id_init(&init->priv);
2014 init->ani2 = 0;
2016}
2017
2019{
2020 if (dest == src) {
2021 /* Don't copy to self */
2022 return;
2023 }
2024
2025 ast_party_id_copy(&dest->id, &src->id);
2026 ast_party_id_copy(&dest->ani, &src->ani);
2027 ast_party_id_copy(&dest->priv, &src->priv);
2028 dest->ani2 = src->ani2;
2029 dest->source = src->source;
2030}
2031
2033{
2034 ast_party_id_set_init(&init->id, &guide->id);
2035 ast_party_id_set_init(&init->ani, &guide->ani);
2036 ast_party_id_set_init(&init->priv, &guide->priv);
2037 init->ani2 = guide->ani2;
2038 init->source = guide->source;
2039}
2040
2042{
2043 ast_party_id_set(&dest->id, &src->id, update ? &update->id : NULL);
2044 ast_party_id_set(&dest->ani, &src->ani, update ? &update->ani : NULL);
2045 ast_party_id_set(&dest->priv, &src->priv, update ? &update->priv : NULL);
2046 dest->ani2 = src->ani2;
2047 dest->source = src->source;
2048}
2049
2051{
2052 connected->id = caller->id;
2053 connected->ani = caller->ani;
2054 connected->priv = caller->priv;
2055 connected->ani2 = caller->ani2;
2057}
2058
2060{
2061 ast_party_id_free(&doomed->id);
2062 ast_party_id_free(&doomed->ani);
2063 ast_party_id_free(&doomed->priv);
2064}
2065
2071
2073{
2074 if (dest == src) {
2075 return;
2076 }
2077
2078 ast_free(dest->str);
2079 dest->str = ast_strdup(src->str);
2080 dest->code = src->code;
2081}
2082
2084{
2085 init->str = NULL;
2086 init->code = guide->code;
2087}
2088
2090{
2091 if (dest == src) {
2092 return;
2093 }
2094
2095 if (src->str && src->str != dest->str) {
2096 ast_free(dest->str);
2097 dest->str = ast_strdup(src->str);
2098 }
2099
2100 dest->code = src->code;
2101}
2102
2104{
2105 ast_free(doomed->str);
2106}
2107
2108
2121
2123{
2124 if (dest == src) {
2125 /* Don't copy to self */
2126 return;
2127 }
2128
2129 ast_party_id_copy(&dest->orig, &src->orig);
2130 ast_party_id_copy(&dest->from, &src->from);
2131 ast_party_id_copy(&dest->to, &src->to);
2132 ast_party_id_copy(&dest->priv_orig, &src->priv_orig);
2133 ast_party_id_copy(&dest->priv_from, &src->priv_from);
2134 ast_party_id_copy(&dest->priv_to, &src->priv_to);
2137 dest->count = src->count;
2138}
2139
2141{
2142 ast_party_id_set_init(&init->orig, &guide->orig);
2143 ast_party_id_set_init(&init->from, &guide->from);
2144 ast_party_id_set_init(&init->to, &guide->to);
2145 ast_party_id_set_init(&init->priv_orig, &guide->priv_orig);
2146 ast_party_id_set_init(&init->priv_from, &guide->priv_from);
2147 ast_party_id_set_init(&init->priv_to, &guide->priv_to);
2150 init->count = guide->count;
2151}
2152
2154{
2155 ast_party_id_set(&dest->orig, &src->orig, update ? &update->orig : NULL);
2156 ast_party_id_set(&dest->from, &src->from, update ? &update->from : NULL);
2157 ast_party_id_set(&dest->to, &src->to, update ? &update->to : NULL);
2158 ast_party_id_set(&dest->priv_orig, &src->priv_orig, update ? &update->priv_orig : NULL);
2159 ast_party_id_set(&dest->priv_from, &src->priv_from, update ? &update->priv_from : NULL);
2160 ast_party_id_set(&dest->priv_to, &src->priv_to, update ? &update->priv_to : NULL);
2163 dest->count = src->count;
2164}
2165
2177
2178static void moh_cleanup(struct ast_channel *chan);
2179
2180/*! \brief Free a channel structure */
2181static void ast_channel_destructor(void *obj)
2182{
2183 struct ast_channel *chan = obj;
2184 struct ast_var_t *vardata;
2185 struct ast_frame *f;
2186 struct varshead *headp;
2187 struct ast_datastore *datastore;
2188 char device_name[AST_CHANNEL_NAME];
2189 ast_callid callid;
2190
2191 ast_debug(1, "Channel %p '%s' destroying\n", chan, ast_channel_name(chan));
2192
2193 /* If there is native format music-on-hold state, free it */
2194 if (ast_channel_music_state(chan)) {
2195 moh_cleanup(chan);
2196 }
2197
2199
2200 /* Things that may possibly raise Stasis messages shouldn't occur after this point */
2202
2204 /* A channel snapshot should not be in the process of being staged now. */
2206
2207 ast_channel_lock(chan);
2209 ast_channel_unlock(chan);
2210 }
2211
2212 ast_channel_lock(chan);
2213
2215
2216 /* Get rid of each of the data stores on the channel */
2217 while ((datastore = AST_LIST_REMOVE_HEAD(ast_channel_datastores(chan), entry)))
2218 /* Free the data store */
2219 ast_datastore_free(datastore);
2220
2221 /* While the channel is locked, take the reference to its callid while we tear down the call. */
2222 callid = ast_channel_callid(chan);
2224
2225 ast_channel_unlock(chan);
2226
2227 /* Lock and unlock the channel just to be sure nobody has it locked still
2228 due to a reference that was stored in a datastore. (i.e. app_chanspy) */
2229 ast_channel_lock(chan);
2230 ast_channel_unlock(chan);
2231
2232 if (ast_channel_tech_pvt(chan)) {
2233 ast_log_callid(LOG_WARNING, callid, "Channel '%s' may not have been hung up properly\n", ast_channel_name(chan));
2235 }
2236
2237 if (ast_channel_sched(chan)) {
2239 }
2240
2242 char *dashptr;
2243
2244 ast_copy_string(device_name, ast_channel_name(chan), sizeof(device_name));
2245 if ((dashptr = strrchr(device_name, '-'))) {
2246 *dashptr = '\0';
2247 }
2248 } else {
2249 device_name[0] = '\0';
2250 }
2251
2252 /* Free translators */
2253 if (ast_channel_readtrans(chan))
2255 if (ast_channel_writetrans(chan))
2257 if (ast_channel_pbx(chan))
2258 ast_log_callid(LOG_WARNING, callid, "PBX may not have been terminated properly on '%s'\n", ast_channel_name(chan));
2259
2260 /* Free formats */
2266
2272
2273 /* Close pipes if appropriate */
2275 if (ast_channel_timer(chan)) {
2278 }
2280 ast_frfree(f);
2281
2282 /* loop over the variables list, freeing all data and deleting list items */
2283 /* no need to lock the list, as the channel is already locked */
2284 headp = ast_channel_varshead(chan);
2285 while ((vardata = AST_LIST_REMOVE_HEAD(headp, entries)))
2286 ast_var_delete(vardata);
2287
2289
2290 /* Destroy the jitterbuffer */
2291 ast_jb_destroy(chan);
2292
2293 if (ast_channel_cdr(chan)) {
2296 }
2297
2298 if (ast_channel_zone(chan)) {
2300 }
2301
2303
2304 if (device_name[0]) {
2305 /*
2306 * We have a device name to notify of a new state.
2307 *
2308 * Queue an unknown state, because, while we know that this particular
2309 * instance is dead, we don't know the state of all other possible
2310 * instances.
2311 */
2313 }
2314
2316
2319
2321}
2322
2323/*! \brief Free a dummy channel structure */
2324static void ast_dummy_channel_destructor(void *obj)
2325{
2326 struct ast_channel *chan = obj;
2327 struct ast_datastore *datastore;
2328 struct ast_var_t *vardata;
2329 struct varshead *headp;
2330
2332
2333 /* Get rid of each of the data stores on the channel */
2334 while ((datastore = AST_LIST_REMOVE_HEAD(ast_channel_datastores(chan), entry))) {
2335 /* Free the data store */
2336 ast_datastore_free(datastore);
2337 }
2338
2344
2345 /* loop over the variables list, freeing all data and deleting list items */
2346 /* no need to lock the list, as the channel is already locked */
2347 headp = ast_channel_varshead(chan);
2348 while ((vardata = AST_LIST_REMOVE_HEAD(headp, entries)))
2349 ast_var_delete(vardata);
2350
2351 if (ast_channel_cdr(chan)) {
2354 }
2355
2357}
2358
2360{
2361 struct ast_datastore *datastore = NULL, *datastore2;
2362
2364 if (datastore->inheritance > 0) {
2365 datastore2 = ast_datastore_alloc(datastore->info, datastore->uid);
2366 if (datastore2) {
2367 datastore2->data = datastore->info->duplicate ? datastore->info->duplicate(datastore->data) : NULL;
2368 datastore2->inheritance = datastore->inheritance == DATASTORE_INHERIT_FOREVER ? DATASTORE_INHERIT_FOREVER : datastore->inheritance - 1;
2370 }
2371 }
2372 }
2373 return 0;
2374}
2375
2376int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
2377{
2378 int res = 0;
2379
2381
2382 return res;
2383}
2384
2385int ast_channel_datastore_remove(struct ast_channel *chan, struct ast_datastore *datastore)
2386{
2387 return AST_LIST_REMOVE(ast_channel_datastores(chan), datastore, entry) ? 0 : -1;
2388}
2389
2390struct ast_datastore *ast_channel_datastore_find(struct ast_channel *chan, const struct ast_datastore_info *info, const char *uid)
2391{
2392 struct ast_datastore *datastore = NULL;
2393
2394 if (info == NULL)
2395 return NULL;
2396
2398 if (datastore->info != info) {
2399 continue;
2400 }
2401
2402 if (uid == NULL) {
2403 /* matched by type only */
2404 break;
2405 }
2406
2407 if ((datastore->uid != NULL) && !strcasecmp(uid, datastore->uid)) {
2408 /* Matched by type AND uid */
2409 break;
2410 }
2411 }
2412
2413 return datastore;
2414}
2415
2416/*! Set the file descriptor on the channel */
2417void ast_channel_set_fd(struct ast_channel *chan, int which, int fd)
2418{
2419 ast_channel_internal_fd_set(chan, which, fd);
2420 return;
2421}
2422
2424{
2425 ast_channel_lock(chan);
2426
2428
2430 struct ast_frame *fr;
2431
2432 /* If we have completely cleared the softhangup flag,
2433 * then we need to fully abort the hangup process. This requires
2434 * pulling the END_OF_Q frame out of the channel frame queue if it
2435 * still happens to be there. */
2436
2437 fr = AST_LIST_LAST(ast_channel_readq(chan));
2438 if (fr && fr->frametype == AST_FRAME_CONTROL &&
2441 ast_frfree(fr);
2442 }
2443 }
2444
2445 ast_channel_unlock(chan);
2446}
2447
2448/*! \brief Softly hangup a channel, don't lock */
2449int ast_softhangup_nolock(struct ast_channel *chan, int cause)
2450{
2451 ast_debug(1, "Soft-Hanging (%#04x) up channel '%s'\n", (unsigned)cause, ast_channel_name(chan));
2452 /* Inform channel driver that we need to be hung up, if it cares */
2455 /* Interrupt any poll call or such */
2457 pthread_kill(ast_channel_blocker(chan), SIGURG);
2458 return 0;
2459}
2460
2461/*! \brief Softly hangup a channel, lock */
2462int ast_softhangup(struct ast_channel *chan, int cause)
2463{
2464 RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
2465 int res;
2466 int tech_cause = 0;
2467 struct ast_rtp_glue *glue;
2468 struct ast_rtp_instance *rtp = NULL;
2469 const struct ast_channel_tech *tech;
2470
2471 /*
2472 * Only hold the channel lock long enough to get the rtp instance.
2473 * glue->get_rtp_info() will bump the refcount on it.
2474 */
2475 ast_channel_lock(chan);
2476 tech = ast_channel_tech(chan);
2477 glue = ast_rtp_instance_get_glue(tech->type);
2478 if (glue) {
2479 glue->get_rtp_info(chan, &rtp);
2480 }
2481 ast_channel_unlock(chan);
2482
2483 /*
2484 * If this channel is in a bridge, ast_rtp_instance_set_stats_vars() will
2485 * attempt to lock the bridge peer as well as this channel. This can cause
2486 * a lock inversion if we already have this channel locked and another
2487 * thread tries to set bridge variables on the peer because it will have
2488 * locked the peer first, then this channel. For this reason, we must
2489 * NOT have the channel locked when we call ast_rtp_instance_set_stats_vars().
2490 * This should be safe since glue->get_rtp_info() will have bumped the
2491 * refcount on the rtp instance so it can't go away while the channel
2492 * is unlocked.
2493 */
2494 if (rtp) {
2496 ao2_ref(rtp, -1);
2497 }
2498
2499 /*
2500 * Now it's safe to lock the channel again.
2501 */
2502 ast_channel_lock(chan);
2503
2504 res = ast_softhangup_nolock(chan, cause);
2505 blob = ast_json_pack("{s: i, s: b}",
2506 "cause", cause,
2507 "soft", 1);
2508
2509 tech_cause = ast_channel_tech_hangupcause(chan);
2510 if (tech_cause) {
2511 ast_json_object_set(blob, "tech_cause", ast_json_integer_create(tech_cause));
2512 }
2513
2515 ast_channel_unlock(chan);
2516
2517 return res;
2518}
2519
2520static void free_translation(struct ast_channel *clonechan)
2521{
2522 if (ast_channel_writetrans(clonechan)) {
2524 }
2525 if (ast_channel_readtrans(clonechan)) {
2527 }
2528 ast_channel_writetrans_set(clonechan, NULL);
2529 ast_channel_readtrans_set(clonechan, NULL);
2530}
2531
2532void ast_set_hangupsource(struct ast_channel *chan, const char *source, int force)
2533{
2535
2536 ast_channel_lock(chan);
2537 if (force || ast_strlen_zero(ast_channel_hangupsource(chan))) {
2538 ast_channel_hangupsource_set(chan, source);
2539 }
2540 ast_channel_unlock(chan);
2541
2542 if (bridge) {
2543 ast_channel_lock(bridge);
2544 if (force || ast_strlen_zero(ast_channel_hangupsource(bridge))) {
2545 ast_channel_hangupsource_set(bridge, source);
2546 }
2547 ast_channel_unlock(bridge);
2548 }
2549}
2550
2556
2562
2563static void destroy_hooks(struct ast_channel *chan)
2564{
2565 if (ast_channel_audiohooks(chan)) {
2568 }
2569
2571}
2572
2573/*! \brief Hangup a channel */
2574void ast_hangup(struct ast_channel *chan)
2575{
2576 /* Be NULL safe for RAII_VAR() usage. */
2577 if (!chan) {
2578 return;
2579 }
2580
2581 ast_debug(1, "Channel %p '%s' hanging up. Refs: %d\n", chan, ast_channel_name(chan),
2582 ao2_ref(chan, 0));
2583
2585
2586 ast_channel_lock(chan);
2587
2588 while (ast_channel_masq(chan) || ast_channel_masqr(chan)) {
2590 }
2591
2592 /* Mark as a zombie so a masquerade cannot be setup on this channel. */
2594
2595 ast_channel_unlock(chan);
2596
2597 /*
2598 * XXX if running the hangup handlers here causes problems
2599 * because the handlers take too long to execute, we could move
2600 * the meat of this function into another thread. A thread
2601 * where channels go to die.
2602 *
2603 * If this is done, ast_autoservice_chan_hangup_peer() will no
2604 * longer be needed.
2605 */
2607 ast_channel_unlink(chan);
2608 ast_channel_lock(chan);
2609
2610 destroy_hooks(chan);
2611
2612 free_translation(chan);
2613 /* Close audio stream */
2614 if (ast_channel_stream(chan)) {
2617 }
2618 /* Close video stream */
2619 if (ast_channel_vstream(chan)) {
2622 }
2623 if (ast_channel_sched(chan)) {
2626 }
2627
2628 if (ast_channel_generatordata(chan)) { /* Clear any tone stuff remaining */
2629 if (ast_channel_generator(chan) && ast_channel_generator(chan)->release) {
2631 }
2632 }
2635
2637 ast_log(LOG_WARNING, "Hard hangup called by thread LWP %d on %s, while blocked by thread LWP %d in procedure %s! Expect a failure\n",
2639 ast_channel_blockproc(chan));
2640 ast_assert(0);
2641 }
2642
2643 if (ast_channel_tech(chan)->hangup) {
2644 ast_channel_tech(chan)->hangup(chan);
2645 }
2646
2647 ast_channel_unlock(chan);
2648
2649 ast_cc_offer(chan);
2650
2651 ast_channel_unref(chan);
2652}
2653
2654/*!
2655 * \internal
2656 * \brief Set channel answered time if not already set.
2657 * \since 13.11.0
2658 *
2659 * \param chan Channel to set answered time.
2660 */
2661static void set_channel_answer_time(struct ast_channel *chan)
2662{
2664 struct timeval answertime;
2665
2666 answertime = ast_tvnow();
2667 ast_channel_answertime_set(chan, &answertime);
2668 }
2669}
2670
2671
2673{
2674 int res = 0;
2675 SCOPE_TRACE(1, "%s\n", ast_channel_name(chan));
2676
2677 ast_channel_lock(chan);
2678
2679 /* You can't answer an outbound call */
2681 ast_channel_unlock(chan);
2682 return 0;
2683 }
2684
2685 /* Stop if we're a zombie or need a soft hangup */
2687 ast_channel_unlock(chan);
2688 return -1;
2689 }
2690
2691 /*
2692 * Mark when incoming channel answered so we can know how
2693 * long the channel has been up.
2694 */
2696
2697 ast_channel_unlock(chan);
2698
2699 switch (ast_channel_state(chan)) {
2700 case AST_STATE_RINGING:
2701 case AST_STATE_RING:
2702 ast_channel_lock(chan);
2703 if (ast_channel_tech(chan)->answer_with_stream_topology) {
2704 res = ast_channel_tech(chan)->answer_with_stream_topology(chan, topology);
2705
2706 } else if (ast_channel_tech(chan)->answer) {
2707 res = ast_channel_tech(chan)->answer(chan);
2708 }
2710 ast_channel_unlock(chan);
2711 break;
2712 case AST_STATE_UP:
2713 /* Fall through */
2714 default:
2715 ast_debug(2, "Skipping answer, since channel state on %s is %s\n", ast_channel_name(chan), ast_state2str(ast_channel_state(chan)));
2716 break;
2717 }
2718
2719 ast_indicate(chan, -1);
2720
2721 return res;
2722}
2723
2725{
2727}
2728
2729int __ast_answer(struct ast_channel *chan, unsigned int delay)
2730{
2731 int res = 0;
2732 enum ast_channel_state old_state;
2733 SCOPE_TRACE(1, "%s\n", ast_channel_name(chan));
2734
2735 old_state = ast_channel_state(chan);
2736 if ((res = ast_raw_answer(chan))) {
2737 return res;
2738 }
2739
2740 switch (old_state) {
2741 case AST_STATE_RINGING:
2742 case AST_STATE_RING:
2743 /* wait for media to start flowing, but don't wait any longer
2744 * than 'delay' or 500 milliseconds, whichever is longer
2745 */
2746 do {
2748 struct ast_frame *cur;
2749 struct ast_frame *new_frame;
2750 int timeout_ms = MAX(delay, 500);
2751 unsigned int done = 0;
2752 struct timeval start;
2753
2755
2756 start = ast_tvnow();
2757 for (;;) {
2758 int ms = ast_remaining_ms(start, timeout_ms);
2759 ms = ast_waitfor(chan, ms);
2760 if (ms < 0) {
2761 ast_log(LOG_WARNING, "Error condition occurred when polling channel %s for a voice frame: %s\n", ast_channel_name(chan), strerror(errno));
2762 res = -1;
2763 break;
2764 }
2765 if (ms == 0) {
2766 ast_debug(2, "Didn't receive a media frame from %s within %u ms of answering. Continuing anyway\n", ast_channel_name(chan), MAX(delay, 500));
2767 break;
2768 }
2769 cur = ast_read(chan);
2770 if (!cur || ((cur->frametype == AST_FRAME_CONTROL) &&
2771 (cur->subclass.integer == AST_CONTROL_HANGUP))) {
2772 if (cur) {
2773 ast_frfree(cur);
2774 }
2775 res = -1;
2776 ast_debug(2, "Hangup of channel %s detected in answer routine\n", ast_channel_name(chan));
2777 break;
2778 }
2779
2780 if ((new_frame = ast_frisolate(cur)) != cur) {
2781 ast_frfree(cur);
2782 }
2783
2785
2786 /* if a specific delay period was requested, continue
2787 * until that delay has passed. don't stop just because
2788 * incoming media has arrived.
2789 */
2790 if (delay) {
2791 continue;
2792 }
2793
2794 switch (new_frame->frametype) {
2795 /* all of these frametypes qualify as 'media' */
2796 case AST_FRAME_VOICE:
2797 case AST_FRAME_VIDEO:
2798 case AST_FRAME_TEXT:
2801 case AST_FRAME_DTMF_END:
2802 case AST_FRAME_IMAGE:
2803 case AST_FRAME_HTML:
2804 case AST_FRAME_MODEM:
2805 case AST_FRAME_RTCP:
2806 done = 1;
2807 break;
2808 case AST_FRAME_CONTROL:
2809 case AST_FRAME_IAX:
2812 case AST_FRAME_NULL:
2813 case AST_FRAME_CNG:
2814 break;
2815 }
2816
2817 if (done) {
2818 break;
2819 }
2820 }
2821
2822 ast_channel_lock(chan);
2823 while ((cur = AST_LIST_REMOVE_HEAD(&frames, frame_list))) {
2824 if (res == 0) {
2825 ast_queue_frame_head(chan, cur);
2826 }
2827 ast_frfree(cur);
2828 }
2829 ast_channel_unlock(chan);
2830 } while (0);
2831 break;
2832 default:
2833 break;
2834 }
2835
2836 return res;
2837}
2838
2839int ast_answer(struct ast_channel *chan)
2840{
2841 SCOPE_TRACE(1, "%s\n", ast_channel_name(chan));
2842 return __ast_answer(chan, 0);
2843}
2844
2845inline int ast_auto_answer(struct ast_channel *chan)
2846{
2847 if (ast_channel_state(chan) == AST_STATE_UP) {
2848 /* Already answered */
2849 return 0;
2850 }
2851 return ast_answer(chan);
2852}
2853
2855{
2856 ast_assert(NULL != chan);
2857
2859 return 0;
2860 }
2862}
2863
2865{
2866 return (ast_channel_get_duration_ms(chan) / 1000);
2867}
2868
2870{
2871 ast_assert(NULL != chan);
2872
2874 return 0;
2875 }
2877}
2878
2880{
2881 return (ast_channel_get_up_time_ms(chan) / 1000);
2882}
2883
2884/*!
2885 * \brief Determine whether or not we have to trigger dtmf emulating using 50 fps timer events
2886 * especially when no voice frames are received during dtmf processing (direct media or muted
2887 * sender case using SIP INFO)
2888 */
2889static inline int should_trigger_dtmf_emulating(struct ast_channel *chan)
2890{
2892 /* We're in the middle of emulating a digit, or DTMF has been
2893 * explicitly deferred. Trigger dtmf with periodic 50 pfs timer events, then. */
2894 return 1;
2895 }
2896
2897 if (!ast_tvzero(*ast_channel_dtmf_tv(chan)) &&
2899 /*
2900 * We're not in the middle of a digit, but it hasn't been long enough
2901 * since the last digit, so we'll have to trigger DTMF further on.
2902 * Using 2 times AST_MIN_DTMF_GAP to trigger readq reading for possible
2903 * buffered next dtmf event
2904 */
2905 return 1;
2906 }
2907
2908 return 0;
2909}
2910
2912{
2913 if (ast_channel_generatordata(chan)) {
2914 struct ast_generator *generator = ast_channel_generator(chan);
2915
2916 if (generator && generator->release) {
2917 generator->release(chan, ast_channel_generatordata(chan));
2918 }
2922 ast_settimeout(chan, 0, NULL, NULL);
2923 }
2924}
2925
2927{
2928 ast_channel_lock(chan);
2931 /* if in the middle of dtmf emulation keep 50 tick per sec timer on rolling */
2932 struct ast_timer *timer = ast_channel_timer(chan);
2933 if (timer) {
2935 } else {
2936 ast_log(LOG_WARNING, "No timing module loaded, DTMF length may be inaccurate\n");
2937 }
2938 }
2939 ast_channel_unlock(chan);
2940}
2941
2943{
2944 struct ast_generator *generator;
2945
2946 ast_channel_lock(chan);
2947 generator = ast_channel_generator(chan);
2948 if (generator && generator->write_format_change) {
2949 generator->write_format_change(chan, ast_channel_generatordata(chan));
2950 }
2951 ast_channel_unlock(chan);
2952}
2953
2954static int generator_force(const void *data)
2955{
2956 /* Called if generator doesn't have data */
2957 void *tmp;
2958 int res;
2959 int (*generate)(struct ast_channel *chan, void *tmp, int datalen, int samples) = NULL;
2960 struct ast_channel *chan = (struct ast_channel *)data;
2961
2962 ast_channel_lock(chan);
2963 tmp = ast_channel_generatordata(chan);
2965 if (ast_channel_generator(chan))
2966 generate = ast_channel_generator(chan)->generate;
2967 ast_channel_unlock(chan);
2968
2969 if (!tmp || !generate) {
2970 return 0;
2971 }
2972
2973 res = generate(chan, tmp, 0, ast_format_get_sample_rate(ast_channel_writeformat(chan)) / 50);
2974
2975 ast_channel_lock(chan);
2976 if (ast_channel_generator(chan) && generate == ast_channel_generator(chan)->generate) {
2978 }
2979 ast_channel_unlock(chan);
2980
2981 if (res) {
2982 ast_debug(1, "Auto-deactivating generator\n");
2984 }
2985
2986 return 0;
2987}
2988
2989int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen, void *params)
2990{
2991 int res = 0;
2992 void *generatordata = NULL;
2993
2994 ast_channel_lock(chan);
2995 if (ast_channel_generatordata(chan)) {
2996 struct ast_generator *generator_old = ast_channel_generator(chan);
2997
2998 if (generator_old && generator_old->release) {
2999 generator_old->release(chan, ast_channel_generatordata(chan));
3000 }
3001 }
3002 if (gen->alloc && !(generatordata = gen->alloc(chan, params))) {
3003 res = -1;
3004 }
3005 ast_channel_generatordata_set(chan, generatordata);
3006 if (!res) {
3007 ast_settimeout(chan, 50, generator_force, chan);
3009 }
3010 ast_channel_unlock(chan);
3011
3012 ast_prod(chan);
3013
3014 return res;
3015}
3016
3017/*! \brief Wait for x amount of time on a file descriptor to have input. */
3018int ast_waitfor_n_fd(int *fds, int n, int *ms, int *exception)
3019{
3020 int winner = -1;
3021 ast_waitfor_nandfds(NULL, 0, fds, n, exception, &winner, ms);
3022 return winner;
3023}
3024
3025/*! \brief Wait for x amount of time on a file descriptor to have input. */
3026struct ast_channel *ast_waitfor_nandfds(struct ast_channel **c, int n, int *fds, int nfds,
3027 int *exception, int *outfd, int *ms)
3028{
3029 struct timeval start = { 0 , 0 };
3030 struct pollfd *pfds = NULL;
3031 int res;
3032 long rms;
3033 int x, y, max;
3034 int sz = nfds;
3035 struct timeval now = { 0, 0 };
3036 struct timeval whentohangup = { 0, 0 }, diff;
3037 struct ast_channel *winner = NULL;
3038 struct fdmap {
3039 int chan;
3040 int fdno;
3041 } *fdmap = NULL;
3042
3043 if (outfd) {
3044 *outfd = -99999;
3045 }
3046 if (exception) {
3047 *exception = 0;
3048 }
3049
3050 for (x = 0; x < n; x++) {
3051 ast_channel_lock(c[x]);
3053 if (ast_tvzero(whentohangup))
3054 now = ast_tvnow();
3055 diff = ast_tvsub(*ast_channel_whentohangup(c[x]), now);
3056 if (diff.tv_sec < 0 || ast_tvzero(diff)) {
3057 ast_test_suite_event_notify("HANGUP_TIME", "Channel: %s", ast_channel_name(c[x]));
3058 /* Should already be hungup */
3061 return c[x];
3062 }
3063 if (ast_tvzero(whentohangup) || ast_tvcmp(diff, whentohangup) < 0)
3064 whentohangup = diff;
3065 }
3066 sz += ast_channel_fd_count(c[x]);
3068 }
3069
3070 if (!sz) {
3071 return NULL;
3072 }
3073
3074 pfds = ast_alloca(sizeof(*pfds) * sz);
3075 fdmap = ast_alloca(sizeof(*fdmap) * sz);
3076
3077 /* Wait full interval */
3078 rms = *ms;
3079 /* INT_MAX, not LONG_MAX, because it matters on 64-bit */
3080 if (!ast_tvzero(whentohangup) && whentohangup.tv_sec < INT_MAX / 1000) {
3081 rms = whentohangup.tv_sec * 1000 + whentohangup.tv_usec / 1000; /* timeout in milliseconds */
3082 if (*ms >= 0 && *ms < rms) { /* original *ms still smaller */
3083 rms = *ms;
3084 }
3085 } else if (!ast_tvzero(whentohangup) && rms < 0) {
3086 /* Tiny corner case... call would need to last >24 days */
3087 rms = INT_MAX;
3088 }
3089 /*
3090 * Build the pollfd array, putting the channels' fds first,
3091 * followed by individual fds. Order is important because
3092 * individual fd's must have priority over channel fds.
3093 */
3094 max = 0;
3095 for (x = 0; x < n; x++) {
3096 ast_channel_lock(c[x]);
3097 for (y = 0; y < ast_channel_fd_count(c[x]); y++) {
3098 fdmap[max].fdno = y; /* fd y is linked to this pfds */
3099 fdmap[max].chan = x; /* channel x is linked to this pfds */
3100 max += ast_add_fd(&pfds[max], ast_channel_fd(c[x], y));
3101 }
3102 CHECK_BLOCKING(c[x]);
3104 }
3105 /* Add the individual fds */
3106 for (x = 0; x < nfds; x++) {
3107 fdmap[max].chan = -1;
3108 max += ast_add_fd(&pfds[max], fds[x]);
3109 }
3110
3111 if (*ms > 0) {
3112 start = ast_tvnow();
3113 }
3114
3115 if (sizeof(int) == 4) { /* XXX fix timeout > 600000 on linux x86-32 */
3116 do {
3117 int kbrms = rms;
3118 if (kbrms > 600000) {
3119 kbrms = 600000;
3120 }
3121 res = ast_poll(pfds, max, kbrms);
3122 if (!res) {
3123 rms -= kbrms;
3124 }
3125 } while (!res && (rms > 0));
3126 } else {
3127 res = ast_poll(pfds, max, rms);
3128 }
3129 for (x = 0; x < n; x++) {
3130 ast_channel_lock(c[x]);
3133 }
3134 if (res < 0) { /* Simulate a timeout if we were interrupted */
3135 if (errno != EINTR) {
3136 *ms = -1;
3137 }
3138 return NULL;
3139 }
3140 if (!ast_tvzero(whentohangup)) { /* if we have a timeout, check who expired */
3141 now = ast_tvnow();
3142 for (x = 0; x < n; x++) {
3144 ast_test_suite_event_notify("HANGUP_TIME", "Channel: %s", ast_channel_name(c[x]));
3146 if (winner == NULL) {
3147 winner = c[x];
3148 }
3149 }
3150 }
3151 }
3152 if (res == 0) { /* no fd ready, reset timeout and done */
3153 *ms = 0; /* XXX use 0 since we may not have an exact timeout. */
3154 return winner;
3155 }
3156 /*
3157 * Then check if any channel or fd has a pending event.
3158 * Remember to check channels first and fds last, as they
3159 * must have priority on setting 'winner'
3160 */
3161 for (x = 0; x < max; x++) {
3162 res = pfds[x].revents;
3163 if (res == 0) {
3164 continue;
3165 }
3166 if (fdmap[x].chan >= 0) { /* this is a channel */
3167 winner = c[fdmap[x].chan]; /* override previous winners */
3168 ast_channel_lock(winner);
3169 if (res & POLLPRI) {
3171 } else {
3173 }
3174 ast_channel_fdno_set(winner, fdmap[x].fdno);
3175 ast_channel_unlock(winner);
3176 } else { /* this is an fd */
3177 if (outfd) {
3178 *outfd = pfds[x].fd;
3179 }
3180 if (exception) {
3181 *exception = (res & POLLPRI) ? -1 : 0;
3182 }
3183 winner = NULL;
3184 }
3185 }
3186 if (*ms > 0) {
3187 *ms -= ast_tvdiff_ms(ast_tvnow(), start);
3188 if (*ms < 0) {
3189 *ms = 0;
3190 }
3191 }
3192 return winner;
3193}
3194
3195struct ast_channel *ast_waitfor_n(struct ast_channel **c, int n, int *ms)
3196{
3197 return ast_waitfor_nandfds(c, n, NULL, 0, NULL, NULL, ms);
3198}
3199
3200int ast_waitfor(struct ast_channel *c, int ms)
3201{
3202 if (ms < 0) {
3203 do {
3204 ms = 100000;
3205 ast_waitfor_nandfds(&c, 1, NULL, 0, NULL, NULL, &ms);
3206 } while (!ms);
3207 } else {
3208 ast_waitfor_nandfds(&c, 1, NULL, 0, NULL, NULL, &ms);
3209 }
3210 return ms;
3211}
3212
3213int ast_waitfordigit(struct ast_channel *c, int ms)
3214{
3215 return ast_waitfordigit_full(c, ms, NULL, -1, -1);
3216}
3217
3218int ast_settimeout(struct ast_channel *c, unsigned int rate, int (*func)(const void *data), void *data)
3219{
3220 return ast_settimeout_full(c, rate, func, data, 0);
3221}
3222
3223int ast_settimeout_full(struct ast_channel *c, unsigned int rate, int (*func)(const void *data), void *data, unsigned int is_ao2_obj)
3224{
3225 int res;
3226 unsigned int real_rate = rate, max_rate;
3228
3230
3231 if (ast_channel_timingfd(c) == -1) {
3233 return -1;
3234 }
3235
3236 if (!func) {
3237 rate = 0;
3238 data = NULL;
3239 }
3240
3241 if (rate && rate > (max_rate = ast_timer_get_max_rate(timer))) {
3242 real_rate = max_rate;
3243 }
3244
3245 ast_debug(3, "Scheduling timer at (%u requested / %u actual) timer ticks per second\n", rate, real_rate);
3246
3247 res = ast_timer_set_rate(timer, real_rate);
3248
3251 }
3252
3255
3256 if (data && is_ao2_obj) {
3257 ao2_ref(data, 1);
3259 } else {
3261 }
3262
3263 if (func == NULL && rate == 0 && ast_channel_fdno(c) == AST_TIMING_FD) {
3264 /* Clearing the timing func and setting the rate to 0
3265 * means that we don't want to be reading from the timingfd
3266 * any more. Setting c->fdno to -1 means we won't have any
3267 * errant reads from the timingfd, meaning we won't potentially
3268 * miss any important frames.
3269 */
3271 }
3272
3274
3275 return res;
3276}
3277
3278int ast_waitfordigit_full(struct ast_channel *c, int timeout_ms, const char *breakon, int audiofd, int cmdfd)
3279{
3280 struct timeval start = ast_tvnow();
3281 int ms;
3282
3283 /* Stop if we're a zombie or need a soft hangup */
3285 return -1;
3286
3287 /* Only look for the end of DTMF, don't bother with the beginning and don't emulate things */
3289
3290 /* Wait for a digit, no more than timeout_ms milliseconds total.
3291 * Or, wait indefinitely if timeout_ms is <0.
3292 */
3293 while ((ms = ast_remaining_ms(start, timeout_ms))) {
3294 struct ast_channel *rchan;
3295 int outfd = -1;
3296
3297 errno = 0;
3298 /* While ast_waitfor_nandfds tries to help by reducing the timeout by how much was waited,
3299 * it is unhelpful if it waited less than a millisecond.
3300 */
3301 rchan = ast_waitfor_nandfds(&c, 1, &cmdfd, (cmdfd > -1) ? 1 : 0, NULL, &outfd, &ms);
3302
3303 if (!rchan && outfd < 0 && ms) {
3304 if (errno == 0 || errno == EINTR)
3305 continue;
3306 ast_log(LOG_WARNING, "Wait failed (%s)\n", strerror(errno));
3308 return -1;
3309 } else if (outfd > -1) {
3310 /* The FD we were watching has something waiting */
3311 ast_log(LOG_WARNING, "The FD we were waiting for has something waiting. Waitfordigit returning numeric 1\n");
3313 return 1;
3314 } else if (rchan) {
3315 int res;
3316 struct ast_frame *f = ast_read(c);
3317
3318 if (!f) {
3320
3321 return -1;
3322 }
3323
3324 switch (f->frametype) {
3326 break;
3327 case AST_FRAME_DTMF_END:
3328 res = f->subclass.integer;
3329 if (!breakon || strchr(breakon, res)) {
3330 ast_frfree(f);
3332 return res;
3333 }
3334 break;
3335 case AST_FRAME_CONTROL:
3336 switch (f->subclass.integer) {
3337 case AST_CONTROL_HANGUP:
3338 ast_frfree(f);
3340 return -1;
3346 /* Fall-through and treat as if it were a DTMF signal. Items
3347 * that perform stream control will handle this. */
3348 res = f->subclass.integer;
3349 ast_frfree(f);
3351 return res;
3355 case AST_CONTROL_ANSWER:
3361 case AST_CONTROL_HOLD:
3362 case AST_CONTROL_UNHOLD:
3363 case AST_CONTROL_FLASH:
3364 case -1:
3365 /* Unimportant */
3366 break;
3367 default:
3368 ast_log(LOG_WARNING, "Unexpected control subclass '%d'\n", f->subclass.integer);
3369 break;
3370 }
3371 break;
3372 case AST_FRAME_VOICE:
3373 /* Write audio if appropriate */
3374 if (audiofd > -1) {
3375 if (write(audiofd, f->data.ptr, f->datalen) < 0) {
3376 ast_log(LOG_WARNING, "write() failed: %s\n", strerror(errno));
3377 }
3378 }
3379 default:
3380 /* Ignore */
3381 break;
3382 }
3383 ast_frfree(f);
3384 }
3385 }
3386
3388
3389 return 0; /* Time is up */
3390}
3391
3396
3398{
3399 switch (direction) {
3400 case DTMF_RECEIVED:
3401 return "Received";
3402 case DTMF_SENT:
3403 return "Sent";
3404 }
3405
3406 return "?";
3407}
3408
3409static void send_dtmf_begin_event(struct ast_channel *chan,
3410 enum DtmfDirection direction, const char digit)
3411{
3412 RAII_VAR(struct ast_json *, channel_blob, NULL, ast_json_unref);
3413 char digit_str[] = { digit, '\0' };
3414
3415 channel_blob = ast_json_pack("{ s: s, s: s }",
3416 "digit", digit_str,
3417 "direction", dtmf_direction_to_string(direction));
3418
3419 if (channel_blob) {
3421 }
3422}
3423
3424static void send_dtmf_end_event(struct ast_channel *chan,
3425 enum DtmfDirection direction, const char digit, long duration_ms)
3426{
3427 RAII_VAR(struct ast_json *, channel_blob, NULL, ast_json_unref);
3428 RAII_VAR(struct ast_json *, cel_blob, NULL, ast_json_unref);
3429 char digit_str[] = { digit, '\0' };
3430
3431 channel_blob = ast_json_pack("{ s: s, s: s, s: I }",
3432 "digit", digit_str,
3433 "direction", dtmf_direction_to_string(direction),
3434 "duration_ms", (ast_json_int_t)duration_ms);
3435
3436 if (channel_blob) {
3438 }
3439
3440 cel_blob = ast_json_pack("{ s: s, s: { s: s, s: I }}",
3442 "extra",
3443 "digit", digit_str,
3444 "duration_ms", (ast_json_int_t)duration_ms);
3445
3446 if (cel_blob) {
3447 ast_cel_publish_event(chan, AST_CEL_DTMF, cel_blob);
3448 } else {
3449 ast_log(LOG_WARNING, "Unable to build extradata for DTMF CEL event on channel %s", ast_channel_name(chan));
3450 }
3451}
3452
3453static void send_flash_event(struct ast_channel *chan)
3454{
3456}
3457
3458static void send_wink_event(struct ast_channel *chan)
3459{
3461}
3462
3463static void ast_read_generator_actions(struct ast_channel *chan, struct ast_frame *f)
3464{
3465 struct ast_generator *generator;
3466 void *gendata;
3467 int res;
3468 int samples;
3469
3470 generator = ast_channel_generator(chan);
3471 if (!generator
3472 || !generator->generate
3473 || f->frametype != AST_FRAME_VOICE
3475 || ast_channel_timingfunc(chan)) {
3476 return;
3477 }
3478
3479 /*
3480 * We must generate frames in phase locked mode since
3481 * we have no internal timer available.
3482 */
3484 float factor;
3486 samples = (int) (((float) f->samples) * factor);
3487 } else {
3488 samples = f->samples;
3489 }
3490
3491 gendata = ast_channel_generatordata(chan);
3492 ast_channel_generatordata_set(chan, NULL); /* reset, to let writes go through */
3493
3494 /*
3495 * This unlock is here based on two assumptions that hold true at
3496 * this point in the code. 1) this function is only called from
3497 * within __ast_read() and 2) all generators call ast_write() in
3498 * their generate callback.
3499 *
3500 * The reason this is added is so that when ast_write is called,
3501 * the lock that occurs there will not recursively lock the
3502 * channel. Doing this will allow deadlock avoidance to work in
3503 * deeper functions.
3504 */
3505 ast_channel_unlock(chan);
3506 res = generator->generate(chan, gendata, f->datalen, samples);
3507 ast_channel_lock(chan);
3508 if (generator == ast_channel_generator(chan)) {
3509 ast_channel_generatordata_set(chan, gendata);
3510 if (res) {
3511 ast_debug(1, "Auto-deactivating generator\n");
3513 }
3514 }
3515}
3516
3517static inline void queue_dtmf_readq(struct ast_channel *chan, struct ast_frame *f)
3518{
3519 struct ast_frame *fr = ast_channel_dtmff(chan);
3520
3523 fr->len = f->len;
3524
3525 /* The only time this function will be called is for a frame that just came
3526 * out of the channel driver. So, we want to stick it on the tail of the
3527 * readq. */
3528
3529 ast_queue_frame(chan, fr);
3530}
3531
3532/*!
3533 * \brief Determine whether or not we should ignore DTMF in the readq
3534 */
3535static inline int should_skip_dtmf(struct ast_channel *chan)
3536{
3538 /* We're in the middle of emulating a digit, or DTMF has been
3539 * explicitly deferred. Skip this digit, then. */
3540 return 1;
3541 }
3542
3543 if (!ast_tvzero(*ast_channel_dtmf_tv(chan)) &&
3545 /* We're not in the middle of a digit, but it hasn't been long enough
3546 * since the last digit, so we'll have to skip DTMF for now. */
3547 return 1;
3548 }
3549
3550 return 0;
3551}
3552
3553/*!
3554 * \brief calculates the number of samples to jump forward with in a monitor stream.
3555
3556 * \note When using ast_seekstream() with the read and write streams of a monitor,
3557 * the number of samples to seek forward must be of the same sample rate as the stream
3558 * or else the jump will not be calculated correctly.
3559 *
3560 * \retval number of samples to seek forward after rate conversion.
3561 */
3562static inline int calc_monitor_jump(int samples, int sample_rate, int seek_rate)
3563{
3564 int diff = sample_rate - seek_rate;
3565
3566 if (diff > 0) {
3567 samples = samples / (float) (sample_rate / seek_rate);
3568 } else if (diff < 0) {
3569 samples = samples * (float) (seek_rate / sample_rate);
3570 }
3571
3572 return samples;
3573}
3574
3575static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio, int dropnondefault)
3576{
3577 struct ast_frame *f = NULL; /* the return value */
3578 int prestate;
3579 int cause = 0;
3580 struct ast_stream *stream = NULL, *default_stream = NULL;
3581
3582 /* this function is very long so make sure there is only one return
3583 * point at the end (there are only two exceptions to this).
3584 */
3585 ast_channel_lock(chan);
3586
3587 /* Stop if we're a zombie or need a soft hangup */
3589 if (ast_channel_generator(chan))
3591
3592 /*
3593 * It is possible for chan->_softhangup to be set and there
3594 * still be control frames that need to be read. Instead of
3595 * just going to 'done' in the case of ast_check_hangup(), we
3596 * need to queue the end-of-Q frame so that it can mark the end
3597 * of the read queue. If there are frames to be read,
3598 * ast_queue_control() will be called repeatedly, but will only
3599 * queue the first end-of-Q frame.
3600 */
3603 } else {
3604 goto done;
3605 }
3606 } else {
3607#ifdef AST_DEVMODE
3608 /*
3609 * The ast_waitfor() code records which of the channel's file
3610 * descriptors reported that data is available. In theory,
3611 * ast_read() should only be called after ast_waitfor() reports
3612 * that a channel has data available for reading but certain
3613 * situations with stasis and ARI could give a false indication.
3614 * For this reason, we don't stop any processing.
3615 */
3616 if (ast_channel_fdno(chan) == -1) {
3617 ast_debug(3,
3618 "ast_read() on chan '%s' called with no recorded file descriptor.\n",
3619 ast_channel_name(chan));
3620 }
3621#endif
3622 }
3623
3624 prestate = ast_channel_state(chan);
3625
3626 if (ast_channel_timingfd(chan) > -1 && ast_channel_fdno(chan) == AST_TIMING_FD) {
3627 enum ast_timer_event res;
3628 int trigger_dtmf_emulating = should_trigger_dtmf_emulating(chan);
3629
3631
3633
3634 switch (res) {
3636 if (ast_timer_ack(ast_channel_timer(chan), 1) < 0) {
3637 ast_log(LOG_ERROR, "Failed to acknowledge timer in ast_read\n");
3638 goto done;
3639 }
3640
3641 if (ast_channel_timingfunc(chan)) {
3642 /* save a copy of func/data before unlocking the channel */
3644 void *data = ast_channel_timingdata(chan);
3645 int got_ref = 0;
3647 ao2_ref(data, 1);
3648 got_ref = 1;
3649 }
3650 ast_channel_fdno_set(chan, -1);
3651 ast_channel_unlock(chan);
3652 func(data);
3653 if (got_ref) {
3654 ao2_ref(data, -1);
3655 }
3656
3657 if (trigger_dtmf_emulating) {
3658 /*
3659 * Since we're breaking out of this switch block and not
3660 * returning, we need to re-lock the channel.
3661 */
3662 ast_channel_lock(chan);
3663 /* generate null frame to trigger dtmf emulating */
3664 f = &ast_null_frame;
3665 break;
3666 }
3667 } else if (trigger_dtmf_emulating) {
3668 /* generate null frame to trigger dtmf emulating */
3669 f = &ast_null_frame;
3670 break;
3671 } else {
3673 /* generate very last null frame to trigger dtmf emulating */
3674 f = &ast_null_frame;
3675 break;
3676 }
3677
3678 /* cannot 'goto done' because the channel is already unlocked */
3679 return &ast_null_frame;
3680
3682 if (AST_LIST_EMPTY(ast_channel_readq(chan)) ||
3685 }
3686 break;
3687 }
3688
3691 }
3692
3693 /* Read and ignore anything on the alertpipe, but read only
3694 one sizeof(blah) per frame that we send from it */
3696 f = &ast_null_frame;
3697 goto done;
3698 }
3699
3700 /* Check for pending read queue */
3701 if (!AST_LIST_EMPTY(ast_channel_readq(chan))) {
3702 int skipped_dtmf_frame = 0;
3703 int skip_dtmf = should_skip_dtmf(chan);
3704
3706 /* We have to be picky about which frame we pull off of the readq because
3707 * there are cases where we want to leave DTMF frames on the queue until
3708 * some later time. */
3709
3710 if ( (f->frametype == AST_FRAME_DTMF_BEGIN || f->frametype == AST_FRAME_DTMF_END) && skip_dtmf) {
3711 skipped_dtmf_frame = 1;
3712 continue;
3713 }
3714
3716 break;
3717 }
3719
3720 if (!f) {
3721 /* There were no acceptable frames on the readq. */
3722 f = &ast_null_frame;
3723 if (!skipped_dtmf_frame) {
3724 /*
3725 * Do not trigger alert pipe if only buffered dtmf begin or end frames
3726 * are left in the readq.
3727 */
3729 } else {
3730 /*
3731 * Safely disable continuous timer events if only buffered dtmf begin or end
3732 * frames are left in the readq.
3733 */
3735 }
3736 }
3737
3738 /* Interpret hangup and end-of-Q frames to return NULL */
3739 /* XXX why not the same for frames from the channel ? */
3740 if (f->frametype == AST_FRAME_CONTROL) {
3741 switch (f->subclass.integer) {
3742 case AST_CONTROL_HANGUP:
3744 cause = f->data.uint32;
3745 /* Fall through */
3747 ast_frfree(f);
3748 f = NULL;
3749 break;
3750 default:
3751 break;
3752 }
3753 } else if (f->frametype == AST_FRAME_VOICE || f->frametype == AST_FRAME_VIDEO) {
3754 if (ast_channel_tech(chan) && ast_channel_tech(chan)->read_stream) {
3757 } else {
3758 /* Since this channel driver does not support multistream determine the default stream this frame
3759 * originated from and update the frame to include it.
3760 */
3761 stream = default_stream = ast_channel_get_default_stream(chan, ast_format_get_type(f->subclass.format));
3762 /* In order to allow media to be passed up the underlying media type has to have a format negotiated on
3763 * the channel itself. In cases where this hasn't happened the channel driver is incorrectly passing up
3764 * a frame for a format that has not been negotiated. If this occurs just drop the frame as we have no
3765 * stream that it came from.
3766 */
3767 if (!stream) {
3768 ast_frfree(f);
3769 f = &ast_null_frame;
3770 } else {
3772 }
3773 }
3774 }
3775 } else {
3777 if (ast_channel_tech(chan)->exception)
3778 f = ast_channel_tech(chan)->exception(chan);
3779 else {
3780 ast_log(LOG_WARNING, "Exception flag set on '%s', but no exception handler\n", ast_channel_name(chan));
3781 f = &ast_null_frame;
3782 }
3783 /* Clear the exception flag */
3785 } else if (ast_channel_tech(chan) && ast_channel_tech(chan)->read_stream) {
3786 f = ast_channel_tech(chan)->read_stream(chan);
3787
3788 /* This channel driver supports multistream so the stream_num on the frame is valid, the only
3789 * thing different is that we need to find the default stream so we know whether to invoke the
3790 * default stream logic or not (such as transcoding).
3791 */
3792 if (f && (f->frametype == AST_FRAME_VOICE || f->frametype == AST_FRAME_VIDEO)) {
3795 }
3796 } else if (ast_channel_tech(chan) && ast_channel_tech(chan)->read) {
3797 f = ast_channel_tech(chan)->read(chan);
3798
3799 /* Since this channel driver does not support multistream determine the default stream this frame
3800 * originated from and update the frame to include it.
3801 */
3802 if (f && (f->frametype == AST_FRAME_VOICE || f->frametype == AST_FRAME_VIDEO)) {
3803 stream = default_stream = ast_channel_get_default_stream(chan, ast_format_get_type(f->subclass.format));
3804 if (!stream) {
3805 ast_frfree(f);
3806 f = &ast_null_frame;
3807 } else {
3809 }
3810 }
3811 }
3812 else
3813 ast_log(LOG_WARNING, "No read routine on channel %s\n", ast_channel_name(chan));
3814 }
3815
3816 if (stream == default_stream) {
3817 /* Perform the framehook read event here. After the frame enters the framehook list
3818 * there is no telling what will happen, <insert mad scientist laugh here>!!! */
3820 }
3821
3822 /*
3823 * Reset the recorded file descriptor that triggered this read so that we can
3824 * easily detect when ast_read() is called without properly using ast_waitfor().
3825 */
3826 ast_channel_fdno_set(chan, -1);
3827
3828 if (f) {
3829 struct ast_frame *readq_tail = AST_LIST_LAST(ast_channel_readq(chan));
3830 struct ast_control_read_action_payload *read_action_payload;
3832 int hooked = 0;
3833
3834 /* if the channel driver returned more than one frame, stuff the excess
3835 into the readq for the next ast_read call
3836 */
3837 if (AST_LIST_NEXT(f, frame_list)) {
3841 }
3842
3843 if (dropnondefault && stream != default_stream) {
3844 /* If the frame originates from a non-default stream and the caller can not handle other streams
3845 * absorb the frame and replace it with a null one instead.
3846 */
3847 ast_frfree(f);
3848 f = &ast_null_frame;
3849 }
3850
3851 switch (f->frametype) {
3852 case AST_FRAME_CONTROL:
3854 if (prestate == AST_STATE_UP && ast_channel_is_bridged(chan)) {
3855 ast_debug(1, "Dropping duplicate answer!\n");
3856 ast_frfree(f);
3857 f = &ast_null_frame;
3858 } else {
3859 /*
3860 * Mark when outgoing channel answered so we can know how
3861 * long the channel has been up.
3862 */
3864
3866 }
3867 } else if (f->subclass.integer == AST_CONTROL_READ_ACTION) {
3868 read_action_payload = f->data.ptr;
3869 switch (read_action_payload->action) {
3873 if (ast_connected_line_parse_data(read_action_payload->payload,
3874 read_action_payload->payload_size, &connected)) {
3876 break;
3877 }
3878 ast_channel_unlock(chan);
3881 read_action_payload->payload,
3882 read_action_payload->payload_size);
3883 }
3885 ast_channel_lock(chan);
3886 break;
3888 ast_channel_unlock(chan);
3889 ast_sendtext(chan, (const char *)read_action_payload->payload);
3890 ast_channel_lock(chan);
3891 break;
3893 ast_channel_unlock(chan);
3894 ast_sendtext_data(chan, (struct ast_msg_data *)read_action_payload->payload);
3895 ast_channel_lock(chan);
3896 break;
3897 }
3898 ast_frfree(f);
3899 f = &ast_null_frame;
3900 } else if (f->subclass.integer == AST_CONTROL_STREAM_TOPOLOGY_REQUEST_CHANGE && dropnondefault) {
3901 /* The caller of this function is incapable of handling streams so we don't accept the change request
3902 * and stick to the streams currently on the channel.
3903 */
3905 ast_frfree(f);
3906 f = &ast_null_frame;
3907 } else if (f->subclass.integer == AST_CONTROL_STREAM_TOPOLOGY_CHANGED && dropnondefault) {
3908 /* The caller of this function is incapable of handling streams so we absorb the notification that the
3909 * stream topology has changed.
3910 */
3911 ast_frfree(f);
3912 f = &ast_null_frame;
3913 } else if (f->subclass.integer == AST_CONTROL_FLASH) {
3914 send_flash_event(chan);
3915 } else if (f->subclass.integer == AST_CONTROL_WINK) {
3916 send_wink_event(chan);
3917 }
3918 break;
3919 case AST_FRAME_DTMF_END:
3921 ast_log(LOG_DTMF, "DTMF end '%c' received on %s, duration %ld ms\n", f->subclass.integer, ast_channel_name(chan), f->len);
3922 /* Queue it up if DTMF is deferred, or if DTMF emulation is forced. */
3924 queue_dtmf_readq(chan, f);
3925 ast_frfree(f);
3926 f = &ast_null_frame;
3928 if (!ast_tvzero(*ast_channel_dtmf_tv(chan)) &&
3930 /* If it hasn't been long enough, defer this digit */
3931 queue_dtmf_readq(chan, f);
3932 ast_frfree(f);
3933 f = &ast_null_frame;
3934 } else {
3935 /* There was no begin, turn this into a begin and send the end later */
3936 struct timeval tv = ast_tvnow();
3940 ast_channel_dtmf_tv_set(chan, &tv);
3941 if (f->len) {
3942 if (f->len > option_dtmfminduration)
3944 else
3946 } else
3948 ast_log(LOG_DTMF, "DTMF begin emulation of '%c' with duration %u queued on %s\n", f->subclass.integer, ast_channel_emulate_dtmf_duration(chan), ast_channel_name(chan));
3949
3950 /*
3951 * Start generating 50 fps timer events (null frames) for dtmf emulating
3952 * independently from any existing incoming voice frames.
3953 * If channel generator is already activated in regular mode use these
3954 * timer events to generate null frames.
3955 */
3956 if (!ast_channel_generator(chan)) {
3957 struct ast_timer *timer = ast_channel_timer(chan);
3958 if (timer) {
3960 } else {
3961 ast_log(LOG_WARNING, "No timing module loaded, DTMF length may be inaccurate\n");
3962 }
3963 }
3964 }
3965 if (ast_channel_audiohooks(chan)) {
3966 struct ast_frame *old_frame = f;
3967 /*!
3968 * \todo XXX It is possible to write a digit to the audiohook twice
3969 * if the digit was originally read while the channel was in autoservice. */
3971 if (old_frame != f)
3972 ast_frfree(old_frame);
3973 }
3974 } else {
3975 struct timeval now = ast_tvnow();
3977 ast_log(LOG_DTMF, "DTMF end accepted with begin '%c' on %s\n", f->subclass.integer, ast_channel_name(chan));
3979 if (!f->len)
3980 f->len = ast_tvdiff_ms(now, *ast_channel_dtmf_tv(chan));
3981
3982 /* detect tones that were received on
3983 * the wire with durations shorter than
3984 * option_dtmfminduration and set f->len
3985 * to the actual duration of the DTMF
3986 * frames on the wire. This will cause
3987 * dtmf emulation to be triggered later
3988 * on.
3989 */
3991 f->len = ast_tvdiff_ms(now, *ast_channel_dtmf_tv(chan));
3992 ast_log(LOG_DTMF, "DTMF end '%c' detected to have actual duration %ld on the wire, emulation will be triggered on %s\n", f->subclass.integer, f->len, ast_channel_name(chan));
3993 }
3994 } else if (!f->len) {
3995 ast_log(LOG_DTMF, "DTMF end accepted without begin '%c' on %s\n", f->subclass.integer, ast_channel_name(chan));
3997 }
3999 ast_log(LOG_DTMF, "DTMF end '%c' has duration %ld but want minimum %u, emulating on %s\n", f->subclass.integer, f->len, option_dtmfminduration, ast_channel_name(chan));
4003 ast_frfree(f);
4004 f = &ast_null_frame;
4005
4006 /* Start generating 50 fps timer events (null frames) for dtmf emulating
4007 * independently from any existing incoming voice frames.
4008 * If channel generator is already activated in regular mode use these
4009 * timer events to generate null frames.
4010 */
4011 if (!ast_channel_generator(chan)) {
4012 struct ast_timer *timer = ast_channel_timer(chan);
4013 if (timer) {
4015 } else {
4016 ast_log(LOG_WARNING, "No timing module loaded, DTMF length may be inaccurate\n");
4017 }
4018 }
4019 } else {
4020 ast_log(LOG_DTMF, "DTMF end passthrough '%c' on %s\n", f->subclass.integer, ast_channel_name(chan));
4021 if (f->len < option_dtmfminduration) {
4023 }
4024 ast_channel_dtmf_tv_set(chan, &now);
4025
4026 /* Start generating 50 fps timer events (null frames) for dtmf emulating
4027 * independently from any existing incoming voice frames.
4028 * If channel generator is already activated in regular mode use these
4029 * timer events to generate null frames.
4030 */
4031 if (!ast_channel_generator(chan)) {
4032 struct ast_timer *timer = ast_channel_timer(chan);
4033 if (timer) {
4035 } else {
4036 ast_log(LOG_WARNING, "No timing module loaded, DTMF length may be inaccurate\n");
4037 }
4038 }
4039 }
4040 if (ast_channel_audiohooks(chan)) {
4041 struct ast_frame *old_frame = f;
4043 if (old_frame != f)
4044 ast_frfree(old_frame);
4045 }
4046 }
4047 break;
4050 ast_log(LOG_DTMF, "DTMF begin '%c' received on %s\n", f->subclass.integer, ast_channel_name(chan));
4052 (!ast_tvzero(*ast_channel_dtmf_tv(chan)) &&
4054 ast_log(LOG_DTMF, "DTMF begin ignored '%c' on %s\n", f->subclass.integer, ast_channel_name(chan));
4055 ast_frfree(f);
4056 f = &ast_null_frame;
4057 } else {
4058 struct timeval now = ast_tvnow();
4060 ast_channel_dtmf_tv_set(chan, &now);
4061 ast_log(LOG_DTMF, "DTMF begin passthrough '%c' on %s\n", f->subclass.integer, ast_channel_name(chan));
4062 }
4063 break;
4064 case AST_FRAME_NULL:
4065 /* The EMULATE_DTMF flag must be cleared here as opposed to when the duration
4066 * is reached , because we want to make sure we pass at least one
4067 * voice frame through before starting the next digit, to ensure a gap
4068 * between DTMF digits. */
4070 struct timeval now = ast_tvnow();
4074 } else if (ast_tvdiff_ms(now, *ast_channel_dtmf_tv(chan)) >= ast_channel_emulate_dtmf_duration(chan)) {
4076 ast_frfree(f);
4077 f = ast_channel_dtmff(chan);
4080 f->len = ast_tvdiff_ms(now, *ast_channel_dtmf_tv(chan));
4081 ast_channel_dtmf_tv_set(chan, &now);
4084 ast_log(LOG_DTMF, "DTMF end emulation of '%c' queued on %s\n", f->subclass.integer, ast_channel_name(chan));
4085 if (ast_channel_audiohooks(chan)) {
4086 struct ast_frame *old_frame = f;
4088 if (old_frame != f) {
4089 ast_frfree(old_frame);
4090 }
4091 }
4092
4093 /* Start generating 50 fps timer events (null frames) for dtmf emulating
4094 * independently from any existing incoming voice frames.
4095 * If channel generator is already activated in regular mode use these
4096 * timer events to generate null frames.
4097 */
4098 if (!ast_channel_generator(chan)) {
4099 struct ast_timer *timer = ast_channel_timer(chan);
4100 if (timer) {
4102 } else {
4103 ast_log(LOG_WARNING, "No timing module loaded, DTMF length may be inaccurate\n");
4104 }
4105 }
4106 }
4107 }
4108 break;
4109 case AST_FRAME_VOICE:
4110 /* If media was received from a non-default stream don't perform any actions, let it just go through */
4111 if (stream != default_stream) {
4112 break;
4113 }
4114
4115 /* The EMULATE_DTMF flag must be cleared here as opposed to when the duration
4116 * is reached , because we want to make sure we pass at least one
4117 * voice frame through before starting the next digit, to ensure a gap
4118 * between DTMF digits. */
4122 }
4123
4124 if (dropaudio || ast_test_flag(ast_channel_flags(chan), AST_FLAG_IN_DTMF)) {
4125 if (dropaudio)
4127 ast_frfree(f);
4128 f = &ast_null_frame;
4129 }
4130
4132 struct timeval now = ast_tvnow();
4135 ast_frfree(f);
4136 f = ast_channel_dtmff(chan);
4139 f->len = ast_tvdiff_ms(now, *ast_channel_dtmf_tv(chan));
4140 ast_channel_dtmf_tv_set(chan, &now);
4141 if (ast_channel_audiohooks(chan)) {
4142 struct ast_frame *old_frame = f;
4144 if (old_frame != f)
4145 ast_frfree(old_frame);
4146 }
4147 ast_log(LOG_DTMF, "DTMF end emulation of '%c' queued on %s\n", f->subclass.integer, ast_channel_name(chan));
4148 } else {
4149 /* Drop voice frames while we're still in the middle of the digit */
4150 ast_frfree(f);
4151 f = &ast_null_frame;
4152 }
4153 break;
4154 }
4155 if (f->frametype != AST_FRAME_VOICE) {
4156 break;
4157 }
4160 struct ast_format *core_format;
4161
4162 /*
4163 * Note: This frame may not be one of the current native
4164 * formats. We may have gotten it out of the read queue from
4165 * a previous multi-frame translation, from a framehook
4166 * injected frame, or the device we're talking to isn't
4167 * respecting negotiated formats. Regardless we will accept
4168 * all frames.
4169 *
4170 * Update the read translation path to handle the new format
4171 * that just came in. If the core wants slinear we need to
4172 * setup a new translation path because the core is usually
4173 * doing something with the audio itself and may not handle
4174 * any other format. e.g., Softmix bridge, holding bridge
4175 * announcer channel, recording, AMD... Otherwise, we'll
4176 * setup to pass the frame as is to the core. In this case
4177 * the core doesn't care. The channel is likely in
4178 * autoservice, safesleep, or the channel is in a bridge.
4179 * Let the bridge technology deal with format compatibility
4180 * between the channels in the bridge.
4181 *
4182 * Beware of the transcode_via_slin and genericplc options as
4183 * they force any transcoding to go through slin on a bridge.
4184 * Unfortunately transcode_via_slin is enabled by default and
4185 * genericplc is enabled in the codecs.conf.sample file.
4186 *
4187 * XXX Only updating translation to slinear frames has some
4188 * corner cases if slinear is one of the native formats and
4189 * there are different sample rates involved. We might wind
4190 * up with conflicting translation paths between channels
4191 * where the read translation path on this channel reduces
4192 * the sample rate followed by a write translation path on
4193 * the peer channel that increases the sample rate.
4194 */
4195 core_format = ast_channel_readformat(chan);
4196 if (!ast_format_cache_is_slinear(core_format)) {
4197 core_format = f->subclass.format;
4198 }
4199 if (ast_set_read_format_path(chan, f->subclass.format, core_format)) {
4200 /* Drop frame. We couldn't make it compatible with the core. */
4201 ast_frfree(f);
4202 f = &ast_null_frame;
4203 break;
4204 }
4205 }
4206 /*
4207 * Send frame to audiohooks if present, if frametype is linear, to preserve
4208 * functional compatibility with previous behavior. If not linear, hold off
4209 * until transcoding is done where we are more likely to have a linear frame
4210 */
4212 /* Place hooked after declaration */
4213 struct ast_frame *old_frame = f;
4214 hooked = 1;
4215
4217 if (old_frame != f) {
4218 ast_frfree(old_frame);
4219 }
4220 }
4221
4222 if (ast_channel_readtrans(chan)
4224 f = ast_translate(ast_channel_readtrans(chan), f, 1);
4225 if (!f) {
4226 f = &ast_null_frame;
4227 }
4228 }
4229
4230 /* Second chance at hooking a linear frame, also the last chance */
4231 if (ast_channel_audiohooks(chan) && !hooked) {
4232 struct ast_frame *old_frame = f;
4233
4235 if (old_frame != f) {
4236 ast_frfree(old_frame);
4237 }
4238 }
4239
4240 /*
4241 * It is possible for the translation process on the channel to have
4242 * produced multiple frames from the single input frame we passed it; if
4243 * this happens, queue the additional frames *before* the frames we may
4244 * have queued earlier. if the readq was empty, put them at the head of
4245 * the queue, and if it was not, put them just after the frame that was
4246 * at the end of the queue.
4247 */
4248 if (AST_LIST_NEXT(f, frame_list)) {
4249 struct ast_frame *cur, *multi_frame = AST_LIST_NEXT(f, frame_list);
4250
4251 /* Mark these frames as being re-queued */
4252 for (cur = multi_frame; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
4254 }
4255
4256 if (!readq_tail) {
4257 ast_queue_frame_head(chan, multi_frame);
4258 } else {
4259 __ast_queue_frame(chan, multi_frame, 0, readq_tail);
4260 }
4261 ast_frfree(multi_frame);
4263 }
4264
4265 /*
4266 * Run generator sitting on the line if timing device not available
4267 * and synchronous generation of outgoing frames is necessary
4268 */
4270 break;
4271 case AST_FRAME_RTCP:
4272 /* Incoming RTCP feedback needs to get to the translator for
4273 * outgoing media, which means we treat it as an ast_write */
4274 if (ast_channel_writetrans(chan)) {
4276 }
4277 break;
4278 default:
4279 /* Just pass it on! */
4280 break;
4281 }
4282 } else {
4283 /* Make sure we always return NULL in the future */
4286 }
4287 if (cause)
4288 ast_channel_hangupcause_set(chan, cause);
4289 if (ast_channel_generator(chan))
4291 /* We no longer End the CDR here */
4292 }
4293
4294 /* High bit prints debugging */
4295 if (ast_channel_fin(chan) & DEBUGCHAN_FLAG)
4296 ast_frame_dump(ast_channel_name(chan), f, "<<");
4298
4299done:
4302
4304 /* The list gets recreated if audiohooks are added again later */
4307 }
4308 ast_channel_unlock(chan);
4309 return f;
4310}
4311
4312struct ast_frame *ast_read(struct ast_channel *chan)
4313{
4314 return __ast_read(chan, 0, 1);
4315}
4316
4318{
4319 return __ast_read(chan, 0, 0);
4320}
4321
4323{
4324 return __ast_read(chan, 1, 1);
4325}
4326
4328{
4329 return __ast_read(chan, 1, 0);
4330}
4331
4332int ast_indicate(struct ast_channel *chan, int condition)
4333{
4334 return ast_indicate_data(chan, condition, NULL, 0);
4335}
4336
4338{
4339 /* Don't include a default case here so that we get compiler warnings
4340 * when a new type is added. */
4341
4342 switch (condition) {
4350 case AST_CONTROL_OPTION:
4351 case AST_CONTROL_WINK:
4352 case AST_CONTROL_FLASH:
4355 case AST_CONTROL_ANSWER:
4356 case AST_CONTROL_HANGUP:
4362 case AST_CONTROL_CC:
4364 case AST_CONTROL_AOC:
4366 case AST_CONTROL_MCID:
4383 break;
4384
4387 case AST_CONTROL_BUSY:
4389 case AST_CONTROL_RING:
4390 case AST_CONTROL_HOLD:
4391 /* You can hear these */
4392 return 1;
4393
4394 case AST_CONTROL_UNHOLD:
4395 /* This is a special case. You stop hearing this. */
4396 break;
4397 }
4398
4399 return 0;
4400}
4401
4403{
4404 char causevar[256];
4405
4406 if (ast_channel_dialed_causes_add(chan, cause_code, datalen)) {
4407 ast_log(LOG_WARNING, "Unable to store hangup cause for %s on %s\n", cause_code->chan_name, ast_channel_name(chan));
4408 }
4409
4410 if (cause_code->emulate_sip_cause) {
4411 snprintf(causevar, sizeof(causevar), "HASH(SIP_CAUSE,%s)", cause_code->chan_name);
4412 ast_func_write(chan, causevar, cause_code->code);
4413 }
4414}
4415
4417{
4418 if (!strcasecmp(flag, "default"))
4419 return DEFAULT_AMA_FLAGS;
4420 if (!strcasecmp(flag, "omit"))
4421 return AST_AMA_OMIT;
4422 if (!strcasecmp(flag, "billing"))
4423 return AST_AMA_BILLING;
4424 if (!strcasecmp(flag, "documentation"))
4425 return AST_AMA_DOCUMENTATION;
4426 return AST_AMA_NONE;
4427}
4428
4430{
4431 switch (flag) {
4432 case AST_AMA_OMIT:
4433 return "OMIT";
4434 case AST_AMA_BILLING:
4435 return "BILLING";
4437 return "DOCUMENTATION";
4438 default:
4439 return "Unknown";
4440 }
4441}
4442
4443/*!
4444 * \internal
4445 * \brief Preprocess connected line update.
4446 * \since 12.0.0
4447 *
4448 * \param chan channel to change the indication
4449 * \param data pointer to payload data
4450 * \param datalen size of payload data
4451 *
4452 * \note This function assumes chan is locked.
4453 *
4454 * \retval 0 keep going.
4455 * \retval -1 quit now.
4456 */
4457static int indicate_connected_line(struct ast_channel *chan, const void *data, size_t datalen)
4458{
4459 struct ast_party_connected_line *chan_connected = ast_channel_connected(chan);
4460 struct ast_party_connected_line *chan_indicated = ast_channel_connected_indicated(chan);
4462 unsigned char current[1024];
4463 unsigned char proposed[1024];
4464 int current_size;
4465 int proposed_size;
4466 int res;
4467
4469 res = ast_connected_line_parse_data(data, datalen, &connected);
4470 if (!res) {
4472 }
4474 if (res) {
4475 return -1;
4476 }
4477
4478 current_size = ast_connected_line_build_data(current, sizeof(current),
4479 chan_indicated, NULL);
4480 proposed_size = ast_connected_line_build_data(proposed, sizeof(proposed),
4481 chan_connected, NULL);
4482 if (current_size == -1 || proposed_size == -1) {
4483 return -1;
4484 }
4485
4486 if (current_size == proposed_size && !memcmp(current, proposed, current_size)) {
4487 ast_debug(1, "%s: Dropping redundant connected line update \"%s\" <%s>.\n",
4488 ast_channel_name(chan),
4489 S_COR(chan_connected->id.name.valid, chan_connected->id.name.str, ""),
4490 S_COR(chan_connected->id.number.valid, chan_connected->id.number.str, ""));
4491 return -1;
4492 }
4493
4494 ast_party_connected_line_copy(chan_indicated, chan_connected);
4495 return 0;
4496}
4497
4498/*!
4499 * \internal
4500 * \brief Preprocess redirecting update.
4501 * \since 12.0.0
4502 *
4503 * \param chan channel to change the indication
4504 * \param data pointer to payload data
4505 * \param datalen size of payload data
4506 *
4507 * \note This function assumes chan is locked.
4508 *
4509 * \retval 0 keep going.
4510 * \retval -1 quit now.
4511 */
4512static int indicate_redirecting(struct ast_channel *chan, const void *data, size_t datalen)
4513{
4514 struct ast_party_redirecting redirecting;
4515 int res;
4516
4518 res = ast_redirecting_parse_data(data, datalen, &redirecting);
4519 if (!res) {
4520 ast_channel_set_redirecting(chan, &redirecting, NULL);
4521 }
4522 ast_party_redirecting_free(&redirecting);
4523 return res ? -1 : 0;
4524}
4525
4526static int indicate_data_internal(struct ast_channel *chan, int _condition, const void *data, size_t datalen)
4527{
4528 /* By using an enum, we'll get compiler warnings for values not handled
4529 * in switch statements. */
4530 enum ast_control_frame_type condition = _condition;
4531 struct ast_tone_zone_sound *ts = NULL;
4532 const struct ast_control_t38_parameters *t38_parameters;
4533 int res;
4534
4535 switch (condition) {
4537 if (indicate_connected_line(chan, data, datalen)) {
4538 res = 0;
4539 return res;
4540 }
4541 break;
4543 if (indicate_redirecting(chan, data, datalen)) {
4544 res = 0;
4545 return res;
4546 }
4547 break;
4548 case AST_CONTROL_HOLD:
4549 case AST_CONTROL_UNHOLD:
4550 ast_channel_hold_state_set(chan, _condition);
4551 break;
4553 t38_parameters = data;
4554 switch (t38_parameters->request_response) {
4556 case AST_T38_NEGOTIATED:
4558 break;
4560 case AST_T38_TERMINATED:
4561 case AST_T38_REFUSED:
4563 break;
4564 default:
4565 break;
4566 }
4567 break;
4568 default:
4569 break;
4570 }
4571
4572 if (is_visible_indication(condition)) {
4573 /* A new visible indication is requested. */
4574 ast_channel_visible_indication_set(chan, _condition);
4575 } else if (condition == AST_CONTROL_UNHOLD || _condition < 0) {
4576 /* Visible indication is cleared/stopped. */
4578 }
4579
4580 if (ast_channel_tech(chan)->indicate) {
4581 /* See if the channel driver can handle this condition. */
4582 res = ast_channel_tech(chan)->indicate(chan, _condition, data, datalen);
4583 } else {
4584 res = -1;
4585 }
4586
4587 if (!res) {
4588 /* The channel driver successfully handled this indication */
4589 res = 0;
4590 return res;
4591 }
4592
4593 /* The channel driver does not support this indication, let's fake
4594 * it by doing our own tone generation if applicable. */
4595
4596 /*!\note If we compare the enumeration type, which does not have any
4597 * negative constants, the compiler may optimize this code away.
4598 * Therefore, we must perform an integer comparison here. */
4599 if (_condition < 0) {
4600 /* Stop any tones that are playing */
4601 ast_playtones_stop(chan);
4602 res = 0;
4603 return res;
4604 }
4605
4606 /* Handle conditions that we have tones for. */
4607 switch (condition) {
4609 /* deprecated T.38 control frame */
4610 res = -1;
4611 return res;
4613 /* there is no way to provide 'default' behavior for these
4614 * control frames, so we need to return failure, but there
4615 * is also no value in the log message below being emitted
4616 * since failure to handle these frames is not an 'error'
4617 * so just return right now. in addition, we want to return
4618 * whatever value the channel driver returned, in case it
4619 * has some meaning.*/
4620 return res;
4622 ts = ast_get_indication_tone(ast_channel_zone(chan), "ring");
4623 /* It is common practice for channel drivers to return -1 if trying
4624 * to indicate ringing on a channel which is up. The idea is to let the
4625 * core generate the ringing inband. However, we don't want the
4626 * warning message about not being able to handle the specific indication
4627 * to print nor do we want ast_indicate_data to return an "error" for this
4628 * condition
4629 */
4630 if (ast_channel_state(chan) == AST_STATE_UP) {
4631 res = 0;
4632 }
4633 break;
4634 case AST_CONTROL_BUSY:
4635 ts = ast_get_indication_tone(ast_channel_zone(chan), "busy");
4636 break;
4639 ts = ast_get_indication_tone(ast_channel_zone(chan), "congestion");
4640 break;
4642 ast_channel_hangupcause_hash_set(chan, data, datalen);
4643 res = 0;
4644 break;
4652 case AST_CONTROL_OPTION:
4653 case AST_CONTROL_WINK:
4654 case AST_CONTROL_FLASH:
4657 case AST_CONTROL_ANSWER:
4658 case AST_CONTROL_HANGUP:
4659 case AST_CONTROL_RING:
4660 case AST_CONTROL_HOLD:
4661 case AST_CONTROL_UNHOLD:
4665 case AST_CONTROL_CC:
4667 case AST_CONTROL_AOC:
4669 case AST_CONTROL_MCID:
4685 /* Nothing left to do for these. */
4686 res = 0;
4687 break;
4688 }
4689
4690 if (ts) {
4691 /* We have a tone to play, yay. */
4692 ast_debug(1, "Driver for channel '%s' does not support indication %u, emulating it\n", ast_channel_name(chan), condition);
4693 res = ast_playtones_start(chan, 0, ts->data, 1);
4694 if (!res) {
4695 ast_test_suite_event_notify("RINGING_INBAND",
4696 "Channel: %s\r\n",
4697 ast_channel_name(chan));
4698 }
4700 }
4701
4702 if (res) {
4703 /* not handled */
4704 ast_log(LOG_WARNING, "Unable to handle indication %u for '%s'\n", condition, ast_channel_name(chan));
4705 }
4706
4707 return res;
4708}
4709
4710int ast_indicate_data(struct ast_channel *chan, int _condition, const void *data, size_t datalen)
4711{
4712 int res;
4713 /* this frame is used by framehooks. if it is set, we must free it at the end of this function */
4714 struct ast_frame *awesome_frame = NULL;
4715
4716 ast_channel_lock(chan);
4717
4718 /* Don't bother if the channel is about to go away, anyway. */
4721 && _condition != AST_CONTROL_MASQUERADE_NOTIFY) {
4722 res = -1;
4723 goto indicate_cleanup;
4724 }
4725
4727 /* Do framehooks now, do it, go, go now */
4728 struct ast_frame frame = {
4730 .subclass.integer = _condition,
4731 .data.ptr = (void *) data, /* this cast from const is only okay because we do the ast_frdup below */
4732 .datalen = datalen
4733 };
4734
4735 /* we have now committed to freeing this frame */
4736 awesome_frame = ast_frdup(&frame);
4737
4738 /* who knows what we will get back! the anticipation is killing me. */
4740 awesome_frame);
4741 if (!awesome_frame
4742 || awesome_frame->frametype != AST_FRAME_CONTROL) {
4743 res = 0;
4744 goto indicate_cleanup;
4745 }
4746
4747 _condition = awesome_frame->subclass.integer;
4748 data = awesome_frame->data.ptr;
4749 datalen = awesome_frame->datalen;
4750 }
4751
4752 res = indicate_data_internal(chan, _condition, data, datalen);
4753
4754indicate_cleanup:
4755 ast_channel_unlock(chan);
4756 if (awesome_frame) {
4757 ast_frfree(awesome_frame);
4758 }
4759
4760 return res;
4761}
4762
4763int ast_recvchar(struct ast_channel *chan, int timeout)
4764{
4765 int c;
4766 char *buf = ast_recvtext(chan, timeout);
4767 if (buf == NULL)
4768 return -1; /* error or timeout */
4769 c = *(unsigned char *)buf;
4770 ast_free(buf);
4771 return c;
4772}
4773
4774char *ast_recvtext(struct ast_channel *chan, int timeout)
4775{
4776 int res;
4777 char *buf = NULL;
4778 struct timeval start = ast_tvnow();
4779 int ms;
4780
4781 while ((ms = ast_remaining_ms(start, timeout))) {
4782 struct ast_frame *f;
4783
4784 if (ast_check_hangup(chan)) {
4785 break;
4786 }
4787 res = ast_waitfor(chan, ms);
4788 if (res <= 0) {/* timeout or error */
4789 break;
4790 }
4791 f = ast_read(chan);
4792 if (f == NULL) {
4793 break; /* no frame */
4794 }
4796 ast_frfree(f);
4797 break;
4798 } else if (f->frametype == AST_FRAME_TEXT) { /* what we want */
4799 buf = ast_strndup((char *) f->data.ptr, f->datalen); /* dup and break */
4800 ast_frfree(f);
4801 break;
4802 }
4803 ast_frfree(f);
4804 }
4805 return buf;
4806}
4807
4808int ast_sendtext_data(struct ast_channel *chan, struct ast_msg_data *msg)
4809{
4810 int res = 0;
4811 const char *body = ast_msg_data_get_attribute(msg, AST_MSG_DATA_ATTR_BODY);
4812 const char *content_type = ast_msg_data_get_attribute(msg, AST_MSG_DATA_ATTR_CONTENT_TYPE);
4813
4814 ast_channel_lock(chan);
4815 /* Stop if we're a zombie or need a soft hangup */
4817 ast_channel_unlock(chan);
4818 return -1;
4819 }
4820
4821 CHECK_BLOCKING(chan);
4822 if (ast_channel_tech(chan)->write_text
4823 && (ast_strlen_zero(content_type) || ast_begins_with(content_type, "text/"))
4825 struct ast_frame f;
4826 /* T.140 payload does not include the null byte terminator */
4827 size_t body_len = strlen(body);
4828
4829 /* Process as T.140 text (moved here from ast_sendtext() */
4830 memset(&f, 0, sizeof(f));
4831 f.src = "DIALPLAN";
4834 f.datalen = body_len;
4836 f.data.ptr = ast_strdup(body);
4837 if (f.data.ptr) {
4838 res = ast_channel_tech(chan)->write_text(chan, &f);
4839 } else {
4840 res = -1;
4841 }
4842 ast_frfree(&f);
4843 } else if ((ast_channel_tech(chan)->properties & AST_CHAN_TP_SEND_TEXT_DATA)
4844 && ast_channel_tech(chan)->send_text_data) {
4845 /* Send enhanced message to a channel driver that supports it */
4846 ast_debug(1, "Sending TEXT_DATA from '%s' to %s:%s %s\n",
4849 ast_channel_name(chan), body);
4850 res = ast_channel_tech(chan)->send_text_data(chan, msg);
4851 } else if (ast_channel_tech(chan)->send_text
4852 && (ast_strlen_zero(content_type) || ast_begins_with(content_type, "text/"))) {
4853 /* Send the body of an enhanced message to a channel driver that supports only a char str */
4854 ast_debug(1, "Sending TEXT to %s: %s\n", ast_channel_name(chan), body);
4855 res = ast_channel_tech(chan)->send_text(chan, body);
4856 } else {
4857 ast_debug(1, "Channel technology does not support sending content type '%s' on channel '%s'\n",
4858 S_OR(content_type, "text/plain"), ast_channel_name(chan));
4859 res = -1;
4860 }
4862 ast_channel_unlock(chan);
4863 return res;
4864}
4865
4866int ast_sendtext(struct ast_channel *chan, const char *text)
4867{
4868 struct ast_msg_data *msg;
4869 int rc;
4870 struct ast_msg_data_attribute attrs[] =
4871 {
4872 {
4874 .value = (char *)text,
4875 }
4876 };
4877
4878 if (ast_strlen_zero(text)) {
4879 return 0;
4880 }
4881
4883 if (!msg) {
4884 return -1;
4885 }
4886 rc = ast_sendtext_data(chan, msg);
4887 ast_free(msg);
4888
4889 return rc;
4890}
4891
4893{
4894 static const char * const mf_tones[] = {
4895 "1300+1500", /* 0 */
4896 "700+900", /* 1 */
4897 "700+1100", /* 2 */
4898 "900+1100", /* 3 */
4899 "700+1300", /* 4 */
4900 "900+1300", /* 5 */
4901 "1100+1300", /* 6 */
4902 "700+1500", /* 7 */
4903 "900+1500", /* 8 */
4904 "1100+1500", /* 9 */
4905 "1100+1700", /* * (KP) */
4906 "1500+1700", /* # (ST) */
4907 "900+1700", /* A (STP) */
4908 "1300+1700", /* B (ST2P) */
4909 "700+1700" /* C (ST3P) */
4910 };
4911
4912 if (digit >= '0' && digit <='9') {
4913 ast_playtones_start(chan, 0, mf_tones[digit-'0'], 0);
4914 } else if (digit == '*') {
4915 ast_playtones_start(chan, 0, mf_tones[10], 0);
4916 } else if (digit == '#') {
4917 ast_playtones_start(chan, 0, mf_tones[11], 0);
4918 } else if (digit == 'A') {
4919 ast_playtones_start(chan, 0, mf_tones[12], 0);
4920 } else if (digit == 'B') {
4921 ast_playtones_start(chan, 0, mf_tones[13], 0);
4922 } else if (digit == 'C') {
4923 ast_playtones_start(chan, 0, mf_tones[14], 0);
4924 } else {
4925 /* not handled */
4926 ast_log(LOG_WARNING, "Unable to generate MF tone '%c' for '%s'\n", digit, ast_channel_name(chan));
4927 }
4928 return 0;
4929}
4930
4932{
4933 /* Device does not support DTMF tones, lets fake
4934 * it by doing our own generation. */
4935 static const char * const dtmf_tones[] = {
4936 "941+1336", /* 0 */
4937 "697+1209", /* 1 */
4938 "697+1336", /* 2 */
4939 "697+1477", /* 3 */
4940 "770+1209", /* 4 */
4941 "770+1336", /* 5 */
4942 "770+1477", /* 6 */
4943 "852+1209", /* 7 */
4944 "852+1336", /* 8 */
4945 "852+1477", /* 9 */
4946 "697+1633", /* A */
4947 "770+1633", /* B */
4948 "852+1633", /* C */
4949 "941+1633", /* D */
4950 "941+1209", /* * */
4951 "941+1477" /* # */
4952 };
4953
4954 if (!ast_channel_tech(chan)->send_digit_begin)
4955 return 0;
4956
4957 ast_channel_lock(chan);
4960 ast_channel_unlock(chan);
4961
4962 if (!ast_channel_tech(chan)->send_digit_begin(chan, digit))
4963 return 0;
4964
4965 if (digit >= '0' && digit <='9')
4966 ast_playtones_start(chan, 0, dtmf_tones[digit-'0'], 0);
4967 else if (digit >= 'A' && digit <= 'D')
4968 ast_playtones_start(chan, 0, dtmf_tones[digit-'A'+10], 0);
4969 else if (digit == '*')
4970 ast_playtones_start(chan, 0, dtmf_tones[14], 0);
4971 else if (digit == '#')
4972 ast_playtones_start(chan, 0, dtmf_tones[15], 0);
4973 else {
4974 /* not handled */
4975 ast_debug(1, "Unable to generate DTMF tone '%c' for '%s'\n", digit, ast_channel_name(chan));
4976 }
4977
4978 return 0;
4979}
4980
4981int ast_senddigit_end(struct ast_channel *chan, char digit, unsigned int duration)
4982{
4983 int res = -1;
4984
4985 if (ast_channel_tech(chan)->send_digit_end)
4986 res = ast_channel_tech(chan)->send_digit_end(chan, digit, duration);
4987
4988 ast_channel_lock(chan);
4991 }
4992 ast_channel_unlock(chan);
4993
4994 if (res && ast_channel_generator(chan))
4995 ast_playtones_stop(chan);
4996
4997 return 0;
4998}
4999
5001{
5002 if (ast_channel_generator(chan)) {
5003 ast_playtones_stop(chan);
5004 return 0;
5005 }
5006 return -1;
5007}
5008
5009int ast_senddigit_mf(struct ast_channel *chan, char digit, unsigned int duration,
5010 unsigned int durationkp, unsigned int durationst, int is_external)
5011{
5012 if (duration < DEFAULT_EMULATE_MF_DURATION) {
5013 duration = DEFAULT_EMULATE_MF_DURATION;
5014 }
5015 if (ast_channel_tech(chan)->send_digit_begin) {
5016 if (digit == '*') {
5017 duration = durationkp;
5018 } else if (digit == '#' || digit == 'A' || digit == 'B' || digit == 'C') {
5019 duration = durationst;
5020 }
5022 if (is_external) {
5023 usleep(duration * 1000);
5024 } else {
5025 ast_safe_sleep(chan, duration);
5026 }
5027 }
5028 return ast_senddigit_mf_end(chan);
5029}
5030
5031int ast_senddigit(struct ast_channel *chan, char digit, unsigned int duration)
5032{
5033 if (duration < AST_DEFAULT_EMULATE_DTMF_DURATION) {
5035 }
5036 if (ast_channel_tech(chan)->send_digit_begin) {
5038 ast_safe_sleep(chan, duration);
5039 }
5040
5041 return ast_senddigit_end(chan, digit, duration);
5042}
5043
5044int ast_senddigit_external(struct ast_channel *chan, char digit, unsigned int duration)
5045{
5046 if (duration < AST_DEFAULT_EMULATE_DTMF_DURATION) {
5048 }
5049 if (ast_channel_tech(chan)->send_digit_begin) {
5051 usleep(duration * 1000);
5052 }
5053
5054 return ast_senddigit_end(chan, digit, duration);
5055}
5056
5057int ast_prod(struct ast_channel *chan)
5058{
5059 struct ast_frame a = { AST_FRAME_VOICE };
5060 char nothing[128];
5061
5062 /* Send an empty audio frame to get things moving */
5063 if (ast_channel_state(chan) != AST_STATE_UP) {
5064 ast_debug(3, "Prodding channel '%s'\n", ast_channel_name(chan));
5065 a.subclass.format = ast_channel_rawwriteformat(chan);
5066 a.data.ptr = nothing + AST_FRIENDLY_OFFSET;
5067 a.src = "ast_prod"; /* this better match check in ast_write */
5068 if (ast_write(chan, &a))
5069 ast_log(LOG_WARNING, "Prodding channel '%s' failed\n", ast_channel_name(chan));
5070 }
5071 return 0;
5072}
5073
5074int ast_write_video(struct ast_channel *chan, struct ast_frame *fr)
5075{
5076 int res;
5077 if (!ast_channel_tech(chan)->write_video)
5078 return 0;
5079 res = ast_write(chan, fr);
5080 if (!res)
5081 res = 1;
5082 return res;
5083}
5084
5085struct plc_ds {
5086 /* A buffer in which to store SLIN PLC
5087 * samples generated by the generic PLC
5088 * functionality in plc.c
5089 */
5090 int16_t *samples_buf;
5091 /* The current number of samples in the
5092 * samples_buf
5093 */
5096};
5097
5098static void plc_ds_destroy(void *data)
5099{
5100 struct plc_ds *plc = data;
5101 ast_free(plc->samples_buf);
5102 ast_free(plc);
5103}
5104
5105static const struct ast_datastore_info plc_ds_info = {
5106 .type = "plc",
5107 .destroy = plc_ds_destroy,
5108};
5109
5110static void adjust_frame_for_plc(struct ast_channel *chan, struct ast_frame *frame, struct ast_datastore *datastore)
5111{
5112 int num_new_samples = frame->samples;
5113 struct plc_ds *plc = datastore->data;
5114
5115 /* As a general note, let me explain the somewhat odd calculations used when taking
5116 * the frame offset into account here. According to documentation in frame.h, the frame's
5117 * offset field indicates the number of bytes that the audio is offset. The plc->samples_buf
5118 * is not an array of bytes, but rather an array of 16-bit integers since it holds SLIN
5119 * samples. So I had two choices to make here with the offset.
5120 *
5121 * 1. Make the offset AST_FRIENDLY_OFFSET bytes. The main downside for this is that
5122 * I can't just add AST_FRIENDLY_OFFSET to the plc->samples_buf and have the pointer
5123 * arithmetic come out right. I would have to do some odd casting or division for this to
5124 * work as I wanted.
5125 * 2. Make the offset AST_FRIENDLY_OFFSET * 2 bytes. This allows the pointer arithmetic
5126 * to work out better with the plc->samples_buf. The downside here is that the buffer's
5127 * allocation contains an extra 64 bytes of unused space.
5128 *
5129 * I decided to go with option 2. This is why in the calloc statement and the statement that
5130 * sets the frame's offset, AST_FRIENDLY_OFFSET is multiplied by 2.
5131 */
5132
5133 /* If this audio frame has no samples to fill in, ignore it */
5134 if (!num_new_samples) {
5135 return;
5136 }
5137
5138 /* First, we need to be sure that our buffer is large enough to accommodate
5139 * the samples we need to fill in. This will likely only occur on the first
5140 * frame we write.
5141 */
5142 if (plc->num_samples < num_new_samples) {
5143 ast_free(plc->samples_buf);
5144 plc->samples_buf = ast_calloc(1, (num_new_samples * sizeof(*plc->samples_buf)) + (AST_FRIENDLY_OFFSET * 2));
5145 if (!plc->samples_buf) {
5146 ast_channel_datastore_remove(chan, datastore);
5147 ast_datastore_free(datastore);
5148 return;
5149 }
5150 plc->num_samples = num_new_samples;
5151 }
5152
5153 if (frame->datalen == 0) {
5155 frame->data.ptr = plc->samples_buf + AST_FRIENDLY_OFFSET;
5156 frame->datalen = num_new_samples * 2;
5157 frame->offset = AST_FRIENDLY_OFFSET * 2;
5158 } else {
5159 plc_rx(&plc->plc_state, frame->data.ptr, frame->samples);
5160 }
5161}
5162
5163static void apply_plc(struct ast_channel *chan, struct ast_frame *frame)
5164{
5165 struct ast_datastore *datastore;
5166 struct plc_ds *plc;
5167
5168 datastore = ast_channel_datastore_find(chan, &plc_ds_info, NULL);
5169 if (datastore) {
5170 plc = datastore->data;
5171 adjust_frame_for_plc(chan, frame, datastore);
5172 return;
5173 }
5174
5175 datastore = ast_datastore_alloc(&plc_ds_info, NULL);
5176 if (!datastore) {
5177 return;
5178 }
5179 plc = ast_calloc(1, sizeof(*plc));
5180 if (!plc) {
5181 ast_datastore_free(datastore);
5182 return;
5183 }
5184 datastore->data = plc;
5185 ast_channel_datastore_add(chan, datastore);
5186 adjust_frame_for_plc(chan, frame, datastore);
5187}
5188
5189static int tech_write(struct ast_channel *chan, struct ast_stream *stream,
5190 struct ast_stream *default_stream, struct ast_frame *frame)
5191{
5192 if (ast_channel_tech(chan)->write_stream) {
5193 return stream ? ast_channel_tech(chan)->write_stream(
5194 chan, ast_stream_get_position(stream), frame) : 0;
5195 }
5196
5197 return ((stream == default_stream) && ast_channel_tech(chan)->write) ?
5198 ast_channel_tech(chan)->write(chan, frame) : 0;
5199}
5200
5201int ast_write(struct ast_channel *chan, struct ast_frame *fr)
5202{
5203 return ast_write_stream(chan, -1, fr);
5204}
5205
5206int ast_write_stream(struct ast_channel *chan, int stream_num, struct ast_frame *fr)
5207{
5208 struct ast_stream *stream = NULL, *default_stream = NULL;
5209 int res = -1;
5210 struct ast_frame *f = NULL;
5211 int count = 0;
5212 int hooked = 0;
5213
5214 /*Deadlock avoidance*/
5215 while(ast_channel_trylock(chan)) {
5216 /*cannot goto done since the channel is not locked*/
5217 if(count++ > 10) {
5218 ast_debug(1, "Deadlock avoided for write to channel '%s'\n", ast_channel_name(chan));
5219 return 0;
5220 }
5221 usleep(1);
5222 }
5223
5224 /* Stop if we're a zombie or need a soft hangup */
5226 goto done;
5227 }
5228
5229 if (stream_num >= 0) {
5230 /* If we were told to write to an explicit stream then allow this frame through, no matter
5231 * if the type is expected or not (a framehook could change)
5232 */
5234 goto done;
5235 }
5237 default_stream = ast_channel_get_default_stream(chan, ast_stream_get_type(stream));
5238 } else if (fr->frametype == AST_FRAME_VOICE || fr->frametype == AST_FRAME_VIDEO || fr->frametype == AST_FRAME_MODEM) {
5239 /* If we haven't been told of a stream then we need to figure out which once we need */
5241
5242 /* Some frame types have a fixed media type */
5243 if (fr->frametype == AST_FRAME_VOICE || fr->frametype == AST_FRAME_VIDEO) {
5245 } else if (fr->frametype == AST_FRAME_MODEM) {
5247 }
5248
5249 /* No stream was specified, so use the default one */
5250 stream = default_stream = ast_channel_get_default_stream(chan, type);
5251 }
5252
5253 /* Perform the framehook write event here. After the frame enters the framehook list
5254 * there is no telling what will happen, how awesome is that!!! */
5255 if ((stream == default_stream) && !(fr = ast_framehook_list_write_event(ast_channel_framehooks(chan), fr))) {
5256 res = 0;
5257 goto done;
5258 }
5259
5260 if (ast_channel_generatordata(chan) && (fr->frametype != AST_FRAME_RTCP) && (!fr->src || strcasecmp(fr->src, "ast_prod"))) {
5263 } else {
5264 if (fr->frametype == AST_FRAME_DTMF_END) {
5265 /* There is a generator running while we're in the middle of a digit.
5266 * It's probably inband DTMF, so go ahead and pass it so it can
5267 * stop the generator */
5268 ast_channel_unlock(chan);
5269 res = ast_senddigit_end(chan, fr->subclass.integer, fr->len);
5270 ast_channel_lock(chan);
5271 } else if (fr->frametype == AST_FRAME_CONTROL
5273 /*
5274 * This is a side case where Echo is basically being called
5275 * and the person put themselves on hold and took themselves
5276 * off hold.
5277 */
5279 fr->datalen);
5280 }
5281 res = 0; /* XXX explain, why 0 ? */
5282 goto done;
5283 }
5284 }
5285 /* High bit prints debugging */
5286 if (ast_channel_fout(chan) & DEBUGCHAN_FLAG)
5287 ast_frame_dump(ast_channel_name(chan), fr, ">>");
5288 switch (fr->frametype) {
5289 case AST_FRAME_CONTROL:
5291 res = 0;
5292 break;
5294 if (ast_channel_audiohooks(chan)) {
5295 struct ast_frame *old_frame = fr;
5297 if (old_frame != fr)
5298 f = fr;
5299 }
5301 ast_channel_unlock(chan);
5302 res = ast_senddigit_begin(chan, fr->subclass.integer);
5303 ast_channel_lock(chan);
5304 break;
5305 case AST_FRAME_DTMF_END:
5306 if (ast_channel_audiohooks(chan)) {
5307 struct ast_frame *new_frame = fr;
5308
5310 if (new_frame != fr) {
5311 ast_frfree(new_frame);
5312 }
5313 }
5315 ast_channel_unlock(chan);
5316 res = ast_senddigit_end(chan, fr->subclass.integer, fr->len);
5317 ast_channel_lock(chan);
5318 break;
5319 case AST_FRAME_TEXT:
5320 CHECK_BLOCKING(chan);
5322 res = (ast_channel_tech(chan)->write_text == NULL) ? 0 :
5323 ast_channel_tech(chan)->write_text(chan, fr);
5324 } else {
5325 res = (ast_channel_tech(chan)->send_text == NULL) ? 0 :
5326 ast_channel_tech(chan)->send_text(chan, (char *) fr->data.ptr);
5327 }
5329 break;
5330 case AST_FRAME_HTML:
5331 CHECK_BLOCKING(chan);
5332 res = (ast_channel_tech(chan)->send_html == NULL) ? 0 :
5333 ast_channel_tech(chan)->send_html(chan, fr->subclass.integer, (char *) fr->data.ptr, fr->datalen);
5335 break;
5336 case AST_FRAME_VIDEO:
5337 /* XXX Handle translation of video codecs one day XXX */
5338 CHECK_BLOCKING(chan);
5339 if (ast_channel_tech(chan)->write_stream) {
5340 if (stream) {
5341 res = ast_channel_tech(chan)->write_stream(chan, ast_stream_get_position(stream), fr);
5342 } else {
5343 res = 0;
5344 }
5345 } else if ((stream == default_stream) && ast_channel_tech(chan)->write_video) {
5346 res = ast_channel_tech(chan)->write_video(chan, fr);
5347 } else {
5348 res = 0;
5349 }
5351 break;
5352 case AST_FRAME_MODEM:
5353 CHECK_BLOCKING(chan);
5354 res = tech_write(chan, stream, default_stream, fr);
5356 break;
5357 case AST_FRAME_VOICE:
5359 apply_plc(chan, fr);
5360 }
5361
5362 f = fr;
5363
5364 /*
5365 * Send frame to audiohooks if present, if frametype is linear (else, later as per
5366 * previous behavior)
5367 */
5368 if ((stream == default_stream) && ast_channel_audiohooks(chan)) {
5370 hooked = 1;
5372 }
5373 }
5374
5375 /* If the frame is in the raw write format, then it's easy... just use the frame - otherwise we will have to translate */
5376 if ((stream == default_stream) && ast_format_cmp(fr->subclass.format, ast_channel_rawwriteformat(chan)) != AST_FORMAT_CMP_EQUAL) {
5378 struct ast_str *codec_buf = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);
5379
5380 /*
5381 * We are not setup to write this frame. Things may have changed
5382 * on the peer side of the world and we try to adjust the format to
5383 * make it compatible again. However, bad things can happen if we
5384 * cannot setup a new translation path. Problems range from no
5385 * audio, one-way audio, to garbled audio. The best we can do is
5386 * request the call to hangup since we could not make it compatible.
5387 *
5388 * Being continuously spammed by this message likely indicates a
5389 * problem with the peer because it cannot make up its mind about
5390 * which format to use.
5391 */
5392 ast_debug(1, "Channel %s changing write format from %s to %s, native formats %s\n",
5393 ast_channel_name(chan),
5397 if (ast_set_write_format(chan, fr->subclass.format)) {
5398 /* Could not handle the new write format. Induce a hangup. */
5399 break;
5400 }
5401 }
5402
5403 if (ast_channel_writetrans(chan)) {
5404 struct ast_frame *trans_frame = ast_translate(ast_channel_writetrans(chan), f, 0);
5405 if (trans_frame != f && f != fr) {
5406 /*
5407 * If translate gives us a new frame and so did the audio
5408 * hook then we need to free the one from the audio hook.
5409 */
5410 ast_frfree(f);
5411 }
5412 f = trans_frame;
5413 }
5414 }
5415
5416 if (!f) {
5417 res = 0;
5418 break;
5419 }
5420
5421 if ((stream == default_stream) && ast_channel_audiohooks(chan) && !hooked) {
5422 struct ast_frame *prev = NULL, *new_frame, *cur, *dup;
5423 int freeoldlist = 0;
5424
5425 if (f != fr) {
5426 freeoldlist = 1;
5427 }
5428
5429 /* Since ast_audiohook_write may return a new frame, and the cur frame is
5430 * an item in a list of frames, create a new list adding each cur frame back to it
5431 * regardless if the cur frame changes or not. */
5432 for (cur = f; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
5434
5435 /* if this frame is different than cur, preserve the end of the list,
5436 * free the old frames, and set cur to be the new frame */
5437 if (new_frame != cur) {
5438
5439 /* doing an ast_frisolate here seems silly, but we are not guaranteed the new_frame
5440 * isn't part of local storage, meaning if ast_audiohook_write is called multiple
5441 * times it may override the previous frame we got from it unless we dup it */
5442 if ((dup = ast_frisolate(new_frame))) {
5444 if (freeoldlist) {
5446 ast_frfree(cur);
5447 }
5448 if (new_frame != dup) {
5449 ast_frfree(new_frame);
5450 }
5451 cur = dup;
5452 }
5453 }
5454
5455 /* now, regardless if cur is new or not, add it to the new list,
5456 * if the new list has not started, cur will become the first item. */
5457 if (prev) {
5458 AST_LIST_NEXT(prev, frame_list) = cur;
5459 } else {
5460 f = cur; /* set f to be the beginning of our new list */
5461 }
5462 prev = cur;
5463 }
5464 }
5465
5466 /* the translator on chan->writetrans may have returned multiple frames
5467 from the single frame we passed in; if so, feed each one of them to the
5468 channel, freeing each one after it has been written */
5469 CHECK_BLOCKING(chan);
5470 if ((f != fr) && AST_LIST_NEXT(f, frame_list)) {
5471 struct ast_frame *cur, *next = NULL;
5472 unsigned int skip = 0;
5473
5474 cur = f;
5475 while (cur) {
5478 if (!skip) {
5479 res = tech_write(chan, stream, default_stream, cur);
5480 if (res < 0) {
5482 skip = 1;
5483 } else if (next) {
5484 /* don't do this for the last frame in the list,
5485 as the code outside the loop will do it once
5486 */
5488 }
5489 }
5490 ast_frfree(cur);
5491 cur = next;
5492 }
5493
5494 /* reset f so the code below doesn't attempt to free it */
5495 f = NULL;
5496 } else {
5497 res = tech_write(chan, stream, default_stream, f);
5498 }
5500 break;
5501 case AST_FRAME_NULL:
5502 case AST_FRAME_IAX:
5503 /* Ignore these */
5504 res = 0;
5505 break;
5506 case AST_FRAME_RTCP:
5507 /* RTCP information is on a per-stream basis and only available on multistream capable channels */
5508 CHECK_BLOCKING(chan);
5509 if (ast_channel_tech(chan)->write_stream && stream) {
5510 res = ast_channel_tech(chan)->write_stream(chan, ast_stream_get_position(stream), fr);
5511 } else {
5512 res = 0;
5513 }
5515 break;
5516 default:
5517 /* At this point, fr is the incoming frame and f is NULL. Channels do
5518 * not expect to get NULL as a frame pointer and will segfault. Hence,
5519 * we output the original frame passed in. */
5520 CHECK_BLOCKING(chan);
5521 res = ast_channel_tech(chan)->write(chan, fr);
5523 break;
5524 }
5525
5526 if (f && f != fr)
5527 ast_frfree(f);
5528
5529 /* Consider a write failure to force a soft hangup */
5530 if (res < 0) {
5532 } else {
5534 }
5535done:
5537 /* The list gets recreated if audiohooks are added again later */
5540 }
5541 ast_channel_unlock(chan);
5542 return res;
5543}
5544
5545int ast_set_read_format_path(struct ast_channel *chan, struct ast_format *raw_format, struct ast_format *core_format)
5546{
5547 struct ast_trans_pvt *trans_old;
5548 struct ast_trans_pvt *trans_new;
5549
5552 /* Nothing to setup */
5553 return 0;
5554 }
5555
5556 ast_debug(1, "Channel %s setting read format path: %s -> %s\n",
5557 ast_channel_name(chan),
5558 ast_format_get_name(raw_format),
5559 ast_format_get_name(core_format));
5560
5561 /* Setup new translation path. */
5562 if (ast_format_cmp(raw_format, core_format) != AST_FORMAT_CMP_EQUAL) {
5563 trans_new = ast_translator_build_path(core_format, raw_format);
5564 if (!trans_new) {
5565 return -1;
5566 }
5567 } else {
5568 /* No translation needed. */
5569 trans_new = NULL;
5570 }
5571 trans_old = ast_channel_readtrans(chan);
5572 if (trans_old) {
5573 ast_translator_free_path(trans_old);
5574 }
5575 ast_channel_readtrans_set(chan, trans_new);
5576 ast_channel_set_rawreadformat(chan, raw_format);
5577 ast_channel_set_readformat(chan, core_format);
5578 return 0;
5579}
5580
5581int ast_set_write_format_path(struct ast_channel *chan, struct ast_format *core_format, struct ast_format *raw_format)
5582{
5583 struct ast_trans_pvt *trans_old;
5584 struct ast_trans_pvt *trans_new;
5585
5588 /* Nothing to setup */
5589 return 0;
5590 }
5591
5592 ast_debug(1, "Channel %s setting write format path: %s -> %s\n",
5593 ast_channel_name(chan),
5594 ast_format_get_name(core_format),
5595 ast_format_get_name(raw_format));
5596
5597 /* Setup new translation path. */
5598 if (ast_format_cmp(raw_format, core_format) != AST_FORMAT_CMP_EQUAL) {
5599 trans_new = ast_translator_build_path(raw_format, core_format);
5600 if (!trans_new) {
5601 return -1;
5602 }
5603 } else {
5604 /* No translation needed. */
5605 trans_new = NULL;
5606 }
5607 trans_old = ast_channel_writetrans(chan);
5608 if (trans_old) {
5609 ast_translator_free_path(trans_old);
5610 }
5611 ast_channel_writetrans_set(chan, trans_new);
5612 ast_channel_set_rawwriteformat(chan, raw_format);
5613 ast_channel_set_writeformat(chan, core_format);
5614 return 0;
5615}
5616
5618 const char *direction;
5619 struct ast_trans_pvt *(*get_trans)(const struct ast_channel *chan);
5620 void (*set_trans)(struct ast_channel *chan, struct ast_trans_pvt *value);
5621 struct ast_format *(*get_format)(struct ast_channel *chan);
5622 void (*set_format)(struct ast_channel *chan, struct ast_format *format);
5623 struct ast_format *(*get_rawformat)(struct ast_channel *chan);
5624 void (*set_rawformat)(struct ast_channel *chan, struct ast_format *format);
5626};
5627
5629 .direction = "read",
5630 .get_trans = ast_channel_readtrans,
5631 .set_trans = ast_channel_readtrans_set,
5632 .get_format = ast_channel_readformat,
5633 .set_format = ast_channel_set_readformat,
5634 .get_rawformat = ast_channel_rawreadformat,
5635 .set_rawformat = ast_channel_set_rawreadformat,
5636 .setoption = AST_OPTION_FORMAT_READ,
5637};
5638
5640 .direction = "write",
5641 .get_trans = ast_channel_writetrans,
5642 .set_trans = ast_channel_writetrans_set,
5643 .get_format = ast_channel_writeformat,
5644 .set_format = ast_channel_set_writeformat,
5645 .get_rawformat = ast_channel_rawwriteformat,
5646 .set_rawformat = ast_channel_set_rawwriteformat,
5647 .setoption = AST_OPTION_FORMAT_WRITE,
5648};
5649
5650static int set_format(struct ast_channel *chan, struct ast_format_cap *cap_set, const int direction, int interleaved_stereo)
5651{
5652 struct ast_trans_pvt *trans_pvt;
5653 struct ast_format_cap *cap_native;
5654 const struct set_format_access *access;
5655 struct ast_format *rawformat;
5656 struct ast_format *format;
5657 RAII_VAR(struct ast_format *, best_set_fmt, NULL, ao2_cleanup);
5658 RAII_VAR(struct ast_format *, best_native_fmt, NULL, ao2_cleanup);
5659 int res;
5660
5661 if (!direction) {
5662 /* reading */
5663 access = &set_format_access_read;
5664 } else {
5665 /* writing */
5666 access = &set_format_access_write;
5667 }
5668
5670 if (!best_set_fmt) {
5671 /*
5672 * Not setting any audio formats?
5673 * Assume a call without any sounds (video, text)
5674 */
5675 return 0;
5676 }
5677
5678 /* See if the underlying channel driver is capable of performing transcoding for us */
5679 res = ast_channel_setoption(chan, access->setoption,
5680 &best_set_fmt, sizeof(best_set_fmt), 0);
5681 if (!res) {
5682 ast_debug(1, "Channel driver natively set channel %s to %s format %s\n",
5683 ast_channel_name(chan), access->direction, ast_format_get_name(best_set_fmt));
5684
5685 ast_channel_lock(chan);
5687 if (!cap_native
5688 || ast_format_cap_append(cap_native, best_set_fmt, 0)) {
5689 ast_channel_unlock(chan);
5690 ao2_cleanup(cap_native);
5691 return -1;
5692 }
5693 ast_channel_nativeformats_set(chan, cap_native);
5694 ao2_cleanup(cap_native);
5695 access->set_format(chan, best_set_fmt);
5696 access->set_rawformat(chan, best_set_fmt);
5697
5698 trans_pvt = access->get_trans(chan);
5699 if (trans_pvt) {
5700 ast_translator_free_path(trans_pvt);
5701 access->set_trans(chan, NULL);
5702 }
5703 ast_channel_unlock(chan);
5704
5705 /* If there is a generator on the channel, it needs to know about this
5706 * change if it is the write format. */
5707 if (direction && ast_channel_generatordata(chan)) {
5709 }
5710
5711 return 0;
5712 }
5713
5714 ast_channel_lock(chan);
5715
5716 format = access->get_format(chan);
5717 rawformat = access->get_rawformat(chan);
5718 ast_assert(format != NULL);
5719 ast_assert(rawformat != NULL);
5720
5721 cap_native = ast_channel_nativeformats(chan);
5722 if (ast_format_cap_empty(cap_native)) {
5723 ast_channel_unlock(chan);
5724 ast_log(LOG_ERROR, "Unable to set format because channel %s supports no formats\n",
5725 ast_channel_name(chan));
5726 return -1;
5727 }
5728
5729 /* Find a translation path from the native format to one of the desired formats */
5730 if (!direction) {
5731 /* reading */
5732 res = ast_translator_best_choice(cap_set, cap_native, &best_set_fmt, &best_native_fmt);
5733 } else {
5734 /* writing */
5735 res = ast_translator_best_choice(cap_native, cap_set, &best_native_fmt, &best_set_fmt);
5736 }
5737 if (res < 0) {
5738 struct ast_str *codec_native = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);
5739 struct ast_str *codec_set = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);
5740
5741 ast_format_cap_get_names(cap_native, &codec_native);
5742 ast_channel_unlock(chan);
5743 ast_format_cap_get_names(cap_set, &codec_set);
5744
5745 ast_log(LOG_WARNING, "Unable to find a codec translation path: %s -> %s\n",
5746 ast_str_buffer(direction ? codec_set : codec_native),
5747 ast_str_buffer(direction ? codec_native : codec_set));
5748 return -1;
5749 }
5750
5751 /* Now we have a good choice for both. */
5752 trans_pvt = access->get_trans(chan);
5753 if ((ast_format_cmp(rawformat, best_native_fmt) != AST_FORMAT_CMP_NOT_EQUAL) &&
5754 (ast_format_cmp(format, best_set_fmt) != AST_FORMAT_CMP_NOT_EQUAL) &&
5755 ((ast_format_cmp(rawformat, format) != AST_FORMAT_CMP_NOT_EQUAL) || access->get_trans(chan))) {
5756 /* the channel is already in these formats, so nothing to do, unless the interleaved format is not set correctly */
5757 if (trans_pvt != NULL) {
5758 if (trans_pvt->interleaved_stereo == interleaved_stereo) {
5759 ast_channel_unlock(chan);
5760 return 0;
5761 }
5762 }
5763 }
5764
5765 /* Free any translation we have right now */
5766 if (trans_pvt) {
5767 ast_translator_free_path(trans_pvt);
5768 access->set_trans(chan, NULL);
5769 }
5770
5771 /* Build a translation path from the raw format to the desired format */
5772 if (ast_format_cmp(best_set_fmt, best_native_fmt) != AST_FORMAT_CMP_NOT_EQUAL) {
5773 /*
5774 * If we were able to swap the native format to the format that
5775 * has been requested, then there is no need to try to build
5776 * a translation path.
5777 */
5778 res = 0;
5779 } else {
5780 if (!direction) {
5781 /* reading */
5782 trans_pvt = ast_translator_build_path(best_set_fmt, best_native_fmt);
5783 if (trans_pvt) {
5784 trans_pvt->interleaved_stereo = 0;
5785 }
5786 } else {
5787 /* writing */
5788 trans_pvt = ast_translator_build_path(best_native_fmt, best_set_fmt);
5789 if (trans_pvt) {
5790 trans_pvt->interleaved_stereo = interleaved_stereo;
5791 }
5792 }
5793 access->set_trans(chan, trans_pvt);
5794 res = trans_pvt ? 0 : -1;
5795 }
5796
5797 if (!res) {
5798 access->set_format(chan, best_set_fmt);
5799 access->set_rawformat(chan, best_native_fmt);
5800
5801 ast_debug(1, "Channel %s setting %s format path: %s -> %s\n",
5802 ast_channel_name(chan),
5803 access->direction,
5804 ast_format_get_name(direction ? best_set_fmt : best_native_fmt),
5805 ast_format_get_name(direction ? best_native_fmt : best_set_fmt));
5806 }
5807
5808 ast_channel_unlock(chan);
5809
5810 /* If there is a generator on the channel, it needs to know about this
5811 * change if it is the write format. */
5812 if (direction && ast_channel_generatordata(chan)) {
5814 }
5815
5816 return res;
5817}
5818
5819int ast_set_read_format(struct ast_channel *chan, struct ast_format *format)
5820{
5822 int res;
5823
5824 ast_assert(format != NULL);
5825
5826 if (!cap) {
5827 return -1;
5828 }
5829 ast_format_cap_append(cap, format, 0);
5830
5831 res = set_format(chan, cap, 0, 0);
5832
5833 ao2_cleanup(cap);
5834 return res;
5835}
5836
5838{
5839 return set_format(chan, cap, 0, 0);
5840}
5841
5843{
5845 int res;
5846
5847 ast_assert(format != NULL);
5848
5849 if (!cap) {
5850 return -1;
5851 }
5852 ast_format_cap_append(cap, format, 0);
5853
5854 res = set_format(chan, cap, 1, 1);
5855
5856 ao2_cleanup(cap);
5857 return res;
5858}
5859
5860int ast_set_write_format(struct ast_channel *chan, struct ast_format *format)
5861{
5863 int res;
5864
5865 ast_assert(format != NULL);
5866
5867 if (!cap) {
5868 return -1;
5869 }
5870 ast_format_cap_append(cap, format, 0);
5871
5872 res = set_format(chan, cap, 1, 0);
5873
5874 ao2_cleanup(cap);
5875 return res;
5876}
5877
5879{
5880 return set_format(chan, cap, 1, 0);
5881}
5882
5883const char *ast_channel_reason2str(int reason)
5884{
5885 switch (reason) /* the following appear to be the only ones actually returned by request_and_dial */
5886 {
5887 case 0:
5888 return "Call Failure (not BUSY, and not NO_ANSWER, maybe Circuit busy or down?)";
5889 case AST_CONTROL_HANGUP:
5890 return "Hangup";
5891 case AST_CONTROL_RING:
5892 return "Local Ring";
5894 return "Remote end Ringing";
5895 case AST_CONTROL_ANSWER:
5896 return "Remote end has Answered";
5897 case AST_CONTROL_BUSY:
5898 return "Remote end is Busy";
5900 return "Congestion (circuits busy)";
5901 default:
5902 return "Unknown Reason!!";
5903 }
5904}
5905
5906static void handle_cause(int cause, int *outstate)
5907{
5908 if (outstate) {
5909 /* compute error and return */
5910 if (cause == AST_CAUSE_BUSY)
5911 *outstate = AST_CONTROL_BUSY;
5912 else if (cause == AST_CAUSE_CONGESTION)
5913 *outstate = AST_CONTROL_CONGESTION;
5914 else
5915 *outstate = 0;
5916 }
5917}
5918
5919/*!
5920 * \internal
5921 * \brief Helper function to inherit info from parent channel.
5922 *
5923 * \param new_chan Channel inheriting information.
5924 * \param parent Channel new_chan inherits information.
5925 * \param orig Channel being replaced by the call forward channel.
5926 */
5927static void call_forward_inherit(struct ast_channel *new_chan, struct ast_channel *parent, struct ast_channel *orig)
5928{
5930 struct ast_party_redirecting redirecting;
5931
5932 /*
5933 * The parent is not a ZOMBIE or hungup so update it with the
5934 * original channel's redirecting information.
5935 */
5936 ast_party_redirecting_init(&redirecting);
5940 if (ast_channel_redirecting_sub(orig, parent, &redirecting, 0)) {
5941 ast_channel_update_redirecting(parent, &redirecting, NULL);
5942 }
5943 ast_party_redirecting_free(&redirecting);
5944 }
5945
5946 /* Safely inherit variables and datastores from the parent channel. */
5947 ast_channel_lock_both(parent, new_chan);
5948 ast_channel_inherit_variables(parent, new_chan);
5949 ast_channel_datastore_inherit(parent, new_chan);
5951 ast_channel_unlock(new_chan);
5952 ast_channel_unlock(parent);
5953}
5954
5955struct ast_channel *ast_call_forward(struct ast_channel *caller, struct ast_channel *orig, int *timeout, struct ast_format_cap *cap, struct outgoing_helper *oh, int *outstate)
5956{
5957 char tmpchan[256];
5958 char forwarder[AST_CHANNEL_NAME];
5959 struct ast_channel *new_chan = NULL;
5960 char *data, *type;
5961 int cause = 0;
5962 int res;
5963
5964 /* gather data and request the new forward channel */
5965 ast_copy_string(tmpchan, ast_channel_call_forward(orig), sizeof(tmpchan));
5966 ast_copy_string(forwarder, ast_channel_name(orig), sizeof(forwarder));
5967 if ((data = strchr(tmpchan, '/'))) {
5968 *data++ = '\0';
5969 type = tmpchan;
5970 } else {
5971 const char *forward_context;
5972 ast_channel_lock(orig);
5973 forward_context = pbx_builtin_getvar_helper(orig, "FORWARD_CONTEXT");
5974 snprintf(tmpchan, sizeof(tmpchan), "%s@%s", ast_channel_call_forward(orig), S_OR(forward_context, ast_channel_context(orig)));
5975 ast_channel_unlock(orig);
5976 data = tmpchan;
5977 type = "Local";
5978 }
5979 if (!(new_chan = ast_request(type, cap, NULL, orig, data, &cause))) {
5980 ast_log(LOG_NOTICE, "Unable to create channel for call forward to '%s/%s' (cause = %d)\n", type, data, cause);
5981 handle_cause(cause, outstate);
5982 ast_hangup(orig);
5983 return NULL;
5984 }
5985
5986 /* Copy/inherit important information into new channel */
5987 if (oh) {
5988 if (oh->vars) {
5989 ast_channel_lock(new_chan);
5990 ast_set_variables(new_chan, oh->vars);
5991 ast_channel_unlock(new_chan);
5992 }
5993 if (oh->parent_channel) {
5994 call_forward_inherit(new_chan, oh->parent_channel, orig);
5995 }
5996 if (!ast_strlen_zero(oh->account)) {
5997 ast_channel_lock(new_chan);
5999 ast_channel_accountcode_set(new_chan, oh->account);
6000 ast_channel_peeraccount_set(new_chan, oh->account);
6002 ast_channel_unlock(new_chan);
6003 }
6004 } else if (caller) { /* no outgoing helper so use caller if available */
6005 call_forward_inherit(new_chan, caller, orig);
6006 }
6007
6008 ast_channel_lock_both(orig, new_chan);
6010 pbx_builtin_setvar_helper(new_chan, "FORWARDERNAME", forwarder);
6014 ast_channel_unlock(new_chan);
6015 ast_channel_unlock(orig);
6016
6017 /* call new channel */
6018 res = ast_call(new_chan, data, 0);
6019 if (timeout) {
6020 *timeout = res;
6021 }
6022 if (res) {
6023 ast_log(LOG_NOTICE, "Unable to call forward to channel %s/%s\n", type, (char *)data);
6024 ast_hangup(orig);
6025 ast_hangup(new_chan);
6026 return NULL;
6027 }
6028 ast_hangup(orig);
6029
6030 return new_chan;
6031}
6032
6033struct ast_channel *__ast_request_and_dial(const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *addr, int timeout, int *outstate, const char *cid_num, const char *cid_name, struct outgoing_helper *oh)
6034{
6035 int dummy_outstate;
6036 int cause = 0;
6037 struct ast_channel *chan;
6038 int res = 0;
6039 int last_subclass = 0;
6041
6042 if (outstate)
6043 *outstate = 0;
6044 else
6045 outstate = &dummy_outstate; /* make outstate always a valid pointer */
6046
6047 chan = ast_request(type, cap, assignedids, requestor, addr, &cause);
6048 if (!chan) {
6049 ast_log(LOG_NOTICE, "Unable to request channel %s/%s\n", type, addr);
6050 handle_cause(cause, outstate);
6051 return NULL;
6052 }
6053
6054 if (oh) {
6055 if (oh->vars) {
6056 ast_channel_lock(chan);
6057 ast_set_variables(chan, oh->vars);
6058 ast_channel_unlock(chan);
6059 }
6060 if (!ast_strlen_zero(oh->cid_num) && !ast_strlen_zero(oh->cid_name)) {
6061 /*
6062 * Use the oh values instead of the function parameters for the
6063 * outgoing CallerID.
6064 */
6065 cid_num = oh->cid_num;
6066 cid_name = oh->cid_name;
6067 }
6068 if (oh->parent_channel) {
6069 /* Safely inherit variables and datastores from the parent channel. */
6075 ast_channel_unlock(chan);
6076 }
6077 if (!ast_strlen_zero(oh->account)) {
6078 ast_channel_lock(chan);
6080 ast_channel_accountcode_set(chan, oh->account);
6081 ast_channel_peeraccount_set(chan, oh->account);
6083 ast_channel_unlock(chan);
6084 }
6085 }
6086
6087 /*
6088 * It seems strange to set the CallerID on an outgoing call leg
6089 * to whom we are calling, but this function's callers are doing
6090 * various Originate methods. This call leg goes to the local
6091 * user. Once the local user answers, the dialplan needs to be
6092 * able to access the CallerID from the CALLERID function as if
6093 * the local user had placed this call.
6094 */
6095 ast_set_callerid(chan, cid_num, cid_name, cid_num);
6096
6097 ast_channel_lock(chan);
6099 ast_channel_unlock(chan);
6101 if (cid_num) {
6102 connected.id.number.valid = 1;
6103 connected.id.number.str = (char *) cid_num;
6105 }
6106 if (cid_name) {
6107 connected.id.name.valid = 1;
6108 connected.id.name.str = (char *) cid_name;
6110 }
6112 if (requestor) {
6113 ast_channel_lock_both(chan, (struct ast_channel *) requestor);
6115 ast_channel_unlock(chan);
6116 ast_channel_unlock((struct ast_channel *) requestor);
6117 }
6118
6119 if (ast_call(chan, addr, 0)) { /* ast_call failed... */
6120 ast_log(LOG_NOTICE, "Unable to call channel %s/%s\n", type, addr);
6121 } else {
6122 struct timeval start = ast_tvnow();
6123 res = 1; /* mark success in case chan->_state is already AST_STATE_UP */
6124 while (timeout && ast_channel_state(chan) != AST_STATE_UP) {
6125 struct ast_frame *f;
6126 int ms = ast_remaining_ms(start, timeout);
6127
6128 res = ast_waitfor(chan, ms);
6129 if (res == 0) { /* timeout, treat it like ringing */
6130 *outstate = AST_CONTROL_RINGING;
6131 break;
6132 }
6133 if (res < 0) /* error or done */
6134 break;
6136 if (!(chan = ast_call_forward(NULL, chan, NULL, cap, oh, outstate))) {
6137 return NULL;
6138 }
6139 continue;
6140 }
6141
6142 f = ast_read(chan);
6143 if (!f) {
6144 *outstate = AST_CONTROL_HANGUP;
6145 res = 0;
6146 break;
6147 }
6148 if (f->frametype == AST_FRAME_CONTROL) {
6149 switch (f->subclass.integer) {
6150 case AST_CONTROL_RINGING: /* record but keep going */
6151 *outstate = f->subclass.integer;
6152 break;
6153
6154 case AST_CONTROL_BUSY:
6155 *outstate = f->subclass.integer;
6156 timeout = 0;
6157 break;
6158
6160 *outstate = AST_CONTROL_CONGESTION;
6161 timeout = 0;
6162 break;
6163
6165 *outstate = f->subclass.integer;
6166 timeout = 0;
6167 break;
6168
6169 case AST_CONTROL_ANSWER:
6170 *outstate = f->subclass.integer;
6171 timeout = 0; /* trick to force exit from the while() */
6172 break;
6173
6176 break;
6177
6179 if (oh && oh->connect_on_early_media) {
6180 *outstate = f->subclass.integer;
6181 timeout = 0; /* trick to force exit from the while() */
6182 break;
6183 }
6184 /* Fallthrough */
6185 /* Ignore these */
6187 case AST_CONTROL_HOLD:
6188 case AST_CONTROL_UNHOLD:
6194 case AST_CONTROL_CC:
6195 case -1: /* Ignore -- just stopping indications */
6196 break;
6197
6198 default:
6199 ast_log(LOG_NOTICE, "Don't know what to do with control frame %d\n", f->subclass.integer);
6200 }
6201 last_subclass = f->subclass.integer;
6202 }
6203 ast_frfree(f);
6204 }
6205 }
6206
6207 /* Final fixups */
6208 if (oh) {
6209 if (!ast_strlen_zero(oh->context))
6211 if (!ast_strlen_zero(oh->exten))
6212 ast_channel_exten_set(chan, oh->exten);
6213 if (oh->priority)
6215 }
6216 if (ast_channel_state(chan) == AST_STATE_UP)
6217 *outstate = AST_CONTROL_ANSWER;
6218
6219 if (res <= 0) {
6220 ast_channel_lock(chan);
6221 if (AST_CONTROL_RINGING == last_subclass) {
6223 }
6224 ast_channel_unlock(chan);
6225 ast_hangup(chan);
6226 chan = NULL;
6227 }
6228 return chan;
6229}
6230
6231struct ast_channel *ast_request_and_dial(const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *addr, int timeout, int *outstate, const char *cidnum, const char *cidname)
6232{
6233 return __ast_request_and_dial(type, cap, assignedids, requestor, addr, timeout, outstate, cidnum, cidname, NULL);
6234}
6235
6236static int set_security_requirements(const struct ast_channel *requestor, struct ast_channel *out)
6237{
6238 int ops[2][2] = {
6241 };
6242 int i;
6243 struct ast_channel *r = (struct ast_channel *) requestor; /* UGLY */
6244 struct ast_datastore *ds;
6245
6246 if (!requestor || !out) {
6247 return 0;
6248 }
6249
6252 struct ast_secure_call_store *encrypt = ds->data;
6253 ops[0][1] = encrypt->signaling;
6254 ops[1][1] = encrypt->media;
6255 } else {
6257 return 0;
6258 }
6260
6261 for (i = 0; i < 2; i++) {
6262 if (ops[i][1]) {
6263 if (ast_channel_setoption(out, ops[i][0], &ops[i][1], sizeof(ops[i][1]), 0)) {
6264 /* We require a security feature, but the channel won't provide it */
6265 return -1;
6266 }
6267 } else {
6268 /* We don't care if we can't clear the option on a channel that doesn't support it */
6269 ast_channel_setoption(out, ops[i][0], &ops[i][1], sizeof(ops[i][1]), 0);
6270 }
6271 }
6272
6273 return 0;
6274}
6275
6276static struct ast_channel *request_channel(const char *type, struct ast_format_cap *request_cap, struct ast_stream_topology *topology,
6277 const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *addr, int *cause)
6278{
6279 struct chanlist *chan;
6280 struct ast_channel *c = NULL;
6281 int res;
6282 int foo;
6283
6284 if (!cause)
6285 cause = &foo;
6286 *cause = AST_CAUSE_NOTDEFINED;
6287
6289 ast_log(LOG_WARNING, "Unable to lock technology backend list\n");
6290 return NULL;
6291 }
6292
6293 AST_RWLIST_TRAVERSE(&backends, chan, list) {
6294 if (strcasecmp(type, chan->tech->type)) {
6295 continue;
6296 }
6297
6298 break;
6299 }
6300
6302
6303 if (!chan) {
6304 ast_log(LOG_WARNING, "No channel type registered for '%s'\n", type);
6305 *cause = AST_CAUSE_NOSUCHDRIVER;
6306 return NULL;
6307 }
6308
6309 /* Allow either format capabilities or stream topology to be provided and adapt */
6310 if (chan->tech->requester_with_stream_topology) {
6311 struct ast_stream_topology *tmp_converted_topology = NULL;
6312
6313 if (!topology && request_cap) {
6314 /* Turn the requested capabilities into a stream topology */
6315 topology = tmp_converted_topology = ast_stream_topology_create_from_format_cap(request_cap);
6316 }
6317
6318 c = chan->tech->requester_with_stream_topology(type, topology, assignedids, requestor, addr, cause);
6319
6320 ast_stream_topology_free(tmp_converted_topology);
6321 } else if (chan->tech->requester) {
6322 struct ast_format_cap *tmp_converted_cap = NULL;
6323 struct ast_format_cap *tmp_cap;
6324 RAII_VAR(struct ast_format *, tmp_fmt, NULL, ao2_cleanup);
6325 RAII_VAR(struct ast_format *, best_audio_fmt, NULL, ao2_cleanup);
6326 struct ast_format_cap *joint_cap;
6327
6328 if (!request_cap && topology) {
6329 /* Turn the request stream topology into capabilities */
6330 request_cap = tmp_converted_cap = ast_stream_topology_get_formats(topology);
6331 }
6332
6333 /* find the best audio format to use */
6335 if (!tmp_cap) {
6337 return NULL;
6338 }
6339
6341 if (!ast_format_cap_empty(tmp_cap)) {
6342 /* We have audio - is it possible to connect the various calls to each other?
6343 (Avoid this check for calls without audio, like text+video calls)
6344 */
6345 res = ast_translator_best_choice(tmp_cap, chan->tech->capabilities, &tmp_fmt, &best_audio_fmt);
6346 ao2_ref(tmp_cap, -1);
6347 if (res < 0) {
6348 struct ast_str *tech_codecs = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);
6349 struct ast_str *request_codecs = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);
6350
6351 ast_log(LOG_WARNING, "No translator path exists for channel type %s (native %s) to %s\n", type,
6352 ast_format_cap_get_names(chan->tech->capabilities, &tech_codecs),
6353 ast_format_cap_get_names(request_cap, &request_codecs));
6355 ao2_cleanup(tmp_converted_cap);
6356 return NULL;
6357 }
6358 }
6359
6360 /* XXX Only the audio format calculated as being the best for translation
6361 * purposes is used for the request. This is because we don't have the ability
6362 * to signal to the initiator which one of their codecs that was offered is
6363 * the one that was selected, particularly in a chain of Local channels.
6364 */
6366 if (!joint_cap) {
6367 ao2_cleanup(tmp_converted_cap);
6368 return NULL;
6369 }
6372 if (best_audio_fmt) { /* text+video call? then, this is NULL */
6373 ast_format_cap_append(joint_cap, best_audio_fmt, 0);
6374 }
6375 ao2_cleanup(tmp_converted_cap);
6376
6377 c = chan->tech->requester(type, joint_cap, assignedids, requestor, addr, cause);
6378 ao2_ref(joint_cap, -1);
6379 }
6380
6381 if (!c) {
6382 return NULL;
6383 }
6384
6385 if (requestor) {
6386 ast_callid callid;
6387
6388 ast_channel_lock_both(c, (struct ast_channel *) requestor);
6389
6390 /* Set the newly created channel's callid to the same as the requestor. */
6391 callid = ast_channel_callid(requestor);
6392 if (callid) {
6393 ast_channel_callid_set(c, callid);
6394 }
6395
6397 ast_channel_unlock((struct ast_channel *) requestor);
6398 }
6399
6400 if (set_security_requirements(requestor, c)) {
6401 ast_log(LOG_WARNING, "Setting security requirements failed\n");
6402 ast_hangup(c);
6404 return NULL;
6405 }
6406
6407 /* no need to generate a Newchannel event here; it is done in the channel_alloc call */
6408 return c;
6409}
6410
6411struct ast_channel *ast_request(const char *type, struct ast_format_cap *request_cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *addr, int *cause)
6412{
6413 return request_channel(type, request_cap, NULL, assignedids, requestor, addr, cause);
6414}
6415
6416struct ast_channel *ast_request_with_stream_topology(const char *type, struct ast_stream_topology *topology, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *addr, int *cause)
6417{
6418 return request_channel(type, NULL, topology, assignedids, requestor, addr, cause);
6419}
6420
6421/*!
6422 * \internal
6423 * \brief Setup new channel accountcodes from the requestor channel after ast_request().
6424 * \since 13.0.0
6425 *
6426 * \param chan New channel to get accountcodes setup.
6427 * \param requestor Requesting channel to get accountcodes from.
6428 * \param relationship What the new channel was created for.
6429 * \param precious TRUE if pre-existing accountcodes on chan will not be overwritten.
6430 *
6431 * \pre The chan and requestor channels are already locked.
6432 */
6433static void channel_req_accountcodes(struct ast_channel *chan, const struct ast_channel *requestor, enum ast_channel_requestor_relationship relationship, int precious)
6434{
6435 /*
6436 * The primary reason for the existence of this function is
6437 * so local channels can propagate accountcodes to the ;2
6438 * channel before ast_call().
6439 *
6440 * The secondary reason is to propagate the CHANNEL(peeraccount)
6441 * value set before Dial, FollowMe, and Queue while maintaining
6442 * the historic straight across accountcode propagation as a
6443 * fallback.
6444 */
6445 switch (relationship) {
6447 /* Crossover the requestor's accountcode and peeraccount */
6448 if (!precious || ast_strlen_zero(ast_channel_accountcode(chan))) {
6449 /*
6450 * The newly created channel does not have an accountcode
6451 * or we don't care.
6452 */
6453 if (!ast_strlen_zero(ast_channel_peeraccount(requestor))) {
6454 /*
6455 * Set it to the requestor's peeraccount. This allows the
6456 * dialplan to indicate the accountcode to use when dialing
6457 * by setting CHANNEL(peeraccount).
6458 */
6459 ast_channel_accountcode_set(chan, ast_channel_peeraccount(requestor));
6460 } else if (!precious
6461 && !ast_strlen_zero(ast_channel_accountcode(requestor))) {
6462 /*
6463 * Fallback to the historic propagation and set it to the
6464 * requestor's accountcode.
6465 */
6466 ast_channel_accountcode_set(chan, ast_channel_accountcode(requestor));
6467 }
6468 }
6469 if (!ast_strlen_zero(ast_channel_accountcode(requestor))) {
6470 ast_channel_peeraccount_set(chan, ast_channel_accountcode(requestor));
6471 }
6472 break;
6474 /* Pass the requestor's accountcode and peeraccount straight. */
6475 if (!precious || ast_strlen_zero(ast_channel_accountcode(chan))) {
6476 /*
6477 * The newly created channel does not have an accountcode
6478 * or we don't care.
6479 */
6480 if (!ast_strlen_zero(ast_channel_accountcode(requestor))) {
6481 ast_channel_accountcode_set(chan, ast_channel_accountcode(requestor));
6482 }
6483 }
6484 if (!ast_strlen_zero(ast_channel_peeraccount(requestor))) {
6485 ast_channel_peeraccount_set(chan, ast_channel_peeraccount(requestor));
6486 }
6487 break;
6488 }
6489}
6490
6491void ast_channel_req_accountcodes(struct ast_channel *chan, const struct ast_channel *requestor, enum ast_channel_requestor_relationship relationship)
6492{
6493 channel_req_accountcodes(chan, requestor, relationship, 0);
6494}
6495
6496void ast_channel_req_accountcodes_precious(struct ast_channel *chan, const struct ast_channel *requestor, enum ast_channel_requestor_relationship relationship)
6497{
6498 channel_req_accountcodes(chan, requestor, relationship, 1);
6499}
6500
6501int ast_pre_call(struct ast_channel *chan, const char *sub_args)
6502{
6503 int (*pre_call)(struct ast_channel *chan, const char *sub_args);
6504
6505 ast_channel_lock(chan);
6506 pre_call = ast_channel_tech(chan)->pre_call;
6507 if (pre_call) {
6508 int res;
6509
6510 res = pre_call(chan, sub_args);
6511 ast_channel_unlock(chan);
6512 return res;
6513 }
6514 ast_channel_unlock(chan);
6515 return ast_app_exec_sub(NULL, chan, sub_args, 0);
6516}
6517
6518int ast_call(struct ast_channel *chan, const char *addr, int timeout)
6519{
6520 /* Place an outgoing call, but don't wait any longer than timeout ms before returning.
6521 If the remote end does not answer within the timeout, then do NOT hang up, but
6522 return anyway. */
6523 int res = -1;
6524 /* Stop if we're a zombie or need a soft hangup */
6525 ast_channel_lock(chan);
6527 if (ast_channel_tech(chan)->call)
6528 res = ast_channel_tech(chan)->call(chan, addr, timeout);
6530 }
6531 ast_channel_unlock(chan);
6532 return res;
6533}
6534
6535/*!
6536 \brief Transfer a call to dest, if the channel supports transfer
6537
6538 Called by:
6539 \arg app_transfer
6540 \arg the manager interface
6541*/
6542int ast_transfer(struct ast_channel *chan, char *dest)
6543{
6544 int protocol;
6545 return ast_transfer_protocol(chan, dest, &protocol);
6546}
6547
6548/*!
6549 \brief Transfer a call to dest, if the channel supports transfer
6550
6551 Called by:
6552 \arg app_transfer
6553 \arg the manager interface
6554*/
6555int ast_transfer_protocol(struct ast_channel *chan, char *dest, int *protocol)
6556{
6557 int res = -1;
6558
6559 if (protocol) {
6560 *protocol = 0;
6561 }
6562
6563 /* Stop if we're a zombie or need a soft hangup */
6564 ast_channel_lock(chan);
6566 if (ast_channel_tech(chan)->transfer) {
6567 res = ast_channel_tech(chan)->transfer(chan, dest);
6568 if (!res)
6569 res = 1;
6570 } else
6571 res = 0;
6572 }
6573 ast_channel_unlock(chan);
6574
6575 if (res <= 0) {
6576 return res;
6577 }
6578
6579 for (;;) {
6580 struct ast_frame *fr;
6581
6582 res = ast_waitfor(chan, -1);
6583
6584 if (res < 0 || !(fr = ast_read(chan))) {
6585 res = -1;
6586 break;
6587 }
6588
6591
6592 if (*message == AST_TRANSFER_SUCCESS) {
6593 res = 1;
6594 } else {
6595 res = -1;
6596 /* Message can contain a protocol specific code
6597 AST_TRANSFER_SUCCESS indicates success
6598 Else, failure. Protocol will be set to the failure reason.
6599 SIP example, 0 is success, else error code 3xx-6xx */
6600 if (protocol) {
6601 *protocol = *message;
6602 }
6603 }
6604
6605 ast_frfree(fr);
6606 break;
6607 }
6608
6609 ast_frfree(fr);
6610 }
6611
6612 return res;
6613}
6614
6615int ast_readstring(struct ast_channel *c, char *s, int len, int timeout, int ftimeout, char *enders)
6616{
6617 return ast_readstring_full(c, s, len, timeout, ftimeout, enders, -1, -1);
6618}
6619
6620int ast_readstring_full(struct ast_channel *c, char *s, int len, int timeout, int ftimeout, char *enders, int audiofd, int ctrlfd)
6621{
6622 int pos = 0; /* index in the buffer where we accumulate digits */
6623 int to = ftimeout;
6624
6625 struct ast_silence_generator *silgen = NULL;
6626
6627 /* Stop if we're a zombie or need a soft hangup */
6629 return -1;
6630 if (!len)
6631 return -1;
6632 for (;;) {
6633 int d;
6634 if (ast_channel_stream(c)) {
6635 d = ast_waitstream_full(c, AST_DIGIT_ANY, audiofd, ctrlfd);
6637 if (!silgen && ast_opt_transmit_silence)
6639 usleep(1000);
6640 if (!d)
6641 d = ast_waitfordigit_full(c, to, NULL, audiofd, ctrlfd);
6642 } else {
6643 if (!silgen && ast_opt_transmit_silence)
6645 d = ast_waitfordigit_full(c, to, NULL, audiofd, ctrlfd);
6646 }
6647 if (d < 0) {
6649 return AST_GETDATA_FAILED;
6650 }
6651 if (d == 0) {
6652 s[pos] = '\0';
6654 return AST_GETDATA_TIMEOUT;
6655 }
6656 if (d == 1) {
6657 s[pos] = '\0';
6660 }
6661 if (strchr(enders, d) && (pos == 0)) {
6662 s[pos] = '\0';
6665 }
6666 if (!strchr(enders, d)) {
6667 s[pos++] = d;
6668 }
6669 if (strchr(enders, d) || (pos >= len)) {
6670 s[pos] = '\0';
6672 return AST_GETDATA_COMPLETE;
6673 }
6674 to = timeout;
6675 }
6676 /* Never reached */
6677 return 0;
6678}
6679
6681{
6682 return (ast_channel_tech(chan)->send_html) ? 1 : 0;
6683}
6684
6685int ast_channel_sendhtml(struct ast_channel *chan, int subclass, const char *data, int datalen)
6686{
6687 if (ast_channel_tech(chan)->send_html)
6688 return ast_channel_tech(chan)->send_html(chan, subclass, data, datalen);
6689 return -1;
6690}
6691
6692int ast_channel_sendurl(struct ast_channel *chan, const char *url)
6693{
6694 return ast_channel_sendhtml(chan, AST_HTML_URL, url, strlen(url) + 1);
6695}
6696
6697/*! \brief Set up translation from one channel to another */
6699{
6700 struct ast_format_cap *src_cap;
6701 struct ast_format_cap *dst_cap;
6702 RAII_VAR(struct ast_format *, best_src_fmt, NULL, ao2_cleanup);
6703 RAII_VAR(struct ast_format *, best_dst_fmt, NULL, ao2_cleanup);
6704 int no_path;
6705
6706 /*
6707 * We cannot short circuit this code because it is possible to ask
6708 * to make compatible two channels that are "compatible" because
6709 * they already have translation paths setup but together make for
6710 * a sub-optimal path. e.g., The From channel has g722 -> ulaw
6711 * and the To channel has ulaw -> g722. They are "compatible" but
6712 * together the translations are unnecessary and the audio loses
6713 * fidelity in the process.
6714 */
6715
6716 ast_channel_lock_both(from, to);
6717
6718 src_cap = ast_channel_nativeformats(from); /* shallow copy, do not destroy */
6719 dst_cap = ast_channel_nativeformats(to); /* shallow copy, do not destroy */
6720
6721 /* If there's no audio in this call, don't bother with trying to find a translation path */
6725 ast_channel_unlock(from);
6726 return 0;
6727 }
6728
6729 no_path = ast_translator_best_choice(dst_cap, src_cap, &best_dst_fmt, &best_src_fmt);
6730
6732 ast_channel_unlock(from);
6733
6734 if (no_path) {
6735 ast_log(LOG_WARNING, "No path to translate from %s to %s\n",
6737 return -1;
6738 }
6739
6740 /* if the best path is not 'pass through', then
6741 * transcoding is needed; if desired, force transcode path
6742 * to use SLINEAR between channels, but only if there is
6743 * no direct conversion available. If generic PLC is
6744 * desired, then transcoding via SLINEAR is a requirement
6745 * even if the formats are the same.
6746 */
6748 || (ast_format_cmp(best_dst_fmt, best_src_fmt) == AST_FORMAT_CMP_NOT_EQUAL
6750
6751 int use_slin = (ast_format_cache_is_slinear(best_src_fmt)
6752 || ast_format_cache_is_slinear(best_dst_fmt))
6754
6755 if (use_slin || ast_translate_path_steps(best_dst_fmt, best_src_fmt) != 1) {
6756 int best_sample_rate = (ast_format_get_sample_rate(best_src_fmt) > ast_format_get_sample_rate(best_dst_fmt)) ?
6757 ast_format_get_sample_rate(best_src_fmt) : ast_format_get_sample_rate(best_dst_fmt);
6758
6759 /* pick the best signed linear format based upon what preserves the sample rate the best. */
6760 ao2_replace(best_src_fmt, ast_format_cache_get_slin_by_rate(best_sample_rate));
6761 }
6762 }
6763
6764 if (ast_set_read_format(from, best_src_fmt)) {
6765 ast_log(LOG_WARNING, "Unable to set read format on channel %s to %s\n",
6766 ast_channel_name(from), ast_format_get_name(best_src_fmt));
6767 return -1;
6768 }
6769 if (ast_set_write_format(to, best_src_fmt)) {
6770 ast_log(LOG_WARNING, "Unable to set write format on channel %s to %s\n",
6771 ast_channel_name(to), ast_format_get_name(best_src_fmt));
6772 return -1;
6773 }
6774 return 0;
6775}
6776
6778{
6779 /*
6780 * Set up translation from the peer to the chan first in case we
6781 * need to hear any in-band tones and the other direction fails.
6782 */
6783 if (ast_channel_make_compatible_helper(peer, chan)) {
6784 return -1;
6785 }
6786
6787 /* Set up translation from the chan to the peer */
6788 if (ast_channel_make_compatible_helper(chan, peer)) {
6789 return -1;
6790 }
6791
6792 return 0;
6793}
6794
6795/*! \brief this function simply changes the name of the channel and issues a manager_event
6796 * with out unlinking and linking the channel from the ao2_container. This should
6797 * only be used when the channel has already been unlinked from the ao2_container.
6798 */
6799static void __ast_change_name_nolink(struct ast_channel *chan, const char *newname)
6800{
6801 /*** DOCUMENTATION
6802 <managerEvent language="en_US" name="Rename">
6803 <managerEventInstance class="EVENT_FLAG_CALL">
6804 <since>
6805 <version>16.24.0</version>
6806 <version>18.10.0</version>
6807 <version>19.2.0</version>
6808 </since>
6809 <synopsis>Raised when the name of a channel is changed.</synopsis>
6810 </managerEventInstance>
6811 </managerEvent>
6812 ***/
6813 ast_manager_event(chan, EVENT_FLAG_CALL, "Rename",
6814 "Channel: %s\r\n"
6815 "Newname: %s\r\n"
6816 "Uniqueid: %s\r\n",
6817 ast_channel_name(chan), newname, ast_channel_uniqueid(chan));
6818 ast_channel_name_set(chan, newname);
6819}
6820
6821void ast_change_name(struct ast_channel *chan, const char *newname)
6822{
6823 /* We must re-link, as the hash value will change here. */
6825 ast_channel_lock(chan);
6827 __ast_change_name_nolink(chan, newname);
6829 ast_channel_unlock(chan);
6831}
6832
6833void ast_channel_inherit_variables(const struct ast_channel *parent, struct ast_channel *child)
6834{
6835 struct ast_var_t *current;
6836 struct ast_var_t *newvar;
6837 const char *varname;
6838 int vartype;
6839
6841 varname = ast_var_full_name(current);
6842 if (!varname) {
6843 continue;
6844 }
6845
6846 vartype = 0;
6847 if (varname[0] == '_') {
6848 vartype = 1;
6849 if (varname[1] == '_') {
6850 vartype = 2;
6851 }
6852 }
6853
6854 switch (vartype) {
6855 case 1:
6856 newvar = ast_var_assign(&varname[1], ast_var_value(current));
6857 break;
6858 case 2:
6859 newvar = ast_var_assign(varname, ast_var_value(current));
6860 break;
6861 default:
6862 continue;
6863 }
6864 if (newvar) {
6865 ast_debug(1, "Inheriting variable %s from %s to %s.\n",
6866 ast_var_full_name(newvar), ast_channel_name(parent),
6867 ast_channel_name(child));
6870 ast_var_value(newvar));
6871 }
6872 }
6873}
6874
6875/*!
6876 \brief Clone channel variables from 'clone' channel into 'original' channel
6877
6878 All variables except those related to app_groupcount are cloned.
6879 Variables are actually _removed_ from 'clone' channel, presumably
6880 because it will subsequently be destroyed.
6881
6882 \note Assumes locks will be in place on both channels when called.
6883*/
6884static void clone_variables(struct ast_channel *original, struct ast_channel *clonechan)
6885{
6886 struct ast_var_t *current, *newvar;
6887 /* Append variables from clone channel into original channel */
6888 /* XXX Is this always correct? We have to in order to keep MACROS working XXX */
6890
6891 /* then, dup the varshead list into the clone */
6892
6894 newvar = ast_var_assign(current->name, current->value);
6895 if (newvar)
6897 }
6898}
6899
6900
6901void ast_channel_name_to_dial_string(char *channel_name)
6902{
6903 char *dash;
6904
6905 /* Truncate after the dash */
6906 dash = strrchr(channel_name, '-');
6907 if (dash) {
6908 *dash = '\0';
6909 }
6910}
6911
6912/*!
6913 * \brief Masquerade a channel
6914 *
6915 * \note Assumes _NO_ channels and _NO_ channel pvt's are locked. If a channel is locked while calling
6916 * this function, it invalidates our channel container locking order. All channels
6917 * must be unlocked before it is permissible to lock the channels' ao2 container.
6918 */
6919static void channel_do_masquerade(struct ast_channel *original, struct ast_channel *clonechan)
6920{
6921 int x;
6922 int origstate;
6923 unsigned int orig_disablestatecache;
6924 unsigned int clone_disablestatecache;
6925 int visible_indication;
6926 int clone_hold_state;
6927 int moh_is_playing;
6928 struct ast_frame *current;
6929 const struct ast_channel_tech *t;
6930 void *t_pvt;
6931 union {
6933 struct ast_party_dialed dialed;
6934 struct ast_party_caller caller;
6936 struct ast_party_redirecting redirecting;
6937 } exchange;
6938 struct ast_channel *bridged;
6939 struct ast_format *rformat;
6940 struct ast_format *wformat;
6941 struct ast_format *tmp_format;
6942 struct ast_format_cap *tmp_cap;
6943 char tmp_name[AST_CHANNEL_NAME];
6944 char clone_sending_dtmf_digit;
6945 struct timeval clone_sending_dtmf_tv;
6946
6947 ast_debug(3, "Masquerading %s(%u) into the structure of %s(%u)\n",
6948 ast_channel_name(clonechan), ast_channel_state(clonechan),
6949 ast_channel_name(original), ast_channel_state(original));
6950 /* XXX This operation is a bit odd. We're essentially putting the guts of
6951 * the clone channel into the original channel. Start by killing off the
6952 * original channel's backend. While the features are nice, which is the
6953 * reason we're keeping it, it's still awesomely weird. XXX */
6954
6955 /* Indicate to each channel that a masquerade is about to begin. */
6956 x = 1;
6957 ast_indicate_data(original, AST_CONTROL_MASQUERADE_NOTIFY, &x, sizeof(x));
6958 ast_indicate_data(clonechan, AST_CONTROL_MASQUERADE_NOTIFY, &x, sizeof(x));
6959
6960 /*
6961 * The container lock is necessary for proper locking order
6962 * because the channels must be unlinked to change their
6963 * names.
6964 *
6965 * The original and clonechan locks must be held while the
6966 * channel contents are shuffled around for the masquerade.
6967 *
6968 * The masq and masqr pointers need to be left alone until the masquerade
6969 * has restabilized the channels to hold off ast_hangup() and until
6970 * AST_FLAG_ZOMBIE can be set on the clonechan.
6971 */
6973
6974 /* Bump the refs to ensure that they won't disappear on us. */
6975 ast_channel_ref(original);
6976 ast_channel_ref(clonechan);
6977
6978 /*
6979 * Since channel name and unique id will change, and both could be keys
6980 * in the channel storage backend, we need to remove them from the backend.
6981 * We'll add them back in after the changes are compete.
6982 */
6985
6987
6988 moh_is_playing = ast_test_flag(ast_channel_flags(original), AST_FLAG_MOH);
6989 if (moh_is_playing) {
6990 /* Stop MOH on the old original channel. */
6991 ast_moh_stop(original);
6992 }
6993
6994 /*
6995 * Stop any visible indication on the original channel so we can
6996 * transfer it to the clonechan taking the original's place.
6997 */
6998 ast_channel_lock(original);
6999 visible_indication = ast_channel_visible_indication(original);
7000 ast_channel_unlock(original);
7001 ast_indicate(original, -1);
7002
7003 /* Start the masquerade channel contents rearrangement. */
7004 ast_channel_lock_both(original, clonechan);
7005
7006 ast_debug(1, "Actually Masquerading %s(%u) into the structure of %s(%u)\n",
7007 ast_channel_name(clonechan), ast_channel_state(clonechan),
7008 ast_channel_name(original), ast_channel_state(original));
7009
7010 /* When all is said and done force new snapshot segments so they are
7011 * up to date.
7012 */
7015
7016 /*
7017 * Remember the original read/write formats. We turn off any
7018 * translation on either one
7019 */
7020 rformat = ao2_bump(ast_channel_readformat(original));
7021 wformat = ao2_bump(ast_channel_writeformat(original));
7022 free_translation(clonechan);
7023 free_translation(original);
7024
7025 clone_hold_state = ast_channel_hold_state(clonechan);
7026
7027 /* Save the current DTMF digit being sent if any. */
7028 clone_sending_dtmf_digit = ast_channel_sending_dtmf_digit(clonechan);
7029 clone_sending_dtmf_tv = ast_channel_sending_dtmf_tv(clonechan);
7030
7031 /* Swap uniqueid's of the channels. This needs to happen before channel renames,
7032 * so rename events get the proper id's.
7033 */
7035
7036 /* Make sure the Stasis topic on the channel is updated appropriately */
7037 ast_channel_internal_swap_topics(clonechan, original);
7038
7039 /* Swap endpoint forward so channel created with endpoint exchanges its state
7040 * with other channel for proper endpoint cleanup.
7041 */
7042 ast_channel_internal_swap_endpoint_forward(clonechan, original);
7043
7044 /* The old snapshots need to follow the channels so the snapshot update is correct */
7045 ast_channel_internal_swap_snapshots(clonechan, original);
7046
7047 /* Now we swap the endpoints if present */
7048 ast_channel_internal_swap_endpoints(clonechan, original);
7049
7050 /* Swap channel names. This uses ast_channel_name_set directly, so we
7051 * don't get any spurious rename events.
7052 */
7053 ast_copy_string(tmp_name, ast_channel_name(clonechan), sizeof(tmp_name));
7054 ast_channel_name_set(clonechan, ast_channel_name(original));
7055 ast_channel_name_set(original, tmp_name);
7056
7057 /* Swap the technologies */
7058 t = ast_channel_tech(original);
7059 ast_channel_tech_set(original, ast_channel_tech(clonechan));
7060 ast_channel_tech_set(clonechan, t);
7061
7062 t_pvt = ast_channel_tech_pvt(original);
7063 ast_channel_tech_pvt_set(original, ast_channel_tech_pvt(clonechan));
7064 ast_channel_tech_pvt_set(clonechan, t_pvt);
7065
7066 /* Swap the alertpipes */
7067 ast_channel_internal_alertpipe_swap(original, clonechan);
7068
7069 /*
7070 * Swap the readq's. The end result should be this:
7071 *
7072 * 1) All frames should be on the new (original) channel.
7073 * 2) Any frames that were already on the new channel before this
7074 * masquerade need to be at the end of the readq, after all of the
7075 * frames on the old (clone) channel.
7076 * 3) The alertpipe needs to get poked for every frame that was already
7077 * on the new channel, since we are now using the alert pipe from the
7078 * old (clone) channel.
7079 */
7080 {
7081 AST_LIST_HEAD_NOLOCK(, ast_frame) tmp_readq;
7082
7083 AST_LIST_HEAD_INIT_NOLOCK(&tmp_readq);
7084 AST_LIST_APPEND_LIST(&tmp_readq, ast_channel_readq(original), frame_list);
7086
7087 while ((current = AST_LIST_REMOVE_HEAD(&tmp_readq, frame_list))) {
7089 if (ast_channel_alert_write(original)) {
7090 ast_log(LOG_WARNING, "write() failed: %s\n", strerror(errno));
7091 }
7092 }
7093 }
7094
7095 /* Swap the raw formats */
7096 tmp_format = ao2_bump(ast_channel_rawreadformat(original));
7098 ast_channel_set_rawreadformat(clonechan, tmp_format);
7099 ao2_cleanup(tmp_format);
7100
7101 tmp_format = ao2_bump(ast_channel_rawwriteformat(original));
7103 ast_channel_set_rawwriteformat(clonechan, tmp_format);
7104 ao2_cleanup(tmp_format);
7105
7107
7108 /* And of course, so does our current state. Note we need not
7109 call ast_setstate since the event manager doesn't really consider
7110 these separate. We do this early so that the clone has the proper
7111 state of the original channel. */
7112 origstate = ast_channel_state(original);
7113 ast_channel_state_set(original, ast_channel_state(clonechan));
7114 ast_channel_state_set(clonechan, origstate);
7115
7116 /* And the swap the cachable state too. Otherwise we'd start caching
7117 * Local channels and ignoring real ones. */
7118 orig_disablestatecache = ast_test_flag(ast_channel_flags(original), AST_FLAG_DISABLE_DEVSTATE_CACHE);
7119 clone_disablestatecache = ast_test_flag(ast_channel_flags(clonechan), AST_FLAG_DISABLE_DEVSTATE_CACHE);
7120 if (orig_disablestatecache != clone_disablestatecache) {
7121 if (orig_disablestatecache) {
7124 } else {
7127 }
7128 }
7129
7130 /* Keep the same language. */
7131 ast_channel_language_set(original, ast_channel_language(clonechan));
7132
7133 /* Keep the same parkinglot. */
7134 ast_channel_parkinglot_set(original, ast_channel_parkinglot(clonechan));
7135
7136 /* Clear all existing file descriptors */
7138
7139 /* Copy all file descriptors present on clonechan to original */
7140 for (x = 0; x < ast_channel_fd_count(clonechan); x++) {
7141 ast_channel_set_fd(original, x, ast_channel_fd(clonechan, x));
7142 }
7143
7144 ast_app_group_update(clonechan, original);
7145
7146 /* Swap hangup handlers. */
7147 exchange.handlers = *ast_channel_hangup_handlers(original);
7149 *ast_channel_hangup_handlers(clonechan) = exchange.handlers;
7150
7151 /* Call fixup handlers for the clone chan */
7152 if (AST_LIST_FIRST(ast_channel_datastores(clonechan))) {
7153 struct ast_datastore *ds;
7154 /* We use a safe traversal here because some fixup routines actually
7155 * remove the datastore from the list and free them.
7156 */
7158 if (ds->info->chan_fixup) {
7159 ds->info->chan_fixup(ds->data, clonechan, original);
7160 }
7161 }
7163 }
7164
7165 /* Call breakdown handlers for the original chan */
7166 if (AST_LIST_FIRST(ast_channel_datastores(original))) {
7167 struct ast_datastore *ds;
7168 /* We use a safe traversal here because some breakdown routines may
7169 * remove the datastore from the list and free them.
7170 */
7172 if (ds->info->chan_breakdown) {
7173 ds->info->chan_breakdown(ds->data, clonechan, original);
7174 }
7175 }
7177 }
7178
7179 /* Move data stores over */
7180 if (AST_LIST_FIRST(ast_channel_datastores(clonechan))) {
7182 }
7183
7184 /* Move framehooks over */
7185 ast_framehook_list_fixup(clonechan, original);
7186
7187 /* Move audiohooks over */
7188 ast_audiohook_move_all(clonechan, original);
7189
7190 ast_autochan_new_channel(clonechan, original);
7191
7192 clone_variables(original, clonechan);
7193 /* Presence of ADSI capable CPE follows clone */
7194 ast_channel_adsicpe_set(original, ast_channel_adsicpe(clonechan));
7195 /* Bridge remains the same */
7196 /* CDR fields remain the same */
7197 /* XXX What about blocking, softhangup, blocker, and lock and blockproc? XXX */
7198 /* Application and data remain the same */
7199 /* Clone exception becomes real one, as with fdno */
7201 ast_channel_fdno_set(original, ast_channel_fdno(clonechan));
7202 /* Schedule context remains the same */
7203 /* Stream stuff stays the same */
7204 /* Keep the original state. The fixup code will need to work with it most likely */
7205
7206 /*
7207 * Just swap the whole structures, nevermind the allocations,
7208 * they'll work themselves out.
7209 */
7210 exchange.dialed = *ast_channel_dialed(original);
7211 ast_channel_dialed_set(original, ast_channel_dialed(clonechan));
7212 ast_channel_dialed_set(clonechan, &exchange.dialed);
7213
7214 /* Reset any earlier private caller id representations */
7215 ast_party_id_reset(&ast_channel_caller(original)->priv);
7216 ast_party_id_reset(&ast_channel_caller(clonechan)->priv);
7217
7218 exchange.caller = *ast_channel_caller(original);
7219 ast_channel_caller_set(original, ast_channel_caller(clonechan));
7220 ast_channel_caller_set(clonechan, &exchange.caller);
7221
7222 /* Reset any earlier private connected id representations */
7223 ast_party_id_reset(&ast_channel_connected(original)->priv);
7224 ast_party_id_reset(&ast_channel_connected(clonechan)->priv);
7225
7226 exchange.connected = *ast_channel_connected(original);
7228 ast_channel_connected_set(clonechan, &exchange.connected);
7229
7230 /* Reset any earlier private redirecting orig, from or to representations */
7231 ast_party_id_reset(&ast_channel_redirecting(original)->priv_orig);
7232 ast_party_id_reset(&ast_channel_redirecting(clonechan)->priv_orig);
7233 ast_party_id_reset(&ast_channel_redirecting(original)->priv_from);
7234 ast_party_id_reset(&ast_channel_redirecting(clonechan)->priv_from);
7235 ast_party_id_reset(&ast_channel_redirecting(original)->priv_to);
7236 ast_party_id_reset(&ast_channel_redirecting(clonechan)->priv_to);
7237
7238 exchange.redirecting = *ast_channel_redirecting(original);
7240 ast_channel_redirecting_set(clonechan, &exchange.redirecting);
7241
7243
7244 /* Restore original timing file descriptor */
7246
7247 /* Our native formats are different now */
7249 if (tmp_cap) {
7251 ast_channel_nativeformats_set(original, tmp_cap);
7252 ao2_ref(tmp_cap, -1);
7253 }
7254
7255 /* Context, extension, priority, app data, jump table, remain the same */
7256 /* pvt switches. pbx stays the same, as does next */
7257
7258 /* Set the write format */
7259 ast_set_write_format(original, wformat);
7260
7261 /* Set the read format */
7262 ast_set_read_format(original, rformat);
7263
7264 /* Copy the music class */
7265 ast_channel_musicclass_set(original, ast_channel_musicclass(clonechan));
7266
7267 /* copy over accuntcode and set peeraccount across the bridge */
7268 ast_channel_accountcode_set(original, S_OR(ast_channel_accountcode(clonechan), ""));
7269
7270 /* copy over userfield */
7271 ast_channel_userfield_set(original, ast_channel_userfield(clonechan));
7272
7273 ast_debug(1, "Putting channel %s in %s/%s formats\n", ast_channel_name(original),
7274 ast_format_get_name(wformat), ast_format_get_name(rformat));
7275
7276 /* Fixup the original clonechan's physical side */
7277 if (ast_channel_tech(original)->fixup && ast_channel_tech(original)->fixup(clonechan, original)) {
7278 ast_log(LOG_WARNING, "Channel type '%s' could not fixup channel %s, strange things may happen. (clonechan)\n",
7279 ast_channel_tech(original)->type, ast_channel_name(original));
7280 }
7281
7282 /* Fixup the original original's physical side */
7283 if (ast_channel_tech(clonechan)->fixup && ast_channel_tech(clonechan)->fixup(original, clonechan)) {
7284 ast_log(LOG_WARNING, "Channel type '%s' could not fixup channel %s, strange things may happen. (original)\n",
7285 ast_channel_tech(clonechan)->type, ast_channel_name(clonechan));
7286 }
7287
7288 ast_channel_internal_swap_stream_topology(original, clonechan);
7289
7290 /*
7291 * Now, at this point, the "clone" channel is totally F'd up.
7292 * We mark it as a zombie so nothing tries to touch it.
7293 *
7294 * This must be done before we unlock clonechan to prevent
7295 * setting up another masquerade on the clonechan.
7296 */
7298 ast_queue_frame(clonechan, &ast_null_frame);
7299
7300 ast_channel_unlock(original);
7301 ast_channel_unlock(clonechan);
7302
7303 /*
7304 * Indicate to each channel that a masquerade is complete.
7305 *
7306 * We can still do this to clonechan even though it is a
7307 * zombie because ast_indicate_data() will explicitly pass
7308 * this control and ast_hangup() is held off until the
7309 * ast_channel_masq() and ast_channel_masqr() pointers are
7310 * cleared.
7311 */
7312 x = 0;
7313 ast_indicate_data(original, AST_CONTROL_MASQUERADE_NOTIFY, &x, sizeof(x));
7314 ast_indicate_data(clonechan, AST_CONTROL_MASQUERADE_NOTIFY, &x, sizeof(x));
7315
7317
7318 if (clone_hold_state == AST_CONTROL_HOLD) {
7319 ast_debug(1, "Channel %s simulating UNHOLD for masquerade.\n",
7320 ast_channel_name(original));
7322 }
7323 if (clone_sending_dtmf_digit) {
7324 /*
7325 * The clonechan was sending a DTMF digit that was not completed
7326 * before the masquerade.
7327 */
7328 ast_channel_end_dtmf(original, clone_sending_dtmf_digit, clone_sending_dtmf_tv,
7329 "masquerade");
7330 }
7331
7332 /*
7333 * If an indication is currently playing, maintain it on the
7334 * channel that is taking the place of original.
7335 *
7336 * This is needed because the masquerade is swapping out the
7337 * internals of the channel, and the new channel private data
7338 * needs to be made aware of the current visible indication
7339 * (RINGING, CONGESTION, etc.)
7340 */
7341 if (visible_indication) {
7342 if (visible_indication == AST_CONTROL_HOLD) {
7343 const char *latest_musicclass;
7344 int len;
7345
7346 ast_channel_lock(original);
7347 latest_musicclass = ast_strdupa(ast_channel_latest_musicclass(original));
7348 ast_channel_unlock(original);
7349 if (ast_strlen_zero(latest_musicclass)) {
7350 latest_musicclass = NULL;
7351 len = 0;
7352 } else {
7353 len = strlen(latest_musicclass) + 1;
7354 }
7355 ast_indicate_data(original, visible_indication, latest_musicclass, len);
7356 } else {
7357 ast_indicate(original, visible_indication);
7358 }
7359 }
7360
7361 /*
7362 * If MOH was playing on the original channel then it needs to be
7363 * maintained on the channel that is replacing it.
7364 */
7365 if (moh_is_playing) {
7366 /* Start MOH on the new original channel. */
7367 ast_moh_start(original, NULL, NULL);
7368 }
7369
7370 ast_channel_lock(original);
7371
7372 /* Signal any blocker */
7374 pthread_kill(ast_channel_blocker(original), SIGURG);
7375 }
7376
7377 ast_debug(1, "Done Masquerading %s (%u)\n", ast_channel_name(original), ast_channel_state(original));
7378 ast_channel_unlock(original);
7379
7380 if ((bridged = ast_channel_bridge_peer(original))) {
7382 ast_channel_unref(bridged);
7383 }
7385
7386 /* Now that the operation is complete, we can clear the masq
7387 * and masqr fields of both channels.
7388 */
7389 ast_channel_lock_both(original, clonechan);
7390 ast_channel_masq_set(original, NULL);
7391 ast_channel_masqr_set(clonechan, NULL);
7392 ast_channel_unlock(original);
7393 ast_channel_unlock(clonechan);
7394
7396 CHANNELSTORAGE_API(current_channel_storage_instance, insert, clonechan, 0, 0);
7399
7400 /* Release our held safety references. */
7401 ast_channel_unref(original);
7402 ast_channel_unref(clonechan);
7403
7404 ao2_cleanup(rformat);
7405 ao2_cleanup(wformat);
7406}
7407
7408void ast_set_callerid(struct ast_channel *chan, const char *cid_num, const char *cid_name, const char *cid_ani)
7409{
7410 ast_channel_lock(chan);
7411
7412 if (cid_num) {
7413 ast_channel_caller(chan)->id.number.valid = 1;
7414 ast_free(ast_channel_caller(chan)->id.number.str);
7415 ast_channel_caller(chan)->id.number.str = ast_strdup(cid_num);
7416 }
7417 if (cid_name) {
7418 ast_channel_caller(chan)->id.name.valid = 1;
7419 ast_free(ast_channel_caller(chan)->id.name.str);
7420 ast_channel_caller(chan)->id.name.str = ast_strdup(cid_name);
7421 }
7422 if (cid_ani) {
7424 ast_free(ast_channel_caller(chan)->ani.number.str);
7425 ast_channel_caller(chan)->ani.number.str = ast_strdup(cid_ani);
7426 }
7427
7429
7430 ast_channel_unlock(chan);
7431}
7432
7433void ast_channel_set_caller(struct ast_channel *chan, const struct ast_party_caller *caller, const struct ast_set_party_caller *update)
7434{
7435 if (ast_channel_caller(chan) == caller) {
7436 /* Don't set to self */
7437 return;
7438 }
7439
7440 ast_channel_lock(chan);
7443 ast_channel_unlock(chan);
7444}
7445
7446void ast_channel_set_caller_event(struct ast_channel *chan, const struct ast_party_caller *caller, const struct ast_set_party_caller *update)
7447{
7448 if (ast_channel_caller(chan) == caller) {
7449 /* Don't set to self */
7450 return;
7451 }
7452
7453 ast_channel_lock(chan);
7457 ast_channel_unlock(chan);
7458}
7459
7461{
7462 int oldstate = ast_channel_state(chan);
7463 char name[AST_CHANNEL_NAME], *dashptr;
7464
7465 if (oldstate == state)
7466 return 0;
7467
7468 ast_copy_string(name, ast_channel_name(chan), sizeof(name));
7469 if ((dashptr = strrchr(name, '-'))) {
7470 *dashptr = '\0';
7471 }
7472
7474
7476
7477 /* We have to pass AST_DEVICE_UNKNOWN here because it is entirely possible that the channel driver
7478 * for this channel is using the callback method for device state. If we pass in an actual state here
7479 * we override what they are saying the state is and things go amuck. */
7481
7482 return 0;
7483}
7484
7485/*! \brief Bridge two channels together (early) */
7487{
7488 /* Make sure we can early bridge, if not error out */
7489 if (!ast_channel_tech(c0)->early_bridge || (c1 && (!ast_channel_tech(c1)->early_bridge || ast_channel_tech(c0)->early_bridge != ast_channel_tech(c1)->early_bridge)))
7490 return -1;
7491
7492 return ast_channel_tech(c0)->early_bridge(c0, c1);
7493}
7494
7495/*! \brief Sets an option on a channel */
7496int ast_channel_setoption(struct ast_channel *chan, int option, void *data, int datalen, int block)
7497{
7498 int res;
7499
7500 ast_channel_lock(chan);
7501 if (!ast_channel_tech(chan)->setoption) {
7502 errno = ENOSYS;
7503 ast_channel_unlock(chan);
7504 return -1;
7505 }
7506
7507 if (block)
7508 ast_log(LOG_ERROR, "XXX Blocking not implemented yet XXX\n");
7509
7510 res = ast_channel_tech(chan)->setoption(chan, option, data, datalen);
7511 ast_channel_unlock(chan);
7512
7513 return res;
7514}
7515
7516int ast_channel_queryoption(struct ast_channel *chan, int option, void *data, int *datalen, int block)
7517{
7518 int res;
7519
7520 ast_channel_lock(chan);
7521 if (!ast_channel_tech(chan)->queryoption) {
7522 errno = ENOSYS;
7523 ast_channel_unlock(chan);
7524 return -1;
7525 }
7526
7527 if (block)
7528 ast_log(LOG_ERROR, "XXX Blocking not implemented yet XXX\n");
7529
7530 res = ast_channel_tech(chan)->queryoption(chan, option, data, datalen);
7531 ast_channel_unlock(chan);
7532
7533 return res;
7534}
7535
7540 int vol;
7541};
7542
7544 int fac1;
7545 int fac2;
7546 int v1_1;
7547 int v2_1;
7548 int v3_1;
7549 int v1_2;
7550 int v2_2;
7551 int v3_2;
7553 int pos;
7556 struct ast_frame f;
7558 short data[4000];
7559};
7560
7561static void tonepair_release(struct ast_channel *chan, void *params)
7562{
7563 struct tonepair_state *ts = params;
7564
7565 if (chan) {
7566 ast_set_write_format(chan, ts->origwfmt);
7567 }
7568 ao2_cleanup(ts->origwfmt);
7569 ast_free(ts);
7570}
7571
7572static void *tonepair_alloc(struct ast_channel *chan, void *params)
7573{
7574 struct tonepair_state *ts;
7575 struct tonepair_def *td = params;
7576
7577 if (!(ts = ast_calloc(1, sizeof(*ts)))) {
7578 return NULL;
7579 }
7580
7583 ast_log(LOG_WARNING, "Unable to set '%s' to signed linear format (write)\n", ast_channel_name(chan));
7585 ts = NULL;
7586 } else {
7587 ts->fac1 = 2.0 * cos(2.0 * M_PI * (td->freq1 / 8000.0)) * 32768.0;
7588 ts->v1_1 = 0;
7589 ts->v2_1 = sin(-4.0 * M_PI * (td->freq1 / 8000.0)) * td->vol;
7590 ts->v3_1 = sin(-2.0 * M_PI * (td->freq1 / 8000.0)) * td->vol;
7591 ts->v2_1 = 0;
7592 ts->fac2 = 2.0 * cos(2.0 * M_PI * (td->freq2 / 8000.0)) * 32768.0;
7593 ts->v2_2 = sin(-4.0 * M_PI * (td->freq2 / 8000.0)) * td->vol;
7594 ts->v3_2 = sin(-2.0 * M_PI * (td->freq2 / 8000.0)) * td->vol;
7595 ts->duration = td->duration;
7596 ts->modulate = 0;
7597 }
7598 /* Let interrupts interrupt :) */
7600 return ts;
7601}
7602
7603static int tonepair_generator(struct ast_channel *chan, void *data, int len, int samples)
7604{
7605 struct tonepair_state *ts = data;
7606 int x;
7607
7608 /* we need to prepare a frame with 16 * timelen samples as we're
7609 * generating SLIN audio
7610 */
7611 len = samples * 2;
7612
7613 if (len > sizeof(ts->data) / 2 - 1) {
7614 ast_log(LOG_WARNING, "Can't generate that much data!\n");
7615 return -1;
7616 }
7617 memset(&ts->f, 0, sizeof(ts->f));
7618 for (x=0;x<len/2;x++) {
7619 ts->v1_1 = ts->v2_1;
7620 ts->v2_1 = ts->v3_1;
7621 ts->v3_1 = (ts->fac1 * ts->v2_1 >> 15) - ts->v1_1;
7622
7623 ts->v1_2 = ts->v2_2;
7624 ts->v2_2 = ts->v3_2;
7625 ts->v3_2 = (ts->fac2 * ts->v2_2 >> 15) - ts->v1_2;
7626 if (ts->modulate) {
7627 int p;
7628 p = ts->v3_2 - 32768;
7629 if (p < 0) p = -p;
7630 p = ((p * 9) / 10) + 1;
7631 ts->data[x] = (ts->v3_1 * p) >> 15;
7632 } else
7633 ts->data[x] = ts->v3_1 + ts->v3_2;
7634 }
7637 ts->f.datalen = len;
7638 ts->f.samples = samples;
7640 ts->f.data.ptr = ts->data;
7641 ast_write(chan, &ts->f);
7642 ts->pos += x;
7643 if (ts->duration > 0) {
7644 if (ts->pos >= ts->duration * 8)
7645 return -1;
7646 }
7647 return 0;
7648}
7649
7650static struct ast_generator tonepair = {
7652 .release = tonepair_release,
7653 .generate = tonepair_generator,
7654};
7655
7656int ast_tonepair_start(struct ast_channel *chan, int freq1, int freq2, int duration, int vol)
7657{
7658 struct tonepair_def d = { 0, };
7659
7660 d.freq1 = freq1;
7661 d.freq2 = freq2;
7662 d.duration = duration;
7663 d.vol = (vol < 1) ? 8192 : vol; /* force invalid to 8192 */
7664 if (ast_activate_generator(chan, &tonepair, &d))
7665 return -1;
7666 return 0;
7667}
7668
7670{
7672}
7673
7674int ast_tonepair(struct ast_channel *chan, int freq1, int freq2, int duration, int vol)
7675{
7676 int res;
7677
7678 if ((res = ast_tonepair_start(chan, freq1, freq2, duration, vol)))
7679 return res;
7680
7681 /* Give us some wiggle room */
7682 while (ast_channel_generatordata(chan) && ast_waitfor(chan, 100) >= 0) {
7683 struct ast_frame *f = ast_read(chan);
7684 if (f)
7685 ast_frfree(f);
7686 else
7687 return -1;
7688 }
7689 return 0;
7690}
7691
7693{
7694 char *piece;
7695 char *c;
7696 int start=0, finish=0, x;
7697 ast_group_t group = 0;
7698
7699 if (ast_strlen_zero(s))
7700 return 0;
7701
7702 c = ast_strdupa(s);
7703
7704 while ((piece = strsep(&c, ","))) {
7705 if (sscanf(piece, "%30d-%30d", &start, &finish) == 2) {
7706 /* Range */
7707 } else if (sscanf(piece, "%30d", &start)) {
7708 /* Just one */
7709 finish = start;
7710 } else {
7711 ast_log(LOG_ERROR, "Syntax error parsing group configuration '%s' at '%s'. Ignoring.\n", s, piece);
7712 continue;
7713 }
7714 for (x = start; x <= finish; x++) {
7715 if ((x > 63) || (x < 0)) {
7716 ast_log(LOG_WARNING, "Ignoring invalid group %d (maximum group is 63)\n", x);
7717 } else
7718 group |= ((ast_group_t) 1 << x);
7719 }
7720 }
7721 return group;
7722}
7723
7724/*! \brief Named group member structure */
7726 /*! Pre-built hash of group member name. */
7727 unsigned int hash;
7728 /*! Group member name. (End allocation of name string.) */
7729 char name[1];
7730};
7731
7732/*! \brief Comparison function used for named group container */
7733static int namedgroup_cmp_cb(void *obj, void *arg, int flags)
7734{
7735 const struct namedgroup_member *an = obj;
7736 const struct namedgroup_member *bn = arg;
7737
7738 return strcmp(an->name, bn->name) ? 0 : CMP_MATCH | CMP_STOP;
7739}
7740
7741/*! \brief Hashing function used for named group container */
7742static int namedgroup_hash_cb(const void *obj, const int flags)
7743{
7744 const struct namedgroup_member *member = obj;
7745
7746 return member->hash;
7747}
7748
7749struct ast_namedgroups *ast_get_namedgroups(const char *s)
7750{
7751 struct ao2_container *namedgroups;
7752 char *piece;
7753 char *c;
7754
7755 if (!s) {
7756 return NULL;
7757 }
7758
7759 /*! \brief Remove leading and trailing whitespace */
7761 if (ast_strlen_zero(c)) {
7762 return NULL;
7763 }
7764
7767 if (!namedgroups) {
7768 return NULL;
7769 }
7770
7771 while ((piece = strsep(&c, ","))) {
7772 struct namedgroup_member *member;
7773 size_t len;
7774
7775 /* remove leading/trailing whitespace */
7776 piece = ast_strip(piece);
7777
7778 len = strlen(piece);
7779 if (!len) {
7780 continue;
7781 }
7782
7784 if (!member) {
7785 ao2_ref(namedgroups, -1);
7786 return NULL;
7787 }
7788 strcpy(member->name, piece);/* Safe */
7789 member->hash = ast_str_hash(member->name);
7790
7791 /* every group name may exist only once, delete duplicates */
7792 ao2_find(namedgroups, member, OBJ_POINTER | OBJ_UNLINK | OBJ_NODATA);
7793 ao2_link(namedgroups, member);
7794 ao2_ref(member, -1);
7795 }
7796
7797 if (!ao2_container_count(namedgroups)) {
7798 /* There were no group names specified. */
7799 ao2_ref(namedgroups, -1);
7800 namedgroups = NULL;
7801 }
7802
7803 return (struct ast_namedgroups *) namedgroups;
7804}
7805
7806struct ast_namedgroups *ast_unref_namedgroups(struct ast_namedgroups *groups)
7807{
7809 return NULL;
7810}
7811
7812struct ast_namedgroups *ast_ref_namedgroups(struct ast_namedgroups *groups)
7813{
7814 if (groups) {
7815 ao2_ref(groups, 1);
7816 }
7817 return groups;
7818}
7819
7820static int (*ast_moh_start_ptr)(struct ast_channel *, const char *, const char *) = NULL;
7821static void (*ast_moh_stop_ptr)(struct ast_channel *) = NULL;
7822static void (*ast_moh_cleanup_ptr)(struct ast_channel *) = NULL;
7823
7824void ast_install_music_functions(int (*start_ptr)(struct ast_channel *, const char *, const char *),
7825 void (*stop_ptr)(struct ast_channel *),
7826 void (*cleanup_ptr)(struct ast_channel *))
7827{
7828 ast_moh_start_ptr = start_ptr;
7829 ast_moh_stop_ptr = stop_ptr;
7830 ast_moh_cleanup_ptr = cleanup_ptr;
7831}
7832
7839
7840int ast_moh_start(struct ast_channel *chan, const char *mclass, const char *interpclass)
7841{
7843 return ast_moh_start_ptr(chan, mclass, interpclass);
7844
7845 ast_verb(3, "Music class %s requested but no musiconhold loaded.\n", mclass ? mclass : (interpclass ? interpclass : "default"));
7846
7847 return -1;
7848}
7849
7850void ast_moh_stop(struct ast_channel *chan)
7851{
7852 if (ast_moh_stop_ptr)
7853 ast_moh_stop_ptr(chan);
7854}
7855
7857{
7858 /* A nop but needed for API compat */
7859}
7860
7861static void moh_cleanup(struct ast_channel *chan)
7862{
7864 ast_moh_cleanup_ptr(chan);
7865}
7866
7867/*!
7868 * \brief List of channel variables to append to all channel-related events.
7869 */
7875
7877
7880
7881static void free_external_channelvars(struct external_vars *channelvars)
7882{
7884 AST_RWLIST_WRLOCK(channelvars);
7885 while ((var = AST_RWLIST_REMOVE_HEAD(channelvars, entry))) {
7886 ast_free(var);
7887 }
7888 AST_RWLIST_UNLOCK(channelvars);
7889}
7890
7891static int channel_has_external_vars(struct external_vars *channelvars)
7892{
7893 int vars_present;
7894
7895 AST_RWLIST_RDLOCK(channelvars);
7896 vars_present = !AST_LIST_EMPTY(channelvars);
7897 AST_RWLIST_UNLOCK(channelvars);
7898
7899 return vars_present;
7900}
7901
7906
7911
7912static void channel_set_external_vars(struct external_vars *channelvars, size_t varc, char **vars)
7913{
7914 size_t i;
7915
7916 free_external_channelvars(channelvars);
7917 AST_RWLIST_WRLOCK(channelvars);
7918 for (i = 0; i < varc; ++i) {
7919 const char *var = vars[i];
7920 struct manager_channel_variable *mcv;
7921 if (!(mcv = ast_calloc(1, sizeof(*mcv) + strlen(var) + 1))) {
7922 break;
7923 }
7924 strcpy(mcv->name, var); /* SAFE */
7925 if (strchr(var, '(')) {
7926 mcv->isfunc = 1;
7927 }
7928 AST_RWLIST_INSERT_TAIL(channelvars, mcv, entry);
7929 }
7930 AST_RWLIST_UNLOCK(channelvars);
7931
7932}
7933
7934void ast_channel_set_manager_vars(size_t varc, char **vars)
7935{
7936 channel_set_external_vars(&ami_vars, varc, vars);
7937}
7938
7939void ast_channel_set_ari_vars(size_t varc, char **vars)
7940{
7941 channel_set_external_vars(&ari_vars, varc, vars);
7942}
7943
7944/*!
7945 * \brief Destructor for lists of variables.
7946 * \param obj AO2 object.
7947 */
7948static void varshead_dtor(void *obj)
7949{
7950 struct varshead *head = obj;
7951 struct ast_var_t *var;
7952
7953 while ((var = AST_RWLIST_REMOVE_HEAD(head, entries))) {
7955 }
7956}
7957
7959{
7960 RAII_VAR(struct varshead *, ret, NULL, ao2_cleanup);
7961 struct ast_var_t *cv;
7962
7963 ret = ao2_alloc(sizeof(*ret), varshead_dtor);
7964
7965 if (!ret) {
7966 return NULL;
7967 }
7968
7971
7972 if (!var) {
7973 return NULL;
7974 }
7975
7977 }
7978
7979 ao2_ref(ret, +1);
7980 return ret;
7981}
7982
7983static struct varshead *channel_get_external_vars(struct external_vars *channelvars,
7984 struct ast_channel *chan)
7985{
7986 RAII_VAR(struct varshead *, ret, NULL, ao2_cleanup);
7987 RAII_VAR(struct ast_str *, tmp, NULL, ast_free);
7988 struct manager_channel_variable *mcv;
7990
7991 if (AST_LIST_EMPTY(channelvars)) {
7992 return NULL;
7993 }
7994
7995 ret = ao2_alloc(sizeof(*ret), varshead_dtor);
7996 tmp = ast_str_create(16);
7997
7998 if (!ret || !tmp) {
7999 return NULL;
8000 }
8001
8002 AST_LIST_TRAVERSE(channelvars, mcv, entry) {
8003 const char *val = NULL;
8004 struct ast_var_t *var;
8005
8006 if (mcv->isfunc) {
8007 if (ast_func_read2(chan, mcv->name, &tmp, 0) == 0) {
8008 val = ast_str_buffer(tmp);
8009 } else {
8011 "Error invoking function %s\n", mcv->name);
8012 }
8013 } else {
8014 val = pbx_builtin_getvar_helper(chan, mcv->name);
8015 }
8016
8017 var = ast_var_assign(mcv->name, val ? val : "");
8018 if (!var) {
8019 return NULL;
8020 }
8021
8023 }
8024
8025 ao2_ref(ret, +1);
8026 return ret;
8027
8028}
8029
8031{
8032 return channel_get_external_vars(&ami_vars, chan);
8033}
8034
8036{
8037 return channel_get_external_vars(&ari_vars, chan);
8038}
8039
8044
8057
8059{
8062 if (rc) {
8063 ast_log(LOG_ERROR, "No channel storage backends available\n");
8064 return -1;
8065 }
8066 }
8067
8071 ast_log(LOG_ERROR, "Failed to open channel storage driver '%s'\n",
8073 return -1;
8074 }
8075
8076 return 0;
8077}
8078
8084
8086{
8087 if (ast_fully_booted) {
8088 ast_log(LOG_ERROR, "Cannot change channel storage driver after Asterisk has started\n");
8089 return -1;
8090 }
8093 return 0;
8094 }
8096 "Invalid channel storage backend '%s' specified. Attempting to use default '%s'.\n",
8097 driver_name, AST_CHANNELSTORAGE_DEFAULT_TYPE);
8100 return 0;
8101 }
8102 ast_log(LOG_ERROR, "Unable to find default channel storage backend '%s'.\n",
8104 return -1;
8105}
8106
8108{
8109
8110 if (ast_channelstorage_init() != 0) {
8111 return -1;
8112 }
8113
8114 /*
8115 * channel_storage_type is a global variable set by options.c
8116 * from the "channel_storage_backend" option in asterisk.conf.
8117 */
8118 if (ast_channel_open_storage() != 0) {
8119 return -1;
8120 }
8121
8123
8125
8127
8129
8132
8133 return 0;
8134}
8135
8136/*! \brief Print call group and pickup group ---*/
8137char *ast_print_group(char *buf, int buflen, ast_group_t group)
8138{
8139 unsigned int i;
8140 int first = 1;
8141 char num[3];
8142
8143 buf[0] = '\0';
8144
8145 if (!group) /* Return empty string if no group */
8146 return buf;
8147
8148 for (i = 0; i <= 63; i++) { /* Max group is 63 */
8149 if (group & ((ast_group_t) 1 << i)) {
8150 if (!first) {
8151 strncat(buf, ", ", buflen - strlen(buf) - 1);
8152 } else {
8153 first = 0;
8154 }
8155 snprintf(num, sizeof(num), "%u", i);
8156 strncat(buf, num, buflen - strlen(buf) - 1);
8157 }
8158 }
8159 return buf;
8160}
8161
8162char *ast_print_namedgroups(struct ast_str **buf, struct ast_namedgroups *group)
8163{
8164 struct ao2_container *grp = (struct ao2_container *) group;
8165 struct namedgroup_member *ng;
8166 int first = 1;
8167 struct ao2_iterator it;
8168
8169 if (!grp) {
8170 return ast_str_buffer(*buf);
8171 }
8172
8173 for (it = ao2_iterator_init(grp, 0); (ng = ao2_iterator_next(&it)); ao2_ref(ng, -1)) {
8174 if (!first) {
8175 ast_str_append(buf, 0, ", ");
8176 } else {
8177 first = 0;
8178 }
8179 ast_str_append(buf, 0, "%s", ng->name);
8180 }
8182
8183 return ast_str_buffer(*buf);
8184}
8185
8186static int namedgroup_match(void *obj, void *arg, int flags)
8187{
8188 void *match;
8189
8190 match = ao2_find(arg, obj, OBJ_POINTER);
8192
8193 return match ? CMP_MATCH | CMP_STOP : 0;
8194}
8195
8196int ast_namedgroups_intersect(struct ast_namedgroups *a, struct ast_namedgroups *b)
8197{
8198 void *match;
8199 struct ao2_container *group_a = (struct ao2_container *) a;
8200 struct ao2_container *group_b = (struct ao2_container *) b;
8201
8202 if (!a || !b) {
8203 return 0;
8204 }
8205
8206 /*
8207 * Do groups a and b intersect? Since a and b are hash tables,
8208 * the average time complexity is:
8209 * O(a.count <= b.count ? a.count : b.count)
8210 */
8211 if (ao2_container_count(group_b) < ao2_container_count(group_a)) {
8212 /* Traverse over the smaller group. */
8213 SWAP(group_a, group_b);
8214 }
8215 match = ao2_callback(group_a, 0, namedgroup_match, group_b);
8217
8218 return match != NULL;
8219}
8220
8221void ast_set_variables(struct ast_channel *chan, struct ast_variable *vars)
8222{
8223 struct ast_variable *cur;
8224
8225 for (cur = vars; cur; cur = cur->next) {
8226 pbx_builtin_setvar_helper(chan, cur->name, cur->value);
8227 }
8228}
8229
8230static void *silence_generator_alloc(struct ast_channel *chan, void *data)
8231{
8232 /* just store the data pointer in the channel structure */
8233 return data;
8234}
8235
8236static void silence_generator_release(struct ast_channel *chan, void *data)
8237{
8238 /* nothing to do */
8239}
8240
8241static int silence_generator_generate(struct ast_channel *chan, void *data, int len, int samples)
8242{
8243 short buf[samples];
8244 struct ast_frame frame = {
8246 .data.ptr = buf,
8247 .samples = samples,
8248 .datalen = sizeof(buf),
8249 };
8251
8252 memset(buf, 0, sizeof(buf));
8253
8254 if (ast_write(chan, &frame))
8255 return -1;
8256
8257 return 0;
8258}
8259
8265
8269
8271{
8273
8274 if (!(state = ast_calloc(1, sizeof(*state)))) {
8275 return NULL;
8276 }
8277
8278 state->old_write_format = ao2_bump(ast_channel_writeformat(chan));
8279
8280 if (ast_set_write_format(chan, ast_format_slin) < 0) {
8281 ast_log(LOG_ERROR, "Could not set write format to SLINEAR\n");
8282 ast_free(state);
8283 return NULL;
8284 }
8285
8287
8288 ast_debug(1, "Started silence generator on '%s'\n", ast_channel_name(chan));
8289
8290 return state;
8291}
8292
8294{
8295 ast_channel_lock(chan);
8296
8297 if (!ast_channel_generatordata(chan)) {
8298 ast_debug(1, "Trying to stop silence generator when there is no generator on '%s'\n",
8299 ast_channel_name(chan));
8300 ast_channel_unlock(chan);
8301 return 0;
8302 }
8304 ast_debug(1, "Trying to stop silence generator when it is not the current generator on '%s'\n",
8305 ast_channel_name(chan));
8306 ast_channel_unlock(chan);
8307 return 0;
8308 }
8310
8311 ast_channel_unlock(chan);
8312
8313 return 1;
8314}
8315
8317{
8318 if (!state) {
8319 return;
8320 }
8321
8322 if (deactivate_silence_generator(chan)) {
8323 ast_debug(1, "Stopped silence generator on '%s'\n", ast_channel_name(chan));
8324 if (ast_set_write_format(chan, state->old_write_format) < 0) {
8325 ast_log(LOG_ERROR, "Could not return write format to its original state\n");
8326 }
8327 }
8328 ao2_cleanup(state->old_write_format);
8329 ast_free(state);
8330}
8331
8332
8333/*
8334 * Wrappers for various ast_say_*() functions that call the full version
8335 * of the same functions.
8336 * The proper place would be say.c, but that file is optional and one
8337 * must be able to build asterisk even without it (using a loadable 'say'
8338 * implementation that only supplies the 'full' version of the functions.
8339 */
8340
8341int ast_say_number(struct ast_channel *chan, int num,
8342 const char *ints, const char *language, const char *options)
8343{
8344 return ast_say_number_full(chan, num, ints, language, options, -1, -1);
8345}
8346
8347int ast_say_ordinal(struct ast_channel *chan, int num,
8348 const char *ints, const char *language, const char *options)
8349{
8350 return ast_say_ordinal_full(chan, num, ints, language, options, -1, -1);
8351}
8352
8353int ast_say_enumeration(struct ast_channel *chan, int num,
8354 const char *ints, const char *language, const char *options)
8355{
8356 return ast_say_enumeration_full(chan, num, ints, language, options, -1, -1);
8357}
8358
8359int ast_say_digits(struct ast_channel *chan, int num,
8360 const char *ints, const char *lang)
8361{
8362 return ast_say_digits_full(chan, num, ints, lang, -1, -1);
8363}
8364
8365int ast_say_digit_str(struct ast_channel *chan, const char *str,
8366 const char *ints, const char *lang)
8367{
8368 return ast_say_digit_str_full(chan, str, ints, lang, -1, -1);
8369}
8370
8371int ast_say_money_str(struct ast_channel *chan, const char *str,
8372 const char *ints, const char *lang)
8373{
8374 return ast_say_money_str_full(chan, str, ints, lang, -1, -1);
8375}
8376
8377int ast_say_character_str(struct ast_channel *chan, const char *str,
8378 const char *ints, const char *lang, enum ast_say_case_sensitivity sensitivity)
8379{
8380 return ast_say_character_str_full(chan, str, ints, lang, sensitivity, -1, -1);
8381}
8382
8383int ast_say_phonetic_str(struct ast_channel *chan, const char *str,
8384 const char *ints, const char *lang)
8385{
8386 return ast_say_phonetic_str_full(chan, str, ints, lang, -1, -1);
8387}
8388
8389int ast_say_digits_full(struct ast_channel *chan, int num,
8390 const char *ints, const char *lang, int audiofd, int ctrlfd)
8391{
8392 char buf[256];
8393
8394 snprintf(buf, sizeof(buf), "%d", num);
8395
8396 return ast_say_digit_str_full(chan, buf, ints, lang, audiofd, ctrlfd);
8397}
8398
8400{
8401 ast_party_id_copy(&dest->id, &src->id);
8402 ast_party_id_copy(&dest->ani, &src->ani);
8403 dest->ani2 = src->ani2;
8404}
8405
8407{
8408 ast_party_id_copy(&dest->id, &src->id);
8409 ast_party_id_copy(&dest->ani, &src->ani);
8410
8411 dest->ani2 = src->ani2;
8412}
8413
8427
8428/*! \note Should follow struct ast_party_name */
8430 /*! \brief Subscriber name ie */
8431 int str;
8432 /*! \brief Character set ie. */
8434 /*! \brief presentation-indicator ie */
8436 /*! \brief valid/present ie */
8438};
8439
8440/*!
8441 * \internal
8442 * \since 1.8
8443 * \brief Build a party name information data frame component.
8444 *
8445 * \param data Buffer to fill with the frame data
8446 * \param datalen Size of the buffer to fill
8447 * \param name Party name information
8448 * \param label Name of particular party name
8449 * \param ies Data frame ie values for the party name components
8450 *
8451 * \retval -1 if error
8452 * \retval Amount of data buffer used
8453 */
8454static int party_name_build_data(unsigned char *data, size_t datalen, const struct ast_party_name *name, const char *label, const struct ast_party_name_ies *ies)
8455{
8456 size_t length;
8457 size_t pos = 0;
8458
8459 /*
8460 * The size of integer values must be fixed in case the frame is
8461 * shipped to another machine.
8462 */
8463 if (name->str) {
8464 length = strlen(name->str);
8465 if (datalen < pos + (sizeof(data[0]) * 2) + length) {
8466 ast_log(LOG_WARNING, "No space left for %s name\n", label);
8467 return -1;
8468 }
8469 data[pos++] = ies->str;
8470 data[pos++] = length;
8471 memcpy(data + pos, name->str, length);
8472 pos += length;
8473 }
8474
8475 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8476 ast_log(LOG_WARNING, "No space left for %s name char set\n", label);
8477 return -1;
8478 }
8479 data[pos++] = ies->char_set;
8480 data[pos++] = 1;
8481 data[pos++] = name->char_set;
8482
8483 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8484 ast_log(LOG_WARNING, "No space left for %s name presentation\n", label);
8485 return -1;
8486 }
8487 data[pos++] = ies->presentation;
8488 data[pos++] = 1;
8489 data[pos++] = name->presentation;
8490
8491 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8492 ast_log(LOG_WARNING, "No space left for %s name valid\n", label);
8493 return -1;
8494 }
8495 data[pos++] = ies->valid;
8496 data[pos++] = 1;
8497 data[pos++] = name->valid;
8498
8499 return pos;
8500}
8501
8502/*! \note Should follow struct ast_party_number */
8504 /*! \brief Subscriber phone number ie */
8505 int str;
8506 /*! \brief Type-Of-Number and Numbering-Plan ie */
8507 int plan;
8508 /*! \brief presentation-indicator ie */
8510 /*! \brief valid/present ie */
8512};
8513
8514/*!
8515 * \internal
8516 * \since 1.8
8517 * \brief Build a party number information data frame component.
8518 *
8519 * \param data Buffer to fill with the frame data
8520 * \param datalen Size of the buffer to fill
8521 * \param number Party number information
8522 * \param label Name of particular party number
8523 * \param ies Data frame ie values for the party number components
8524 *
8525 * \retval -1 if error
8526 * \retval Amount of data buffer used
8527 */
8528static int party_number_build_data(unsigned char *data, size_t datalen, const struct ast_party_number *number, const char *label, const struct ast_party_number_ies *ies)
8529{
8530 size_t length;
8531 size_t pos = 0;
8532
8533 /*
8534 * The size of integer values must be fixed in case the frame is
8535 * shipped to another machine.
8536 */
8537 if (number->str) {
8538 length = strlen(number->str);
8539 if (datalen < pos + (sizeof(data[0]) * 2) + length) {
8540 ast_log(LOG_WARNING, "No space left for %s number\n", label);
8541 return -1;
8542 }
8543 data[pos++] = ies->str;
8544 data[pos++] = length;
8545 memcpy(data + pos, number->str, length);
8546 pos += length;
8547 }
8548
8549 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8550 ast_log(LOG_WARNING, "No space left for %s numbering plan\n", label);
8551 return -1;
8552 }
8553 data[pos++] = ies->plan;
8554 data[pos++] = 1;
8555 data[pos++] = number->plan;
8556
8557 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8558 ast_log(LOG_WARNING, "No space left for %s number presentation\n", label);
8559 return -1;
8560 }
8561 data[pos++] = ies->presentation;
8562 data[pos++] = 1;
8563 data[pos++] = number->presentation;
8564
8565 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8566 ast_log(LOG_WARNING, "No space left for %s number valid\n", label);
8567 return -1;
8568 }
8569 data[pos++] = ies->valid;
8570 data[pos++] = 1;
8571 data[pos++] = number->valid;
8572
8573 return pos;
8574}
8575
8576/*! \note Should follow struct ast_party_subaddress */
8578 /*! \brief subaddress ie. */
8579 int str;
8580 /*! \brief subaddress type ie */
8581 int type;
8582 /*! \brief odd/even indicator ie */
8584 /*! \brief valid/present ie */
8586};
8587
8588/*!
8589 * \internal
8590 * \since 1.8
8591 * \brief Build a party subaddress information data frame component.
8592 *
8593 * \param data Buffer to fill with the frame data
8594 * \param datalen Size of the buffer to fill
8595 * \param subaddress Party subaddress information
8596 * \param label Name of particular party subaddress
8597 * \param ies Data frame ie values for the party subaddress components
8598 *
8599 * \retval -1 if error
8600 * \retval Amount of data buffer used
8601 */
8602static int party_subaddress_build_data(unsigned char *data, size_t datalen, const struct ast_party_subaddress *subaddress, const char *label, const struct ast_party_subaddress_ies *ies)
8603{
8604 size_t length;
8605 size_t pos = 0;
8606
8607 /*
8608 * The size of integer values must be fixed in case the frame is
8609 * shipped to another machine.
8610 */
8611 if (subaddress->str) {
8612 length = strlen(subaddress->str);
8613 if (datalen < pos + (sizeof(data[0]) * 2) + length) {
8614 ast_log(LOG_WARNING, "No space left for %s subaddress\n", label);
8615 return -1;
8616 }
8617 data[pos++] = ies->str;
8618 data[pos++] = length;
8619 memcpy(data + pos, subaddress->str, length);
8620 pos += length;
8621 }
8622
8623 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8624 ast_log(LOG_WARNING, "No space left for %s type of subaddress\n", label);
8625 return -1;
8626 }
8627 data[pos++] = ies->type;
8628 data[pos++] = 1;
8629 data[pos++] = subaddress->type;
8630
8631 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8633 "No space left for %s subaddress odd-even indicator\n", label);
8634 return -1;
8635 }
8636 data[pos++] = ies->odd_even_indicator;
8637 data[pos++] = 1;
8638 data[pos++] = subaddress->odd_even_indicator;
8639
8640 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8641 ast_log(LOG_WARNING, "No space left for %s subaddress valid\n", label);
8642 return -1;
8643 }
8644 data[pos++] = ies->valid;
8645 data[pos++] = 1;
8646 data[pos++] = subaddress->valid;
8647
8648 return pos;
8649}
8650
8651/*! \note Should follow struct ast_party_id */
8653 /*! \brief Subscriber name ies */
8655 /*! \brief Subscriber phone number ies */
8657 /*! \brief Subscriber subaddress ies. */
8659 /*! \brief User party id tag ie. */
8660 int tag;
8661 /*!
8662 * \brief Combined name and number presentation ie.
8663 * \note Not sent if value is zero.
8664 */
8666};
8667
8668/*!
8669 * \internal
8670 * \since 1.8
8671 * \brief Build a party id information data frame component.
8672 *
8673 * \param data Buffer to fill with the frame data
8674 * \param datalen Size of the buffer to fill
8675 * \param id Party id information
8676 * \param label Name of particular party id
8677 * \param ies Data frame ie values for the party id components
8678 * \param update What id information to build. NULL if all.
8679 *
8680 * \retval -1 if error
8681 * \retval Amount of data buffer used
8682 */
8683static int party_id_build_data(unsigned char *data, size_t datalen,
8684 const struct ast_party_id *id, const char *label, const struct ast_party_id_ies *ies,
8685 const struct ast_set_party_id *update)
8686{
8687 size_t length;
8688 size_t pos = 0;
8689 int res;
8690
8691 /*
8692 * The size of integer values must be fixed in case the frame is
8693 * shipped to another machine.
8694 */
8695
8696 if (!update || update->name) {
8697 res = party_name_build_data(data + pos, datalen - pos, &id->name, label,
8698 &ies->name);
8699 if (res < 0) {
8700 return -1;
8701 }
8702 pos += res;
8703 }
8704
8705 if (!update || update->number) {
8706 res = party_number_build_data(data + pos, datalen - pos, &id->number, label,
8707 &ies->number);
8708 if (res < 0) {
8709 return -1;
8710 }
8711 pos += res;
8712 }
8713
8714 if (!update || update->subaddress) {
8715 res = party_subaddress_build_data(data + pos, datalen - pos, &id->subaddress,
8716 label, &ies->subaddress);
8717 if (res < 0) {
8718 return -1;
8719 }
8720 pos += res;
8721 }
8722
8723 /* *************** Party id user tag **************************** */
8724 if (id->tag) {
8725 length = strlen(id->tag);
8726 if (datalen < pos + (sizeof(data[0]) * 2) + length) {
8727 ast_log(LOG_WARNING, "No space left for %s tag\n", label);
8728 return -1;
8729 }
8730 data[pos++] = ies->tag;
8731 data[pos++] = length;
8732 memcpy(data + pos, id->tag, length);
8733 pos += length;
8734 }
8735
8736 /* *************** Party id combined presentation *************** */
8737 if (ies->combined_presentation && (!update || update->number)) {
8738 int presentation;
8739
8740 if (!update || update->name) {
8741 presentation = ast_party_id_presentation(id);
8742 } else {
8743 /*
8744 * We must compromise because not all the information is available
8745 * to determine a combined presentation value.
8746 * We will only send the number presentation instead.
8747 */
8748 presentation = id->number.presentation;
8749 }
8750
8751 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8752 ast_log(LOG_WARNING, "No space left for %s combined presentation\n", label);
8753 return -1;
8754 }
8755 data[pos++] = ies->combined_presentation;
8756 data[pos++] = 1;
8757 data[pos++] = presentation;
8758 }
8759
8760 return pos;
8761}
8762
8763/*!
8764 * \brief Element identifiers for connected line indication frame data
8765 * \note Only add to the end of this enum.
8766 */
8767enum {
8771 AST_CONNECTED_LINE_ID_PRESENTATION,/* Combined number and name presentation. */
8779 /*
8780 * No more party id combined number and name presentation values
8781 * need to be created.
8782 */
8801};
8802
8803int ast_connected_line_build_data(unsigned char *data, size_t datalen, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update)
8804{
8805 int32_t value;
8806 size_t pos = 0;
8807 int res;
8808
8809 static const struct ast_party_id_ies ies = {
8811 .name.char_set = AST_CONNECTED_LINE_NAME_CHAR_SET,
8812 .name.presentation = AST_CONNECTED_LINE_NAME_PRESENTATION,
8813 .name.valid = AST_CONNECTED_LINE_NAME_VALID,
8814
8815 .number.str = AST_CONNECTED_LINE_NUMBER,
8816 .number.plan = AST_CONNECTED_LINE_NUMBER_PLAN,
8817 .number.presentation = AST_CONNECTED_LINE_NUMBER_PRESENTATION,
8818 .number.valid = AST_CONNECTED_LINE_NUMBER_VALID,
8819
8820 .subaddress.str = AST_CONNECTED_LINE_SUBADDRESS,
8821 .subaddress.type = AST_CONNECTED_LINE_SUBADDRESS_TYPE,
8822 .subaddress.odd_even_indicator = AST_CONNECTED_LINE_SUBADDRESS_ODD_EVEN,
8823 .subaddress.valid = AST_CONNECTED_LINE_SUBADDRESS_VALID,
8824
8826 .combined_presentation = AST_CONNECTED_LINE_ID_PRESENTATION,
8827 };
8828
8829 static const struct ast_party_id_ies priv_ies = {
8832 .name.presentation = AST_CONNECTED_LINE_PRIV_NAME_PRESENTATION,
8834
8835 .number.str = AST_CONNECTED_LINE_PRIV_NUMBER,
8837 .number.presentation = AST_CONNECTED_LINE_PRIV_NUMBER_PRESENTATION,
8839
8840 .subaddress.str = AST_CONNECTED_LINE_PRIV_SUBADDRESS,
8841 .subaddress.type = AST_CONNECTED_LINE_PRIV_SUBADDRESS_TYPE,
8842 .subaddress.odd_even_indicator = AST_CONNECTED_LINE_PRIV_SUBADDRESS_ODD_EVEN,
8843 .subaddress.valid = AST_CONNECTED_LINE_PRIV_SUBADDRESS_VALID,
8844
8846 .combined_presentation = 0,/* Not sent. */
8847 };
8848
8849 /*
8850 * The size of integer values must be fixed in case the frame is
8851 * shipped to another machine.
8852 */
8853
8854 /* Connected line frame version */
8855 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
8856 ast_log(LOG_WARNING, "No space left for connected line frame version\n");
8857 return -1;
8858 }
8859 data[pos++] = AST_CONNECTED_LINE_VERSION;
8860 data[pos++] = 1;
8861 data[pos++] = 2;/* Version 1 did not have a version ie */
8862
8863 res = party_id_build_data(data + pos, datalen - pos, &connected->id,
8864 "connected line", &ies, update ? &update->id : NULL);
8865 if (res < 0) {
8866 return -1;
8867 }
8868 pos += res;
8869
8870 res = party_id_build_data(data + pos, datalen - pos, &connected->priv,
8871 "connected line priv", &priv_ies, update ? &update->priv : NULL);
8872 if (res < 0) {
8873 return -1;
8874 }
8875 pos += res;
8876
8877 /* Connected line source */
8878 if (datalen < pos + (sizeof(data[0]) * 2) + sizeof(value)) {
8879 ast_log(LOG_WARNING, "No space left for connected line source\n");
8880 return -1;
8881 }
8882 data[pos++] = AST_CONNECTED_LINE_SOURCE;
8883 data[pos++] = sizeof(value);
8884 value = htonl(connected->source);
8885 memcpy(data + pos, &value, sizeof(value));
8886 pos += sizeof(value);
8887
8888 return pos;
8889}
8890
8891int ast_connected_line_parse_data(const unsigned char *data, size_t datalen, struct ast_party_connected_line *connected)
8892{
8893 size_t pos;
8894 unsigned char ie_len;
8895 unsigned char ie_id;
8896 int32_t value;
8897 int frame_version = 1;
8898 int combined_presentation = 0;
8899 int got_combined_presentation = 0;/* TRUE if got a combined name and number presentation value. */
8900
8901 for (pos = 0; pos < datalen; pos += ie_len) {
8902 if (datalen < pos + sizeof(ie_id) + sizeof(ie_len)) {
8903 ast_log(LOG_WARNING, "Invalid connected line update\n");
8904 return -1;
8905 }
8906 ie_id = data[pos++];
8907 ie_len = data[pos++];
8908 if (datalen < pos + ie_len) {
8909 ast_log(LOG_WARNING, "Invalid connected line update\n");
8910 return -1;
8911 }
8912
8913 switch (ie_id) {
8914/* Connected line party frame version */
8916 if (ie_len != 1) {
8917 ast_log(LOG_WARNING, "Invalid connected line frame version (%u)\n",
8918 (unsigned) ie_len);
8919 break;
8920 }
8921 frame_version = data[pos];
8922 break;
8923/* Connected line party id name */
8925 ast_free(connected->id.name.str);
8926 connected->id.name.str = ast_malloc(ie_len + 1);
8927 if (connected->id.name.str) {
8928 memcpy(connected->id.name.str, data + pos, ie_len);
8929 connected->id.name.str[ie_len] = 0;
8930 }
8931 break;
8933 if (ie_len != 1) {
8934 ast_log(LOG_WARNING, "Invalid connected line name char set (%u)\n",
8935 (unsigned) ie_len);
8936 break;
8937 }
8938 connected->id.name.char_set = data[pos];
8939 break;
8941 if (ie_len != 1) {
8942 ast_log(LOG_WARNING, "Invalid connected line name presentation (%u)\n",
8943 (unsigned) ie_len);
8944 break;
8945 }
8946 connected->id.name.presentation = data[pos];
8947 break;
8949 if (ie_len != 1) {
8950 ast_log(LOG_WARNING, "Invalid connected line name valid (%u)\n",
8951 (unsigned) ie_len);
8952 break;
8953 }
8954 connected->id.name.valid = data[pos];
8955 break;
8956/* Connected line party id number */
8958 ast_free(connected->id.number.str);
8959 connected->id.number.str = ast_malloc(ie_len + 1);
8960 if (connected->id.number.str) {
8961 memcpy(connected->id.number.str, data + pos, ie_len);
8962 connected->id.number.str[ie_len] = 0;
8963 }
8964 break;
8966 if (ie_len != 1) {
8967 ast_log(LOG_WARNING, "Invalid connected line numbering plan (%u)\n",
8968 (unsigned) ie_len);
8969 break;
8970 }
8971 connected->id.number.plan = data[pos];
8972 break;
8974 if (ie_len != 1) {
8975 ast_log(LOG_WARNING, "Invalid connected line number presentation (%u)\n",
8976 (unsigned) ie_len);
8977 break;
8978 }
8979 connected->id.number.presentation = data[pos];
8980 break;
8982 if (ie_len != 1) {
8983 ast_log(LOG_WARNING, "Invalid connected line number valid (%u)\n",
8984 (unsigned) ie_len);
8985 break;
8986 }
8987 connected->id.number.valid = data[pos];
8988 break;
8989/* Connected line party id subaddress */
8991 ast_free(connected->id.subaddress.str);
8992 connected->id.subaddress.str = ast_malloc(ie_len + 1);
8993 if (connected->id.subaddress.str) {
8994 memcpy(connected->id.subaddress.str, data + pos, ie_len);
8995 connected->id.subaddress.str[ie_len] = 0;
8996 }
8997 break;
8999 if (ie_len != 1) {
9000 ast_log(LOG_WARNING, "Invalid connected line type of subaddress (%u)\n",
9001 (unsigned) ie_len);
9002 break;
9003 }
9004 connected->id.subaddress.type = data[pos];
9005 break;
9007 if (ie_len != 1) {
9009 "Invalid connected line subaddress odd-even indicator (%u)\n",
9010 (unsigned) ie_len);
9011 break;
9012 }
9013 connected->id.subaddress.odd_even_indicator = data[pos];
9014 break;
9016 if (ie_len != 1) {
9017 ast_log(LOG_WARNING, "Invalid connected line subaddress valid (%u)\n",
9018 (unsigned) ie_len);
9019 break;
9020 }
9021 connected->id.subaddress.valid = data[pos];
9022 break;
9023/* Connected line party tag */
9025 ast_free(connected->id.tag);
9026 connected->id.tag = ast_malloc(ie_len + 1);
9027 if (connected->id.tag) {
9028 memcpy(connected->id.tag, data + pos, ie_len);
9029 connected->id.tag[ie_len] = 0;
9030 }
9031 break;
9032/* Connected line party id combined presentation */
9034 if (ie_len != 1) {
9035 ast_log(LOG_WARNING, "Invalid connected line combined presentation (%u)\n",
9036 (unsigned) ie_len);
9037 break;
9038 }
9039 combined_presentation = data[pos];
9040 got_combined_presentation = 1;
9041 break;
9042/* Private connected line party id name */
9044 ast_free(connected->priv.name.str);
9045 connected->priv.name.str = ast_malloc(ie_len + 1);
9046 if (connected->priv.name.str) {
9047 memcpy(connected->priv.name.str, data + pos, ie_len);
9048 connected->priv.name.str[ie_len] = 0;
9049 }
9050 break;
9052 if (ie_len != 1) {
9053 ast_log(LOG_WARNING, "Invalid connected line private name char set (%u)\n",
9054 (unsigned) ie_len);
9055 break;
9056 }
9057 connected->priv.name.char_set = data[pos];
9058 break;
9060 if (ie_len != 1) {
9061 ast_log(LOG_WARNING, "Invalid connected line private name presentation (%u)\n",
9062 (unsigned) ie_len);
9063 break;
9064 }
9065 connected->priv.name.presentation = data[pos];
9066 break;
9068 if (ie_len != 1) {
9069 ast_log(LOG_WARNING, "Invalid connected line private name valid (%u)\n",
9070 (unsigned) ie_len);
9071 break;
9072 }
9073 connected->priv.name.valid = data[pos];
9074 break;
9075/* Private connected line party id number */
9077 ast_free(connected->priv.number.str);
9078 connected->priv.number.str = ast_malloc(ie_len + 1);
9079 if (connected->priv.number.str) {
9080 memcpy(connected->priv.number.str, data + pos, ie_len);
9081 connected->priv.number.str[ie_len] = 0;
9082 }
9083 break;
9085 if (ie_len != 1) {
9086 ast_log(LOG_WARNING, "Invalid connected line private numbering plan (%u)\n",
9087 (unsigned) ie_len);
9088 break;
9089 }
9090 connected->priv.number.plan = data[pos];
9091 break;
9093 if (ie_len != 1) {
9094 ast_log(LOG_WARNING, "Invalid connected line private number presentation (%u)\n",
9095 (unsigned) ie_len);
9096 break;
9097 }
9098 connected->priv.number.presentation = data[pos];
9099 break;
9101 if (ie_len != 1) {
9102 ast_log(LOG_WARNING, "Invalid connected line private number valid (%u)\n",
9103 (unsigned) ie_len);
9104 break;
9105 }
9106 connected->priv.number.valid = data[pos];
9107 break;
9108/* Private connected line party id subaddress */
9110 ast_free(connected->priv.subaddress.str);
9111 connected->priv.subaddress.str = ast_malloc(ie_len + 1);
9112 if (connected->priv.subaddress.str) {
9113 memcpy(connected->priv.subaddress.str, data + pos, ie_len);
9114 connected->priv.subaddress.str[ie_len] = 0;
9115 }
9116 break;
9118 if (ie_len != 1) {
9119 ast_log(LOG_WARNING, "Invalid connected line private type of subaddress (%u)\n",
9120 (unsigned) ie_len);
9121 break;
9122 }
9123 connected->priv.subaddress.type = data[pos];
9124 break;
9126 if (ie_len != 1) {
9128 "Invalid connected line private subaddress odd-even indicator (%u)\n",
9129 (unsigned) ie_len);
9130 break;
9131 }
9132 connected->priv.subaddress.odd_even_indicator = data[pos];
9133 break;
9135 if (ie_len != 1) {
9136 ast_log(LOG_WARNING, "Invalid connected line private subaddress valid (%u)\n",
9137 (unsigned) ie_len);
9138 break;
9139 }
9140 connected->priv.subaddress.valid = data[pos];
9141 break;
9142/* Private connected line party tag */
9144 ast_free(connected->priv.tag);
9145 connected->priv.tag = ast_malloc(ie_len + 1);
9146 if (connected->priv.tag) {
9147 memcpy(connected->priv.tag, data + pos, ie_len);
9148 connected->priv.tag[ie_len] = 0;
9149 }
9150 break;
9151/* Connected line party source */
9153 if (ie_len != sizeof(value)) {
9154 ast_log(LOG_WARNING, "Invalid connected line source (%u)\n",
9155 (unsigned) ie_len);
9156 break;
9157 }
9158 memcpy(&value, data + pos, sizeof(value));
9159 connected->source = ntohl(value);
9160 break;
9161/* Connected line party unknown element */
9162 default:
9163 ast_debug(1, "Unknown connected line element: %u (%u)\n",
9164 (unsigned) ie_id, (unsigned) ie_len);
9165 break;
9166 }
9167 }
9168
9169 switch (frame_version) {
9170 case 1:
9171 /*
9172 * The other end is an earlier version that we need to adjust
9173 * for compatibility.
9174 */
9175 connected->id.name.valid = 1;
9176 connected->id.name.char_set = AST_PARTY_CHAR_SET_ISO8859_1;
9177 connected->id.number.valid = 1;
9178 if (got_combined_presentation) {
9179 connected->id.name.presentation = combined_presentation;
9180 connected->id.number.presentation = combined_presentation;
9181 }
9182 break;
9183 case 2:
9184 /* The other end is at the same level as we are. */
9185 break;
9186 default:
9187 /*
9188 * The other end is newer than we are.
9189 * We need to assume that they are compatible with us.
9190 */
9191 ast_debug(1, "Connected line frame has newer version: %u\n",
9192 (unsigned) frame_version);
9193 break;
9194 }
9195
9196 return 0;
9197}
9198
9200{
9201 unsigned char data[1024]; /* This should be large enough */
9202 size_t datalen;
9203
9204 datalen = ast_connected_line_build_data(data, sizeof(data), connected, update);
9205 if (datalen == (size_t) -1) {
9206 return;
9207 }
9208
9209 ast_indicate_data(chan, AST_CONTROL_CONNECTED_LINE, data, datalen);
9210}
9211
9213{
9214 unsigned char data[1024]; /* This should be large enough */
9215 size_t datalen;
9216
9217 datalen = ast_connected_line_build_data(data, sizeof(data), connected, update);
9218 if (datalen == (size_t) -1) {
9219 return;
9220 }
9221
9223}
9224
9225void ast_channel_set_redirecting(struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
9226{
9227 if (ast_channel_redirecting(chan) == redirecting) {
9228 /* Don't set to self */
9229 return;
9230 }
9231
9232 ast_channel_lock(chan);
9236 ast_channel_unlock(chan);
9237}
9238
9239/*!
9240 * \brief Element identifiers for redirecting indication frame data
9241 * \note Only add to the end of this enum.
9242 */
9243enum {
9247 AST_REDIRECTING_FROM_ID_PRESENTATION,/* Combined number and name presentation. */
9251 AST_REDIRECTING_TO_ID_PRESENTATION,/* Combined number and name presentation. */
9265 /*
9266 * No more party id combined number and name presentation values
9267 * need to be created.
9268 */
9334};
9335
9340
9341static int redirecting_reason_build_data(unsigned char *data, size_t datalen,
9342 const struct ast_party_redirecting_reason *reason, const char *label,
9343 const struct ast_party_redirecting_reason_ies *ies)
9344{
9345 size_t length;
9346 size_t pos = 0;
9347 int32_t value;
9348
9349 if (datalen < pos + (sizeof(data[0]) * 2) + sizeof(value)) {
9350 ast_log(LOG_WARNING, "No space left for %s code\n", label);
9351 return -1;
9352 }
9353 data[pos++] = ies->code;
9354 data[pos++] = sizeof(value);
9355 value = htonl(reason->code);
9356 memcpy(data + pos, &value, sizeof(value));
9357 pos += sizeof(value);
9358
9359 if (reason->str) {
9360 length = strlen(reason->str);
9361 if (datalen < pos + (sizeof(data[0]) * 2) + length) {
9362 ast_log(LOG_WARNING, "No space left for %s string\n", label);
9363 return -1;
9364 }
9365 data[pos++] = ies->str;
9366 data[pos++] = length;
9367 memcpy(data + pos, reason->str, length);
9368 pos += length;
9369 }
9370
9371 return pos;
9372}
9373
9374int ast_redirecting_build_data(unsigned char *data, size_t datalen, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
9375{
9376 int32_t value;
9377 size_t pos = 0;
9378 int res;
9379
9380 static const struct ast_party_id_ies orig_ies = {
9382 .name.char_set = AST_REDIRECTING_ORIG_NAME_CHAR_SET,
9383 .name.presentation = AST_REDIRECTING_ORIG_NAME_PRESENTATION,
9384 .name.valid = AST_REDIRECTING_ORIG_NAME_VALID,
9385
9386 .number.str = AST_REDIRECTING_ORIG_NUMBER,
9387 .number.plan = AST_REDIRECTING_ORIG_NUMBER_PLAN,
9388 .number.presentation = AST_REDIRECTING_ORIG_NUMBER_PRESENTATION,
9389 .number.valid = AST_REDIRECTING_ORIG_NUMBER_VALID,
9390
9391 .subaddress.str = AST_REDIRECTING_ORIG_SUBADDRESS,
9392 .subaddress.type = AST_REDIRECTING_ORIG_SUBADDRESS_TYPE,
9393 .subaddress.odd_even_indicator = AST_REDIRECTING_ORIG_SUBADDRESS_ODD_EVEN,
9394 .subaddress.valid = AST_REDIRECTING_ORIG_SUBADDRESS_VALID,
9395
9397 .combined_presentation = 0,/* Not sent. */
9398 };
9399 static const struct ast_party_id_ies from_ies = {
9401 .name.char_set = AST_REDIRECTING_FROM_NAME_CHAR_SET,
9402 .name.presentation = AST_REDIRECTING_FROM_NAME_PRESENTATION,
9403 .name.valid = AST_REDIRECTING_FROM_NAME_VALID,
9404
9405 .number.str = AST_REDIRECTING_FROM_NUMBER,
9406 .number.plan = AST_REDIRECTING_FROM_NUMBER_PLAN,
9407 .number.presentation = AST_REDIRECTING_FROM_NUMBER_PRESENTATION,
9408 .number.valid = AST_REDIRECTING_FROM_NUMBER_VALID,
9409
9410 .subaddress.str = AST_REDIRECTING_FROM_SUBADDRESS,
9411 .subaddress.type = AST_REDIRECTING_FROM_SUBADDRESS_TYPE,
9412 .subaddress.odd_even_indicator = AST_REDIRECTING_FROM_SUBADDRESS_ODD_EVEN,
9413 .subaddress.valid = AST_REDIRECTING_FROM_SUBADDRESS_VALID,
9414
9416 .combined_presentation = AST_REDIRECTING_FROM_ID_PRESENTATION,
9417 };
9418 static const struct ast_party_id_ies to_ies = {
9420 .name.char_set = AST_REDIRECTING_TO_NAME_CHAR_SET,
9421 .name.presentation = AST_REDIRECTING_TO_NAME_PRESENTATION,
9422 .name.valid = AST_REDIRECTING_TO_NAME_VALID,
9423
9424 .number.str = AST_REDIRECTING_TO_NUMBER,
9425 .number.plan = AST_REDIRECTING_TO_NUMBER_PLAN,
9426 .number.presentation = AST_REDIRECTING_TO_NUMBER_PRESENTATION,
9427 .number.valid = AST_REDIRECTING_TO_NUMBER_VALID,
9428
9429 .subaddress.str = AST_REDIRECTING_TO_SUBADDRESS,
9430 .subaddress.type = AST_REDIRECTING_TO_SUBADDRESS_TYPE,
9431 .subaddress.odd_even_indicator = AST_REDIRECTING_TO_SUBADDRESS_ODD_EVEN,
9432 .subaddress.valid = AST_REDIRECTING_TO_SUBADDRESS_VALID,
9433
9435 .combined_presentation = AST_REDIRECTING_TO_ID_PRESENTATION,
9436 };
9437 static const struct ast_party_id_ies priv_orig_ies = {
9442
9445 .number.presentation = AST_REDIRECTING_PRIV_ORIG_NUMBER_PRESENTATION,
9447
9448 .subaddress.str = AST_REDIRECTING_PRIV_ORIG_SUBADDRESS,
9450 .subaddress.odd_even_indicator = AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_ODD_EVEN,
9452
9454 .combined_presentation = 0,/* Not sent. */
9455 };
9456 static const struct ast_party_id_ies priv_from_ies = {
9461
9464 .number.presentation = AST_REDIRECTING_PRIV_FROM_NUMBER_PRESENTATION,
9466
9467 .subaddress.str = AST_REDIRECTING_PRIV_FROM_SUBADDRESS,
9469 .subaddress.odd_even_indicator = AST_REDIRECTING_PRIV_FROM_SUBADDRESS_ODD_EVEN,
9471
9473 .combined_presentation = 0,/* Not sent. */
9474 };
9475 static const struct ast_party_id_ies priv_to_ies = {
9478 .name.presentation = AST_REDIRECTING_PRIV_TO_NAME_PRESENTATION,
9480
9481 .number.str = AST_REDIRECTING_PRIV_TO_NUMBER,
9483 .number.presentation = AST_REDIRECTING_PRIV_TO_NUMBER_PRESENTATION,
9485
9486 .subaddress.str = AST_REDIRECTING_PRIV_TO_SUBADDRESS,
9487 .subaddress.type = AST_REDIRECTING_PRIV_TO_SUBADDRESS_TYPE,
9488 .subaddress.odd_even_indicator = AST_REDIRECTING_PRIV_TO_SUBADDRESS_ODD_EVEN,
9489 .subaddress.valid = AST_REDIRECTING_PRIV_TO_SUBADDRESS_VALID,
9490
9492 .combined_presentation = 0,/* Not sent. */
9493 };
9494 static const struct ast_party_redirecting_reason_ies reason_ies = {
9497 };
9498
9499 static const struct ast_party_redirecting_reason_ies orig_reason_ies = {
9502 };
9503
9504 /* Redirecting frame version */
9505 if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
9506 ast_log(LOG_WARNING, "No space left for redirecting frame version\n");
9507 return -1;
9508 }
9509 data[pos++] = AST_REDIRECTING_VERSION;
9510 data[pos++] = 1;
9511 data[pos++] = 2;/* Version 1 did not have a version ie */
9512
9513 res = party_id_build_data(data + pos, datalen - pos, &redirecting->orig,
9514 "redirecting-orig", &orig_ies, update ? &update->orig : NULL);
9515 if (res < 0) {
9516 return -1;
9517 }
9518 pos += res;
9519
9520 res = party_id_build_data(data + pos, datalen - pos, &redirecting->from,
9521 "redirecting-from", &from_ies, update ? &update->from : NULL);
9522 if (res < 0) {
9523 return -1;
9524 }
9525 pos += res;
9526
9527 res = party_id_build_data(data + pos, datalen - pos, &redirecting->to,
9528 "redirecting-to", &to_ies, update ? &update->to : NULL);
9529 if (res < 0) {
9530 return -1;
9531 }
9532 pos += res;
9533
9534 res = party_id_build_data(data + pos, datalen - pos, &redirecting->priv_orig,
9535 "redirecting-priv-orig", &priv_orig_ies, update ? &update->priv_orig : NULL);
9536 if (res < 0) {
9537 return -1;
9538 }
9539 pos += res;
9540
9541 res = party_id_build_data(data + pos, datalen - pos, &redirecting->priv_from,
9542 "redirecting-priv-from", &priv_from_ies, update ? &update->priv_from : NULL);
9543 if (res < 0) {
9544 return -1;
9545 }
9546 pos += res;
9547
9548 res = party_id_build_data(data + pos, datalen - pos, &redirecting->priv_to,
9549 "redirecting-priv-to", &priv_to_ies, update ? &update->priv_to : NULL);
9550 if (res < 0) {
9551 return -1;
9552 }
9553 pos += res;
9554
9555 /* Redirecting reason */
9556 res = redirecting_reason_build_data(data + pos, datalen - pos, &redirecting->reason,
9557 "redirecting-reason", &reason_ies);
9558 if (res < 0) {
9559 return -1;
9560 }
9561 pos += res;
9562
9563 /* Redirecting original reason */
9564 res = redirecting_reason_build_data(data + pos, datalen - pos, &redirecting->orig_reason,
9565 "redirecting-orig-reason", &orig_reason_ies);
9566 if (res < 0) {
9567 return -1;
9568 }
9569 pos += res;
9570
9571 /* Redirecting count */
9572 if (datalen < pos + (sizeof(data[0]) * 2) + sizeof(value)) {
9573 ast_log(LOG_WARNING, "No space left for redirecting count\n");
9574 return -1;
9575 }
9576 data[pos++] = AST_REDIRECTING_COUNT;
9577 data[pos++] = sizeof(value);
9578 value = htonl(redirecting->count);
9579 memcpy(data + pos, &value, sizeof(value));
9580 pos += sizeof(value);
9581
9582 return pos;
9583}
9584
9585int ast_redirecting_parse_data(const unsigned char *data, size_t datalen, struct ast_party_redirecting *redirecting)
9586{
9587 size_t pos;
9588 unsigned char ie_len;
9589 unsigned char ie_id;
9590 int32_t value;
9591 int frame_version = 1;
9592 int from_combined_presentation = 0;
9593 int got_from_combined_presentation = 0;/* TRUE if got a combined name and number presentation value. */
9594 int to_combined_presentation = 0;
9595 int got_to_combined_presentation = 0;/* TRUE if got a combined name and number presentation value. */
9596
9597 for (pos = 0; pos < datalen; pos += ie_len) {
9598 if (datalen < pos + sizeof(ie_id) + sizeof(ie_len)) {
9599 ast_log(LOG_WARNING, "Invalid redirecting update\n");
9600 return -1;
9601 }
9602 ie_id = data[pos++];
9603 ie_len = data[pos++];
9604 if (datalen < pos + ie_len) {
9605 ast_log(LOG_WARNING, "Invalid redirecting update\n");
9606 return -1;
9607 }
9608
9609 switch (ie_id) {
9610/* Redirecting frame version */
9612 if (ie_len != 1) {
9613 ast_log(LOG_WARNING, "Invalid redirecting frame version (%u)\n",
9614 (unsigned) ie_len);
9615 break;
9616 }
9617 frame_version = data[pos];
9618 break;
9619/* Redirecting-orig party id name */
9621 ast_free(redirecting->orig.name.str);
9622 redirecting->orig.name.str = ast_malloc(ie_len + 1);
9623 if (redirecting->orig.name.str) {
9624 memcpy(redirecting->orig.name.str, data + pos, ie_len);
9625 redirecting->orig.name.str[ie_len] = 0;
9626 }
9627 break;
9629 if (ie_len != 1) {
9630 ast_log(LOG_WARNING, "Invalid redirecting-orig name char set (%u)\n",
9631 (unsigned) ie_len);
9632 break;
9633 }
9634 redirecting->orig.name.char_set = data[pos];
9635 break;
9637 if (ie_len != 1) {
9638 ast_log(LOG_WARNING, "Invalid redirecting-orig name presentation (%u)\n",
9639 (unsigned) ie_len);
9640 break;
9641 }
9642 redirecting->orig.name.presentation = data[pos];
9643 break;
9645 if (ie_len != 1) {
9646 ast_log(LOG_WARNING, "Invalid redirecting-orig name valid (%u)\n",
9647 (unsigned) ie_len);
9648 break;
9649 }
9650 redirecting->orig.name.valid = data[pos];
9651 break;
9652/* Redirecting-orig party id number */
9654 ast_free(redirecting->orig.number.str);
9655 redirecting->orig.number.str = ast_malloc(ie_len + 1);
9656 if (redirecting->orig.number.str) {
9657 memcpy(redirecting->orig.number.str, data + pos, ie_len);
9658 redirecting->orig.number.str[ie_len] = 0;
9659 }
9660 break;
9662 if (ie_len != 1) {
9663 ast_log(LOG_WARNING, "Invalid redirecting-orig numbering plan (%u)\n",
9664 (unsigned) ie_len);
9665 break;
9666 }
9667 redirecting->orig.number.plan = data[pos];
9668 break;
9670 if (ie_len != 1) {
9671 ast_log(LOG_WARNING, "Invalid redirecting-orig number presentation (%u)\n",
9672 (unsigned) ie_len);
9673 break;
9674 }
9675 redirecting->orig.number.presentation = data[pos];
9676 break;
9678 if (ie_len != 1) {
9679 ast_log(LOG_WARNING, "Invalid redirecting-orig number valid (%u)\n",
9680 (unsigned) ie_len);
9681 break;
9682 }
9683 redirecting->orig.number.valid = data[pos];
9684 break;
9685/* Redirecting-orig party id subaddress */
9687 ast_free(redirecting->orig.subaddress.str);
9688 redirecting->orig.subaddress.str = ast_malloc(ie_len + 1);
9689 if (redirecting->orig.subaddress.str) {
9690 memcpy(redirecting->orig.subaddress.str, data + pos, ie_len);
9691 redirecting->orig.subaddress.str[ie_len] = 0;
9692 }
9693 break;
9695 if (ie_len != 1) {
9696 ast_log(LOG_WARNING, "Invalid redirecting-orig type of subaddress (%u)\n",
9697 (unsigned) ie_len);
9698 break;
9699 }
9700 redirecting->orig.subaddress.type = data[pos];
9701 break;
9703 if (ie_len != 1) {
9705 "Invalid redirecting-orig subaddress odd-even indicator (%u)\n",
9706 (unsigned) ie_len);
9707 break;
9708 }
9709 redirecting->orig.subaddress.odd_even_indicator = data[pos];
9710 break;
9712 if (ie_len != 1) {
9713 ast_log(LOG_WARNING, "Invalid redirecting-orig subaddress valid (%u)\n",
9714 (unsigned) ie_len);
9715 break;
9716 }
9717 redirecting->orig.subaddress.valid = data[pos];
9718 break;
9719/* Redirecting-orig party id tag */
9721 ast_free(redirecting->orig.tag);
9722 redirecting->orig.tag = ast_malloc(ie_len + 1);
9723 if (redirecting->orig.tag) {
9724 memcpy(redirecting->orig.tag, data + pos, ie_len);
9725 redirecting->orig.tag[ie_len] = 0;
9726 }
9727 break;
9728/* Redirecting-from party id name */
9730 ast_free(redirecting->from.name.str);
9731 redirecting->from.name.str = ast_malloc(ie_len + 1);
9732 if (redirecting->from.name.str) {
9733 memcpy(redirecting->from.name.str, data + pos, ie_len);
9734 redirecting->from.name.str[ie_len] = 0;
9735 }
9736 break;
9738 if (ie_len != 1) {
9739 ast_log(LOG_WARNING, "Invalid redirecting-from name char set (%u)\n",
9740 (unsigned) ie_len);
9741 break;
9742 }
9743 redirecting->from.name.char_set = data[pos];
9744 break;
9746 if (ie_len != 1) {
9747 ast_log(LOG_WARNING, "Invalid redirecting-from name presentation (%u)\n",
9748 (unsigned) ie_len);
9749 break;
9750 }
9751 redirecting->from.name.presentation = data[pos];
9752 break;
9754 if (ie_len != 1) {
9755 ast_log(LOG_WARNING, "Invalid redirecting-from name valid (%u)\n",
9756 (unsigned) ie_len);
9757 break;
9758 }
9759 redirecting->from.name.valid = data[pos];
9760 break;
9761/* Redirecting-from party id number */
9763 ast_free(redirecting->from.number.str);
9764 redirecting->from.number.str = ast_malloc(ie_len + 1);
9765 if (redirecting->from.number.str) {
9766 memcpy(redirecting->from.number.str, data + pos, ie_len);
9767 redirecting->from.number.str[ie_len] = 0;
9768 }
9769 break;
9771 if (ie_len != 1) {
9772 ast_log(LOG_WARNING, "Invalid redirecting-from numbering plan (%u)\n",
9773 (unsigned) ie_len);
9774 break;
9775 }
9776 redirecting->from.number.plan = data[pos];
9777 break;
9779 if (ie_len != 1) {
9780 ast_log(LOG_WARNING, "Invalid redirecting-from number presentation (%u)\n",
9781 (unsigned) ie_len);
9782 break;
9783 }
9784 redirecting->from.number.presentation = data[pos];
9785 break;
9787 if (ie_len != 1) {
9788 ast_log(LOG_WARNING, "Invalid redirecting-from number valid (%u)\n",
9789 (unsigned) ie_len);
9790 break;
9791 }
9792 redirecting->from.number.valid = data[pos];
9793 break;
9794/* Redirecting-from party id combined presentation */
9796 if (ie_len != 1) {
9797 ast_log(LOG_WARNING, "Invalid redirecting-from combined presentation (%u)\n",
9798 (unsigned) ie_len);
9799 break;
9800 }
9801 from_combined_presentation = data[pos];
9802 got_from_combined_presentation = 1;
9803 break;
9804/* Redirecting-from party id subaddress */
9806 ast_free(redirecting->from.subaddress.str);
9807 redirecting->from.subaddress.str = ast_malloc(ie_len + 1);
9808 if (redirecting->from.subaddress.str) {
9809 memcpy(redirecting->from.subaddress.str, data + pos, ie_len);
9810 redirecting->from.subaddress.str[ie_len] = 0;
9811 }
9812 break;
9814 if (ie_len != 1) {
9815 ast_log(LOG_WARNING, "Invalid redirecting-from type of subaddress (%u)\n",
9816 (unsigned) ie_len);
9817 break;
9818 }
9819 redirecting->from.subaddress.type = data[pos];
9820 break;
9822 if (ie_len != 1) {
9824 "Invalid redirecting-from subaddress odd-even indicator (%u)\n",
9825 (unsigned) ie_len);
9826 break;
9827 }
9828 redirecting->from.subaddress.odd_even_indicator = data[pos];
9829 break;
9831 if (ie_len != 1) {
9832 ast_log(LOG_WARNING, "Invalid redirecting-from subaddress valid (%u)\n",
9833 (unsigned) ie_len);
9834 break;
9835 }
9836 redirecting->from.subaddress.valid = data[pos];
9837 break;
9838/* Redirecting-from party id tag */
9840 ast_free(redirecting->from.tag);
9841 redirecting->from.tag = ast_malloc(ie_len + 1);
9842 if (redirecting->from.tag) {
9843 memcpy(redirecting->from.tag, data + pos, ie_len);
9844 redirecting->from.tag[ie_len] = 0;
9845 }
9846 break;
9847/* Redirecting-to party id name */
9849 ast_free(redirecting->to.name.str);
9850 redirecting->to.name.str = ast_malloc(ie_len + 1);
9851 if (redirecting->to.name.str) {
9852 memcpy(redirecting->to.name.str, data + pos, ie_len);
9853 redirecting->to.name.str[ie_len] = 0;
9854 }
9855 break;
9857 if (ie_len != 1) {
9858 ast_log(LOG_WARNING, "Invalid redirecting-to name char set (%u)\n",
9859 (unsigned) ie_len);
9860 break;
9861 }
9862 redirecting->to.name.char_set = data[pos];
9863 break;
9865 if (ie_len != 1) {
9866 ast_log(LOG_WARNING, "Invalid redirecting-to name presentation (%u)\n",
9867 (unsigned) ie_len);
9868 break;
9869 }
9870 redirecting->to.name.presentation = data[pos];
9871 break;
9873 if (ie_len != 1) {
9874 ast_log(LOG_WARNING, "Invalid redirecting-to name valid (%u)\n",
9875 (unsigned) ie_len);
9876 break;
9877 }
9878 redirecting->to.name.valid = data[pos];
9879 break;
9880/* Redirecting-to party id number */
9882 ast_free(redirecting->to.number.str);
9883 redirecting->to.number.str = ast_malloc(ie_len + 1);
9884 if (redirecting->to.number.str) {
9885 memcpy(redirecting->to.number.str, data + pos, ie_len);
9886 redirecting->to.number.str[ie_len] = 0;
9887 }
9888 break;
9890 if (ie_len != 1) {
9891 ast_log(LOG_WARNING, "Invalid redirecting-to numbering plan (%u)\n",
9892 (unsigned) ie_len);
9893 break;
9894 }
9895 redirecting->to.number.plan = data[pos];
9896 break;
9898 if (ie_len != 1) {
9899 ast_log(LOG_WARNING, "Invalid redirecting-to number presentation (%u)\n",
9900 (unsigned) ie_len);
9901 break;
9902 }
9903 redirecting->to.number.presentation = data[pos];
9904 break;
9906 if (ie_len != 1) {
9907 ast_log(LOG_WARNING, "Invalid redirecting-to number valid (%u)\n",
9908 (unsigned) ie_len);
9909 break;
9910 }
9911 redirecting->to.number.valid = data[pos];
9912 break;
9913/* Redirecting-to party id combined presentation */
9915 if (ie_len != 1) {
9916 ast_log(LOG_WARNING, "Invalid redirecting-to combined presentation (%u)\n",
9917 (unsigned) ie_len);
9918 break;
9919 }
9920 to_combined_presentation = data[pos];
9921 got_to_combined_presentation = 1;
9922 break;
9923/* Redirecting-to party id subaddress */
9925 ast_free(redirecting->to.subaddress.str);
9926 redirecting->to.subaddress.str = ast_malloc(ie_len + 1);
9927 if (redirecting->to.subaddress.str) {
9928 memcpy(redirecting->to.subaddress.str, data + pos, ie_len);
9929 redirecting->to.subaddress.str[ie_len] = 0;
9930 }
9931 break;
9933 if (ie_len != 1) {
9934 ast_log(LOG_WARNING, "Invalid redirecting-to type of subaddress (%u)\n",
9935 (unsigned) ie_len);
9936 break;
9937 }
9938 redirecting->to.subaddress.type = data[pos];
9939 break;
9941 if (ie_len != 1) {
9943 "Invalid redirecting-to subaddress odd-even indicator (%u)\n",
9944 (unsigned) ie_len);
9945 break;
9946 }
9947 redirecting->to.subaddress.odd_even_indicator = data[pos];
9948 break;
9950 if (ie_len != 1) {
9951 ast_log(LOG_WARNING, "Invalid redirecting-to subaddress valid (%u)\n",
9952 (unsigned) ie_len);
9953 break;
9954 }
9955 redirecting->to.subaddress.valid = data[pos];
9956 break;
9957/* Redirecting-to party id tag */
9959 ast_free(redirecting->to.tag);
9960 redirecting->to.tag = ast_malloc(ie_len + 1);
9961 if (redirecting->to.tag) {
9962 memcpy(redirecting->to.tag, data + pos, ie_len);
9963 redirecting->to.tag[ie_len] = 0;
9964 }
9965 break;
9966/* Private redirecting-orig party id name */
9968 ast_free(redirecting->priv_orig.name.str);
9969 redirecting->priv_orig.name.str = ast_malloc(ie_len + 1);
9970 if (redirecting->priv_orig.name.str) {
9971 memcpy(redirecting->priv_orig.name.str, data + pos, ie_len);
9972 redirecting->priv_orig.name.str[ie_len] = 0;
9973 }
9974 break;
9976 if (ie_len != 1) {
9977 ast_log(LOG_WARNING, "Invalid private redirecting-orig name char set (%u)\n",
9978 (unsigned) ie_len);
9979 break;
9980 }
9981 redirecting->priv_orig.name.char_set = data[pos];
9982 break;
9984 if (ie_len != 1) {
9985 ast_log(LOG_WARNING, "Invalid private redirecting-orig name presentation (%u)\n",
9986 (unsigned) ie_len);
9987 break;
9988 }
9989 redirecting->priv_orig.name.presentation = data[pos];
9990 break;
9992 if (ie_len != 1) {
9993 ast_log(LOG_WARNING, "Invalid private redirecting-orig name valid (%u)\n",
9994 (unsigned) ie_len);
9995 break;
9996 }
9997 redirecting->priv_orig.name.valid = data[pos];
9998 break;
9999/* Private redirecting-orig party id number */
10001 ast_free(redirecting->priv_orig.number.str);
10002 redirecting->priv_orig.number.str = ast_malloc(ie_len + 1);
10003 if (redirecting->priv_orig.number.str) {
10004 memcpy(redirecting->priv_orig.number.str, data + pos, ie_len);
10005 redirecting->priv_orig.number.str[ie_len] = 0;
10006 }
10007 break;
10009 if (ie_len != 1) {
10010 ast_log(LOG_WARNING, "Invalid private redirecting-orig numbering plan (%u)\n",
10011 (unsigned) ie_len);
10012 break;
10013 }
10014 redirecting->priv_orig.number.plan = data[pos];
10015 break;
10017 if (ie_len != 1) {
10018 ast_log(LOG_WARNING, "Invalid private redirecting-orig number presentation (%u)\n",
10019 (unsigned) ie_len);
10020 break;
10021 }
10022 redirecting->priv_orig.number.presentation = data[pos];
10023 break;
10025 if (ie_len != 1) {
10026 ast_log(LOG_WARNING, "Invalid private redirecting-orig number valid (%u)\n",
10027 (unsigned) ie_len);
10028 break;
10029 }
10030 redirecting->priv_orig.number.valid = data[pos];
10031 break;
10032/* Private redirecting-orig party id subaddress */
10034 ast_free(redirecting->priv_orig.subaddress.str);
10035 redirecting->priv_orig.subaddress.str = ast_malloc(ie_len + 1);
10036 if (redirecting->priv_orig.subaddress.str) {
10037 memcpy(redirecting->priv_orig.subaddress.str, data + pos, ie_len);
10038 redirecting->priv_orig.subaddress.str[ie_len] = 0;
10039 }
10040 break;
10042 if (ie_len != 1) {
10043 ast_log(LOG_WARNING, "Invalid private redirecting-orig type of subaddress (%u)\n",
10044 (unsigned) ie_len);
10045 break;
10046 }
10047 redirecting->priv_orig.subaddress.type = data[pos];
10048 break;
10050 if (ie_len != 1) {
10052 "Invalid private redirecting-orig subaddress odd-even indicator (%u)\n",
10053 (unsigned) ie_len);
10054 break;
10055 }
10056 redirecting->priv_orig.subaddress.odd_even_indicator = data[pos];
10057 break;
10059 if (ie_len != 1) {
10060 ast_log(LOG_WARNING, "Invalid private redirecting-orig subaddress valid (%u)\n",
10061 (unsigned) ie_len);
10062 break;
10063 }
10064 redirecting->priv_orig.subaddress.valid = data[pos];
10065 break;
10066/* Private redirecting-orig party id tag */
10068 ast_free(redirecting->priv_orig.tag);
10069 redirecting->priv_orig.tag = ast_malloc(ie_len + 1);
10070 if (redirecting->priv_orig.tag) {
10071 memcpy(redirecting->priv_orig.tag, data + pos, ie_len);
10072 redirecting->priv_orig.tag[ie_len] = 0;
10073 }
10074 break;
10075/* Private redirecting-from party id name */
10077 ast_free(redirecting->priv_from.name.str);
10078 redirecting->priv_from.name.str = ast_malloc(ie_len + 1);
10079 if (redirecting->priv_from.name.str) {
10080 memcpy(redirecting->priv_from.name.str, data + pos, ie_len);
10081 redirecting->priv_from.name.str[ie_len] = 0;
10082 }
10083 break;
10085 if (ie_len != 1) {
10086 ast_log(LOG_WARNING, "Invalid private redirecting-from name char set (%u)\n",
10087 (unsigned) ie_len);
10088 break;
10089 }
10090 redirecting->priv_from.name.char_set = data[pos];
10091 break;
10093 if (ie_len != 1) {
10094 ast_log(LOG_WARNING, "Invalid private redirecting-from name presentation (%u)\n",
10095 (unsigned) ie_len);
10096 break;
10097 }
10098 redirecting->priv_from.name.presentation = data[pos];
10099 break;
10101 if (ie_len != 1) {
10102 ast_log(LOG_WARNING, "Invalid private redirecting-from name valid (%u)\n",
10103 (unsigned) ie_len);
10104 break;
10105 }
10106 redirecting->priv_from.name.valid = data[pos];
10107 break;
10108/* Private redirecting-from party id number */
10110 ast_free(redirecting->priv_from.number.str);
10111 redirecting->priv_from.number.str = ast_malloc(ie_len + 1);
10112 if (redirecting->priv_from.number.str) {
10113 memcpy(redirecting->priv_from.number.str, data + pos, ie_len);
10114 redirecting->priv_from.number.str[ie_len] = 0;
10115 }
10116 break;
10118 if (ie_len != 1) {
10119 ast_log(LOG_WARNING, "Invalid private redirecting-from numbering plan (%u)\n",
10120 (unsigned) ie_len);
10121 break;
10122 }
10123 redirecting->priv_from.number.plan = data[pos];
10124 break;
10126 if (ie_len != 1) {
10127 ast_log(LOG_WARNING, "Invalid private redirecting-from number presentation (%u)\n",
10128 (unsigned) ie_len);
10129 break;
10130 }
10131 redirecting->priv_from.number.presentation = data[pos];
10132 break;
10134 if (ie_len != 1) {
10135 ast_log(LOG_WARNING, "Invalid private redirecting-from number valid (%u)\n",
10136 (unsigned) ie_len);
10137 break;
10138 }
10139 redirecting->priv_from.number.valid = data[pos];
10140 break;
10141/* Private redirecting-from party id subaddress */
10143 ast_free(redirecting->priv_from.subaddress.str);
10144 redirecting->priv_from.subaddress.str = ast_malloc(ie_len + 1);
10145 if (redirecting->priv_from.subaddress.str) {
10146 memcpy(redirecting->priv_from.subaddress.str, data + pos, ie_len);
10147 redirecting->priv_from.subaddress.str[ie_len] = 0;
10148 }
10149 break;
10151 if (ie_len != 1) {
10152 ast_log(LOG_WARNING, "Invalid private redirecting-from type of subaddress (%u)\n",
10153 (unsigned) ie_len);
10154 break;
10155 }
10156 redirecting->priv_from.subaddress.type = data[pos];
10157 break;
10159 if (ie_len != 1) {
10161 "Invalid private redirecting-from subaddress odd-even indicator (%u)\n",
10162 (unsigned) ie_len);
10163 break;
10164 }
10165 redirecting->priv_from.subaddress.odd_even_indicator = data[pos];
10166 break;
10168 if (ie_len != 1) {
10169 ast_log(LOG_WARNING, "Invalid private redirecting-from subaddress valid (%u)\n",
10170 (unsigned) ie_len);
10171 break;
10172 }
10173 redirecting->priv_from.subaddress.valid = data[pos];
10174 break;
10175/* Private redirecting-from party id tag */
10177 ast_free(redirecting->priv_from.tag);
10178 redirecting->priv_from.tag = ast_malloc(ie_len + 1);
10179 if (redirecting->priv_from.tag) {
10180 memcpy(redirecting->priv_from.tag, data + pos, ie_len);
10181 redirecting->priv_from.tag[ie_len] = 0;
10182 }
10183 break;
10184/* Private redirecting-to party id name */
10186 ast_free(redirecting->priv_to.name.str);
10187 redirecting->priv_to.name.str = ast_malloc(ie_len + 1);
10188 if (redirecting->priv_to.name.str) {
10189 memcpy(redirecting->priv_to.name.str, data + pos, ie_len);
10190 redirecting->priv_to.name.str[ie_len] = 0;
10191 }
10192 break;
10194 if (ie_len != 1) {
10195 ast_log(LOG_WARNING, "Invalid private redirecting-to name char set (%u)\n",
10196 (unsigned) ie_len);
10197 break;
10198 }
10199 redirecting->priv_to.name.char_set = data[pos];
10200 break;
10202 if (ie_len != 1) {
10203 ast_log(LOG_WARNING, "Invalid private redirecting-to name presentation (%u)\n",
10204 (unsigned) ie_len);
10205 break;
10206 }
10207 redirecting->priv_to.name.presentation = data[pos];
10208 break;
10210 if (ie_len != 1) {
10211 ast_log(LOG_WARNING, "Invalid private redirecting-to name valid (%u)\n",
10212 (unsigned) ie_len);
10213 break;
10214 }
10215 redirecting->priv_to.name.valid = data[pos];
10216 break;
10217/* Private redirecting-to party id number */
10219 ast_free(redirecting->priv_to.number.str);
10220 redirecting->priv_to.number.str = ast_malloc(ie_len + 1);
10221 if (redirecting->priv_to.number.str) {
10222 memcpy(redirecting->priv_to.number.str, data + pos, ie_len);
10223 redirecting->priv_to.number.str[ie_len] = 0;
10224 }
10225 break;
10227 if (ie_len != 1) {
10228 ast_log(LOG_WARNING, "Invalid private redirecting-to numbering plan (%u)\n",
10229 (unsigned) ie_len);
10230 break;
10231 }
10232 redirecting->priv_to.number.plan = data[pos];
10233 break;
10235 if (ie_len != 1) {
10236 ast_log(LOG_WARNING, "Invalid private redirecting-to number presentation (%u)\n",
10237 (unsigned) ie_len);
10238 break;
10239 }
10240 redirecting->priv_to.number.presentation = data[pos];
10241 break;
10243 if (ie_len != 1) {
10244 ast_log(LOG_WARNING, "Invalid private redirecting-to number valid (%u)\n",
10245 (unsigned) ie_len);
10246 break;
10247 }
10248 redirecting->priv_to.number.valid = data[pos];
10249 break;
10250/* Private redirecting-to party id subaddress */
10252 ast_free(redirecting->priv_to.subaddress.str);
10253 redirecting->priv_to.subaddress.str = ast_malloc(ie_len + 1);
10254 if (redirecting->priv_to.subaddress.str) {
10255 memcpy(redirecting->priv_to.subaddress.str, data + pos, ie_len);
10256 redirecting->priv_to.subaddress.str[ie_len] = 0;
10257 }
10258 break;
10260 if (ie_len != 1) {
10261 ast_log(LOG_WARNING, "Invalid private redirecting-to type of subaddress (%u)\n",
10262 (unsigned) ie_len);
10263 break;
10264 }
10265 redirecting->priv_to.subaddress.type = data[pos];
10266 break;
10268 if (ie_len != 1) {
10270 "Invalid private redirecting-to subaddress odd-even indicator (%u)\n",
10271 (unsigned) ie_len);
10272 break;
10273 }
10274 redirecting->priv_to.subaddress.odd_even_indicator = data[pos];
10275 break;
10277 if (ie_len != 1) {
10278 ast_log(LOG_WARNING, "Invalid private redirecting-to subaddress valid (%u)\n",
10279 (unsigned) ie_len);
10280 break;
10281 }
10282 redirecting->priv_to.subaddress.valid = data[pos];
10283 break;
10284/* Private redirecting-to party id tag */
10286 ast_free(redirecting->priv_to.tag);
10287 redirecting->priv_to.tag = ast_malloc(ie_len + 1);
10288 if (redirecting->priv_to.tag) {
10289 memcpy(redirecting->priv_to.tag, data + pos, ie_len);
10290 redirecting->priv_to.tag[ie_len] = 0;
10291 }
10292 break;
10293/* Redirecting reason code */
10295 if (ie_len != sizeof(value)) {
10296 ast_log(LOG_WARNING, "Invalid redirecting reason (%u)\n",
10297 (unsigned) ie_len);
10298 break;
10299 }
10300 memcpy(&value, data + pos, sizeof(value));
10301 redirecting->reason.code = ntohl(value);
10302 break;
10303/* Redirecting reason string */
10305 ast_free(redirecting->reason.str);
10306 redirecting->reason.str = ast_malloc(ie_len + 1);
10307 if (redirecting->reason.str) {
10308 memcpy(redirecting->reason.str, data + pos, ie_len);
10309 redirecting->reason.str[ie_len] = 0;
10310 }
10311 break;
10312/* Redirecting orig-reason code */
10314 if (ie_len != sizeof(value)) {
10315 ast_log(LOG_WARNING, "Invalid redirecting original reason (%u)\n",
10316 (unsigned) ie_len);
10317 break;
10318 }
10319 memcpy(&value, data + pos, sizeof(value));
10320 redirecting->orig_reason.code = ntohl(value);
10321 break;
10322/* Redirecting orig-reason string */
10324 ast_free(redirecting->orig_reason.str);
10325 redirecting->orig_reason.str = ast_malloc(ie_len + 1);
10326 if (redirecting->orig_reason.str) {
10327 memcpy(redirecting->orig_reason.str, data + pos, ie_len);
10328 redirecting->orig_reason.str[ie_len] = 0;
10329 }
10330 break;
10331/* Redirecting count */
10333 if (ie_len != sizeof(value)) {
10334 ast_log(LOG_WARNING, "Invalid redirecting count (%u)\n",
10335 (unsigned) ie_len);
10336 break;
10337 }
10338 memcpy(&value, data + pos, sizeof(value));
10339 redirecting->count = ntohl(value);
10340 break;
10341/* Redirecting unknown element */
10342 default:
10343 ast_debug(1, "Unknown redirecting element: %u (%u)\n",
10344 (unsigned) ie_id, (unsigned) ie_len);
10345 break;
10346 }
10347 }
10348
10349 switch (frame_version) {
10350 case 1:
10351 /*
10352 * The other end is an earlier version that we need to adjust
10353 * for compatibility.
10354 *
10355 * The earlier version did not have the orig party id or
10356 * orig_reason value.
10357 */
10358 redirecting->from.name.valid = 1;
10360 redirecting->from.number.valid = 1;
10361 if (got_from_combined_presentation) {
10362 redirecting->from.name.presentation = from_combined_presentation;
10363 redirecting->from.number.presentation = from_combined_presentation;
10364 }
10365
10366 redirecting->to.name.valid = 1;
10368 redirecting->to.number.valid = 1;
10369 if (got_to_combined_presentation) {
10370 redirecting->to.name.presentation = to_combined_presentation;
10371 redirecting->to.number.presentation = to_combined_presentation;
10372 }
10373 break;
10374 case 2:
10375 /* The other end is at the same level as we are. */
10376 break;
10377 default:
10378 /*
10379 * The other end is newer than we are.
10380 * We need to assume that they are compatible with us.
10381 */
10382 ast_debug(1, "Redirecting frame has newer version: %u\n",
10383 (unsigned) frame_version);
10384 break;
10385 }
10386
10387 return 0;
10388}
10389
10391{
10392 unsigned char data[1024]; /* This should be large enough */
10393 size_t datalen;
10394
10395 datalen = ast_redirecting_build_data(data, sizeof(data), redirecting, update);
10396 if (datalen == (size_t) -1) {
10397 return;
10398 }
10399
10400 ast_indicate_data(chan, AST_CONTROL_REDIRECTING, data, datalen);
10401}
10402
10404{
10405 unsigned char data[1024]; /* This should be large enough */
10406 size_t datalen;
10407
10408 datalen = ast_redirecting_build_data(data, sizeof(data), redirecting, update);
10409 if (datalen == (size_t) -1) {
10410 return;
10411 }
10412
10413 ast_queue_control_data(chan, AST_CONTROL_REDIRECTING, data, datalen);
10414}
10415
10416/*!
10417 * Storage to determine if the current thread is running an intercept dialplan routine.
10418 */
10419AST_THREADSTORAGE_RAW(in_intercept_routine);
10420
10421/*!
10422 * \internal
10423 * \brief Set the current intercept dialplan routine status mode.
10424 * \since 13.14.0
10425 *
10426 * \param in_intercept_mode New intercept mode. (Non-zero if in intercept mode)
10427 */
10428static void channel_set_intercept_mode(int in_intercept_mode)
10429{
10430 int status;
10431
10432 status = ast_threadstorage_set_ptr(&in_intercept_routine,
10433 in_intercept_mode ? &(int) { 1 } : NULL);
10434 if (status) {
10435 ast_log(LOG_ERROR, "Failed to set dialplan intercept mode\n");
10436 }
10437}
10438
10440{
10441 return ast_threadstorage_get_ptr(&in_intercept_routine) ? 1 : 0;
10442}
10443
10444int ast_channel_connected_line_sub(struct ast_channel *autoservice_chan, struct ast_channel *sub_chan, const void *connected_info, int is_frame)
10445{
10446 const char *sub;
10447 const char *sub_args;
10448 int retval;
10449
10450 ast_channel_lock(sub_chan);
10451 sub = pbx_builtin_getvar_helper(sub_chan, "CONNECTED_LINE_SEND_SUB");
10452 sub = ast_strdupa(S_OR(sub, ""));
10453 sub_args = pbx_builtin_getvar_helper(sub_chan, "CONNECTED_LINE_SEND_SUB_ARGS");
10454 sub_args = ast_strdupa(S_OR(sub_args, ""));
10455
10456 if (ast_strlen_zero(sub)) {
10457 ast_channel_unlock(sub_chan);
10458 return -1;
10459 }
10460
10461 if (is_frame) {
10462 const struct ast_frame *frame = connected_info;
10463
10465 } else {
10466 const struct ast_party_connected_line *connected = connected_info;
10467
10469 }
10470 ast_channel_unlock(sub_chan);
10471
10473 retval = ast_app_run_sub(autoservice_chan, sub_chan, sub, sub_args, 0);
10475 if (!retval) {
10476 struct ast_party_connected_line saved_connected;
10477
10478 ast_party_connected_line_init(&saved_connected);
10479 ast_channel_lock(sub_chan);
10480 ast_party_connected_line_copy(&saved_connected, ast_channel_connected(sub_chan));
10481 ast_channel_unlock(sub_chan);
10482 ast_channel_update_connected_line(sub_chan, &saved_connected, NULL);
10483 ast_party_connected_line_free(&saved_connected);
10484 }
10485
10486 return retval;
10487}
10488
10489int ast_channel_redirecting_sub(struct ast_channel *autoservice_chan, struct ast_channel *sub_chan, const void *redirecting_info, int is_frame)
10490{
10491 const char *sub;
10492 const char *sub_args;
10493 int retval;
10494
10495 ast_channel_lock(sub_chan);
10496 sub = pbx_builtin_getvar_helper(sub_chan, "REDIRECTING_SEND_SUB");
10497 sub = ast_strdupa(S_OR(sub, ""));
10498 sub_args = pbx_builtin_getvar_helper(sub_chan, "REDIRECTING_SEND_SUB_ARGS");
10499 sub_args = ast_strdupa(S_OR(sub_args, ""));
10500
10501 if (ast_strlen_zero(sub)) {
10502 ast_channel_unlock(sub_chan);
10503 return -1;
10504 }
10505
10506 if (is_frame) {
10507 const struct ast_frame *frame = redirecting_info;
10508
10510 } else {
10511 const struct ast_party_redirecting *redirecting = redirecting_info;
10512
10514 }
10515 ast_channel_unlock(sub_chan);
10516
10518 retval = ast_app_run_sub(autoservice_chan, sub_chan, sub, sub_args, 0);
10520 if (!retval) {
10521 struct ast_party_redirecting saved_redirecting;
10522
10523 ast_party_redirecting_init(&saved_redirecting);
10524 ast_channel_lock(sub_chan);
10525 ast_party_redirecting_copy(&saved_redirecting, ast_channel_redirecting(sub_chan));
10526 ast_channel_unlock(sub_chan);
10527 ast_channel_update_redirecting(sub_chan, &saved_redirecting, NULL);
10528 ast_party_redirecting_free(&saved_redirecting);
10529 }
10530
10531 return retval;
10532}
10533
10534static void *channel_cc_params_copy(void *data)
10535{
10536 const struct ast_cc_config_params *src = data;
10538 if (!dest) {
10539 return NULL;
10540 }
10541 ast_cc_copy_config_params(dest, src);
10542 return dest;
10543}
10544
10545static void channel_cc_params_destroy(void *data)
10546{
10547 struct ast_cc_config_params *cc_params = data;
10549}
10550
10552 .type = "Call Completion",
10553 .duplicate = channel_cc_params_copy,
10554 .destroy = channel_cc_params_destroy,
10555};
10556
10558 const struct ast_cc_config_params *base_params)
10559{
10560 struct ast_cc_config_params *cc_params;
10561 struct ast_datastore *cc_datastore;
10562
10563 if (!(cc_params = ast_cc_config_params_init())) {
10564 return -1;
10565 }
10566
10567 if (!(cc_datastore = ast_datastore_alloc(&cc_channel_datastore_info, NULL))) {
10569 return -1;
10570 }
10571
10572 if (base_params) {
10573 ast_cc_copy_config_params(cc_params, base_params);
10574 }
10575 cc_datastore->data = cc_params;
10576 ast_channel_datastore_add(chan, cc_datastore);
10577 return 0;
10578}
10579
10581{
10582 struct ast_datastore *cc_datastore;
10583
10584 if (!ast_cc_is_enabled()) {
10585 return NULL;
10586 }
10587
10588 if (!(cc_datastore = ast_channel_datastore_find(chan, &cc_channel_datastore_info, NULL))) {
10589 /* If we can't find the datastore, it almost definitely means that the channel type being
10590 * used has not had its driver modified to parse CC config parameters. The best action
10591 * to take here is to create the parameters on the spot with the defaults set.
10592 */
10593 if (ast_channel_cc_params_init(chan, NULL)) {
10594 return NULL;
10595 }
10596 if (!(cc_datastore = ast_channel_datastore_find(chan, &cc_channel_datastore_info, NULL))) {
10597 /* Should be impossible */
10598 return NULL;
10599 }
10600 }
10601
10602 ast_assert(cc_datastore->data != NULL);
10603 return cc_datastore->data;
10604}
10605
10606int ast_channel_get_device_name(struct ast_channel *chan, char *device_name, size_t name_buffer_length)
10607{
10608 int len = name_buffer_length;
10609 char *dash;
10610 if (!ast_channel_queryoption(chan, AST_OPTION_DEVICE_NAME, device_name, &len, 0)) {
10611 return 0;
10612 }
10613
10614 /* Dang. Do it the old-fashioned way */
10615 ast_copy_string(device_name, ast_channel_name(chan), name_buffer_length);
10616 if ((dash = strrchr(device_name, '-'))) {
10617 *dash = '\0';
10618 }
10619
10620 return 0;
10621}
10622
10623int ast_channel_get_cc_agent_type(struct ast_channel *chan, char *agent_type, size_t size)
10624{
10625 int len = size;
10626 char *slash;
10627
10629 return 0;
10630 }
10631
10633 if ((slash = strchr(agent_type, '/'))) {
10634 *slash = '\0';
10635 }
10636 return 0;
10637}
10638
10643
10645{
10646 struct ast_bridge *bridge;
10647
10648 bridge = ast_channel_internal_bridge(chan);
10649 if (bridge) {
10650 ao2_ref(bridge, +1);
10651 }
10652 return bridge;
10653}
10654
10656{
10657 return ast_channel_internal_bridge(chan) != NULL;
10658}
10659
10661{
10662 int hangup_flags = ast_channel_softhangup_internal_flag(chan);
10663 int hangup_test = hangup_flags & AST_SOFTHANGUP_ASYNCGOTO;
10664 int unbridge = ast_channel_unbridged(chan);
10665
10666 /* This function should only return true if either the unbridged flag or
10667 * the ASYNCGOTO soft hangup flag is set and when no other soft hangup
10668 * flags are set. Any other soft hangup flags being set should make it
10669 * return false.
10670 */
10671 return ((hangup_test || unbridge) && (hangup_test == hangup_flags));
10672}
10673
10675{
10676 struct ast_channel *peer;
10677 struct ast_bridge *bridge;
10678
10679 /* Get the bridge the channel is in. */
10680 ast_channel_lock(chan);
10681 bridge = ast_channel_get_bridge(chan);
10682 ast_channel_unlock(chan);
10683 if (!bridge) {
10684 return NULL;
10685 }
10686
10687 peer = ast_bridge_peer(bridge, chan);
10688 ao2_ref(bridge, -1);
10689 return peer;
10690}
10691
10693{
10694 struct ast_bridge_channel *bridge_channel;
10695
10696 bridge_channel = ast_channel_internal_bridge_channel(chan);
10697 if (bridge_channel) {
10698 ao2_ref(bridge_channel, +1);
10699 }
10700 return bridge_channel;
10701}
10702
10704{
10705 struct ast_channel *yanked_chan;
10706 struct {
10707 char *accountcode;
10708 char *exten;
10709 char *context;
10710 char *name;
10711 int amaflags;
10712 int priority;
10713 struct ast_format *readformat;
10714 struct ast_format *writeformat;
10715 } my_vars = { 0, };
10716
10717 ast_channel_lock(yankee);
10718 my_vars.accountcode = ast_strdupa(ast_channel_accountcode(yankee));
10719 my_vars.exten = ast_strdupa(ast_channel_exten(yankee));
10720 my_vars.context = ast_strdupa(ast_channel_context(yankee));
10721 my_vars.name = ast_strdupa(ast_channel_name(yankee));
10722 my_vars.amaflags = ast_channel_amaflags(yankee);
10723 my_vars.priority = ast_channel_priority(yankee);
10724 /* The priority as returned by ast_channel_yank is where the channel
10725 * should go if the dialplan is executed on it. If the channel is
10726 * already executing dialplan then the priority currently set is
10727 * where it is currently. We increment it so it becomes where it should
10728 * execute.
10729 */
10731 my_vars.priority++;
10732 }
10733 my_vars.writeformat = ao2_bump(ast_channel_writeformat(yankee));
10734 my_vars.readformat = ao2_bump(ast_channel_readformat(yankee));
10735 ast_channel_unlock(yankee);
10736
10737 /* Do not hold any channel locks while calling channel_alloc() since the function
10738 * locks the channel container when linking the new channel in. */
10739 if (!(yanked_chan = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, my_vars.accountcode,
10740 my_vars.exten, my_vars.context, NULL, yankee, my_vars.amaflags,
10741 "Surrogate/%s", my_vars.name))) {
10742 ao2_cleanup(my_vars.writeformat);
10743 ao2_cleanup(my_vars.readformat);
10744 return NULL;
10745 }
10746
10747 /* Make formats okay */
10748 ast_channel_set_readformat(yanked_chan, my_vars.readformat);
10749 ast_channel_set_writeformat(yanked_chan, my_vars.writeformat);
10750 ao2_cleanup(my_vars.readformat);
10751 ao2_cleanup(my_vars.writeformat);
10752 ast_channel_priority_set(yanked_chan, my_vars.priority);
10753
10754 ast_channel_unlock(yanked_chan);
10755
10756 if (ast_channel_move(yanked_chan, yankee)) {
10757 ast_hangup(yanked_chan);
10758 return NULL;
10759 }
10760
10761 return yanked_chan;
10762}
10763
10764/*!
10765 * Mutex that prevents multiple ast_channel_move() operations
10766 * from occurring simultaneously. This is necessary since the
10767 * involved channels have to be locked and unlocked throughout
10768 * the move operation.
10769 *
10770 * The most important data being protected are the masq and masqr
10771 * data on channels. We don't want them getting criss-crossed due
10772 * to multiple moves mucking with them.
10773 */
10775
10776int ast_channel_move(struct ast_channel *dest, struct ast_channel *source)
10777{
10778 RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
10780
10781 if (dest == source) {
10782 ast_log(LOG_WARNING, "Can't move channel '%s' into itself!\n",
10783 ast_channel_name(dest));
10784 return -1;
10785 }
10786
10787 ast_channel_lock_both(dest, source);
10788
10791 /* Zombies! Run! */
10793 "Can't move channel. One or both is dead (%s <-- %s)\n",
10794 ast_channel_name(dest), ast_channel_name(source));
10795 ast_channel_unlock(source);
10796 ast_channel_unlock(dest);
10797 return -1;
10798 }
10799
10800 ast_channel_masq_set(dest, source);
10801 ast_channel_masqr_set(source, dest);
10802
10803 blob = ast_json_pack("{s: s}",
10804 "newchanneluniqueid", ast_channel_uniqueid(dest));
10806
10807 ast_channel_unlock(dest);
10808 ast_channel_unlock(source);
10809
10810 channel_do_masquerade(dest, source);
10811 return 0;
10812}
10813
10814static void suppress_datastore_destroy_cb(void *data)
10815{
10816 ao2_cleanup(data);
10817}
10818
10820 .type = "suppressvoice",
10822};
10823
10824static void suppress_framehook_destroy_cb(void *data)
10825{
10826 ao2_cleanup(data);
10827}
10828
10834
10835static void suppress_framehook_fixup_cb(void *data, int framehook_id, struct ast_channel *old_chan, struct ast_channel *new_chan)
10836{
10837 struct suppress_data *suppress = data;
10838
10839 suppress->framehook_id = framehook_id;
10840}
10841
10842static struct ast_frame *suppress_framehook_event_cb(struct ast_channel *chan, struct ast_frame *frame, enum ast_framehook_event event, void *data)
10843{
10844 struct suppress_data *suppress = data;
10845 int suppress_frame = 0;
10846
10847 if (!frame) {
10848 return NULL;
10849 }
10850
10851 if (frame->frametype != suppress->frametype) {
10852 return frame;
10853 }
10854
10856 suppress_frame = 1;
10857 } else if (event == AST_FRAMEHOOK_EVENT_WRITE && (suppress->direction & AST_MUTE_DIRECTION_WRITE)) {
10858 suppress_frame = 1;
10859 }
10860
10861 if (suppress_frame) {
10862 switch (frame->frametype) {
10863 case AST_FRAME_VOICE:
10865 ast_frfree(frame);
10866 }
10867 frame = &ast_null_frame;
10868 break;
10869 default:
10870 break;
10871 }
10872 }
10873
10874 return frame;
10875}
10876
10878{
10879 switch (frametype) {
10880 case AST_FRAME_VOICE:
10882 default:
10883 return NULL;
10884 }
10885}
10886
10887int ast_channel_suppress(struct ast_channel *chan, unsigned int direction, enum ast_frame_type frametype)
10888{
10889 struct suppress_data *suppress;
10890 const struct ast_datastore_info *datastore_info = NULL;
10891 struct ast_datastore *datastore = NULL;
10892 struct ast_framehook_interface interface = {
10894 .event_cb = suppress_framehook_event_cb,
10895 .destroy_cb = suppress_framehook_destroy_cb,
10896 .chan_fixup_cb = suppress_framehook_fixup_cb,
10897 };
10898 int framehook_id;
10899
10900 if (!(datastore_info = suppress_get_datastore_information(frametype))) {
10901 ast_log(LOG_WARNING, "Attempted to suppress an unsupported frame type (%u).\n", frametype);
10902 return -1;
10903 }
10904
10905 if ((datastore = ast_channel_datastore_find(chan, datastore_info, NULL))) {
10906 suppress = datastore->data;
10907 suppress->direction |= direction;
10908 return 0;
10909 }
10910
10911 if (!(suppress = ao2_alloc(sizeof(*suppress), NULL))) {
10912 ast_log(LOG_WARNING, "Failed to allocate data while attempting to suppress a stream.\n");
10913 return -1;
10914 }
10915
10916 suppress->frametype = frametype;
10917 suppress->direction |= direction;
10918
10919 interface.data = suppress;
10920
10921 framehook_id = ast_framehook_attach(chan, &interface);
10922 if (framehook_id < 0) {
10923 /* Hook attach failed. Get rid of the evidence. */
10924 ast_log(LOG_WARNING, "Failed to attach framehook while attempting to suppress a stream.\n");
10925 ao2_ref(suppress, -1);
10926 return -1;
10927 }
10928
10929 /* One ref for the framehook */
10930 ao2_ref(suppress, +1);
10931
10932 suppress->framehook_id = framehook_id;
10933
10934 if (!(datastore = ast_datastore_alloc(datastore_info, NULL))) {
10935 ast_log(LOG_WARNING, "Failed to allocate datastore while attempting to suppress a stream.\n");
10936 ast_framehook_detach(chan, framehook_id);
10937 ao2_ref(suppress, -1);
10938 return -1;
10939 }
10940
10941 /* the ref provided by the allocation is taken by the datastore */
10942 datastore->data = suppress;
10943
10944 ast_channel_datastore_add(chan, datastore);
10945
10946 return 0;
10947}
10948
10949int ast_channel_unsuppress(struct ast_channel *chan, unsigned int direction, enum ast_frame_type frametype)
10950{
10951 const struct ast_datastore_info *datastore_info = NULL;
10952 struct ast_datastore *datastore = NULL;
10953 struct suppress_data *suppress;
10954
10955 if (!(datastore_info = suppress_get_datastore_information(frametype))) {
10956 ast_log(LOG_WARNING, "Attempted to unsuppress an unsupported frame type (%u).\n", frametype);
10957 return -1;
10958 }
10959
10960 if (!(datastore = ast_channel_datastore_find(chan, datastore_info, NULL))) {
10961 /* Nothing to do! */
10962 return 0;
10963 }
10964
10965 suppress = datastore->data;
10966
10967 suppress->direction &= ~(direction);
10968
10969 if (suppress->direction == 0) {
10970 /* Nothing left to suppress. Bye! */
10971 ast_framehook_detach(chan, suppress->framehook_id);
10972 ast_channel_datastore_remove(chan, datastore);
10973 ast_datastore_free(datastore);
10974 }
10975
10976 return 0;
10977}
10978
10979void ast_channel_end_dtmf(struct ast_channel *chan, char digit, struct timeval start, const char *why)
10980{
10981 int dead;
10982 long duration;
10983
10984 ast_channel_lock(chan);
10987 & ~AST_SOFTHANGUP_ASYNCGOTO);
10988 ast_channel_unlock(chan);
10989 if (dead) {
10990 /* Channel is a zombie or a real hangup. */
10991 return;
10992 }
10993
10994 duration = ast_tvdiff_ms(ast_tvnow(), start);
10995 if (duration < option_dtmfminduration) {
10996 duration = option_dtmfminduration;
10997 }
10998 ast_senddigit_end(chan, digit, duration);
10999 ast_log(LOG_DTMF, "DTMF end '%c' simulated on %s due to %s, duration %ld ms\n",
11000 digit, ast_channel_name(chan), why, duration);
11001}
11002
11003static void features_destroy(void *obj)
11004{
11006}
11007
11009 .type = "bridge-features",
11010 .destroy = features_destroy,
11011};
11012
11014{
11015 struct ast_datastore *datastore;
11016
11018 if (!datastore) {
11019 return NULL;
11020 }
11021 return datastore->data;
11022}
11023
11024static int channel_feature_hooks_set_full(struct ast_channel *chan, struct ast_bridge_features *features, int replace)
11025{
11026 struct ast_datastore *datastore;
11027 struct ast_bridge_features *ds_features;
11028
11030 if (datastore) {
11031 ds_features = datastore->data;
11032 if (replace) {
11033 ast_bridge_features_cleanup(ds_features);
11034 ast_bridge_features_init(ds_features);
11035 }
11036 if (features) {
11037 ast_bridge_features_merge(ds_features, features);
11038 }
11039 return 0;
11040 }
11041
11043 if (!datastore) {
11044 return -1;
11045 }
11046
11047 ds_features = ast_bridge_features_new();
11048 if (!ds_features) {
11049 ast_datastore_free(datastore);
11050 return -1;
11051 }
11052
11053 if (features) {
11054 ast_bridge_features_merge(ds_features, features);
11055 }
11056 datastore->data = ds_features;
11057 ast_channel_datastore_add(chan, datastore);
11058 return 0;
11059}
11060
11062{
11063 return channel_feature_hooks_set_full(chan, features, 0);
11064}
11065
11067{
11068 return channel_feature_hooks_set_full(chan, features, 1);
11069}
11070
11072{
11074}
11075
11077 struct ast_stream_topology *topology, void *change_source)
11078{
11079 int res;
11080
11081 ast_assert(chan != NULL);
11082 ast_assert(topology != NULL);
11083
11084 ast_channel_lock(chan);
11086 ast_channel_unlock(chan);
11087 return -1;
11088 }
11089
11091 ast_debug(2, "%s: Topologies already match. Current: %s Requested: %s\n",
11092 ast_channel_name(chan),
11094 ast_str_tmp(256, ast_stream_topology_to_str(topology, &STR_TMP)));
11095 ast_channel_unlock(chan);
11096 return 0;
11097 }
11098
11100
11101 res = ast_channel_tech(chan)->indicate(chan, AST_CONTROL_STREAM_TOPOLOGY_REQUEST_CHANGE, topology, sizeof(topology));
11102 ast_channel_unlock(chan);
11103 return res;
11104}
11105
11107{
11108 ast_assert(chan != NULL);
11109 ast_assert(topology != NULL);
11110
11112 return -1;
11113 }
11114
11115 return ast_channel_tech(chan)->indicate(chan, AST_CONTROL_STREAM_TOPOLOGY_CHANGED, topology, sizeof(topology));
11116}
11117
11119{
11120 int res;
11122
11123 ast_assert(chan != NULL);
11124
11125 if (!ast_channel_is_multistream(chan)) {
11126 return -1;
11127 }
11128
11129 ast_channel_lock(chan);
11131 res = ast_queue_frame(chan, &f);
11132 ast_channel_unlock(chan);
11133
11134 return res;
11135}
11136
11137void ast_channel_set_flag(struct ast_channel *chan, unsigned int flag)
11138{
11139 ast_channel_lock(chan);
11141 ast_channel_unlock(chan);
11142}
11143
11144void ast_channel_clear_flag(struct ast_channel *chan, unsigned int flag)
11145{
11146 ast_channel_lock(chan);
11148 ast_channel_unlock(chan);
11149}
11150
Prototypes for public functions only of internal interest,.
void ast_jb_destroy(struct ast_channel *chan)
Destroys jitterbuffer on a channel.
void ast_cli_unregister_multiple(void)
Definition ael_main.c:408
@ AST_ALERT_READ_FATAL
Definition alertpipe.h:28
static struct aco_type agent_type
char digit
static struct ast_generator gen
jack_status_t status
Definition app_jack.c:149
const char * str
Definition app_jack.c:150
char * text
Definition app_queue.c:1791
enum queue_result id
Definition app_queue.c:1790
struct sla_ringing_trunk * first
Definition app_sla.c:338
ast_cond_t cond
Definition app_sla.c:336
ast_mutex_t lock
Definition app_sla.c:337
#define var
Definition ast_expr2f.c:605
char * strsep(char **str, const char *delims)
Asterisk main include file. File version handling, generic pbx functions.
int ast_register_cleanup(void(*func)(void))
Register a function to be executed before Asterisk gracefully exits.
Definition clicompat.c:19
int ast_shutting_down(void)
Definition asterisk.c:1889
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition astmm.h:288
#define ast_free(a)
Definition astmm.h:180
#define ast_strndup(str, len)
A wrapper for strndup()
Definition astmm.h:256
#define ast_strdup(str)
A wrapper for strdup()
Definition astmm.h:241
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition astmm.h:298
#define ast_calloc(num, len)
A wrapper for calloc()
Definition astmm.h:202
#define ast_malloc(len)
A wrapper for malloc()
Definition astmm.h:191
#define ast_log
Definition astobj2.c:42
#define ao2_iterator_next(iter)
Definition astobj2.h:1911
#define ao2_link(container, obj)
Add an object to a container.
Definition astobj2.h:1532
@ CMP_MATCH
Definition astobj2.h:1027
@ CMP_STOP
Definition astobj2.h:1028
#define OBJ_POINTER
Definition astobj2.h:1150
@ AO2_ALLOC_OPT_LOCK_NOLOCK
Definition astobj2.h:367
#define ao2_callback(c, flags, cb_fn, arg)
ao2_callback() is a generic function that applies cb_fn() to all objects in a container,...
Definition astobj2.h:1693
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
#define ao2_cleanup(obj)
Definition astobj2.h:1934
#define ao2_find(container, arg, flags)
Definition astobj2.h:1736
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
#define ao2_replace(dst, src)
Replace one object reference with another cleaning up the original.
Definition astobj2.h:501
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition astobj2.h:459
#define ao2_alloc_options(data_size, destructor_fn, options)
Definition astobj2.h:404
#define ao2_bump(obj)
Bump refcount on an AO2 object by one, returning the object.
Definition astobj2.h:480
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
int() ao2_callback_data_fn(void *obj, void *arg, void *data, int flags)
Type of a generic callback function.
Definition astobj2.h:1244
@ OBJ_NOLOCK
Assume that the ao2_container is already locked.
Definition astobj2.h:1063
@ OBJ_NODATA
Definition astobj2.h:1044
@ OBJ_UNLINK
Definition astobj2.h:1039
#define ao2_alloc(data_size, destructor_fn)
Definition astobj2.h:409
#define ao2_container_alloc_hash(ao2_options, container_options, n_buckets, hash_fn, sort_fn, cmp_fn)
Allocate and initialize a hash container with the desired number of buckets.
Definition astobj2.h:1303
Audiohooks Architecture.
struct ast_frame * ast_audiohook_write_list(struct ast_channel *chan, struct ast_audiohook_list *audiohook_list, enum ast_audiohook_direction direction, struct ast_frame *frame)
Pass a frame off to be handled by the audiohook core.
Definition audiohook.c:1116
@ AST_AUDIOHOOK_DIRECTION_READ
Definition audiohook.h:49
@ AST_AUDIOHOOK_DIRECTION_WRITE
Definition audiohook.h:50
int ast_audiohook_write_list_empty(struct ast_audiohook_list *audiohook_list)
Determine if a audiohook_list is empty or not.
Definition audiohook.c:1108
void ast_audiohook_detach_list(struct ast_audiohook_list *audiohook_list)
Detach audiohooks from list and destroy said list.
Definition audiohook.c:602
void ast_audiohook_move_all(struct ast_channel *old_chan, struct ast_channel *new_chan)
Move all audiohooks from one channel to another.
Definition audiohook.c:709
"smart" channels that update automatically if a channel is masqueraded
void ast_autochan_new_channel(struct ast_channel *old_chan, struct ast_channel *new_chan)
Switch what channel autochans point to.
Definition autochan.c:86
Bridging API.
struct ast_channel * ast_bridge_peer(struct ast_bridge *bridge, struct ast_channel *chan)
Get the channel's bridge peer only if the bridge is two-party.
Definition bridge.c:4154
void ast_bridge_notify_masquerade(struct ast_channel *chan)
Notify bridging that this channel was just masqueraded.
Definition bridge.c:1511
int ast_bridge_features_init(struct ast_bridge_features *features)
Initialize bridge features structure.
Definition bridge.c:3699
struct ast_bridge_features * ast_bridge_features_new(void)
Allocate a new bridge features struct.
Definition bridge.c:3762
void ast_bridge_features_merge(struct ast_bridge_features *into, const struct ast_bridge_features *from)
Merge one ast_bridge_features into another.
Definition bridge.c:3674
void ast_bridge_features_cleanup(struct ast_bridge_features *features)
Clean up the contents of a bridge features structure.
Definition bridge.c:3732
void ast_bridge_features_destroy(struct ast_bridge_features *features)
Destroy an allocated bridge features struct.
Definition bridge.c:3753
CallerID (and other GR30) management and generation Includes code and algorithms from the Zapata libr...
#define AST_PRES_USER_NUMBER_UNSCREENED
Definition callerid.h:426
#define AST_PRES_UNAVAILABLE
Definition callerid.h:434
#define AST_PRES_RESTRICTED
Definition callerid.h:433
#define AST_PRES_ALLOWED
Definition callerid.h:432
@ AST_CONNECTED_LINE_UPDATE_SOURCE_UNKNOWN
Definition callerid.h:552
#define AST_PRES_NUMBER_NOT_AVAILABLE
Definition callerid.h:461
@ AST_REDIRECTING_REASON_UNKNOWN
Definition callerid.h:499
#define AST_PRES_NUMBER_TYPE
Definition callerid.h:425
#define AST_PRES_RESTRICTION
Definition callerid.h:431
#define AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED
Definition callerid.h:437
Internal Asterisk hangup causes.
#define AST_CAUSE_SWITCH_CONGESTION
Definition causes.h:123
#define AST_CAUSE_NUMBER_PORTED_NOT_HERE
Definition causes.h:105
#define AST_CAUSE_CONGESTION
Definition causes.h:153
#define AST_CAUSE_INVALID_IE_CONTENTS
Definition causes.h:141
#define AST_CAUSE_UNALLOCATED
Definition causes.h:98
#define AST_CAUSE_INTERWORKING
Definition causes.h:146
#define AST_CAUSE_PROTOCOL_ERROR
Definition causes.h:145
#define AST_CAUSE_NUMBER_CHANGED
Definition causes.h:112
#define AST_CAUSE_BEARERCAPABILITY_NOTAVAIL
Definition causes.h:130
#define AST_CAUSE_CALL_AWARDED_DELIVERED
Definition causes.h:103
#define AST_CAUSE_INVALID_NUMBER_FORMAT
Definition causes.h:116
#define AST_CAUSE_OUTGOING_CALL_BARRED
Definition causes.h:127
#define AST_CAUSE_CHAN_NOT_IMPLEMENTED
Definition causes.h:132
#define AST_CAUSE_WRONG_MESSAGE
Definition causes.h:139
#define AST_CAUSE_INCOMPATIBLE_DESTINATION
Definition causes.h:135
#define AST_CAUSE_BEARERCAPABILITY_NOTAUTH
Definition causes.h:129
#define AST_CAUSE_DESTINATION_OUT_OF_ORDER
Definition causes.h:115
#define AST_CAUSE_NO_USER_RESPONSE
Definition causes.h:108
#define AST_CAUSE_NORMAL_TEMPORARY_FAILURE
Definition causes.h:122
#define AST_CAUSE_MESSAGE_TYPE_NONEXIST
Definition causes.h:138
#define AST_CAUSE_MANDATORY_IE_LENGTH_ERROR
Definition causes.h:144
#define AST_CAUSE_REDIRECTED_TO_NEW_DESTINATION
Definition causes.h:113
#define AST_CAUSE_FACILITY_NOT_SUBSCRIBED
Definition causes.h:126
#define AST_CAUSE_BEARERCAPABILITY_NOTIMPL
Definition causes.h:131
#define AST_CAUSE_WRONG_CALL_STATE
Definition causes.h:142
#define AST_CAUSE_PRE_EMPTED
Definition causes.h:104
#define AST_CAUSE_REQUESTED_CHAN_UNAVAIL
Definition causes.h:125
#define AST_CAUSE_NORMAL_CIRCUIT_CONGESTION
Definition causes.h:120
#define AST_CAUSE_CHANNEL_UNACCEPTABLE
Definition causes.h:102
#define AST_CAUSE_NOTDEFINED
Definition causes.h:155
#define AST_CAUSE_CALL_REJECTED
Definition causes.h:111
#define AST_CAUSE_SUBSCRIBER_ABSENT
Definition causes.h:110
#define AST_CAUSE_NETWORK_OUT_OF_ORDER
Definition causes.h:121
#define AST_CAUSE_INVALID_CALL_REFERENCE
Definition causes.h:134
#define AST_CAUSE_FACILITY_REJECTED
Definition causes.h:117
#define AST_CAUSE_ANSWERED_ELSEWHERE
Definition causes.h:114
#define AST_CAUSE_NORMAL_UNSPECIFIED
Definition causes.h:119
#define AST_CAUSE_FACILITY_NOT_IMPLEMENTED
Definition causes.h:133
#define AST_CAUSE_INCOMING_CALL_BARRED
Definition causes.h:128
#define AST_CAUSE_MANDATORY_IE_MISSING
Definition causes.h:137
#define AST_CAUSE_NOSUCHDRIVER
Definition causes.h:156
#define AST_CAUSE_ACCESS_INFO_DISCARDED
Definition causes.h:124
#define AST_CAUSE_RECOVERY_ON_TIMER_EXPIRE
Definition causes.h:143
#define AST_CAUSE_NO_ROUTE_TRANSIT_NET
Definition causes.h:99
#define AST_CAUSE_RESPONSE_TO_STATUS_ENQUIRY
Definition causes.h:118
#define AST_CAUSE_NO_ROUTE_DESTINATION
Definition causes.h:100
#define AST_CAUSE_BUSY
Definition causes.h:149
#define AST_CAUSE_INVALID_MSG_UNSPECIFIED
Definition causes.h:136
#define AST_CAUSE_NO_ANSWER
Definition causes.h:109
#define AST_CAUSE_NORMAL_CLEARING
Definition causes.h:106
#define AST_CAUSE_MISDIALLED_TRUNK_PREFIX
Definition causes.h:101
#define AST_CAUSE_IE_NONEXIST
Definition causes.h:140
#define AST_CAUSE_USER_BUSY
Definition causes.h:107
#define ast_cc_config_params_init()
Allocate and initialize an ast_cc_config_params structure.
Definition ccss.h:135
void ast_cc_config_params_destroy(struct ast_cc_config_params *params)
Free memory from CCSS configuration params.
Definition ccss.c:714
int ast_cc_offer(struct ast_channel *caller_chan)
Offer CC to a caller.
Definition ccss.c:3780
void ast_cc_copy_config_params(struct ast_cc_config_params *dest, const struct ast_cc_config_params *src)
copy CCSS configuration parameters from one structure to another
Definition ccss.c:876
int ast_cc_is_enabled(void)
Determine if CCSS is enabled.
Definition ccss.c:4540
void ast_cdr_free(struct ast_cdr *cdr)
Free a CDR record.
Definition cdr.c:3557
static int connected
Definition cdr_pgsql.c:73
Call Event Logging API.
void ast_cel_publish_event(struct ast_channel *chan, enum ast_cel_event_type event_type, struct ast_json *blob)
Publish a CEL event.
Definition cel.c:1762
@ AST_CEL_DTMF
A DTMF digit was processed.
Definition cel.h:86
static PGresult * result
Definition cel_pgsql.c:84
static int match(struct ast_sockaddr *addr, unsigned short callno, unsigned short dcallno, const struct chan_iax2_pvt *cur, int check_dcallno)
Definition chan_iax2.c:2401
static struct ast_timer * timer
Definition chan_iax2.c:401
static char language[MAX_LANGUAGE]
Definition chan_iax2.c:361
static char accountcode[AST_MAX_ACCOUNT_CODE]
Definition chan_iax2.c:510
unsigned int cos
Definition chan_iax2.c:393
static const char type[]
static int indicate(void *data)
static int transfer(void *data)
static int hangup(void *data)
static int answer(void *data)
Definition chan_pjsip.c:687
static int call(void *data)
static void send_text(unsigned char pos, unsigned char inverse, struct unistimsession *pte, const char *text)
void ast_party_subaddress_copy(struct ast_party_subaddress *dest, const struct ast_party_subaddress *src)
Copy the source party subaddress information to the destination party subaddress.
Definition channel.c:1692
static void channels_shutdown(void)
Definition channel.c:8045
static void channel_do_masquerade(struct ast_channel *original, struct ast_channel *clonechan)
Masquerade a channel.
Definition channel.c:6919
int ast_say_number(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options)
says a number
Definition channel.c:8341
struct varshead * ast_channel_get_manager_vars(struct ast_channel *chan)
Gets the variables for a given channel, as specified by ast_channel_set_manager_vars().
Definition channel.c:8030
int ast_senddigit_mf_begin(struct ast_channel *chan, char digit)
Send an MF digit to a channel.
Definition channel.c:4892
int ast_waitfordigit(struct ast_channel *c, int ms)
Waits for a digit.
Definition channel.c:3213
static int kill_write(struct ast_channel *chan, struct ast_frame *frame)
Definition channel.c:408
void ast_softhangup_all(void)
Soft hangup all active channels.
Definition channel.c:494
int ast_channel_request_stream_topology_change(struct ast_channel *chan, struct ast_stream_topology *topology, void *change_source)
Request that the stream topology of a channel change.
Definition channel.c:11076
void ast_channel_end_dtmf(struct ast_channel *chan, char digit, struct timeval start, const char *why)
Simulate a DTMF end on a broken bridge channel.
Definition channel.c:10979
void ast_party_redirecting_reason_copy(struct ast_party_redirecting_reason *dest, const struct ast_party_redirecting_reason *src)
Copy the source redirecting reason information to the destination redirecting reason.
Definition channel.c:2072
struct ast_channel * ast_channel_get_by_exten(const char *exten, const char *context)
Find a channel by extension and context.
Definition channel.c:1430
static void channel_req_accountcodes(struct ast_channel *chan, const struct ast_channel *requestor, enum ast_channel_requestor_relationship relationship, int precious)
Definition channel.c:6433
static int indicate_connected_line(struct ast_channel *chan, const void *data, size_t datalen)
Definition channel.c:4457
void ast_party_name_init(struct ast_party_name *init)
Initialize the given name structure.
Definition channel.c:1578
char * ast_recvtext(struct ast_channel *chan, int timeout)
Receives a text string from a channel Read a string of text from a channel.
Definition channel.c:4774
static void generator_write_format_change(struct ast_channel *chan)
Definition channel.c:2942
enum ast_channel_error ast_channel_errno(void)
Get error code for latest channel operation.
Definition channel.c:11071
int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen, void *params)
Definition channel.c:2989
struct ast_channel * ast_channel_callback(ao2_callback_data_fn *cb_fn, void *arg, void *data, int ao2_flags)
Call a function with every active channel.
Definition channel.c:1336
void ast_party_dialed_set_init(struct ast_party_dialed *init, const struct ast_party_dialed *guide)
Initialize the given dialed structure using the given guide for a set update operation.
Definition channel.c:1937
int ast_channel_get_device_name(struct ast_channel *chan, char *device_name, size_t name_buffer_length)
Get a device name given its channel structure.
Definition channel.c:10606
struct ast_channel * ast_waitfor_nandfds(struct ast_channel **c, int n, int *fds, int nfds, int *exception, int *outfd, int *ms)
Wait for x amount of time on a file descriptor to have input.
Definition channel.c:3026
static int set_format(struct ast_channel *chan, struct ast_format_cap *cap_set, const int direction, int interleaved_stereo)
Definition channel.c:5650
int ast_auto_answer(struct ast_channel *chan)
Answer a channel, if it's not already answered.
Definition channel.c:2845
static int silence_generator_generate(struct ast_channel *chan, void *data, int len, int samples)
Definition channel.c:8241
void ast_party_redirecting_init(struct ast_party_redirecting *init)
Initialize the given redirecting structure.
Definition channel.c:2109
int ast_write(struct ast_channel *chan, struct ast_frame *fr)
Write a frame to a channel This function writes the given frame to the indicated channel.
Definition channel.c:5201
int ast_call(struct ast_channel *chan, const char *addr, int timeout)
Make a call.
Definition channel.c:6518
void ast_channel_set_redirecting(struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
Set the redirecting id information in the Asterisk channel.
Definition channel.c:9225
static void handle_cause(int cause, int *outstate)
Definition channel.c:5906
void ast_channel_clear_flag(struct ast_channel *chan, unsigned int flag)
Clear a flag on a channel.
Definition channel.c:11144
int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
Add a datastore to a channel.
Definition channel.c:2376
static void send_dtmf_begin_event(struct ast_channel *chan, enum DtmfDirection direction, const char digit)
Definition channel.c:3409
struct ast_channel * ast_call_forward(struct ast_channel *caller, struct ast_channel *orig, int *timeout, struct ast_format_cap *cap, struct outgoing_helper *oh, int *outstate)
Forwards a call to a new channel specified by the original channel's call_forward str....
Definition channel.c:5955
int ast_channel_datastore_remove(struct ast_channel *chan, struct ast_datastore *datastore)
Remove a datastore from a channel.
Definition channel.c:2385
void ast_party_id_init(struct ast_party_id *init)
Initialize the given party id structure.
Definition channel.c:1744
int ast_set_read_format_path(struct ast_channel *chan, struct ast_format *raw_format, struct ast_format *core_format)
Set specific read path on channel.
Definition channel.c:5545
#define AST_MIN_DTMF_GAP
Definition channel.c:116
void ast_channel_clear_softhangup(struct ast_channel *chan, int flag)
Clear a set of softhangup flags from a channel.
Definition channel.c:2423
static void clone_variables(struct ast_channel *original, struct ast_channel *clonechan)
Clone channel variables from 'clone' channel into 'original' channel.
Definition channel.c:6884
static char * handle_cli_core_show_channeltype(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Show details about a channel driver - CLI command.
Definition channel.c:327
struct ast_channel_iterator * ast_channel_iterator_by_name_new(const char *name, size_t name_len)
Create a new channel iterator based on name.
Definition channel.c:1368
int ast_say_digit_str(struct ast_channel *chan, const char *str, const char *ints, const char *lang)
says digits of a string
Definition channel.c:8365
struct varshead * ast_channel_get_vars(struct ast_channel *chan)
Gets the variables for a given channel, as set using pbx_builtin_setvar_helper().
Definition channel.c:7958
int ast_prod(struct ast_channel *chan)
Send empty audio to prime a channel driver.
Definition channel.c:5057
int __ast_answer(struct ast_channel *chan, unsigned int delay)
Answer a channel, with a selectable delay before returning.
Definition channel.c:2729
static int calc_monitor_jump(int samples, int sample_rate, int seek_rate)
calculates the number of samples to jump forward with in a monitor stream.
Definition channel.c:3562
static struct ast_frame * kill_exception(struct ast_channel *chan)
Definition channel.c:402
static int ast_channel_make_compatible_helper(struct ast_channel *from, struct ast_channel *to)
Set up translation from one channel to another.
Definition channel.c:6698
void ast_party_number_init(struct ast_party_number *init)
Initialize the given number structure.
Definition channel.c:1631
static void suppress_framehook_fixup_cb(void *data, int framehook_id, struct ast_channel *old_chan, struct ast_channel *new_chan)
Definition channel.c:10835
void ast_hangup(struct ast_channel *chan)
Hangup a channel.
Definition channel.c:2574
void ast_channel_set_caller(struct ast_channel *chan, const struct ast_party_caller *caller, const struct ast_set_party_caller *update)
Set the caller id information in the Asterisk channel.
Definition channel.c:7433
static int tonepair_generator(struct ast_channel *chan, void *data, int len, int samples)
Definition channel.c:7603
int ast_moh_start(struct ast_channel *chan, const char *mclass, const char *interpclass)
Turn on music on hold on a given channel.
Definition channel.c:7840
void ast_moh_cleanup(struct ast_channel *chan)
Clean up music on hold state on a given channel.
Definition channel.c:7856
int ast_raw_answer_with_stream_topology(struct ast_channel *chan, struct ast_stream_topology *topology)
Answer a channel passing in a stream topology.
Definition channel.c:2672
int ast_readstring(struct ast_channel *c, char *s, int len, int timeout, int ftimeout, char *enders)
Reads multiple digits.
Definition channel.c:6615
int ast_channel_sendurl(struct ast_channel *chan, const char *url)
Sends a URL on a given link Send URL on link.
Definition channel.c:6692
struct ast_channel_iterator * ast_channel_iterator_destroy(struct ast_channel_iterator *i)
Destroy a channel iterator.
Definition channel.c:1349
int ast_queue_hangup(struct ast_channel *chan)
Queue a hangup frame for channel.
Definition channel.c:1182
struct ast_channel * ast_channel_bridge_peer(struct ast_channel *chan)
Get the channel's bridge peer only if the bridge is two-party.
Definition channel.c:10674
int ast_transfer_protocol(struct ast_channel *chan, char *dest, int *protocol)
Transfer a call to dest, if the channel supports transfer.
Definition channel.c:6555
static int indicate_redirecting(struct ast_channel *chan, const void *data, size_t datalen)
Definition channel.c:4512
static void(* ast_moh_cleanup_ptr)(struct ast_channel *)
Definition channel.c:7822
static int set_security_requirements(const struct ast_channel *requestor, struct ast_channel *out)
Definition channel.c:6236
static void ast_read_generator_actions(struct ast_channel *chan, struct ast_frame *f)
Definition channel.c:3463
void ast_party_subaddress_set_init(struct ast_party_subaddress *init, const struct ast_party_subaddress *guide)
Initialize the given party subaddress structure using the given guide for a set update operation.
Definition channel.c:1706
void ast_channel_set_connected_line(struct ast_channel *chan, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update)
Set the connected line information in the Asterisk channel.
Definition channel.c:8414
int ast_senddigit_begin(struct ast_channel *chan, char digit)
Send a DTMF digit to a channel.
Definition channel.c:4931
static int channel_has_external_vars(struct external_vars *channelvars)
Definition channel.c:7891
int ast_party_id_presentation(const struct ast_party_id *id)
Determine the overall presentation value for the given party.
Definition channel.c:1808
struct ast_channel * ast_channel_get_by_uniqueid(const char *uniqueid)
Find a channel by a uniqueid.
Definition channel.c:1442
static int party_subaddress_build_data(unsigned char *data, size_t datalen, const struct ast_party_subaddress *subaddress, const char *label, const struct ast_party_subaddress_ies *ies)
Definition channel.c:8602
void ast_party_number_copy(struct ast_party_number *dest, const struct ast_party_number *src)
Copy the source party number information to the destination party number.
Definition channel.c:1639
@ AST_CONNECTED_LINE_NUMBER_VALID
Definition channel.c:8786
@ AST_CONNECTED_LINE_SOURCE
Definition channel.c:8772
@ AST_CONNECTED_LINE_PRIV_SUBADDRESS_VALID
Definition channel.c:8799
@ AST_CONNECTED_LINE_PRIV_SUBADDRESS_ODD_EVEN
Definition channel.c:8798
@ AST_CONNECTED_LINE_PRIV_NAME_VALID
Definition channel.c:8793
@ AST_CONNECTED_LINE_PRIV_SUBADDRESS_TYPE
Definition channel.c:8797
@ AST_CONNECTED_LINE_PRIV_NUMBER_PRESENTATION
Definition channel.c:8791
@ AST_CONNECTED_LINE_NAME_CHAR_SET
Definition channel.c:8784
@ AST_CONNECTED_LINE_SUBADDRESS_VALID
Definition channel.c:8776
@ AST_CONNECTED_LINE_SUBADDRESS_ODD_EVEN
Definition channel.c:8775
@ AST_CONNECTED_LINE_SUBADDRESS
Definition channel.c:8773
@ AST_CONNECTED_LINE_PRIV_NUMBER_PLAN
Definition channel.c:8789
@ AST_CONNECTED_LINE_NUMBER
Definition channel.c:8768
@ AST_CONNECTED_LINE_ID_PRESENTATION
Definition channel.c:8771
@ AST_CONNECTED_LINE_PRIV_NAME_PRESENTATION
Definition channel.c:8795
@ AST_CONNECTED_LINE_PRIV_NAME
Definition channel.c:8792
@ AST_CONNECTED_LINE_TAG
Definition channel.c:8777
@ AST_CONNECTED_LINE_PRIV_NUMBER_VALID
Definition channel.c:8790
@ AST_CONNECTED_LINE_NUMBER_PRESENTATION
Definition channel.c:8787
@ AST_CONNECTED_LINE_PRIV_NAME_CHAR_SET
Definition channel.c:8794
@ AST_CONNECTED_LINE_NAME
Definition channel.c:8769
@ AST_CONNECTED_LINE_NAME_PRESENTATION
Definition channel.c:8785
@ AST_CONNECTED_LINE_SUBADDRESS_TYPE
Definition channel.c:8774
@ AST_CONNECTED_LINE_PRIV_SUBADDRESS
Definition channel.c:8796
@ AST_CONNECTED_LINE_PRIV_TAG
Definition channel.c:8800
@ AST_CONNECTED_LINE_NAME_VALID
Definition channel.c:8783
@ AST_CONNECTED_LINE_PRIV_NUMBER
Definition channel.c:8788
@ AST_CONNECTED_LINE_NUMBER_PLAN
Definition channel.c:8770
@ AST_CONNECTED_LINE_VERSION
Definition channel.c:8778
static void moh_cleanup(struct ast_channel *chan)
Definition channel.c:7861
static int namedgroup_cmp_cb(void *obj, void *arg, int flags)
Comparison function used for named group container.
Definition channel.c:7733
void ast_channel_unlink(struct ast_channel *chan)
Remove a channel from the global channels container.
Definition channel.c:10639
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
Queue one or more frames to a channel's frame queue.
Definition channel.c:1171
void ast_party_number_set(struct ast_party_number *dest, const struct ast_party_number *src)
Set the source party number information into the destination party number.
Definition channel.c:1661
void ast_party_subaddress_init(struct ast_party_subaddress *init)
Initialize the given subaddress structure.
Definition channel.c:1684
int ast_channel_has_hook_requiring_audio(struct ast_channel *chan)
Check if the channel has any active hooks that require audio.
Definition channel.c:2557
int ast_readstring_full(struct ast_channel *c, char *s, int len, int timeout, int ftimeout, char *enders, int audiofd, int ctrlfd)
Definition channel.c:6620
static const struct ast_datastore_info suppress_datastore_voice
Definition channel.c:10819
void ast_party_connected_line_free(struct ast_party_connected_line *doomed)
Destroy the connected line information contents.
Definition channel.c:2059
static const struct ast_datastore_info plc_ds_info
Definition channel.c:5105
int64_t ast_channel_get_up_time_ms(struct ast_channel *chan)
Obtain how long it has been since the channel was answered in ms.
Definition channel.c:2869
void ast_channel_set_manager_vars(size_t varc, char **vars)
Sets the variables to be stored in the manager_vars field of all snapshots.
Definition channel.c:7934
int ast_sendtext_data(struct ast_channel *chan, struct ast_msg_data *msg)
Sends text to a channel in an ast_msg_data structure wrapper with ast_sendtext as fallback.
Definition channel.c:4808
static int party_name_build_data(unsigned char *data, size_t datalen, const struct ast_party_name *name, const char *label, const struct ast_party_name_ies *ies)
Definition channel.c:8454
DtmfDirection
Definition channel.c:3392
@ DTMF_SENT
Definition channel.c:3394
@ DTMF_RECEIVED
Definition channel.c:3393
int ast_set_read_format_from_cap(struct ast_channel *chan, struct ast_format_cap *cap)
Sets read format on channel chan from capabilities Set read format for channel to whichever component...
Definition channel.c:5837
int ast_tonepair_start(struct ast_channel *chan, int freq1, int freq2, int duration, int vol)
Definition channel.c:7656
void ast_channel_set_caller_event(struct ast_channel *chan, const struct ast_party_caller *caller, const struct ast_set_party_caller *update)
Set the caller id information in the Asterisk channel and generate an AMI event if the caller id name...
Definition channel.c:7446
static char * handle_cli_core_show_channeltypes(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Show channel types - CLI command.
Definition channel.c:262
int ast_senddigit(struct ast_channel *chan, char digit, unsigned int duration)
Send a DTMF digit to a channel.
Definition channel.c:5031
#define AST_DEFAULT_EMULATE_DTMF_DURATION
Definition channel.c:106
void ast_party_redirecting_set(struct ast_party_redirecting *dest, const struct ast_party_redirecting *src, const struct ast_set_party_redirecting *update)
Set the redirecting information based on another redirecting source.
Definition channel.c:2153
const struct ast_channel_tech ast_kill_tech
Kill the channel channel driver technology descriptor.
Definition channel.c:435
int ast_channel_make_compatible(struct ast_channel *chan, struct ast_channel *peer)
Make the frame formats of two channels compatible.
Definition channel.c:6777
int ast_channel_queryoption(struct ast_channel *chan, int option, void *data, int *datalen, int block)
Checks the value of an option.
Definition channel.c:7516
struct varshead * ast_channel_get_ari_vars(struct ast_channel *chan)
Gets the variables for a given channel, as specified by ast_channel_set_ari_vars().
Definition channel.c:8035
static void queue_dtmf_readq(struct ast_channel *chan, struct ast_frame *f)
Definition channel.c:3517
static void * channel_cc_params_copy(void *data)
Definition channel.c:10534
static int deactivate_silence_generator(struct ast_channel *chan)
Definition channel.c:8293
static void tonepair_release(struct ast_channel *chan, void *params)
Definition channel.c:7561
static struct varshead * channel_get_external_vars(struct external_vars *channelvars, struct ast_channel *chan)
Definition channel.c:7983
int ast_channel_setoption(struct ast_channel *chan, int option, void *data, int datalen, int block)
Sets an option on a channel.
Definition channel.c:7496
void ast_moh_stop(struct ast_channel *chan)
Turn off music on hold on a given channel.
Definition channel.c:7850
void ast_party_id_free(struct ast_party_id *doomed)
Destroy the party id contents.
Definition channel.c:1798
void ast_channel_unregister(const struct ast_channel_tech *tech)
Unregister channel driver.
Definition channel.c:571
static const struct ast_datastore_info * suppress_get_datastore_information(enum ast_frame_type frametype)
Definition channel.c:10877
void ast_party_subaddress_set(struct ast_party_subaddress *dest, const struct ast_party_subaddress *src)
Set the source party subaddress information into the destination party subaddress.
Definition channel.c:1714
int ast_waitfor_n_fd(int *fds, int n, int *ms, int *exception)
Wait for x amount of time on a file descriptor to have input.
Definition channel.c:3018
int ast_channel_stream_topology_changed(struct ast_channel *chan, struct ast_stream_topology *topology)
Provide notice to a channel that the stream topology has changed.
Definition channel.c:11106
int ast_set_write_format_from_cap(struct ast_channel *chan, struct ast_format_cap *cap)
Sets write format on channel chan Set write format for channel to whichever component of "format" is ...
Definition channel.c:5878
void ast_party_id_set(struct ast_party_id *dest, const struct ast_party_id *src, const struct ast_set_party_id *update)
Set the source party id information into the destination party id.
Definition channel.c:1775
struct ast_channel * ast_channel_iterator_next(struct ast_channel_iterator *i)
Get the next channel for a channel iterator.
Definition channel.c:1388
void ast_set_variables(struct ast_channel *chan, struct ast_variable *vars)
adds a list of channel variables to a channel
Definition channel.c:8221
struct ast_namedgroups * ast_ref_namedgroups(struct ast_namedgroups *groups)
Definition channel.c:7812
static const struct ast_channel_tech null_tech
Definition channel.c:703
int ast_channel_feature_hooks_replace(struct ast_channel *chan, struct ast_bridge_features *features)
Sets the channel-attached features a channel has access to upon being bridged.
Definition channel.c:11066
static void silence_generator_release(struct ast_channel *chan, void *data)
Definition channel.c:8236
static int namedgroup_hash_cb(const void *obj, const int flags)
Hashing function used for named group container.
Definition channel.c:7742
struct ast_silence_generator * ast_channel_start_silence_generator(struct ast_channel *chan)
Starts a silence generator on the given channel.
Definition channel.c:8270
int internal_channel_set_current_storage_driver(const char *driver_name)
Definition channel.c:8085
static int chancount
Definition channel.c:97
static void(* ast_moh_stop_ptr)(struct ast_channel *)
Definition channel.c:7821
void ast_party_connected_line_copy(struct ast_party_connected_line *dest, const struct ast_party_connected_line *src)
Copy the source connected line information to the destination connected line.
Definition channel.c:2018
int ast_recvchar(struct ast_channel *chan, int timeout)
Receives a text character from a channel.
Definition channel.c:4763
static struct external_vars ari_vars
Definition channel.c:7879
struct ast_channel * ast_channel_yank(struct ast_channel *yankee)
Gain control of a channel in the system.
Definition channel.c:10703
int ast_queue_control(struct ast_channel *chan, enum ast_control_frame_type control)
Queue a control frame.
Definition channel.c:1289
int ast_channel_cc_params_init(struct ast_channel *chan, const struct ast_cc_config_params *base_params)
Set up datastore with CCSS parameters for a channel.
Definition channel.c:10557
int ast_say_ordinal(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options)
says an ordinal number
Definition channel.c:8347
void ast_channel_close_storage(void)
Definition channel.c:8040
int ast_channel_get_intercept_mode(void)
Am I currently running an intercept dialplan routine.
Definition channel.c:10439
void ast_party_connected_line_set(struct ast_party_connected_line *dest, const struct ast_party_connected_line *src, const struct ast_set_party_connected_line *update)
Set the connected line information based on another connected line source.
Definition channel.c:2041
int ast_write_stream(struct ast_channel *chan, int stream_num, struct ast_frame *fr)
Write a frame to a stream This function writes the given frame to the indicated stream on the channel...
Definition channel.c:5206
void ast_channel_stop_silence_generator(struct ast_channel *chan, struct ast_silence_generator *state)
Stops a previously-started silence generator on the given channel.
Definition channel.c:8316
int ast_settimeout_full(struct ast_channel *c, unsigned int rate, int(*func)(const void *data), void *data, unsigned int is_ao2_obj)
Definition channel.c:3223
static int should_skip_dtmf(struct ast_channel *chan)
Determine whether or not we should ignore DTMF in the readq.
Definition channel.c:3535
static struct ast_channel * __ast_channel_alloc_ap(int needqueue, int state, const char *cid_num, const char *cid_name, const char *acctcode, const char *exten, const char *context, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, enum ama_flags amaflag, struct ast_endpoint *endpoint, struct ast_channel_initializers *initializers, const char *file, int line, const char *function, const char *name_fmt, va_list ap)
Create a new channel structure.
Definition channel.c:746
void ast_party_dialed_init(struct ast_party_dialed *init)
Initialize the given dialed structure.
Definition channel.c:1915
const char * ast_channel_get_current_storage_driver_name(void)
Get the name of the current channel storage driver.
Definition channel.c:8079
void ast_party_caller_copy(struct ast_party_caller *dest, const struct ast_party_caller *src)
Copy the source caller information to the destination caller.
Definition channel.c:1973
int ast_setstate(struct ast_channel *chan, enum ast_channel_state state)
Change the state of a channel.
Definition channel.c:7460
void ast_party_redirecting_reason_set(struct ast_party_redirecting_reason *dest, const struct ast_party_redirecting_reason *src)
Set the redirecting reason information based on another redirecting reason source.
Definition channel.c:2089
int ast_namedgroups_intersect(struct ast_namedgroups *a, struct ast_namedgroups *b)
Return TRUE if group a and b contain at least one common groupname.
Definition channel.c:8196
int ast_channel_datastore_inherit(struct ast_channel *from, struct ast_channel *to)
Inherit datastores from a parent to a child.
Definition channel.c:2359
char * ast_transfercapability2str(int transfercapability)
Gives the string form of a given transfer capability.
Definition channel.c:673
void ast_channel_undefer_dtmf(struct ast_channel *chan)
Unset defer DTMF flag on channel.
Definition channel.c:1329
static void deactivate_generator_nolock(struct ast_channel *chan)
Definition channel.c:2911
void ast_channel_req_accountcodes(struct ast_channel *chan, const struct ast_channel *requestor, enum ast_channel_requestor_relationship relationship)
Setup new channel accountcodes from the requestor channel after ast_request().
Definition channel.c:6491
void ast_deactivate_generator(struct ast_channel *chan)
Definition channel.c:2926
static void channel_cc_params_destroy(void *data)
Definition channel.c:10545
void ast_party_id_merge_copy(struct ast_party_id *dest, struct ast_party_id *base, struct ast_party_id *overlay)
Copy a merge of a given party id into another given party id to a given destination party id.
Definition channel.c:1907
struct ast_channel_iterator * ast_channel_iterator_by_exten_new(const char *exten, const char *context)
Create a new channel iterator based on extension.
Definition channel.c:1357
int ast_check_hangup_locked(struct ast_channel *chan)
Definition channel.c:460
static const struct causes_map causes[]
Definition channel.c:137
static void plc_ds_destroy(void *data)
Definition channel.c:5098
int ast_channel_cmpwhentohangup_tv(struct ast_channel *chan, struct timeval offset)
Compare a offset with when to hangup channel.
Definition channel.c:524
unsigned long global_fin
Definition channel.c:99
struct ast_channel * __ast_channel_alloc(int needqueue, int state, const char *cid_num, const char *cid_name, const char *acctcode, const char *exten, const char *context, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, enum ama_flags amaflag, struct ast_endpoint *endpoint, const char *file, int line, const char *function, const char *name_fmt,...)
Create a channel structure.
Definition channel.c:967
void ast_install_music_functions(int(*start_ptr)(struct ast_channel *, const char *, const char *), void(*stop_ptr)(struct ast_channel *), void(*cleanup_ptr)(struct ast_channel *))
Definition channel.c:7824
char * ast_print_group(char *buf, int buflen, ast_group_t group)
Print call group and pickup group —.
Definition channel.c:8137
static void varshead_dtor(void *obj)
Destructor for lists of variables.
Definition channel.c:7948
struct ast_channel * ast_channel_get_by_name_prefix(const char *name, size_t name_len)
Find a channel by a name prefix.
Definition channel.c:1400
void ast_party_redirecting_reason_set_init(struct ast_party_redirecting_reason *init, const struct ast_party_redirecting_reason *guide)
Initialize the given redirecting reason structure using the given guide for a set update operation.
Definition channel.c:2083
int ast_set_write_format_interleaved_stereo(struct ast_channel *chan, struct ast_format *format)
Sets write format for a channel. All internal data will than be handled in an interleaved format....
Definition channel.c:5842
void ast_party_caller_set(struct ast_party_caller *dest, const struct ast_party_caller *src, const struct ast_set_party_caller *update)
Set the caller information based on another caller source.
Definition channel.c:1994
int ast_channel_suppress(struct ast_channel *chan, unsigned int direction, enum ast_frame_type frametype)
Suppress passing of a frame type on a channel.
Definition channel.c:10887
int ast_channel_feature_hooks_append(struct ast_channel *chan, struct ast_bridge_features *features)
Appends to the channel-attached features a channel has access to upon being bridged.
Definition channel.c:11061
static int safe_sleep_conditional(struct ast_channel *chan, int timeout_ms, int(*cond)(void *), void *data, unsigned int generate_silence)
Wait, look for hangups and condition arg.
Definition channel.c:1485
static void __ast_change_name_nolink(struct ast_channel *chan, const char *newname)
this function simply changes the name of the channel and issues a manager_event with out unlinking an...
Definition channel.c:6799
@ AST_REDIRECTING_FROM_NAME_PRESENTATION
Definition channel.c:9271
@ AST_REDIRECTING_TO_NAME
Definition channel.c:9249
@ AST_REDIRECTING_VERSION
Definition channel.c:9264
@ AST_REDIRECTING_PRIV_FROM_NAME_VALID
Definition channel.c:9311
@ AST_REDIRECTING_PRIV_FROM_SUBADDRESS_ODD_EVEN
Definition channel.c:9316
@ AST_REDIRECTING_TO_TAG
Definition channel.c:9263
@ AST_REDIRECTING_FROM_NUMBER_PLAN
Definition channel.c:9246
@ AST_REDIRECTING_PRIV_TO_NAME_VALID
Definition channel.c:9298
@ AST_REDIRECTING_ORIG_TAG
Definition channel.c:9291
@ AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_ODD_EVEN
Definition channel.c:9329
@ AST_REDIRECTING_REASON_CODE
Definition channel.c:9252
@ AST_REDIRECTING_PRIV_TO_NUMBER_VALID
Definition channel.c:9295
@ AST_REDIRECTING_PRIV_TO_NUMBER_PRESENTATION
Definition channel.c:9296
@ AST_REDIRECTING_ORIG_REASON_CODE
Definition channel.c:9292
@ AST_REDIRECTING_TO_NAME_PRESENTATION
Definition channel.c:9276
@ AST_REDIRECTING_PRIV_TO_NAME
Definition channel.c:9297
@ AST_REDIRECTING_PRIV_ORIG_NAME_VALID
Definition channel.c:9324
@ AST_REDIRECTING_ORIG_NUMBER_VALID
Definition channel.c:9280
@ AST_REDIRECTING_FROM_NUMBER_PRESENTATION
Definition channel.c:9273
@ AST_REDIRECTING_ORIG_SUBADDRESS_VALID
Definition channel.c:9290
@ AST_REDIRECTING_FROM_NUMBER_VALID
Definition channel.c:9272
@ AST_REDIRECTING_TO_NAME_VALID
Definition channel.c:9274
@ AST_REDIRECTING_PRIV_FROM_NAME
Definition channel.c:9310
@ AST_REDIRECTING_TO_SUBADDRESS_ODD_EVEN
Definition channel.c:9260
@ AST_REDIRECTING_ORIG_SUBADDRESS_ODD_EVEN
Definition channel.c:9289
@ AST_REDIRECTING_PRIV_FROM_SUBADDRESS_TYPE
Definition channel.c:9315
@ AST_REDIRECTING_PRIV_TO_SUBADDRESS_VALID
Definition channel.c:9304
@ AST_REDIRECTING_PRIV_TO_SUBADDRESS_ODD_EVEN
Definition channel.c:9303
@ AST_REDIRECTING_ORIG_NAME_CHAR_SET
Definition channel.c:9285
@ AST_REDIRECTING_PRIV_FROM_SUBADDRESS
Definition channel.c:9314
@ AST_REDIRECTING_TO_NUMBER_PLAN
Definition channel.c:9250
@ AST_REDIRECTING_PRIV_TO_NUMBER
Definition channel.c:9293
@ AST_REDIRECTING_PRIV_FROM_NUMBER_VALID
Definition channel.c:9308
@ AST_REDIRECTING_ORIG_NAME
Definition channel.c:9283
@ AST_REDIRECTING_ORIG_SUBADDRESS
Definition channel.c:9287
@ AST_REDIRECTING_FROM_TAG
Definition channel.c:9262
@ AST_REDIRECTING_PRIV_ORIG_NUMBER_PLAN
Definition channel.c:9321
@ AST_REDIRECTING_TO_NUMBER
Definition channel.c:9248
@ AST_REDIRECTING_ORIG_SUBADDRESS_TYPE
Definition channel.c:9288
@ AST_REDIRECTING_FROM_NAME_CHAR_SET
Definition channel.c:9270
@ AST_REDIRECTING_PRIV_FROM_TAG
Definition channel.c:9318
@ AST_REDIRECTING_FROM_ID_PRESENTATION
Definition channel.c:9247
@ AST_REDIRECTING_PRIV_FROM_NUMBER
Definition channel.c:9306
@ AST_REDIRECTING_PRIV_TO_NUMBER_PLAN
Definition channel.c:9294
@ AST_REDIRECTING_TO_NUMBER_VALID
Definition channel.c:9277
@ AST_REDIRECTING_FROM_SUBADDRESS_VALID
Definition channel.c:9257
@ AST_REDIRECTING_FROM_NAME_VALID
Definition channel.c:9269
@ AST_REDIRECTING_PRIV_TO_NAME_CHAR_SET
Definition channel.c:9299
@ AST_REDIRECTING_PRIV_ORIG_TAG
Definition channel.c:9331
@ AST_REDIRECTING_FROM_SUBADDRESS_TYPE
Definition channel.c:9255
@ AST_REDIRECTING_PRIV_TO_TAG
Definition channel.c:9305
@ AST_REDIRECTING_COUNT
Definition channel.c:9253
@ AST_REDIRECTING_FROM_SUBADDRESS
Definition channel.c:9254
@ AST_REDIRECTING_PRIV_ORIG_NAME_CHAR_SET
Definition channel.c:9325
@ AST_REDIRECTING_ORIG_NAME_VALID
Definition channel.c:9284
@ AST_REDIRECTING_TO_ID_PRESENTATION
Definition channel.c:9251
@ AST_REDIRECTING_PRIV_FROM_NUMBER_PLAN
Definition channel.c:9307
@ AST_REDIRECTING_PRIV_TO_NAME_PRESENTATION
Definition channel.c:9300
@ AST_REDIRECTING_PRIV_FROM_NUMBER_PRESENTATION
Definition channel.c:9309
@ AST_REDIRECTING_PRIV_FROM_NAME_PRESENTATION
Definition channel.c:9313
@ AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_TYPE
Definition channel.c:9328
@ AST_REDIRECTING_ORIG_REASON_STR
Definition channel.c:9333
@ AST_REDIRECTING_ORIG_NAME_PRESENTATION
Definition channel.c:9286
@ AST_REDIRECTING_PRIV_FROM_NAME_CHAR_SET
Definition channel.c:9312
@ AST_REDIRECTING_ORIG_NUMBER
Definition channel.c:9279
@ AST_REDIRECTING_PRIV_ORIG_NAME
Definition channel.c:9323
@ AST_REDIRECTING_PRIV_TO_SUBADDRESS_TYPE
Definition channel.c:9302
@ AST_REDIRECTING_PRIV_ORIG_NUMBER_VALID
Definition channel.c:9320
@ AST_REDIRECTING_PRIV_ORIG_NUMBER_PRESENTATION
Definition channel.c:9322
@ AST_REDIRECTING_TO_SUBADDRESS_VALID
Definition channel.c:9261
@ AST_REDIRECTING_PRIV_ORIG_SUBADDRESS_VALID
Definition channel.c:9330
@ AST_REDIRECTING_TO_SUBADDRESS_TYPE
Definition channel.c:9259
@ AST_REDIRECTING_REASON_STR
Definition channel.c:9332
@ AST_REDIRECTING_FROM_NAME
Definition channel.c:9245
@ AST_REDIRECTING_PRIV_ORIG_NUMBER
Definition channel.c:9319
@ AST_REDIRECTING_PRIV_FROM_SUBADDRESS_VALID
Definition channel.c:9317
@ AST_REDIRECTING_ORIG_NUMBER_PRESENTATION
Definition channel.c:9282
@ AST_REDIRECTING_PRIV_TO_SUBADDRESS
Definition channel.c:9301
@ AST_REDIRECTING_PRIV_ORIG_NAME_PRESENTATION
Definition channel.c:9326
@ AST_REDIRECTING_TO_NUMBER_PRESENTATION
Definition channel.c:9278
@ AST_REDIRECTING_FROM_NUMBER
Definition channel.c:9244
@ AST_REDIRECTING_ORIG_NUMBER_PLAN
Definition channel.c:9281
@ AST_REDIRECTING_FROM_SUBADDRESS_ODD_EVEN
Definition channel.c:9256
@ AST_REDIRECTING_PRIV_ORIG_SUBADDRESS
Definition channel.c:9327
@ AST_REDIRECTING_TO_SUBADDRESS
Definition channel.c:9258
@ AST_REDIRECTING_TO_NAME_CHAR_SET
Definition channel.c:9275
void ast_channel_softhangup_withcause_locked(struct ast_channel *chan, int causecode)
Lock the given channel, then request softhangup on the channel with the given causecode.
Definition channel.c:469
int ast_say_digits(struct ast_channel *chan, int num, const char *ints, const char *lang)
says digits
Definition channel.c:8359
int ast_undestroyed_channels(void)
Definition channel.c:505
struct ast_frame * ast_read(struct ast_channel *chan)
Reads a frame.
Definition channel.c:4312
void ast_party_connected_line_collect_caller(struct ast_party_connected_line *connected, struct ast_party_caller *caller)
Collect the caller party information into a connected line structure.
Definition channel.c:2050
int ast_queue_control_data(struct ast_channel *chan, enum ast_control_frame_type control, const void *data, size_t datalen)
Queue a control frame with payload.
Definition channel.c:1296
struct ast_bridge_features * ast_channel_feature_hooks_get(struct ast_channel *chan)
Gets the channel-attached features a channel has access to upon being bridged.
Definition channel.c:11013
void ast_channel_update_connected_line(struct ast_channel *chan, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update)
Indicate that the connected line information has changed.
Definition channel.c:9199
int ast_senddigit_mf_end(struct ast_channel *chan)
End sending an MF digit to a channel.
Definition channel.c:5000
int ast_channel_move(struct ast_channel *dest, struct ast_channel *source)
Move a channel from its current location to a new location.
Definition channel.c:10776
void ast_channel_queue_redirecting_update(struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
Queue a redirecting update frame on a channel.
Definition channel.c:10403
void ast_party_redirecting_reason_init(struct ast_party_redirecting_reason *init)
Initialize the given redirecting reason structure.
Definition channel.c:2066
int ast_senddigit_external(struct ast_channel *chan, char digit, unsigned int duration)
Send a DTMF digit to a channel from an external thread.
Definition channel.c:5044
int ast_sendtext(struct ast_channel *chan, const char *text)
Sends text to a channel.
Definition channel.c:4866
struct ast_channel * ast_request_and_dial(const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *addr, int timeout, int *outstate, const char *cidnum, const char *cidname)
Request a channel of a given type, with data as optional information used by the low level module and...
Definition channel.c:6231
struct ast_frame * ast_read_stream(struct ast_channel *chan)
Reads a frame, but does not filter to just the default streams.
Definition channel.c:4317
void ast_party_caller_set_init(struct ast_party_caller *init, const struct ast_party_caller *guide)
Initialize the given caller structure using the given guide for a set update operation.
Definition channel.c:1986
void ast_party_id_set_init(struct ast_party_id *init, const struct ast_party_id *guide)
Initialize the given party id structure using the given guide for a set update operation.
Definition channel.c:1767
void ast_party_name_free(struct ast_party_name *doomed)
Destroy the party name contents.
Definition channel.c:1625
void ast_channel_set_ari_vars(size_t varc, char **vars)
Sets the variables to be stored in the ari_vars field of all snapshots.
Definition channel.c:7939
void ast_party_dialed_free(struct ast_party_dialed *doomed)
Destroy the dialed party contents.
Definition channel.c:1958
int ast_say_money_str(struct ast_channel *chan, const char *str, const char *ints, const char *lang)
function to pronounce monetary amounts
Definition channel.c:8371
void ast_set_callerid(struct ast_channel *chan, const char *cid_num, const char *cid_name, const char *cid_ani)
Set caller ID number, name and ANI and generate AMI event.
Definition channel.c:7408
int ast_channel_redirecting_sub(struct ast_channel *autoservice_chan, struct ast_channel *sub_chan, const void *redirecting_info, int is_frame)
Run a redirecting interception subroutine and update a channel's redirecting information.
Definition channel.c:10489
void ast_channel_inherit_variables(const struct ast_channel *parent, struct ast_channel *child)
Inherits channel variable from parent to child channel.
Definition channel.c:6833
static ast_mutex_t channel_move_lock
Definition channel.c:10774
static int namedgroup_match(void *obj, void *arg, int flags)
Definition channel.c:8186
int ast_queue_frame_head(struct ast_channel *chan, struct ast_frame *fin)
Queue one or more frames to the head of a channel's frame queue.
Definition channel.c:1176
static const struct ast_datastore_info cc_channel_datastore_info
Definition channel.c:10551
static int channel_feature_hooks_set_full(struct ast_channel *chan, struct ast_bridge_features *features, int replace)
Definition channel.c:11024
struct ast_frame * ast_read_stream_noaudio(struct ast_channel *chan)
Reads a frame, but does not filter to just the default streams, returning AST_FRAME_NULL frame if aud...
Definition channel.c:4327
int ast_channel_sendhtml(struct ast_channel *chan, int subclass, const char *data, int datalen)
Sends HTML on given channel Send HTML or URL on link.
Definition channel.c:6685
struct ast_channel * __ast_request_and_dial(const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *addr, int timeout, int *outstate, const char *cid_num, const char *cid_name, struct outgoing_helper *oh)
Request a channel of a given type, with data as optional information used by the low level module and...
Definition channel.c:6033
void ast_party_redirecting_set_init(struct ast_party_redirecting *init, const struct ast_party_redirecting *guide)
Initialize the given redirecting id structure using the given guide for a set update operation.
Definition channel.c:2140
int ast_set_read_format(struct ast_channel *chan, struct ast_format *format)
Sets read format on channel chan.
Definition channel.c:5819
static void free_external_channelvars(struct external_vars *channelvars)
Definition channel.c:7881
void ast_party_name_set_init(struct ast_party_name *init, const struct ast_party_name *guide)
Initialize the given party name structure using the given guide for a set update operation.
Definition channel.c:1600
int ast_say_enumeration(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options)
says an enumeration
Definition channel.c:8353
int ast_queue_hangup_with_cause(struct ast_channel *chan, int cause)
Queue a hangup frame for channel.
Definition channel.c:1213
static int do_ids_conflict(const struct ast_assigned_ids *assignedids, int rdlock)
Definition channel.c:711
int ast_connected_line_parse_data(const unsigned char *data, size_t datalen, struct ast_party_connected_line *connected)
Parse connected line indication frame data.
Definition channel.c:8891
void ast_party_caller_free(struct ast_party_caller *doomed)
Destroy the caller party contents.
Definition channel.c:2002
struct ast_channel * __ast_dummy_channel_alloc(const char *file, int line, const char *function)
Definition channel.c:1007
const char * ast_cause2str(int cause)
Gives the string form of a given hangup cause.
Definition channel.c:613
const char * ast_channel_amaflags2string(enum ama_flags flag)
Convert the enum representation of an AMA flag to a string representation.
Definition channel.c:4429
void ast_party_dialed_copy(struct ast_party_dialed *dest, const struct ast_party_dialed *src)
Copy the source dialed party information to the destination dialed party.
Definition channel.c:1923
int ast_active_channels(void)
returns number of active/allocated channels
Definition channel.c:500
static struct ast_frame * kill_read(struct ast_channel *chan)
Definition channel.c:396
struct ast_channel * ast_request_with_stream_topology(const char *type, struct ast_stream_topology *topology, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *addr, int *cause)
Requests a channel (specifying stream topology)
Definition channel.c:6416
static const struct set_format_access set_format_access_write
Definition channel.c:5639
struct ast_namedgroups * ast_get_namedgroups(const char *s)
Create an ast_namedgroups set with group names from comma separated string.
Definition channel.c:7749
static struct ast_generator tonepair
Definition channel.c:7650
static int generator_force(const void *data)
Definition channel.c:2954
static void call_forward_inherit(struct ast_channel *new_chan, struct ast_channel *parent, struct ast_channel *orig)
Definition channel.c:5927
static void adjust_frame_for_plc(struct ast_channel *chan, struct ast_frame *frame, struct ast_datastore *datastore)
Definition channel.c:5110
void ast_uninstall_music_functions(void)
Definition channel.c:7833
static void channel_set_intercept_mode(int in_intercept_mode)
Definition channel.c:10428
int ast_channels_init(void)
Definition channel.c:8107
int ast_waitfordigit_full(struct ast_channel *c, int timeout_ms, const char *breakon, int audiofd, int cmdfd)
Wait for a digit Same as ast_waitfordigit() with audio fd for outputting read audio and ctrlfd to mon...
Definition channel.c:3278
int ast_check_hangup(struct ast_channel *chan)
Checks to see if a channel is needing hang up.
Definition channel.c:446
int ast_say_character_str(struct ast_channel *chan, const char *str, const char *ints, const char *lang, enum ast_say_case_sensitivity sensitivity)
function to pronounce character and phonetic strings
Definition channel.c:8377
static struct external_vars ami_vars
Definition channel.c:7878
void ast_party_name_set(struct ast_party_name *dest, const struct ast_party_name *src)
Set the source party name information into the destination party name.
Definition channel.c:1608
static void features_destroy(void *obj)
Definition channel.c:11003
void ast_set_party_id_all(struct ast_set_party_id *update_id)
Set the update marker to update all information of a corresponding party id.
Definition channel.c:1737
int ast_channel_is_bridged(const struct ast_channel *chan)
Determine if a channel is in a bridge.
Definition channel.c:10655
static int kill_hangup(struct ast_channel *chan)
Definition channel.c:420
void ast_party_dialed_set(struct ast_party_dialed *dest, const struct ast_party_dialed *src)
Set the dialed information based on another dialed source.
Definition channel.c:1945
const char * ast_channel_reason2str(int reason)
return an english explanation of the code returned thru __ast_request_and_dial's 'outstate' argument
Definition channel.c:5883
struct ast_frame * ast_read_noaudio(struct ast_channel *chan)
Reads a frame, returning AST_FRAME_NULL frame if audio.
Definition channel.c:4322
int64_t ast_channel_get_duration_ms(struct ast_channel *chan)
Obtain how long it's been, in milliseconds, since the channel was created.
Definition channel.c:2854
struct ast_bridge * ast_channel_get_bridge(const struct ast_channel *chan)
Get the bridge associated with a channel.
Definition channel.c:10644
static void suppress_datastore_destroy_cb(void *data)
Definition channel.c:10814
struct ast_channel * ast_channel_release(struct ast_channel *chan)
Unlink and release reference to a channel.
Definition channel.c:1571
int ast_channel_open_storage()
Definition channel.c:8058
int ast_redirecting_build_data(unsigned char *data, size_t datalen, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
Build the redirecting id data frame.
Definition channel.c:9374
void ast_set_hangupsource(struct ast_channel *chan, const char *source, int force)
Set the source of the hangup in this channel and it's bridge.
Definition channel.c:2532
void ast_channel_set_flag(struct ast_channel *chan, unsigned int flag)
Set a flag on a channel.
Definition channel.c:11137
int ast_softhangup(struct ast_channel *chan, int cause)
Softly hangup a channel, lock.
Definition channel.c:2462
static void send_flash_event(struct ast_channel *chan)
Definition channel.c:3453
int ast_write_video(struct ast_channel *chan, struct ast_frame *fr)
Write video frame to a channel This function writes the given frame to the indicated channel.
Definition channel.c:5074
static void send_dtmf_end_event(struct ast_channel *chan, enum DtmfDirection direction, const char digit, long duration_ms)
Definition channel.c:3424
void ast_channel_name_to_dial_string(char *channel_name)
Removes the trailing identifiers from a channel name string.
Definition channel.c:6901
void ast_channel_hangupcause_hash_set(struct ast_channel *chan, const struct ast_control_pvt_cause_code *cause_code, int datalen)
Sets the HANGUPCAUSE hash and optionally the SIP_CAUSE hash on the given channel.
Definition channel.c:4402
struct ast_channel * __ast_channel_alloc_with_initializers(int needqueue, int state, const char *cid_num, const char *cid_name, const char *acctcode, const char *exten, const char *context, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, enum ama_flags amaflag, struct ast_endpoint *endpoint, struct ast_channel_initializers *initializers, const char *file, int line, const char *function, const char *name_fmt,...)
Create a channel structure.
Definition channel.c:986
int ast_queue_unhold(struct ast_channel *chan)
Queue an unhold frame.
Definition channel.c:1274
static void destroy_hooks(struct ast_channel *chan)
Definition channel.c:2563
int ast_channel_connected_line_sub(struct ast_channel *autoservice_chan, struct ast_channel *sub_chan, const void *connected_info, int is_frame)
Run a connected line interception subroutine and update a channel's connected line information.
Definition channel.c:10444
void ast_channel_update_redirecting(struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
Indicate that the redirecting id has changed.
Definition channel.c:10390
int ast_channel_has_manager_vars(void)
Return whether or not any manager variables have been set.
Definition channel.c:7902
void ast_party_id_reset(struct ast_party_id *id)
Destroy and initialize the given party id structure.
Definition channel.c:1883
void ast_party_id_invalidate(struct ast_party_id *id)
Invalidate all components of the given party id.
Definition channel.c:1876
int ast_queue_hold(struct ast_channel *chan, const char *musicclass)
Queue a hold frame.
Definition channel.c:1249
int ast_connected_line_build_data(unsigned char *data, size_t datalen, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update)
Build the connected line information data frame.
Definition channel.c:8803
int ast_senddigit_end(struct ast_channel *chan, char digit, unsigned int duration)
Send a DTMF digit to a channel.
Definition channel.c:4981
int ast_channel_has_ari_vars(void)
Return whether or not any ARI variables have been set.
Definition channel.c:7907
int ast_channel_register(const struct ast_channel_tech *tech)
Register a new telephony channel in Asterisk.
Definition channel.c:540
int ast_say_phonetic_str(struct ast_channel *chan, const char *str, const char *ints, const char *lang)
Definition channel.c:8383
struct ast_party_id ast_party_id_merge(struct ast_party_id *base, struct ast_party_id *overlay)
Merge a given party id into another given party id.
Definition channel.c:1889
int ast_channel_stream_topology_changed_externally(struct ast_channel *chan)
Provide notice from a channel that the topology has changed on it as a result of the remote party ren...
Definition channel.c:11118
#define DEFAULT_EMULATE_MF_DURATION
Definition channel.c:110
void ast_party_number_set_init(struct ast_party_number *init, const struct ast_party_number *guide)
Initialize the given party number structure using the given guide for a set update operation.
Definition channel.c:1653
int ast_settimeout(struct ast_channel *c, unsigned int rate, int(*func)(const void *data), void *data)
Enable or disable timer ticks for a channel.
Definition channel.c:3218
static const struct ast_channel_tech surrogate_tech
Channel technology used to extract a channel from a running application. The channel created with thi...
Definition channel.c:697
int ast_set_write_format(struct ast_channel *chan, struct ast_format *format)
Sets write format on channel chan.
Definition channel.c:5860
void ast_party_id_copy(struct ast_party_id *dest, const struct ast_party_id *src)
Copy the source party id information to the destination party id.
Definition channel.c:1752
void ast_party_number_free(struct ast_party_number *doomed)
Destroy the party number contents.
Definition channel.c:1678
void ast_party_connected_line_init(struct ast_party_connected_line *init)
Initialize the given connected line structure.
Definition channel.c:2009
int ast_channel_get_up_time(struct ast_channel *chan)
Obtain how long it has been since the channel was answered.
Definition channel.c:2879
static char * complete_channeltypes(struct ast_cli_args *a)
Definition channel.c:304
int ast_channel_is_leaving_bridge(struct ast_channel *chan)
Determine if a channel is leaving a bridge, but not hung up.
Definition channel.c:10660
void ast_channel_setwhentohangup_tv(struct ast_channel *chan, struct timeval offset)
Set when to hangup channel.
Definition channel.c:511
int ast_redirecting_parse_data(const unsigned char *data, size_t datalen, struct ast_party_redirecting *redirecting)
Parse redirecting indication frame data.
Definition channel.c:9585
static int indicate_data_internal(struct ast_channel *chan, int _condition, const void *data, size_t datalen)
Definition channel.c:4526
struct ast_variable * ast_channeltype_list(void)
return an ast_variable list of channeltypes
Definition channel.c:189
int ast_say_digits_full(struct ast_channel *chan, int num, const char *ints, const char *lang, int audiofd, int ctrlfd)
Same as ast_say_digits() with audiofd for received audio and returns 1 on ctrlfd being readable.
Definition channel.c:8389
struct ast_bridge_channel * ast_channel_get_bridge_channel(struct ast_channel *chan)
Get a reference to the channel's bridge pointer.
Definition channel.c:10692
int ast_senddigit_mf(struct ast_channel *chan, char digit, unsigned int duration, unsigned int durationkp, unsigned int durationst, int is_external)
Send an MF digit to a channel.
Definition channel.c:5009
static struct ast_generator silence_generator
Definition channel.c:8260
int ast_safe_sleep_conditional(struct ast_channel *chan, int timeout_ms, int(*cond)(void *), void *data)
Wait for a specified amount of time, looking for hangups and a condition argument.
Definition channel.c:1555
static void suppress_framehook_destroy_cb(void *data)
Definition channel.c:10824
static void channel_set_external_vars(struct external_vars *channelvars, size_t varc, char **vars)
Definition channel.c:7912
int ast_transfer(struct ast_channel *chan, char *dest)
Transfer a call to dest, if the channel supports transfer.
Definition channel.c:6542
static int party_id_build_data(unsigned char *data, size_t datalen, const struct ast_party_id *id, const char *label, const struct ast_party_id_ies *ies, const struct ast_set_party_id *update)
Definition channel.c:8683
int ast_channel_unsuppress(struct ast_channel *chan, unsigned int direction, enum ast_frame_type frametype)
Stop suppressing of a frame type on a channel.
Definition channel.c:10949
void ast_party_redirecting_free(struct ast_party_redirecting *doomed)
Destroy the redirecting information contents.
Definition channel.c:2166
#define FORMAT
static void free_translation(struct ast_channel *clonechan)
Definition channel.c:2520
void ast_channel_set_fd(struct ast_channel *chan, int which, int fd)
Definition channel.c:2417
const char * ast_state2str(enum ast_channel_state state)
Gives the string form of a given channel state.
Definition channel.c:637
static int tech_write(struct ast_channel *chan, struct ast_stream *stream, struct ast_stream *default_stream, struct ast_frame *frame)
Definition channel.c:5189
void ast_connected_line_copy_from_caller(struct ast_party_connected_line *dest, const struct ast_party_caller *src)
Copy the caller information to the connected line information.
Definition channel.c:8399
int ast_softhangup_nolock(struct ast_channel *chan, int cause)
Softly hangup a channel, don't lock.
Definition channel.c:2449
enum ama_flags ast_channel_string2amaflag(const char *flag)
Convert a string to a detail record AMA flag.
Definition channel.c:4416
static int redirecting_reason_build_data(unsigned char *data, size_t datalen, const struct ast_party_redirecting_reason *reason, const char *label, const struct ast_party_redirecting_reason_ies *ies)
Definition channel.c:9341
int ast_indicate_data(struct ast_channel *chan, int _condition, const void *data, size_t datalen)
Indicates condition of channel, with payload.
Definition channel.c:4710
static struct ast_frame * suppress_framehook_event_cb(struct ast_channel *chan, struct ast_frame *frame, enum ast_framehook_event event, void *data)
Definition channel.c:10842
static int attribute_const is_visible_indication(enum ast_control_frame_type condition)
Definition channel.c:4337
static void ast_channel_destructor(void *obj)
Free a channel structure.
Definition channel.c:2181
void ast_channel_req_accountcodes_precious(struct ast_channel *chan, const struct ast_channel *requestor, enum ast_channel_requestor_relationship relationship)
Setup new channel accountcodes from the requestor channel after ast_request().
Definition channel.c:6496
static int party_number_build_data(unsigned char *data, size_t datalen, const struct ast_party_number *number, const char *label, const struct ast_party_number_ies *ies)
Definition channel.c:8528
int ast_set_write_format_path(struct ast_channel *chan, struct ast_format *core_format, struct ast_format *raw_format)
Set specific write path on channel.
Definition channel.c:5581
static void apply_plc(struct ast_channel *chan, struct ast_frame *frame)
Definition channel.c:5163
static struct ast_cli_entry cli_channel[]
Definition channel.c:391
int ast_pre_call(struct ast_channel *chan, const char *sub_args)
Execute a Gosub call on the channel before a call is placed.
Definition channel.c:6501
int ast_channel_supports_html(struct ast_channel *chan)
Checks for HTML support on a channel.
Definition channel.c:6680
int ast_queue_answer(struct ast_channel *chan, const struct ast_stream_topology *topology)
Queue an ANSWER control frame with topology.
Definition channel.c:1304
int ast_str2cause(const char *name)
Convert a symbolic hangup cause to number.
Definition channel.c:626
static void * tonepair_alloc(struct ast_channel *chan, void *params)
Definition channel.c:7572
struct ast_namedgroups * ast_unref_namedgroups(struct ast_namedgroups *groups)
Definition channel.c:7806
void ast_party_subaddress_free(struct ast_party_subaddress *doomed)
Destroy the party subaddress contents.
Definition channel.c:1731
static int ast_channel_softhangup_cb(void *obj, void *arg, void *data, int flags)
Definition channel.c:485
static void set_channel_answer_time(struct ast_channel *chan)
Definition channel.c:2661
static void * silence_generator_alloc(struct ast_channel *chan, void *data)
Definition channel.c:8230
int ast_channel_get_duration(struct ast_channel *chan)
Obtain how long the channel since the channel was created.
Definition channel.c:2864
void ast_channel_queue_connected_line_update(struct ast_channel *chan, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update)
Queue a connected line update frame on a channel.
Definition channel.c:9212
void ast_party_connected_line_set_init(struct ast_party_connected_line *init, const struct ast_party_connected_line *guide)
Initialize the given connected line structure using the given guide for a set update operation.
Definition channel.c:2032
unsigned long global_fout
Definition channel.c:99
static struct ast_frame * __ast_read(struct ast_channel *chan, int dropaudio, int dropnondefault)
Definition channel.c:3575
static struct ast_channel * request_channel(const char *type, struct ast_format_cap *request_cap, struct ast_stream_topology *topology, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *addr, int *cause)
Definition channel.c:6276
static int should_trigger_dtmf_emulating(struct ast_channel *chan)
Determine whether or not we have to trigger dtmf emulating using 50 fps timer events especially when ...
Definition channel.c:2889
static int kill_fixup(struct ast_channel *oldchan, struct ast_channel *newchan)
Definition channel.c:414
int ast_safe_sleep_without_silence(struct ast_channel *chan, int ms)
Wait for a specified amount of time, looking for hangups, and do not generate silence.
Definition channel.c:1566
static int __ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin, int head, struct ast_frame *after)
Definition channel.c:1041
void ast_connected_line_copy_to_caller(struct ast_party_caller *dest, const struct ast_party_connected_line *src)
Copy the connected line information to the caller information.
Definition channel.c:8406
const struct ast_channel_tech * ast_get_channel_tech(const char *name)
Get handle to channel driver based on name.
Definition channel.c:593
struct ast_channel * ast_channel_get_by_name(const char *name)
Find a channel by name or uniqueid.
Definition channel.c:1417
int ast_channel_defer_dtmf(struct ast_channel *chan)
Set defer DTMF flag on channel.
Definition channel.c:1315
static const struct ast_datastore_info bridge_features_info
Definition channel.c:11008
int ast_tonepair(struct ast_channel *chan, int freq1, int freq2, int duration, int vol)
Definition channel.c:7674
int ast_answer(struct ast_channel *chan)
Answer a channel.
Definition channel.c:2839
void ast_change_name(struct ast_channel *chan, const char *newname)
Change channel name.
Definition channel.c:6821
int ast_waitfor(struct ast_channel *c, int ms)
Wait for input on a channel.
Definition channel.c:3200
ast_group_t ast_get_group(const char *s)
Definition channel.c:7692
static const struct set_format_access set_format_access_read
Definition channel.c:5628
int ast_channel_early_bridge(struct ast_channel *c0, struct ast_channel *c1)
Bridge two channels together (early)
Definition channel.c:7486
int ast_indicate(struct ast_channel *chan, int condition)
Indicates condition of channel.
Definition channel.c:4332
static const char * dtmf_direction_to_string(enum DtmfDirection direction)
Definition channel.c:3397
int ast_is_deferrable_frame(const struct ast_frame *frame)
Should we keep this frame for later?
Definition channel.c:1454
struct ast_channel_iterator * ast_channel_iterator_all_new(void)
Create a new channel iterator.
Definition channel.c:1380
int ast_safe_sleep(struct ast_channel *chan, int ms)
Wait, look for hangups.
Definition channel.c:1561
struct ast_channel * ast_request(const char *type, struct ast_format_cap *request_cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *addr, int *cause)
Requests a channel.
Definition channel.c:6411
static void send_wink_event(struct ast_channel *chan)
Definition channel.c:3458
static int(* ast_moh_start_ptr)(struct ast_channel *, const char *, const char *)
Definition channel.c:7820
struct ast_cc_config_params * ast_channel_get_cc_config_params(struct ast_channel *chan)
Get the CCSS parameters from a channel.
Definition channel.c:10580
#define DEFAULT_AMA_FLAGS
Definition channel.c:112
int ast_raw_answer(struct ast_channel *chan)
Answer a channel.
Definition channel.c:2724
void ast_party_redirecting_copy(struct ast_party_redirecting *dest, const struct ast_party_redirecting *src)
Copy the source redirecting information to the destination redirecting.
Definition channel.c:2122
char * ast_print_namedgroups(struct ast_str **buf, struct ast_namedgroups *group)
Print named call groups and named pickup groups.
Definition channel.c:8162
void ast_party_name_copy(struct ast_party_name *dest, const struct ast_party_name *src)
Copy the source party name information to the destination party name.
Definition channel.c:1586
int ast_channel_get_cc_agent_type(struct ast_channel *chan, char *agent_type, size_t size)
Find the appropriate CC agent type to use given a channel.
Definition channel.c:10623
struct ast_datastore * ast_channel_datastore_find(struct ast_channel *chan, const struct ast_datastore_info *info, const char *uid)
Find a datastore on a channel.
Definition channel.c:2390
void ast_party_redirecting_reason_free(struct ast_party_redirecting_reason *doomed)
Destroy the redirecting reason contents.
Definition channel.c:2103
#define STATE2STR_BUFSIZE
Definition channel.c:102
void ast_party_caller_init(struct ast_party_caller *init)
Initialize the given caller structure.
Definition channel.c:1965
void ast_tonepair_stop(struct ast_channel *chan)
Definition channel.c:7669
struct ast_channel * ast_waitfor_n(struct ast_channel **c, int n, int *ms)
Waits for input on a group of channels Wait for input on an array of channels for a given # of millis...
Definition channel.c:3195
int ast_channel_has_audio_frame_or_monitor(struct ast_channel *chan)
Check if the channel has active audiohooks, active framehooks, or a monitor.
Definition channel.c:2551
static void ast_dummy_channel_destructor(void *obj)
Free a dummy channel structure.
Definition channel.c:2324
General Asterisk PBX channel definitions.
void ast_channel_internal_alertpipe_swap(struct ast_channel *chan1, struct ast_channel *chan2)
Swap the interal alertpipe between two channels.
void ast_channel_exten_set(struct ast_channel *chan, const char *value)
const char * ast_channel_name(const struct ast_channel *chan)
int ast_channel_tech_hangupcause(const struct ast_channel *chan)
int ast_autoservice_stop(struct ast_channel *chan)
Stop servicing a channel for us...
struct ast_bridge * ast_channel_internal_bridge(const struct ast_channel *chan)
struct timeval ast_channel_answertime(struct ast_channel *chan)
void ast_channel_named_pickupgroups_set(struct ast_channel *chan, struct ast_namedgroups *value)
int(* ast_timing_func_t)(const void *data)
Definition channel.h:919
struct ast_channel * ast_channel_masq(const struct ast_channel *chan)
int ast_channel_blocker_tid(const struct ast_channel *chan)
void ast_channel_stream_set(struct ast_channel *chan, struct ast_filestream *value)
void ast_channel_visible_indication_set(struct ast_channel *chan, int value)
const char * ast_channel_blockproc(const struct ast_channel *chan)
void ast_channel_caller_set(struct ast_channel *chan, struct ast_party_caller *value)
void * ast_channel_tech_pvt(const struct ast_channel *chan)
void ast_channel_dialed_set(struct ast_channel *chan, struct ast_party_dialed *value)
struct ast_format * ast_channel_rawreadformat(struct ast_channel *chan)
#define DEBUGCHAN_FLAG
Definition channel.h:877
void * ast_channel_music_state(const struct ast_channel *chan)
unsigned int ast_channel_fin(const struct ast_channel *chan)
const char * ast_channel_latest_musicclass(const struct ast_channel *chan)
void ast_channel_callid_cleanup(struct ast_channel *chan)
void ast_channel_set_oldwriteformat(struct ast_channel *chan, struct ast_format *format)
void ast_channel_softhangup_internal_flag_clear(struct ast_channel *chan, int value)
struct varshead * ast_channel_varshead(struct ast_channel *chan)
void ast_channel_generator_set(struct ast_channel *chan, struct ast_generator *value)
#define ast_channel_alloc(needqueue, state, cid_num, cid_name, acctcode, exten, context, assignedids, requestor, amaflag,...)
Create a channel structure.
Definition channel.h:1299
void ast_channel_sending_dtmf_digit_set(struct ast_channel *chan, char value)
void * ast_channel_timingdata(const struct ast_channel *chan)
int ast_channel_internal_alert_readfd(struct ast_channel *chan)
ast_channel_requestor_relationship
Definition channel.h:1523
@ AST_CHANNEL_REQUESTOR_BRIDGE_PEER
Definition channel.h:1525
@ AST_CHANNEL_REQUESTOR_REPLACEMENT
Definition channel.h:1527
void ast_channel_dtmf_tv_set(struct ast_channel *chan, struct timeval *value)
struct ast_flags * ast_channel_snapshot_segment_flags(struct ast_channel *chan)
#define DATASTORE_INHERIT_FOREVER
Definition channel.h:194
#define CHECK_BLOCKING(c)
Set the blocking indication on the channel.
Definition channel.h:2938
void ast_channel_internal_swap_endpoint_forward(struct ast_channel *a, struct ast_channel *b)
Swap endpoint_forward between two channels.
void ast_channel_nativeformats_set(struct ast_channel *chan, struct ast_format_cap *value)
const char * ast_channel_musicclass(const struct ast_channel *chan)
int ast_channel_fdno(const struct ast_channel *chan)
void ast_channel_internal_fd_clear_all(struct ast_channel *chan)
void ast_channel_internal_alertpipe_close(struct ast_channel *chan)
void ast_channel_answertime_set(struct ast_channel *chan, struct timeval *value)
void ast_channel_hold_state_set(struct ast_channel *chan, int value)
#define ast_channel_lock(chan)
Definition channel.h:2989
struct ast_trans_pvt * ast_channel_readtrans(const struct ast_channel *chan)
struct ast_format_cap * ast_channel_nativeformats(const struct ast_channel *chan)
struct timeval ast_channel_sending_dtmf_tv(const struct ast_channel *chan)
struct ast_party_redirecting * ast_channel_redirecting(struct ast_channel *chan)
struct ast_trans_pvt * ast_channel_writetrans(const struct ast_channel *chan)
void ast_channel_vstreamid_set(struct ast_channel *chan, int value)
static const char ast_stream_topology_changed_external[]
Set as the change source reason when a channel stream topology has been changed externally as a resul...
Definition channel.h:223
void ast_channel_timingdata_set(struct ast_channel *chan, void *value)
struct ast_cdr * ast_channel_cdr(const struct ast_channel *chan)
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
void ast_channel_redirecting_set(struct ast_channel *chan, struct ast_party_redirecting *value)
unsigned long long ast_group_t
Definition channel.h:215
ast_channel_error
Definition channel.h:4918
@ AST_CHANNEL_ERROR_ID_EXISTS
Definition channel.h:4922
int ast_channel_priority(const struct ast_channel *chan)
void ast_channel_writetrans_set(struct ast_channel *chan, struct ast_trans_pvt *value)
void ast_channel_streamid_set(struct ast_channel *chan, int value)
#define ast_channel_ref(c)
Increase channel reference count.
Definition channel.h:3014
void ast_channel_generatordata_set(struct ast_channel *chan, void *value)
#define ast_channel_lock_both(chan1, chan2)
Lock two channels.
Definition channel.h:2996
struct ast_party_connected_line * ast_channel_connected(struct ast_channel *chan)
void ast_channel_softhangup_internal_flag_set(struct ast_channel *chan, int value)
ast_callid ast_channel_callid(const struct ast_channel *chan)
const char * ast_channel_uniqueid(const struct ast_channel *chan)
const char * ast_channel_accountcode(const struct ast_channel *chan)
void ast_channel_internal_swap_endpoints(struct ast_channel *a, struct ast_channel *b)
Swap endpoints between two channels.
const char * ast_channel_context(const struct ast_channel *chan)
const char * ast_channel_userfield(const struct ast_channel *chan)
char ast_channel_dtmf_digit_to_emulate(const struct ast_channel *chan)
void ast_channel_timingfd_set(struct ast_channel *chan, int value)
#define AST_MUTE_DIRECTION_READ
Definition channel.h:4837
void ast_channel_endpoint_set(struct ast_channel *chan, struct ast_endpoint *endpoint)
pthread_t ast_channel_blocker(const struct ast_channel *chan)
ama_flags
Channel AMA Flags.
Definition channel.h:1197
@ AST_AMA_DOCUMENTATION
Definition channel.h:1201
@ AST_AMA_OMIT
Definition channel.h:1199
@ AST_AMA_NONE
Definition channel.h:1198
@ AST_AMA_BILLING
Definition channel.h:1200
void ast_channel_sending_dtmf_tv_set(struct ast_channel *chan, struct timeval value)
#define ast_channel_trylock(chan)
Definition channel.h:2991
const char * ast_channel_parkinglot(const struct ast_channel *chan)
ast_channel_adsicpe
Definition channel.h:888
void ast_channel_internal_swap_topics(struct ast_channel *a, struct ast_channel *b)
Swap topics beteween two channels.
#define AST_ALERT_FD
Definition channel.h:202
const char * ast_channel_peeraccount(const struct ast_channel *chan)
struct timeval ast_channel_creationtime(struct ast_channel *chan)
struct ast_bridge_channel * ast_channel_internal_bridge_channel(const struct ast_channel *chan)
struct ast_framehook_list * ast_channel_framehooks(const struct ast_channel *chan)
void ast_channel_audiohooks_set(struct ast_channel *chan, struct ast_audiohook_list *value)
int ast_channel_fd(const struct ast_channel *chan, int which)
void ast_channel_timer_set(struct ast_channel *chan, struct ast_timer *value)
void ast_channel_internal_fd_set(struct ast_channel *chan, int which, int value)
void ast_channel_fin_set(struct ast_channel *chan, unsigned int value)
@ AST_SOFTHANGUP_ASYNCGOTO
Definition channel.h:1146
@ AST_SOFTHANGUP_EXPLICIT
Definition channel.h:1168
@ AST_SOFTHANGUP_DEV
Definition channel.h:1141
@ AST_SOFTHANGUP_TIMEOUT
Definition channel.h:1158
@ AST_SOFTHANGUP_SHUTDOWN
Definition channel.h:1151
void ast_channel_set_rawreadformat(struct ast_channel *chan, struct ast_format *format)
struct ast_audiohook_list * ast_channel_audiohooks(const struct ast_channel *chan)
void ast_channel_tech_pvt_set(struct ast_channel *chan, void *value)
enum ama_flags ast_channel_amaflags(const struct ast_channel *chan)
void ast_channel_readtrans_set(struct ast_channel *chan, struct ast_trans_pvt *value)
void * ast_channel_generatordata(const struct ast_channel *chan)
struct ast_format * ast_channel_rawwriteformat(struct ast_channel *chan)
void ast_channel_set_is_t38_active_nolock(struct ast_channel *chan, int is_t38_active)
Variant of ast_channel_set_is_t38_active. Use this if the channel is already locked prior to calling.
const char * ast_channel_hangupsource(const struct ast_channel *chan)
unsigned int ast_channel_fout(const struct ast_channel *chan)
struct ast_stream_topology * ast_channel_get_stream_topology(const struct ast_channel *chan)
Retrieve the topology of streams on a channel.
int ast_channel_hangupcause(const struct ast_channel *chan)
int ast_channel_timingfd(const struct ast_channel *chan)
void ast_channel_fdno_set(struct ast_channel *chan, int value)
#define AST_TIMING_FD
Definition channel.h:203
void ast_channel_set_rawwriteformat(struct ast_channel *chan, struct ast_format *format)
struct ast_party_dialed * ast_channel_dialed(struct ast_channel *chan)
@ AST_PARTY_CHAR_SET_ISO8859_1
Definition channel.h:246
void ast_channel_creationtime_set(struct ast_channel *chan, struct timeval *value)
struct ast_tone_zone * ast_channel_zone(const struct ast_channel *chan)
int ast_channel_dialed_causes_add(const struct ast_channel *chan, const struct ast_control_pvt_cause_code *cause_code, int datalen)
Add cause code information to the channel.
void ast_channel_named_callgroups_set(struct ast_channel *chan, struct ast_namedgroups *value)
int ast_channel_alert_write(struct ast_channel *chan)
struct ast_readq_list * ast_channel_readq(struct ast_channel *chan)
ast_timing_func_t ast_channel_timingfunc(const struct ast_channel *chan)
void ast_channel_set_readformat(struct ast_channel *chan, struct ast_format *format)
void ast_channel_dtmf_digit_to_emulate_set(struct ast_channel *chan, char value)
#define AST_CHANNEL_NAME
Definition channel.h:173
void ast_channel_softhangup_internal_flag_add(struct ast_channel *chan, int value)
struct timeval * ast_channel_whentohangup(struct ast_channel *chan)
#define ast_channel_unref(c)
Decrease channel reference count.
Definition channel.h:3025
struct ast_stream * ast_channel_get_default_stream(struct ast_channel *chan, enum ast_media_type type)
Retrieve the default stream of a specific media type on a channel.
struct ast_filestream * ast_channel_vstream(const struct ast_channel *chan)
ast_alert_status_t ast_channel_internal_alert_read(struct ast_channel *chan)
struct ast_format * ast_channel_writeformat(struct ast_channel *chan)
void ast_channel_internal_swap_uniqueid_and_linkedid(struct ast_channel *a, struct ast_channel *b)
Swap uniqueid and linkedid beteween two channels.
struct ast_generator * ast_channel_generator(const struct ast_channel *chan)
int ast_channel_unbridged(struct ast_channel *chan)
This function will check if the bridge needs to be re-evaluated due to external changes.
int ast_channel_hold_state(const struct ast_channel *chan)
void ast_channel_emulate_dtmf_duration_set(struct ast_channel *chan, unsigned int value)
void ast_channel_amaflags_set(struct ast_channel *chan, enum ama_flags value)
const char * ast_channel_language(const struct ast_channel *chan)
struct ast_party_connected_line * ast_channel_connected_indicated(struct ast_channel *chan)
void ast_channel_cdr_set(struct ast_channel *chan, struct ast_cdr *value)
void ast_channel_context_set(struct ast_channel *chan, const char *value)
void ast_channel_connected_set(struct ast_channel *chan, struct ast_party_connected_line *value)
void ast_channel_timingfunc_set(struct ast_channel *chan, ast_timing_func_t value)
struct ast_sched_context * ast_channel_sched(const struct ast_channel *chan)
void ast_channel_state_set(struct ast_channel *chan, enum ast_channel_state)
int ast_channel_fd_count(const struct ast_channel *chan)
Retrieve the number of file decriptor positions present on the channel.
#define AST_MUTE_DIRECTION_WRITE
Definition channel.h:4838
struct ast_frame * ast_channel_dtmff(struct ast_channel *chan)
void ast_channel_internal_swap_snapshots(struct ast_channel *a, struct ast_channel *b)
Swap snapshots beteween two channels.
@ AST_FLAG_ZOMBIE
Definition channel.h:1007
@ AST_FLAG_DISABLE_DEVSTATE_CACHE
Definition channel.h:1049
@ AST_FLAG_SNAPSHOT_STAGE
Definition channel.h:1070
@ AST_FLAG_OUTGOING
Definition channel.h:1019
@ AST_FLAG_IN_AUTOLOOP
Definition channel.h:1017
@ AST_FLAG_END_DTMF_ONLY
Definition channel.h:1027
@ AST_FLAG_DEAD
Definition channel.h:1065
@ AST_FLAG_EXCEPTION
Definition channel.h:1009
@ AST_FLAG_EMULATE_DTMF
Definition channel.h:1024
@ AST_FLAG_IN_DTMF
Definition channel.h:1021
@ AST_FLAG_WRITE_INT
Definition channel.h:1003
@ AST_FLAG_DEFER_DTMF
Definition channel.h:1001
@ AST_FLAG_BLOCKING
Definition channel.h:1005
@ AST_FLAG_ORIGINATED
Definition channel.h:1059
@ AST_FLAG_TIMINGDATA_IS_AO2_OBJ
Definition channel.h:1074
@ AST_FLAG_MOH
Definition channel.h:1011
unsigned int ast_channel_emulate_dtmf_duration(const struct ast_channel *chan)
static int ast_add_fd(struct pollfd *pfd, int fd)
if fd is a valid descriptor, set *pfd with the descriptor
Definition channel.h:2886
const char * ast_channel_call_forward(const struct ast_channel *chan)
#define AST_JITTERBUFFER_FD
Definition channel.h:206
struct ast_filestream * ast_channel_stream(const struct ast_channel *chan)
struct ast_pbx * ast_channel_pbx(const struct ast_channel *chan)
void ast_channel_fout_set(struct ast_channel *chan, unsigned int value)
struct ast_autochan_list * ast_channel_autochans(struct ast_channel *chan)
void ast_channel_zone_set(struct ast_channel *chan, struct ast_tone_zone *value)
struct ast_channel * ast_channel_masqr(const struct ast_channel *chan)
int ast_channel_softhangup_internal_flag(struct ast_channel *chan)
struct timeval * ast_channel_dtmf_tv(struct ast_channel *chan)
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)
char ast_channel_sending_dtmf_digit(const struct ast_channel *chan)
int ast_channel_visible_indication(const struct ast_channel *chan)
#define FRAMECOUNT_INC(x)
Definition channel.h:880
struct ast_timer * ast_channel_timer(const struct ast_channel *chan)
struct ast_hangup_handler_list * ast_channel_hangup_handlers(struct ast_channel *chan)
void ast_channel_masqr_set(struct ast_channel *chan, struct ast_channel *value)
void ast_channel_callid_set(struct ast_channel *chan, ast_callid value)
void ast_channel_internal_alertpipe_clear(struct ast_channel *chan)
void ast_channel_priority_set(struct ast_channel *chan, int value)
void ast_channel_hangupcause_set(struct ast_channel *chan, int value)
void ast_channel_whentohangup_set(struct ast_channel *chan, struct timeval *value)
#define ast_channel_cleanup(c)
Cleanup a channel reference.
Definition channel.h:3036
int ast_channel_fd_isset(const struct ast_channel *chan, int which)
void ast_channel_adsicpe_set(struct ast_channel *chan, enum ast_channel_adsicpe value)
int ast_channel_is_multistream(struct ast_channel *chan)
Determine if a channel is multi-stream capable.
int ast_channel_internal_alertpipe_init(struct ast_channel *chan)
void ast_channel_sched_set(struct ast_channel *chan, struct ast_sched_context *value)
void ast_channel_tech_set(struct ast_channel *chan, const struct ast_channel_tech *value)
const char * ast_channel_exten(const struct ast_channel *chan)
struct ast_datastore_list * ast_channel_datastores(struct ast_channel *chan)
#define ast_channel_unlock(chan)
Definition channel.h:2990
void ast_channel_masq_set(struct ast_channel *chan, struct ast_channel *value)
@ AST_CHAN_TP_INTERNAL
Channels with this particular technology are an implementation detail of Asterisk and should generall...
Definition channel.h:991
@ AST_CHAN_TP_SEND_TEXT_DATA
Channels have this property if they implement send_text_data.
Definition channel.h:995
void ast_channel_set_writeformat(struct ast_channel *chan, struct ast_format *format)
void ast_channel_vstream_set(struct ast_channel *chan, struct ast_filestream *value)
struct ast_format * ast_channel_readformat(struct ast_channel *chan)
int ast_channel_alert_writable(struct ast_channel *chan)
Internal channel functions for channel.c to use.
void ast_channel_internal_set_stream_topology_change_source(struct ast_channel *chan, void *change_source)
void ast_channel_internal_set_stream_topology(struct ast_channel *chan, struct ast_stream_topology *topology)
int ast_channel_internal_is_finalized(struct ast_channel *chan)
const struct ast_channelstorage_driver * current_channel_storage_driver
The current channel storage driver.
struct ast_channel * __ast_channel_internal_alloc_with_initializers(void(*destructor)(void *obj), const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const struct ast_channel_initializers *initializers, const char *file, int line, const char *function)
struct ast_channelstorage_instance * current_channel_storage_instance
The current channel storage instance.
enum ast_channel_error ast_channel_internal_errno(void)
void ast_channel_internal_swap_stream_topology(struct ast_channel *chan1, struct ast_channel *chan2)
void ast_channel_internal_cleanup(struct ast_channel *chan)
struct ast_channel * __ast_channel_internal_alloc(void(*destructor)(void *obj), const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *file, int line, const char *function)
int ast_channel_internal_setup_topics(struct ast_channel *chan)
void ast_channel_internal_finalize(struct ast_channel *chan)
void ast_channel_internal_errno_set(enum ast_channel_error error)
void ast_channel_name_set(struct ast_channel *chan, const char *value)
void ast_channel_name_build_va(struct ast_channel *chan, const char *fmt, va_list ap)
ast_channel_state
ast_channel states
@ AST_STATE_MUTE
@ AST_STATE_RING
@ AST_STATE_DIALING_OFFHOOK
@ AST_STATE_RINGING
@ AST_STATE_PRERING
@ AST_STATE_DOWN
@ AST_STATE_OFFHOOK
@ AST_STATE_BUSY
@ AST_STATE_DIALING
@ AST_STATE_UP
@ AST_STATE_RESERVED
struct ast_channelstorage_instance * ast_channelstorage_open(const struct ast_channelstorage_driver *storage_driver, const char *instance_name)
size_t current
int ast_channelstorage_init(void)
const struct ast_channelstorage_driver * ast_channelstorage_get_driver(const char *driver_name)
void ast_channelstorage_close(struct ast_channelstorage_instance *storage_instance)
#define AST_CHANNELSTORAGE_DEFAULT_TYPE
#define CHANNELSTORAGE_API(_instance, _func,...)
static struct ast_channel_iterator * iterator_by_exten_new(struct ast_channelstorage_instance *driver, const char *exten, const char *context)
static struct ast_channel * callback(struct ast_channelstorage_instance *driver, ao2_callback_data_fn *cb_fn, void *arg, void *data, int ao2_flags, int rdlock)
static struct ast_channel * iterator_next(struct ast_channelstorage_instance *driver, struct ast_channel_iterator *i)
static struct ast_channel_iterator * iterator_destroy(struct ast_channelstorage_instance *driver, struct ast_channel_iterator *i)
static struct ast_channel_iterator * iterator_by_name_new(struct ast_channelstorage_instance *driver, const char *name, size_t name_len)
static struct ast_channel * get_by_uniqueid(struct ast_channelstorage_instance *driver, const char *uniqueid, int lock)
static struct ast_channel_iterator * iterator_all_new(struct ast_channelstorage_instance *driver)
static struct ast_channel * get_by_exten(struct ast_channelstorage_instance *driver, const char *exten, const char *context, int rdlock)
static int active_channels(struct ast_channelstorage_instance *driver, int rdlock)
returns number of active/allocated channels
Channel Variables.
const char * ast_var_name(const struct ast_var_t *var)
Definition chanvars.c:60
#define ast_var_assign(name, value)
Definition chanvars.h:40
const char * ast_var_full_name(const struct ast_var_t *var)
Definition chanvars.c:75
const char * ast_var_value(const struct ast_var_t *var)
Definition chanvars.c:80
void ast_var_delete(struct ast_var_t *var)
Definition extconf.c:2469
Standard Command Line Interface.
#define CLI_SHOWUSAGE
Definition cli.h:45
#define CLI_SUCCESS
Definition cli.h:44
#define AST_CLI_DEFINE(fn, txt,...)
Definition cli.h:197
int ast_cli_completion_add(char *value)
Add a result to a request for completion options.
Definition main/cli.c:2845
void ast_cli(int fd, const char *fmt,...)
Definition clicompat.c:6
#define ESS(x)
Definition cli.h:59
@ CLI_INIT
Definition cli.h:152
@ CLI_GENERATE
Definition cli.h:153
#define CLI_FAILURE
Definition cli.h:46
#define ast_cli_register_multiple(e, len)
Register multiple commands.
Definition cli.h:265
ast_media_type
Types of media.
Definition codec.h:30
@ AST_MEDIA_TYPE_AUDIO
Definition codec.h:32
@ AST_MEDIA_TYPE_UNKNOWN
Definition codec.h:31
@ AST_MEDIA_TYPE_IMAGE
Definition codec.h:34
@ AST_MEDIA_TYPE_TEXT
Definition codec.h:35
static void update(int code_size, int y, int wi, int fi, int dq, int sr, int dqsez, struct g726_state *state_ptr)
Definition codec_g726.c:367
#define attribute_const
Definition compiler.h:41
#define ast_datastore_alloc(info, uid)
Definition datastore.h:85
int ast_datastore_free(struct ast_datastore *datastore)
Free a data store object.
Definition datastore.c:68
Device state management.
@ AST_DEVSTATE_CACHABLE
Definition devicestate.h:70
@ AST_DEVSTATE_NOT_CACHABLE
Definition devicestate.h:69
int ast_devstate_changed_literal(enum ast_device_state state, enum ast_devstate_cache cachable, const char *device)
Tells Asterisk the State for Device is changed.
@ AST_DEVICE_UNKNOWN
Definition devicestate.h:53
static const float mf_tones[]
Definition dsp.c:332
char buf[BUFSIZE]
Definition eagi_proxy.c:66
long int flag
Definition f2c.h:83
#define max(a, b)
Definition f2c.h:198
Call Parking and Pickup API Includes code and algorithms from the Zapata library.
Generic File Format Support. Should be included by clients of the file handling routines....
int ast_waitstream_full(struct ast_channel *c, const char *breakon, int audiofd, int monfd)
Definition file.c:1883
int ast_stopstream(struct ast_channel *c)
Stops a stream.
Definition file.c:223
int ast_closestream(struct ast_filestream *f)
Closes a stream.
Definition file.c:1130
#define AST_DIGIT_ANY
Definition file.h:48
enum ast_media_type ast_format_get_type(const struct ast_format *format)
Get the media type of a format.
Definition format.c:354
unsigned int ast_format_get_sample_rate(const struct ast_format *format)
Get the sample rate of a media format.
Definition format.c:379
enum ast_format_cmp_res ast_format_cmp(const struct ast_format *format1, const struct ast_format *format2)
Compare two formats.
Definition format.c:201
@ AST_FORMAT_CMP_EQUAL
Definition format.h:36
@ AST_FORMAT_CMP_NOT_EQUAL
Definition format.h:38
const char * ast_format_get_name(const struct ast_format *format)
Get the name associated with a format.
Definition format.c:334
int ast_format_cache_is_slinear(struct ast_format *format)
Determines if a format is one of the cached slin formats.
struct ast_format * ast_format_slin
Built-in cached signed linear 8kHz format.
struct ast_format * ast_format_none
Built-in "null" format.
struct ast_format * ast_format_cache_get_slin_by_rate(unsigned int rate)
Retrieve the best signed linear format given a sample rate.
struct ast_format * ast_format_t140
Built-in cached t140 format.
#define AST_FORMAT_CAP_NAMES_LEN
Definition format_cap.h:324
int ast_format_cap_empty(const struct ast_format_cap *cap)
Determine if a format cap has no formats in it.
Definition format_cap.c:744
struct ast_format * ast_format_cap_get_best_by_type(const struct ast_format_cap *cap, enum ast_media_type type)
Get the most preferred format for a particular media type.
Definition format_cap.c:417
void ast_format_cap_remove_by_type(struct ast_format_cap *cap, enum ast_media_type type)
Remove all formats matching a specific format type.
Definition format_cap.c:523
@ AST_FORMAT_CAP_FLAG_DEFAULT
Definition format_cap.h:38
int ast_format_cap_append_from_cap(struct ast_format_cap *dst, const struct ast_format_cap *src, enum ast_media_type type)
Append the formats of provided type in src to dst.
Definition format_cap.c:269
const char * ast_format_cap_get_names(const struct ast_format_cap *cap, struct ast_str **buf)
Get the names of codecs of a set of formats.
Definition format_cap.c:734
int ast_format_cap_has_type(const struct ast_format_cap *cap, enum ast_media_type type)
Find out if the capabilities structure has any formats of a specific type.
Definition format_cap.c:613
#define ast_format_cap_append(cap, format, framing)
Add format capability to capabilities structure.
Definition format_cap.h:99
#define ast_format_cap_alloc(flags)
Allocate a new ast_format_cap structure.
Definition format_cap.h:49
static const char name[]
Definition format_mp3.c:68
static void write_stream(struct ogg_vorbis_desc *s, FILE *f)
Write out any pending encoded data.
FrameHook Architecture.
int ast_framehook_list_contains_no_active_of_type(struct ast_framehook_list *framehooks, enum ast_frame_type type)
Determine if a framehook list is free of active framehooks consuming a specific type of frame.
Definition framehook.c:287
int ast_framehook_attach(struct ast_channel *chan, struct ast_framehook_interface *i)
Attach an framehook onto a channel for frame interception.
Definition framehook.c:132
ast_framehook_event
These are the types of events that the framehook's event callback can receive.
Definition framehook.h:151
@ AST_FRAMEHOOK_EVENT_WRITE
Definition framehook.h:153
@ AST_FRAMEHOOK_EVENT_READ
Definition framehook.h:152
struct ast_frame * ast_framehook_list_read_event(struct ast_framehook_list *framehooks, struct ast_frame *frame)
This is used by the channel API push a frame read event to a channel's framehook list.
Definition framehook.c:318
int ast_framehook_detach(struct ast_channel *chan, int framehook_id)
Detach an framehook from a channel.
Definition framehook.c:177
int ast_framehook_list_destroy(struct ast_channel *chan)
This is used by the channel API to detach and destroy all framehooks on a channel during channel dest...
Definition framehook.c:206
void ast_framehook_list_fixup(struct ast_channel *old_chan, struct ast_channel *new_chan)
This is used by the channel API during a masquerade operation to move all mobile framehooks from the ...
Definition framehook.c:223
int ast_framehook_list_contains_no_active(struct ast_framehook_list *framehooks)
Determine if a framehook list is free of active framehooks or not.
Definition framehook.c:282
int ast_framehook_list_is_empty(struct ast_framehook_list *framehooks)
Determine if an framehook list is empty or not.
Definition framehook.c:274
struct ast_frame * ast_framehook_list_write_event(struct ast_framehook_list *framehooks, struct ast_frame *frame)
This is used by the channel API push a frame write event to a channel's framehook list.
Definition framehook.c:313
#define AST_FRAMEHOOK_INTERFACE_VERSION
Definition framehook.h:227
direction
static int replace(struct ast_channel *chan, const char *cmd, char *data, struct ast_str **buf, ssize_t len)
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
globally accessible channel datastores
const struct ast_datastore_info secure_call_info
#define SCOPE_TRACE(__level,...)
struct stasis_message_type * ast_channel_masquerade_type(void)
Message type for when a channel is being masqueraded.
void ast_channel_publish_varset(struct ast_channel *chan, const char *variable, const char *value)
Publish a ast_channel_publish_varset for a channel.
struct stasis_message_type * ast_channel_hold_type(void)
Message type for when a channel is placed on hold.
struct stasis_message_type * ast_channel_dtmf_begin_type(void)
Message type for when DTMF begins on a channel.
void ast_channel_snapshot_invalidate_segment(struct ast_channel *chan, enum ast_channel_snapshot_segment_invalidation segment)
Invalidate a channel snapshot segment from being reused.
void ast_channel_publish_final_snapshot(struct ast_channel *chan)
Send the final channel snapshot for a channel, thus removing it from cache.
void ast_channel_stage_snapshot_done(struct ast_channel *chan)
Clear flag to indicate channel snapshot is being staged, and publish snapshot.
struct stasis_message_type * ast_channel_unhold_type(void)
Message type for when a channel is removed from hold.
struct stasis_message_type * ast_channel_hangup_request_type(void)
Message type for when a hangup is requested on a channel.
struct stasis_message_type * ast_channel_flash_type(void)
Message type for when a hook flash occurs on a channel.
struct stasis_message_type * ast_channel_dtmf_end_type(void)
Message type for when DTMF ends on a channel.
struct stasis_message_type * ast_channel_wink_type(void)
Message type for when a wink occurs on a channel.
void ast_channel_publish_snapshot(struct ast_channel *chan)
Publish a ast_channel_snapshot for a channel.
void ast_channel_publish_blob(struct ast_channel *chan, struct stasis_message_type *type, struct ast_json *blob)
Publish a channel blob message.
void ast_channel_stage_snapshot(struct ast_channel *chan)
Set flag to indicate channel snapshot is being staged.
@ AST_CHANNEL_SNAPSHOT_INVALIDATE_CALLER
@ AST_CHANNEL_SNAPSHOT_INVALIDATE_CONNECTED
const char * ast_msg_data_get_attribute(struct ast_msg_data *msg, enum ast_msg_data_attribute_type attribute_type)
Get attribute from ast_msg_data.
struct ast_msg_data * ast_msg_data_alloc(enum ast_msg_data_source_type source, struct ast_msg_data_attribute attributes[], size_t count)
Allocates an ast_msg_data structure.
@ AST_MSG_DATA_ATTR_BODY
Definition message.h:458
@ AST_MSG_DATA_ATTR_TO
Definition message.h:455
@ AST_MSG_DATA_ATTR_FROM
Definition message.h:456
@ AST_MSG_DATA_ATTR_CONTENT_TYPE
Definition message.h:457
@ AST_MSG_DATA_SOURCE_TYPE_UNKNOWN
Definition message.h:447
unsigned int option_dtmfminduration
Definition options.c:84
Application convenience functions, designed to give consistent look and feel to Asterisk apps.
@ AST_GETDATA_FAILED
@ AST_GETDATA_INTERRUPTED
@ AST_GETDATA_COMPLETE
@ AST_GETDATA_TIMEOUT
@ AST_GETDATA_EMPTY_END_TERMINATED
int ast_app_run_sub(struct ast_channel *autoservice_chan, struct ast_channel *sub_chan, const char *sub_location, const char *sub_args, int ignore_hangup)
Run a subroutine on a channel, placing an optional second channel into autoservice.
Definition main/app.c:328
int ast_app_group_update(struct ast_channel *oldchan, struct ast_channel *newchan)
Update all group counting for a channel to a new one.
Definition main/app.c:2301
int ast_app_group_discard(struct ast_channel *chan)
Discard all group counting for a channel.
Definition main/app.c:2320
int ast_app_exec_sub(struct ast_channel *autoservice_chan, struct ast_channel *sub_chan, const char *sub_args, int ignore_hangup)
Run a subroutine on a channel, placing an optional second channel into autoservice.
Definition main/app.c:297
#define ast_variable_new(name, value, filename)
Asterisk internal frame definitions.
@ AST_T38_TERMINATED
@ AST_T38_REQUEST_TERMINATE
@ AST_T38_NEGOTIATED
@ AST_T38_REQUEST_NEGOTIATE
@ AST_FRAME_READ_ACTION_CONNECTED_LINE_MACRO
@ AST_FRAME_READ_ACTION_SEND_TEXT
@ AST_FRAME_READ_ACTION_SEND_TEXT_DATA
#define AST_OPTION_DEVICE_NAME
#define ast_frisolate(fr)
Makes a frame independent of any static storage.
void ast_frame_dump(const char *name, struct ast_frame *f, char *prefix)
Definition main/frame.c:731
#define ast_frdup(fr)
Copies a frame.
@ AST_TRANSFER_SUCCESS
#define AST_OPTION_FORMAT_WRITE
#define ast_frfree(fr)
#define AST_HTML_URL
#define AST_MALLOCD_DATA
#define AST_OPTION_CC_AGENT_TYPE
#define AST_OPTION_SECURE_MEDIA
@ AST_FRFLAG_REQUEUED
#define AST_FRIENDLY_OFFSET
Offset into a frame's data buffer.
#define AST_OPTION_FORMAT_READ
#define AST_OPTION_SECURE_SIGNALING
ast_frame_type
Frame types.
@ AST_FRAME_DTMF_END
@ AST_FRAME_DTMF_BEGIN
@ AST_FRAME_BRIDGE_ACTION_SYNC
@ AST_FRAME_TEXT_DATA
@ AST_FRAME_CONTROL
@ AST_FRAME_BRIDGE_ACTION
ast_control_frame_type
Internal control frame subtype field values.
@ AST_CONTROL_SRCUPDATE
@ AST_CONTROL_RECORD_CANCEL
@ AST_CONTROL_PROGRESS
@ AST_CONTROL_STREAM_TOPOLOGY_SOURCE_CHANGED
@ AST_CONTROL_OFFHOOK
@ AST_CONTROL_STREAM_RESTART
@ AST_CONTROL_STREAM_SUSPEND
@ AST_CONTROL_RADIO_UNKEY
@ AST_CONTROL_UNHOLD
@ AST_CONTROL_VIDUPDATE
@ AST_CONTROL_STREAM_TOPOLOGY_REQUEST_CHANGE
@ AST_CONTROL_STREAM_REVERSE
@ AST_CONTROL_PROCEEDING
@ AST_CONTROL_REDIRECTING
@ AST_CONTROL_TAKEOFFHOOK
@ AST_CONTROL_T38_PARAMETERS
@ AST_CONTROL_READ_ACTION
@ AST_CONTROL_RECORD_STOP
@ AST_CONTROL_CONGESTION
@ AST_CONTROL_PLAYBACK_BEGIN
@ AST_CONTROL_ANSWER
@ AST_CONTROL_RECORD_MUTE
@ AST_CONTROL_RINGING
@ AST_CONTROL_HANGUP
@ AST_CONTROL_STREAM_STOP
@ AST_CONTROL_RADIO_KEY
@ AST_CONTROL_OPTION
@ AST_CONTROL_STREAM_TOPOLOGY_CHANGED
@ AST_CONTROL_CONNECTED_LINE
@ AST_CONTROL_END_OF_Q
@ AST_CONTROL_TRANSFER
@ AST_CONTROL_STREAM_FORWARD
@ AST_CONTROL_FLASH
@ AST_CONTROL_RECORD_SUSPEND
@ AST_CONTROL_SRCCHANGE
@ AST_CONTROL_INCOMPLETE
@ _XXX_AST_CONTROL_T38
@ AST_CONTROL_MASQUERADE_NOTIFY
@ AST_CONTROL_PVT_CAUSE_CODE
@ AST_CONTROL_UPDATE_RTP_PEER
struct ast_frame ast_null_frame
Definition main/frame.c:79
#define ast_debug(level,...)
Log a DEBUG message.
unsigned int ast_callid
void ast_log_callid(int level, const char *file, int line, const char *function, ast_callid callid, const char *fmt,...)
Used for sending a log message with a known call_id This is a modified logger function which is funct...
Definition logger.c:2471
#define LOG_ERROR
#define ast_verb(level,...)
#define LOG_NOTICE
#define LOG_WARNING
#define LOG_DTMF
Tone Indication Support.
static struct ast_tone_zone_sound * ast_tone_zone_sound_unref(struct ast_tone_zone_sound *ts)
Release a reference to an ast_tone_zone_sound.
int ast_playtones_start(struct ast_channel *chan, int vol, const char *tonelist, int interruptible)
Start playing a list of tones on a channel.
void ast_playtones_stop(struct ast_channel *chan)
Stop playing tones on a channel.
struct ast_tone_zone_sound * ast_get_indication_tone(const struct ast_tone_zone *zone, const char *indication)
Locate a tone zone sound.
static struct ast_tone_zone * ast_tone_zone_unref(struct ast_tone_zone *tz)
Release a reference to an ast_tone_zone.
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition json.c:73
struct ast_json * ast_json_object_create(void)
Create a new JSON object.
Definition json.c:399
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
Definition json.c:612
struct ast_json * ast_json_integer_create(intmax_t value)
Create a JSON integer.
Definition json.c:327
int ast_json_object_set(struct ast_json *object, const char *key, struct ast_json *value)
Set a field in a JSON object.
Definition json.c:414
AST_JSON_INT_T ast_json_int_t
Primarily used to cast when packing to an "I" type.
Definition json.h:87
A set of macros to manage forward-linked lists.
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition linkedlists.h:78
#define AST_LIST_HEAD_INIT_NOLOCK(head)
Initializes a list head structure.
#define AST_LIST_HEAD_NOLOCK(name, type)
Defines a structure to be used to hold a list of specified type (with no lock).
#define AST_LIST_LAST(head)
Returns the last entry contained in a list.
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
#define AST_LIST_INSERT_LIST_AFTER(head, list, elm, field)
Inserts a whole list after a specific entry in a list.
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition linkedlists.h:52
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
#define AST_RWLIST_HEAD_INIT(head)
Initializes an rwlist head structure.
#define AST_RWLIST_HEAD_STATIC(name, type)
Defines a structure to be used to hold a read/write list of specified type, statically initialized.
#define AST_RWLIST_REMOVE_HEAD
#define AST_LIST_EMPTY(head)
Checks whether the specified list contains any entries.
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
#define AST_LIST_ENTRY(type)
Declare a forward link structure inside a list entry.
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
#define AST_RWLIST_HEAD(name, type)
Defines a structure to be used to hold a read/write list of specified type.
#define AST_RWLIST_TRAVERSE
#define AST_LIST_INSERT_HEAD(head, elm, field)
Inserts a list entry at the head of a list.
#define AST_LIST_REMOVE(head, elm, field)
Removes a specific entry from a list.
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
#define AST_RWLIST_INSERT_HEAD
#define AST_RWLIST_INSERT_TAIL
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
#define AST_LIST_APPEND_LIST(head, list, field)
Appends a whole list to the tail of a list.
#define AST_LIST_FIRST(head)
Returns the first entry contained in a list.
#define AST_LIST_NEXT(elm, field)
Returns the next entry in the list after the given entry.
Asterisk locking-related definitions:
#define CHANNEL_DEADLOCK_AVOIDANCE(chan)
Definition lock.h:481
int ast_atomic_fetchadd_int(volatile int *p, int v)
Atomically add v to *p and return the previous value of *p.
Definition lock.h:764
#define SCOPED_LOCK(varname, lock, lockfunc, unlockfunc)
Scoped Locks.
Definition lock.h:590
#define SCOPED_MUTEX(varname, lock)
scoped lock specialization for mutexes
Definition lock.h:596
#define AST_MUTEX_DEFINE_STATIC(mutex)
Definition lock.h:527
#define remove
int errno
The AMI - Asterisk Manager Interface - is a TCP protocol created to manage Asterisk with third-party ...
#define EVENT_FLAG_CALL
Definition manager.h:76
#define ast_manager_event(chan, category, event, contents,...)
Definition manager.h:257
int ast_max_forwards_decrement(struct ast_channel *chan)
Decrement the max forwards count for a particular channel.
Out-of-call text message support.
Header for providers of file and format handling routines. Clients of these routines should include "...
Music on hold handling.
#define ast_opt_transcode_via_slin
Definition options.h:128
#define ast_opt_generic_plc_on_equal_codecs
Definition options.h:146
#define ast_fully_booted
Definition options.h:127
#define ast_opt_generic_plc
Definition options.h:144
char ast_defaultlanguage[]
Definition options.c:99
#define ast_opt_transmit_silence
Definition options.h:134
static int frames
Definition parser.c:51
Asterisk file paths, configured in asterisk.conf.
Core PBX routines and definitions.
void ast_pbx_hangup_handler_destroy(struct ast_channel *chan)
Destroy the hangup handler container on a channel.
const char * pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name)
Return a pointer to the value of the corresponding channel variable.
int pbx_builtin_setvar_helper(struct ast_channel *chan, const char *name, const char *value)
Add a variable to the channel variable stack, removing the most recently set value for the same name.
int ast_func_read2(struct ast_channel *chan, const char *function, struct ast_str **str, ssize_t maxlen)
executes a read operation on a function
void ast_pbx_hangup_handler_init(struct ast_channel *chan)
Init the hangup handler container on a channel.
int ast_pbx_hangup_handler_run(struct ast_channel *chan)
Run all hangup handlers on the channel.
int ast_func_write(struct ast_channel *chan, const char *function, const char *value)
executes a write operation on a function
int plc_fillin(plc_state_t *s, int16_t amp[], int len)
Fill-in a block of missing audio samples.
Definition plc.c:175
int plc_rx(plc_state_t *s, int16_t amp[], int len)
Process a block of received audio samples.
Definition plc.c:132
#define ast_poll(a, b, c)
Definition poll-compat.h:88
static struct stasis_subscription * sub
Statsd channel stats. Exmaple of how to subscribe to Stasis events.
static char url[512]
#define NULL
Definition resample.c:96
#define M_PI
Definition resample.c:83
Pluggable RTP Architecture.
void ast_rtp_instance_set_stats_vars(struct ast_channel *chan, struct ast_rtp_instance *instance)
Set standard statistics from an RTP instance on a channel.
struct ast_rtp_glue * ast_rtp_instance_get_glue(const char *type)
Get the RTP glue that binds a channel to the RTP engine.
Say numbers and dates (maybe words one day too)
SAY_EXTERN int(* ast_say_money_str_full)(struct ast_channel *chan, const char *num, const char *ints, const char *lang, int audiofd, int ctrlfd) SAY_INIT(ast_say_money_str_full)
Definition say.h:170
SAY_EXTERN int(* ast_say_number_full)(struct ast_channel *chan, int num, const char *ints, const char *lang, const char *options, int audiofd, int ctrlfd) SAY_INIT(ast_say_number_full)
Same as ast_say_number() with audiofd for received audio and returns 1 on ctrlfd being readable.
Definition say.h:86
SAY_EXTERN int(* ast_say_enumeration_full)(struct ast_channel *chan, int num, const char *ints, const char *lang, const char *options, int audiofd, int ctrlfd) SAY_INIT(ast_say_enumeration_full)
Same as ast_say_enumeration() with audiofd for received audio and returns 1 on ctrlfd being readable.
Definition say.h:125
SAY_EXTERN int(* ast_say_ordinal_full)(struct ast_channel *chan, int num, const char *ints, const char *lang, const char *options, int audiofd, int ctrlfd) SAY_INIT(ast_say_ordinal_full)
Same as ast_say_number() with audiofd for received audio and returns 1 on ctrlfd being readable.
Definition say.h:105
SAY_EXTERN int(* ast_say_character_str_full)(struct ast_channel *chan, const char *num, const char *ints, const char *lang, enum ast_say_case_sensitivity sensitivity, int audiofd, int ctrlfd) SAY_INIT(ast_say_character_str_full)
Definition say.h:194
SAY_EXTERN int(* ast_say_digit_str_full)(struct ast_channel *chan, const char *num, const char *ints, const char *lang, int audiofd, int ctrlfd) SAY_INIT(ast_say_digit_str_full)
Same as ast_say_digit_str() with audiofd for received audio and returns 1 on ctrlfd being readable.
Definition say.h:162
ast_say_case_sensitivity
Controls how ast_say_character_str denotes the case of characters in a string.
Definition say.h:181
SAY_EXTERN int(* ast_say_phonetic_str_full)(struct ast_channel *chan, const char *num, const char *ints, const char *lang, int audiofd, int ctrlfd) SAY_INIT(ast_say_phonetic_str_full)
Definition say.h:199
Scheduler Routines (derived from cheops)
void ast_sched_context_destroy(struct ast_sched_context *c)
destroys a schedule context
Definition sched.c:271
struct ast_sched_context * ast_sched_context_create(void)
Create a scheduler context.
Definition sched.c:238
A machine to gather up arbitrary frames and convert them to raw slinear on demand.
int ast_stasis_channels_init(void)
Initialize the stasis channel topic and message types.
Media Stream API.
struct ast_stream_topology * ast_stream_topology_alloc(void)
Create a stream topology.
Definition stream.c:652
int ast_stream_get_position(const struct ast_stream *stream)
Get the position of the stream in the topology.
Definition stream.c:500
const char * ast_stream_topology_to_str(const struct ast_stream_topology *topology, struct ast_str **buf)
Get a string representing the topology for debugging/display purposes.
Definition stream.c:939
struct ast_stream * ast_stream_topology_get_stream(const struct ast_stream_topology *topology, unsigned int position)
Get a specific stream from the topology.
Definition stream.c:791
int ast_stream_topology_get_count(const struct ast_stream_topology *topology)
Get the number of streams in a topology.
Definition stream.c:768
enum ast_media_type ast_stream_get_type(const struct ast_stream *stream)
Get the media type of a stream.
Definition stream.c:316
void ast_stream_topology_free(struct ast_stream_topology *topology)
Unreference and destroy a stream topology.
Definition stream.c:746
struct ast_stream_topology * ast_stream_topology_create_from_format_cap(struct ast_format_cap *cap)
A helper function that, given a format capabilities structure, creates a topology and separates the m...
Definition stream.c:851
struct ast_format_cap * ast_stream_topology_get_formats(struct ast_stream_topology *topology)
Create a format capabilities structure representing the topology.
Definition stream.c:933
int ast_stream_topology_equal(const struct ast_stream_topology *left, const struct ast_stream_topology *right)
Compare two stream topologies to see if they are equal.
Definition stream.c:699
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition strings.h:1139
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
Definition strings.h:80
static force_inline int attribute_pure ast_str_hash(const char *str)
Compute a hash value on a string.
Definition strings.h:1259
#define S_COR(a, b, c)
returns the equivalent of logic or for strings, with an additional boolean check: second one if not e...
Definition strings.h:87
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition strings.h:65
#define ast_str_tmp(init_len, __expr)
Provides a temporary ast_str and returns a copy of its buffer.
Definition strings.h:1189
#define ast_str_alloca(init_len)
Definition strings.h:848
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition strings.h:659
char * ast_trim_blanks(char *str)
Trims trailing whitespace characters from a string.
Definition strings.h:186
char *attribute_pure ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition strings.h:761
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition strings.h:425
static int force_inline attribute_pure ast_begins_with(const char *str, const char *prefix)
Checks whether a string begins with another.
Definition strings.h:97
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
Definition strings.h:223
char *attribute_pure ast_skip_blanks(const char *str)
Gets a pointer to the first non-whitespace character in a string.
Definition strings.h:161
Generic container type.
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition astobj2.h:1821
Structure to pass both assignedid values to channel drivers.
Definition channel.h:606
const char * uniqueid2
Definition channel.h:608
const char * uniqueid
Definition channel.h:607
Structure that contains information regarding a channel in a bridge.
struct ast_channel * chan
Structure that contains features information.
Structure that contains information about a bridge.
Definition bridge.h:353
Helper struct for initializing additional channel information on channel creation.
Definition channel.h:615
Structure to describe a channel "technology", ie a channel driver See for examples:
Definition channel.h:648
int(*const write)(struct ast_channel *chan, struct ast_frame *frame)
Write a frame, in standard format (see frame.h)
Definition channel.h:770
struct ast_frame *(*const read)(struct ast_channel *chan)
Read a frame (or chain of frames from the same stream), in standard format (see frame....
Definition channel.h:754
int(*const write_stream)(struct ast_channel *chan, int stream_num, struct ast_frame *frame)
Write a frame on a specific stream, in standard format (see frame.h)
Definition channel.h:773
struct ast_frame *(*const read_stream)(struct ast_channel *chan)
Read a frame (or chain of frames from the same stream), in standard format (see frame....
Definition channel.h:767
int(*const indicate)(struct ast_channel *c, int condition, const void *data, size_t datalen)
Indicate a particular condition (e.g. AST_CONTROL_BUSY or AST_CONTROL_RINGING or AST_CONTROL_CONGESTI...
Definition channel.h:791
int(*const send_text)(struct ast_channel *chan, const char *text)
Display or transmit text.
Definition channel.h:776
int(*const write_text)(struct ast_channel *chan, struct ast_frame *frame)
Write a text frame, in standard format.
Definition channel.h:809
int(*const call)(struct ast_channel *chan, const char *addr, int timeout)
Make a call.
Definition channel.h:721
enum ast_bridge_result(*const early_bridge)(struct ast_channel *c0, struct ast_channel *c1)
Bridge two channels of the same type together (early)
Definition channel.h:788
int(*const send_text_data)(struct ast_channel *chan, struct ast_msg_data *data)
Display or transmit text with data.
Definition channel.h:864
int(*const hangup)(struct ast_channel *chan)
Hangup (and possibly destroy) the channel.
Definition channel.h:724
const char *const type
Definition channel.h:649
int(*const queryoption)(struct ast_channel *chan, int option, void *data, int *datalen)
Query a given option. Called with chan locked.
Definition channel.h:800
int(*const setoption)(struct ast_channel *chan, int option, void *data, int datalen)
Set a given option. Called with chan locked.
Definition channel.h:797
int(*const answer)(struct ast_channel *chan)
Answer the channel.
Definition channel.h:727
const char *const description
Definition channel.h:650
int(* pre_call)(struct ast_channel *chan, const char *sub_args)
Execute a Gosub call on the channel in a technology specific way before a call is placed.
Definition channel.h:861
int(*const send_digit_end)(struct ast_channel *chan, char digit, unsigned int duration)
Stop sending a literal DTMF digit.
Definition channel.h:710
int(*const transfer)(struct ast_channel *chan, const char *newdest)
Blind transfer other side (see app_transfer.c and ast_transfer()
Definition channel.h:803
int(*const write_video)(struct ast_channel *chan, struct ast_frame *frame)
Write a frame, in standard format.
Definition channel.h:806
struct ast_frame *(*const exception)(struct ast_channel *chan)
Handle an exception, reading a frame.
Definition channel.h:785
int(*const send_html)(struct ast_channel *chan, int subclass, const char *data, int len)
Send HTML data.
Definition channel.h:782
int(*const answer_with_stream_topology)(struct ast_channel *chan, struct ast_stream_topology *topology)
Answer the channel with topology.
Definition channel.h:740
Main Channel structure associated with a channel.
struct ast_channel_id uniqueid
struct ast_party_connected_line connected
Channel Connected Line ID information.
char exten[AST_MAX_EXTENSION]
const char * data
const struct ast_channel_tech * tech
struct ast_endpoint * endpoint
struct ast_format * writeformat
struct ast_party_redirecting redirecting
Redirecting/Diversion information.
struct ast_party_dialed dialed
Dialed/Called information.
void * generatordata
char context[AST_MAX_CONTEXT]
struct ast_format * readformat
struct ast_party_caller caller
Channel Caller ID information.
descriptor for a cli entry.
Definition cli.h:171
char * command
Definition cli.h:186
const char * usage
Definition cli.h:177
enum ast_control_t38 request_response
Structure for a data store type.
Definition datastore.h:31
void *(* duplicate)(void *data)
Definition datastore.h:33
void(* chan_fixup)(void *data, struct ast_channel *old_chan, struct ast_channel *new_chan)
Fix up channel references on the masquerading channel.
Definition datastore.h:48
const char * type
Definition datastore.h:32
void(* chan_breakdown)(void *data, struct ast_channel *old_chan, struct ast_channel *new_chan)
Fix up channel references on the channel being masqueraded into.
Definition datastore.h:60
Structure for a data store object.
Definition datastore.h:64
const struct ast_datastore_info * info
Definition datastore.h:67
const char * uid
Definition datastore.h:65
void * data
Definition datastore.h:66
unsigned int inheritance
Definition datastore.h:69
struct ast_datastore::@223 entry
Format capabilities structure, holds formats + preference order + etc.
Definition format_cap.c:54
Definition of a media format.
Definition format.c:43
struct ast_format * format
Data structure associated with a single frame of data.
struct ast_frame_subclass subclass
enum ast_frame_type frametype
union ast_frame::@235 data
struct ast_frame * next
void(* digit)(struct ast_channel *chan, char digit)
Definition channel.h:237
int(* generate)(struct ast_channel *chan, void *data, int len, int samples)
Definition channel.h:235
void *(* alloc)(struct ast_channel *chan, void *params)
Definition channel.h:228
void(* release)(struct ast_channel *chan, void *data)
Definition channel.h:230
void(* write_format_change)(struct ast_channel *chan, void *data)
Definition channel.h:240
Abstract JSON element (object, array, string, int, ...).
enum ast_msg_data_attribute_type type
Definition message.h:463
Structure used to transport a message through the frame core.
Caller Party information.
Definition channel.h:420
struct ast_party_id priv
Private caller party ID.
Definition channel.h:432
struct ast_party_id id
Caller party ID.
Definition channel.h:422
int ani2
Automatic Number Identification 2 (Info Digits)
Definition channel.h:435
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition channel.h:429
Connected Line/Party information.
Definition channel.h:458
int source
Information about the source of an update.
Definition channel.h:484
struct ast_party_id priv
Private connected party ID.
Definition channel.h:470
struct ast_party_id id
Connected party ID.
Definition channel.h:460
int ani2
Automatic Number Identification 2 (Info Digits)
Definition channel.h:477
struct ast_party_id ani
Automatic Number Identification (ANI)
Definition channel.h:467
Dialed/Called Party information.
Definition channel.h:380
struct ast_party_subaddress subaddress
Dialed/Called subaddress.
Definition channel.h:393
char * str
Subscriber phone number (Malloced)
Definition channel.h:388
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
Definition channel.h:390
struct ast_party_dialed::@217 number
Dialed/Called number.
int transit_network_select
Transit Network Select.
Definition channel.h:399
struct ast_party_subaddress_ies subaddress
Subscriber subaddress ies.
Definition channel.c:8658
struct ast_party_name_ies name
Subscriber name ies.
Definition channel.c:8654
int combined_presentation
Combined name and number presentation ie.
Definition channel.c:8665
struct ast_party_number_ies number
Subscriber phone number ies.
Definition channel.c:8656
int tag
User party id tag ie.
Definition channel.c:8660
Information needed to identify an endpoint in a call.
Definition channel.h:340
struct ast_party_subaddress subaddress
Subscriber subaddress.
Definition channel.h:346
char * tag
User-set "tag".
Definition channel.h:356
struct ast_party_name name
Subscriber name.
Definition channel.h:342
struct ast_party_number number
Subscriber phone number.
Definition channel.h:344
int char_set
Character set ie.
Definition channel.c:8433
int presentation
presentation-indicator ie
Definition channel.c:8435
int str
Subscriber name ie.
Definition channel.c:8431
int valid
valid/present ie
Definition channel.c:8437
Information needed to specify a name in a call.
Definition channel.h:264
int char_set
Character set the name is using.
Definition channel.h:274
int presentation
Q.931 encoded presentation-indicator encoded field.
Definition channel.h:279
unsigned char valid
TRUE if the name information is valid/present.
Definition channel.h:281
char * str
Subscriber name (Malloced)
Definition channel.h:266
int presentation
presentation-indicator ie
Definition channel.c:8509
int str
Subscriber phone number ie.
Definition channel.c:8505
int valid
valid/present ie
Definition channel.c:8511
int plan
Type-Of-Number and Numbering-Plan ie.
Definition channel.c:8507
Information needed to specify a number in a call.
Definition channel.h:291
int presentation
Q.931 presentation-indicator and screening-indicator encoded fields.
Definition channel.h:297
unsigned char valid
TRUE if the number information is valid/present.
Definition channel.h:299
char * str
Subscriber phone number (Malloced)
Definition channel.h:293
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
Definition channel.h:295
Redirecting reason information.
Definition channel.h:503
int code
enum AST_REDIRECTING_REASON value for redirection
Definition channel.h:512
char * str
a string value for the redirecting reason
Definition channel.h:509
Redirecting Line information. RDNIS (Redirecting Directory Number Information Service) Where a call d...
Definition channel.h:524
struct ast_party_id priv_to
Call is redirecting to a new party (Sent to the caller) - private representation.
Definition channel.h:541
struct ast_party_redirecting_reason orig_reason
Reason for the redirection by the original party.
Definition channel.h:547
struct ast_party_redirecting_reason reason
Reason for the redirection.
Definition channel.h:544
struct ast_party_id priv_from
Who is redirecting the call (Sent to the party the call is redirected toward) - private representatio...
Definition channel.h:538
struct ast_party_id from
Who is redirecting the call (Sent to the party the call is redirected toward)
Definition channel.h:529
int count
Number of times the call was redirected.
Definition channel.h:550
struct ast_party_id to
Call is redirecting to a new party (Sent to the caller)
Definition channel.h:532
struct ast_party_id orig
Who originally redirected the call (Sent to the party the call is redirected toward)
Definition channel.h:526
struct ast_party_id priv_orig
Who originally redirected the call (Sent to the party the call is redirected toward) - private repres...
Definition channel.h:535
int str
subaddress ie.
Definition channel.c:8579
int odd_even_indicator
odd/even indicator ie
Definition channel.c:8583
int valid
valid/present ie
Definition channel.c:8585
int type
subaddress type ie
Definition channel.c:8581
Information needed to specify a subaddress in a call.
Definition channel.h:309
unsigned char odd_even_indicator
TRUE if odd number of address signals.
Definition channel.h:328
unsigned char valid
TRUE if the subaddress information is valid/present.
Definition channel.h:330
char * str
Malloced subaddress string.
Definition channel.h:315
int type
Q.931 subaddress type.
Definition channel.h:322
enum ast_rtp_glue_result(* get_rtp_info)(struct ast_channel *chan, struct ast_rtp_instance **instance)
Callback for retrieving the RTP instance carrying audio.
Definition rtp_engine.h:787
Indicate what information in ast_party_caller should be set.
Definition channel.h:442
Indicate what information in ast_party_connected_line should be set.
Definition channel.h:491
Indicate what information in ast_party_id should be set.
Definition channel.h:363
unsigned char subaddress
Definition channel.h:369
unsigned char number
Definition channel.h:367
unsigned char name
Definition channel.h:365
Indicate what information in ast_party_redirecting should be set.
Definition channel.h:557
struct ast_format * old_write_format
Definition channel.c:8267
Support for dynamic strings.
Definition strings.h:623
void * data
Definition timing.c:55
Description of a tone.
Definition indications.h:35
const char * data
Description of a tone.
Definition indications.h:52
Default structure for translators, with the basic fields and buffers, all allocated as part of the sa...
Definition translate.h:213
int interleaved_stereo
Definition translate.h:238
struct ast_var_t::@220 entries
Structure for variables, used for configurations and for channel variables.
struct ast_variable * next
the list of registered channel types
Definition channel.c:125
map AST_CAUSE's to readable string representations
Definition channel.c:131
const char * desc
Definition channel.c:134
const char * name
Definition channel.c:133
int cause
Definition channel.c:132
List of channel drivers.
Definition app_dial.c:804
struct ast_channel * chan
Definition app_dial.c:806
struct chanlist::@348 list
const struct ast_channel_tech * tech
Definition channel.c:120
const char * tech
Definition app_dial.c:810
List of channel variables to append to all channel-related events.
Definition channel.c:7870
struct manager_channel_variable::@349 entry
Named group member structure.
Definition channel.c:7725
unsigned int hash
Definition channel.c:7727
Number structure.
const char * cid_num
Definition channel.h:1129
struct ast_variable * vars
Definition channel.h:1132
int connect_on_early_media
Definition channel.h:1128
const char * account
Definition channel.h:1131
const char * cid_name
Definition channel.h:1130
const char * exten
Definition channel.h:1126
const char * context
Definition channel.h:1125
struct ast_channel * parent_channel
Definition channel.h:1133
int16_t * samples_buf
Definition channel.c:5090
size_t num_samples
Definition channel.c:5094
plc_state_t plc_state
Definition channel.c:5095
struct ast_format *(* get_format)(struct ast_channel *chan)
Definition channel.c:5621
void(* set_trans)(struct ast_channel *chan, struct ast_trans_pvt *value)
Definition channel.c:5620
void(* set_rawformat)(struct ast_channel *chan, struct ast_format *format)
Definition channel.c:5624
struct ast_trans_pvt *(* get_trans)(const struct ast_channel *chan)
Definition channel.c:5619
void(* set_format)(struct ast_channel *chan, struct ast_format *format)
Definition channel.c:5622
const char * direction
Definition channel.c:5618
struct ast_format *(* get_rawformat)(struct ast_channel *chan)
Definition channel.c:5623
enum ast_frame_type frametype
Definition channel.c:10830
unsigned int direction
Definition channel.c:10831
unsigned char offset[AST_FRIENDLY_OFFSET]
Definition channel.c:7557
struct ast_format * origwfmt
Definition channel.c:7552
struct ast_frame f
Definition channel.c:7556
short data[4000]
Definition channel.c:7558
int value
Definition syslog.c:37
Test Framework API.
#define ast_test_suite_event_notify(s, f,...)
Definition test.h:189
static const struct ast_aeap_message_handler handlers[]
Definition test_aeap.c:135
int done
static struct test_options options
static struct test_val b
static struct test_val a
static struct test_val d
static struct test_val c
Definitions to aid in the use of thread local storage.
int ast_threadstorage_set_ptr(struct ast_threadstorage *ts, void *ptr)
Set a raw pointer from threadstorage.
void * ast_threadstorage_get_ptr(struct ast_threadstorage *ts)
Retrieve a raw pointer from threadstorage.
void * ast_threadstorage_get(struct ast_threadstorage *ts, size_t init_size)
Retrieve thread storage.
#define AST_THREADSTORAGE(name)
Define a thread storage variable.
#define AST_THREADSTORAGE_RAW(name)
int ast_tvzero(const struct timeval t)
Returns true if the argument is 0,0.
Definition time.h:117
int ast_tvcmp(struct timeval _a, struct timeval _b)
Compress two struct timeval instances returning -1, 0, 1 if the first arg is smaller,...
Definition time.h:137
int ast_remaining_ms(struct timeval start, int max_ms)
Calculate remaining milliseconds given a starting timestamp and upper bound.
Definition utils.c:2315
struct timeval ast_tvadd(struct timeval a, struct timeval b)
Returns the sum of two timevals a + b.
Definition extconf.c:2280
struct timeval ast_tvsub(struct timeval a, struct timeval b)
Returns the difference of two timevals a - b.
Definition extconf.c:2295
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
Definition time.h:107
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition time.h:159
Timing source management.
unsigned int ast_timer_get_max_rate(const struct ast_timer *handle)
Get maximum rate supported for a timer.
Definition timing.c:191
void ast_timer_close(struct ast_timer *handle)
Close an opened timing handle.
Definition timing.c:154
int ast_timer_ack(const struct ast_timer *handle, unsigned int quantity)
Acknowledge a timer event.
Definition timing.c:171
int ast_timer_set_rate(const struct ast_timer *handle, unsigned int rate)
Set the timing tick rate.
Definition timing.c:166
enum ast_timer_event ast_timer_get_event(const struct ast_timer *handle)
Retrieve timing event.
Definition timing.c:186
int ast_timer_enable_continuous(const struct ast_timer *handle)
Enable continuous mode.
Definition timing.c:176
const char * ast_timer_get_name(const struct ast_timer *handle)
Get name of timer in use.
Definition timing.c:196
int ast_timer_disable_continuous(const struct ast_timer *handle)
Disable continuous mode.
Definition timing.c:181
struct ast_timer * ast_timer_open(void)
Open a timer.
Definition timing.c:122
ast_timer_event
Definition timing.h:57
@ AST_TIMING_EVENT_CONTINUOUS
Definition timing.h:59
@ AST_TIMING_EVENT_EXPIRED
Definition timing.h:58
int ast_timer_fd(const struct ast_timer *handle)
Get a poll()-able file descriptor for a timer.
Definition timing.c:161
General Asterisk channel transcoding definitions.
#define AST_TRANS_CAP_RESTRICTED_DIGITAL
Definition transcap.h:37
#define AST_TRANS_CAP_DIGITAL
Definition transcap.h:36
#define AST_TRANS_CAP_DIGITAL_W_TONES
Definition transcap.h:40
#define AST_TRANS_CAP_SPEECH
Definition transcap.h:35
#define AST_TRANS_CAP_3_1K_AUDIO
Definition transcap.h:38
#define AST_TRANS_CAP_VIDEO
Definition transcap.h:41
Support for translation of data formats. translate.c.
struct ast_frame * ast_translate(struct ast_trans_pvt *tr, struct ast_frame *f, int consume)
translates one or more frames Apply an input frame into the translator and receive zero or one output...
Definition translate.c:623
int ast_translator_best_choice(struct ast_format_cap *dst_cap, struct ast_format_cap *src_cap, struct ast_format **dst_fmt_out, struct ast_format **src_fmt_out)
Chooses the best translation path.
Definition translate.c:1676
void ast_translator_free_path(struct ast_trans_pvt *tr)
Frees a translator path Frees the given translator path structure.
Definition translate.c:533
struct ast_trans_pvt * ast_translator_build_path(struct ast_format *dest, struct ast_format *source)
Builds a translator path Build a path (possibly NULL) from source to dest.
Definition translate.c:543
unsigned int ast_translate_path_steps(struct ast_format *dest, struct ast_format *src)
Returns the number of steps required to convert from 'src' to 'dest'.
Definition translate.c:1810
FILE * out
Definition utils/frame.c:33
Utility functions.
#define ast_test_flag(p, flag)
Definition utils.h:64
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition utils.h:981
#define ast_assert(a)
Definition utils.h:779
int ast_get_tid(void)
Get current thread ID.
Definition utils.c:2786
#define ast_clear_flag(p, flag)
Definition utils.h:78
#define SWAP(a, b)
Definition utils.h:256
#define ast_set_flag(p, flag)
Definition utils.h:71
#define ARRAY_LEN(a)
Definition utils.h:706
#define MAX(a, b)
Definition utils.h:254
#define AST_FLAGS_ALL
Definition utils.h:217