Mon Mar 12 2012 21:20:38

Asterisk developer's documentation


channel.c
Go to the documentation of this file.
00001 /*
00002  * Asterisk -- An open source telephony toolkit.
00003  *
00004  * Copyright (C) 1999 - 2006, Digium, Inc.
00005  *
00006  * Mark Spencer <markster@digium.com>
00007  *
00008  * See http://www.asterisk.org for more information about
00009  * the Asterisk project. Please do not directly contact
00010  * any of the maintainers of this project for assistance;
00011  * the project provides a web site, mailing lists and IRC
00012  * channels for your use.
00013  *
00014  * This program is free software, distributed under the terms of
00015  * the GNU General Public License Version 2. See the LICENSE file
00016  * at the top of the source tree.
00017  */
00018 
00019 /*! \file
00020  *
00021  * \brief Channel Management
00022  *
00023  * \author Mark Spencer <markster@digium.com>
00024  */
00025 
00026 #include "asterisk.h"
00027 
00028 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 348464 $")
00029 
00030 #include "asterisk/_private.h"
00031 
00032 #include <sys/time.h>
00033 #include <signal.h>
00034 #include <math.h>
00035 
00036 #include "asterisk/paths.h"   /* use ast_config_AST_SYSTEM_NAME */
00037 
00038 #include "asterisk/pbx.h"
00039 #include "asterisk/frame.h"
00040 #include "asterisk/mod_format.h"
00041 #include "asterisk/sched.h"
00042 #include "asterisk/channel.h"
00043 #include "asterisk/musiconhold.h"
00044 #include "asterisk/say.h"
00045 #include "asterisk/file.h"
00046 #include "asterisk/cli.h"
00047 #include "asterisk/translate.h"
00048 #include "asterisk/manager.h"
00049 #include "asterisk/cel.h"
00050 #include "asterisk/chanvars.h"
00051 #include "asterisk/linkedlists.h"
00052 #include "asterisk/indications.h"
00053 #include "asterisk/monitor.h"
00054 #include "asterisk/causes.h"
00055 #include "asterisk/callerid.h"
00056 #include "asterisk/utils.h"
00057 #include "asterisk/lock.h"
00058 #include "asterisk/app.h"
00059 #include "asterisk/transcap.h"
00060 #include "asterisk/devicestate.h"
00061 #include "asterisk/threadstorage.h"
00062 #include "asterisk/slinfactory.h"
00063 #include "asterisk/audiohook.h"
00064 #include "asterisk/framehook.h"
00065 #include "asterisk/timing.h"
00066 #include "asterisk/autochan.h"
00067 #include "asterisk/stringfields.h"
00068 #include "asterisk/global_datastores.h"
00069 #include "asterisk/data.h"
00070 
00071 #ifdef HAVE_EPOLL
00072 #include <sys/epoll.h>
00073 #endif
00074 
00075 #if defined(KEEP_TILL_CHANNEL_PARTY_NUMBER_INFO_NEEDED)
00076 #if defined(HAVE_PRI)
00077 #include "libpri.h"
00078 #endif   /* defined(HAVE_PRI) */
00079 #endif   /* defined(KEEP_TILL_CHANNEL_PARTY_NUMBER_INFO_NEEDED) */
00080 
00081 struct ast_epoll_data {
00082    struct ast_channel *chan;
00083    int which;
00084 };
00085 
00086 /* uncomment if you have problems with 'monitoring' synchronized files */
00087 #if 0
00088 #define MONITOR_CONSTANT_DELAY
00089 #define MONITOR_DELAY   150 * 8     /*!< 150 ms of MONITORING DELAY */
00090 #endif
00091 
00092 /*! \brief Prevent new channel allocation if shutting down. */
00093 static int shutting_down;
00094 
00095 static int uniqueint;
00096 
00097 unsigned long global_fin, global_fout;
00098 
00099 AST_THREADSTORAGE(state2str_threadbuf);
00100 #define STATE2STR_BUFSIZE   32
00101 
00102 /*! Default amount of time to use when emulating a digit as a begin and end 
00103  *  100ms */
00104 #define AST_DEFAULT_EMULATE_DTMF_DURATION 100
00105 
00106 /*! Minimum allowed digit length - 80ms */
00107 #define AST_MIN_DTMF_DURATION 80
00108 
00109 /*! Minimum amount of time between the end of the last digit and the beginning 
00110  *  of a new one - 45ms */
00111 #define AST_MIN_DTMF_GAP 45
00112 
00113 /*! \brief List of channel drivers */
00114 struct chanlist {
00115    const struct ast_channel_tech *tech;
00116    AST_LIST_ENTRY(chanlist) list;
00117 };
00118 
00119 #ifdef CHANNEL_TRACE
00120 /*! \brief Structure to hold channel context backtrace data */
00121 struct ast_chan_trace_data {
00122    int enabled;
00123    AST_LIST_HEAD_NOLOCK(, ast_chan_trace) trace;
00124 };
00125 
00126 /*! \brief Structure to save contexts where an ast_chan has been into */
00127 struct ast_chan_trace {
00128    char context[AST_MAX_CONTEXT];
00129    char exten[AST_MAX_EXTENSION];
00130    int priority;
00131    AST_LIST_ENTRY(ast_chan_trace) entry;
00132 };
00133 #endif
00134 
00135 /*! \brief the list of registered channel types */
00136 static AST_RWLIST_HEAD_STATIC(backends, chanlist);
00137 
00138 #ifdef LOW_MEMORY
00139 #define NUM_CHANNEL_BUCKETS 61
00140 #else
00141 #define NUM_CHANNEL_BUCKETS 1567
00142 #endif
00143 
00144 #if 0 /* XXX AstData: ast_callerid no longer exists. (Equivalent code not readily apparent.) */
00145 #define DATA_EXPORT_CALLERID(MEMBER)            \
00146    MEMBER(ast_callerid, cid_dnid, AST_DATA_STRING)    \
00147    MEMBER(ast_callerid, cid_num, AST_DATA_STRING)     \
00148    MEMBER(ast_callerid, cid_name, AST_DATA_STRING)    \
00149    MEMBER(ast_callerid, cid_ani, AST_DATA_STRING)     \
00150    MEMBER(ast_callerid, cid_pres, AST_DATA_INTEGER)   \
00151    MEMBER(ast_callerid, cid_ani2, AST_DATA_INTEGER)   \
00152    MEMBER(ast_callerid, cid_tag, AST_DATA_STRING)
00153 
00154 AST_DATA_STRUCTURE(ast_callerid, DATA_EXPORT_CALLERID);
00155 #endif
00156 
00157 #define DATA_EXPORT_CHANNEL(MEMBER)                \
00158    MEMBER(ast_channel, blockproc, AST_DATA_STRING)          \
00159    MEMBER(ast_channel, appl, AST_DATA_STRING)            \
00160    MEMBER(ast_channel, data, AST_DATA_STRING)            \
00161    MEMBER(ast_channel, name, AST_DATA_STRING)            \
00162    MEMBER(ast_channel, language, AST_DATA_STRING)           \
00163    MEMBER(ast_channel, musicclass, AST_DATA_STRING)         \
00164    MEMBER(ast_channel, accountcode, AST_DATA_STRING)        \
00165    MEMBER(ast_channel, peeraccount, AST_DATA_STRING)        \
00166    MEMBER(ast_channel, userfield, AST_DATA_STRING)          \
00167    MEMBER(ast_channel, call_forward, AST_DATA_STRING)       \
00168    MEMBER(ast_channel, uniqueid, AST_DATA_STRING)           \
00169    MEMBER(ast_channel, linkedid, AST_DATA_STRING)           \
00170    MEMBER(ast_channel, parkinglot, AST_DATA_STRING)         \
00171    MEMBER(ast_channel, hangupsource, AST_DATA_STRING)       \
00172    MEMBER(ast_channel, dialcontext, AST_DATA_STRING)        \
00173    MEMBER(ast_channel, rings, AST_DATA_INTEGER)          \
00174    MEMBER(ast_channel, priority, AST_DATA_INTEGER)          \
00175    MEMBER(ast_channel, macropriority, AST_DATA_INTEGER)        \
00176    MEMBER(ast_channel, adsicpe, AST_DATA_INTEGER)           \
00177    MEMBER(ast_channel, fin, AST_DATA_UNSIGNED_INTEGER)         \
00178    MEMBER(ast_channel, fout, AST_DATA_UNSIGNED_INTEGER)        \
00179    MEMBER(ast_channel, emulate_dtmf_duration, AST_DATA_UNSIGNED_INTEGER)   \
00180    MEMBER(ast_channel, visible_indication, AST_DATA_INTEGER)      \
00181    MEMBER(ast_channel, context, AST_DATA_STRING)            \
00182    MEMBER(ast_channel, exten, AST_DATA_STRING)           \
00183    MEMBER(ast_channel, macrocontext, AST_DATA_STRING)       \
00184    MEMBER(ast_channel, macroexten, AST_DATA_STRING)
00185 
00186 AST_DATA_STRUCTURE(ast_channel, DATA_EXPORT_CHANNEL);
00187 
00188 
00189 /*! \brief All active channels on the system */
00190 static struct ao2_container *channels;
00191 
00192 /*! \brief map AST_CAUSE's to readable string representations 
00193  *
00194  * \ref causes.h
00195 */
00196 static const struct {
00197    int cause;
00198    const char *name;
00199    const char *desc;
00200 } causes[] = {
00201    { AST_CAUSE_UNALLOCATED, "UNALLOCATED", "Unallocated (unassigned) number" },
00202    { AST_CAUSE_NO_ROUTE_TRANSIT_NET, "NO_ROUTE_TRANSIT_NET", "No route to specified transmit network" },
00203    { AST_CAUSE_NO_ROUTE_DESTINATION, "NO_ROUTE_DESTINATION", "No route to destination" },
00204    { AST_CAUSE_CHANNEL_UNACCEPTABLE, "CHANNEL_UNACCEPTABLE", "Channel unacceptable" },
00205    { AST_CAUSE_CALL_AWARDED_DELIVERED, "CALL_AWARDED_DELIVERED", "Call awarded and being delivered in an established channel" },
00206    { AST_CAUSE_NORMAL_CLEARING, "NORMAL_CLEARING", "Normal Clearing" },
00207    { AST_CAUSE_USER_BUSY, "USER_BUSY", "User busy" },
00208    { AST_CAUSE_NO_USER_RESPONSE, "NO_USER_RESPONSE", "No user responding" },
00209    { AST_CAUSE_NO_ANSWER, "NO_ANSWER", "User alerting, no answer" },
00210    { AST_CAUSE_CALL_REJECTED, "CALL_REJECTED", "Call Rejected" },
00211    { AST_CAUSE_NUMBER_CHANGED, "NUMBER_CHANGED", "Number changed" },
00212    { AST_CAUSE_DESTINATION_OUT_OF_ORDER, "DESTINATION_OUT_OF_ORDER", "Destination out of order" },
00213    { AST_CAUSE_INVALID_NUMBER_FORMAT, "INVALID_NUMBER_FORMAT", "Invalid number format" },
00214    { AST_CAUSE_FACILITY_REJECTED, "FACILITY_REJECTED", "Facility rejected" },
00215    { AST_CAUSE_RESPONSE_TO_STATUS_ENQUIRY, "RESPONSE_TO_STATUS_ENQUIRY", "Response to STATus ENQuiry" },
00216    { AST_CAUSE_NORMAL_UNSPECIFIED, "NORMAL_UNSPECIFIED", "Normal, unspecified" },
00217    { AST_CAUSE_NORMAL_CIRCUIT_CONGESTION, "NORMAL_CIRCUIT_CONGESTION", "Circuit/channel congestion" },
00218    { AST_CAUSE_NETWORK_OUT_OF_ORDER, "NETWORK_OUT_OF_ORDER", "Network out of order" },
00219    { AST_CAUSE_NORMAL_TEMPORARY_FAILURE, "NORMAL_TEMPORARY_FAILURE", "Temporary failure" },
00220    { AST_CAUSE_SWITCH_CONGESTION, "SWITCH_CONGESTION", "Switching equipment congestion" },
00221    { AST_CAUSE_ACCESS_INFO_DISCARDED, "ACCESS_INFO_DISCARDED", "Access information discarded" },
00222    { AST_CAUSE_REQUESTED_CHAN_UNAVAIL, "REQUESTED_CHAN_UNAVAIL", "Requested channel not available" },
00223    { AST_CAUSE_PRE_EMPTED, "PRE_EMPTED", "Pre-empted" },
00224    { AST_CAUSE_FACILITY_NOT_SUBSCRIBED, "FACILITY_NOT_SUBSCRIBED", "Facility not subscribed" },
00225    { AST_CAUSE_OUTGOING_CALL_BARRED, "OUTGOING_CALL_BARRED", "Outgoing call barred" },
00226    { AST_CAUSE_INCOMING_CALL_BARRED, "INCOMING_CALL_BARRED", "Incoming call barred" },
00227    { AST_CAUSE_BEARERCAPABILITY_NOTAUTH, "BEARERCAPABILITY_NOTAUTH", "Bearer capability not authorized" },
00228    { AST_CAUSE_BEARERCAPABILITY_NOTAVAIL, "BEARERCAPABILITY_NOTAVAIL", "Bearer capability not available" },
00229    { AST_CAUSE_BEARERCAPABILITY_NOTIMPL, "BEARERCAPABILITY_NOTIMPL", "Bearer capability not implemented" },
00230    { AST_CAUSE_CHAN_NOT_IMPLEMENTED, "CHAN_NOT_IMPLEMENTED", "Channel not implemented" },
00231    { AST_CAUSE_FACILITY_NOT_IMPLEMENTED, "FACILITY_NOT_IMPLEMENTED", "Facility not implemented" },
00232    { AST_CAUSE_INVALID_CALL_REFERENCE, "INVALID_CALL_REFERENCE", "Invalid call reference value" },
00233    { AST_CAUSE_INCOMPATIBLE_DESTINATION, "INCOMPATIBLE_DESTINATION", "Incompatible destination" },
00234    { AST_CAUSE_INVALID_MSG_UNSPECIFIED, "INVALID_MSG_UNSPECIFIED", "Invalid message unspecified" },
00235    { AST_CAUSE_MANDATORY_IE_MISSING, "MANDATORY_IE_MISSING", "Mandatory information element is missing" },
00236    { AST_CAUSE_MESSAGE_TYPE_NONEXIST, "MESSAGE_TYPE_NONEXIST", "Message type nonexist." },
00237    { AST_CAUSE_WRONG_MESSAGE, "WRONG_MESSAGE", "Wrong message" },
00238    { AST_CAUSE_IE_NONEXIST, "IE_NONEXIST", "Info. element nonexist or not implemented" },
00239    { AST_CAUSE_INVALID_IE_CONTENTS, "INVALID_IE_CONTENTS", "Invalid information element contents" },
00240    { AST_CAUSE_WRONG_CALL_STATE, "WRONG_CALL_STATE", "Message not compatible with call state" },
00241    { AST_CAUSE_RECOVERY_ON_TIMER_EXPIRE, "RECOVERY_ON_TIMER_EXPIRE", "Recover on timer expiry" },
00242    { AST_CAUSE_MANDATORY_IE_LENGTH_ERROR, "MANDATORY_IE_LENGTH_ERROR", "Mandatory IE length error" },
00243    { AST_CAUSE_PROTOCOL_ERROR, "PROTOCOL_ERROR", "Protocol error, unspecified" },
00244    { AST_CAUSE_INTERWORKING, "INTERWORKING", "Interworking, unspecified" },
00245 };
00246 
00247 struct ast_variable *ast_channeltype_list(void)
00248 {
00249    struct chanlist *cl;
00250    struct ast_variable *var = NULL, *prev = NULL;
00251 
00252    AST_RWLIST_RDLOCK(&backends);
00253    AST_RWLIST_TRAVERSE(&backends, cl, list) {
00254       if (prev)  {
00255          if ((prev->next = ast_variable_new(cl->tech->type, cl->tech->description, "")))
00256             prev = prev->next;
00257       } else {
00258          var = ast_variable_new(cl->tech->type, cl->tech->description, "");
00259          prev = var;
00260       }
00261    }
00262    AST_RWLIST_UNLOCK(&backends);
00263 
00264    return var;
00265 }
00266 
00267 static void channel_data_add_flags(struct ast_data *tree,
00268    struct ast_channel *chan)
00269 {
00270    ast_data_add_bool(tree, "DEFER_DTMF", ast_test_flag(chan, AST_FLAG_DEFER_DTMF));
00271    ast_data_add_bool(tree, "WRITE_INT", ast_test_flag(chan, AST_FLAG_WRITE_INT));
00272    ast_data_add_bool(tree, "BLOCKING", ast_test_flag(chan, AST_FLAG_BLOCKING));
00273    ast_data_add_bool(tree, "ZOMBIE", ast_test_flag(chan, AST_FLAG_ZOMBIE));
00274    ast_data_add_bool(tree, "EXCEPTION", ast_test_flag(chan, AST_FLAG_EXCEPTION));
00275    ast_data_add_bool(tree, "MOH", ast_test_flag(chan, AST_FLAG_MOH));
00276    ast_data_add_bool(tree, "SPYING", ast_test_flag(chan, AST_FLAG_SPYING));
00277    ast_data_add_bool(tree, "NBRIDGE", ast_test_flag(chan, AST_FLAG_NBRIDGE));
00278    ast_data_add_bool(tree, "IN_AUTOLOOP", ast_test_flag(chan, AST_FLAG_IN_AUTOLOOP));
00279    ast_data_add_bool(tree, "OUTGOING", ast_test_flag(chan, AST_FLAG_OUTGOING));
00280    ast_data_add_bool(tree, "IN_DTMF", ast_test_flag(chan, AST_FLAG_IN_DTMF));
00281    ast_data_add_bool(tree, "EMULATE_DTMF", ast_test_flag(chan, AST_FLAG_EMULATE_DTMF));
00282    ast_data_add_bool(tree, "END_DTMF_ONLY", ast_test_flag(chan, AST_FLAG_END_DTMF_ONLY));
00283    ast_data_add_bool(tree, "ANSWERED_ELSEWHERE", ast_test_flag(chan, AST_FLAG_ANSWERED_ELSEWHERE));
00284    ast_data_add_bool(tree, "MASQ_NOSTREAM", ast_test_flag(chan, AST_FLAG_MASQ_NOSTREAM));
00285    ast_data_add_bool(tree, "BRIDGE_HANGUP_RUN", ast_test_flag(chan, AST_FLAG_BRIDGE_HANGUP_RUN));
00286    ast_data_add_bool(tree, "BRIDGE_HANGUP_DONT", ast_test_flag(chan, AST_FLAG_BRIDGE_HANGUP_DONT));
00287    ast_data_add_bool(tree, "DISABLE_WORKAROUNDS", ast_test_flag(chan, AST_FLAG_DISABLE_WORKAROUNDS));
00288 }
00289 
00290 #if defined(KEEP_TILL_CHANNEL_PARTY_NUMBER_INFO_NEEDED)
00291 static const char *party_number_ton2str(int ton)
00292 {
00293 #if defined(HAVE_PRI)
00294    switch ((ton >> 4) & 0x07) {
00295    case PRI_TON_INTERNATIONAL:
00296       return "International";
00297    case PRI_TON_NATIONAL:
00298       return "National";
00299    case PRI_TON_NET_SPECIFIC:
00300       return "Network Specific";
00301    case PRI_TON_SUBSCRIBER:
00302       return "Subscriber";
00303    case PRI_TON_ABBREVIATED:
00304       return "Abbreviated";
00305    case PRI_TON_RESERVED:
00306       return "Reserved";
00307    case PRI_TON_UNKNOWN:
00308    default:
00309       break;
00310    }
00311 #endif   /* defined(HAVE_PRI) */
00312    return "Unknown";
00313 }
00314 #endif   /* defined(KEEP_TILL_CHANNEL_PARTY_NUMBER_INFO_NEEDED) */
00315 
00316 #if defined(KEEP_TILL_CHANNEL_PARTY_NUMBER_INFO_NEEDED)
00317 static const char *party_number_plan2str(int plan)
00318 {
00319 #if defined(HAVE_PRI)
00320    switch (plan & 0x0F) {
00321    default:
00322    case PRI_NPI_UNKNOWN:
00323       break;
00324    case PRI_NPI_E163_E164:
00325       return "Public (E.163/E.164)";
00326    case PRI_NPI_X121:
00327       return "Data (X.121)";
00328    case PRI_NPI_F69:
00329       return "Telex (F.69)";
00330    case PRI_NPI_NATIONAL:
00331       return "National Standard";
00332    case PRI_NPI_PRIVATE:
00333       return "Private";
00334    case PRI_NPI_RESERVED:
00335       return "Reserved";
00336    }
00337 #endif   /* defined(HAVE_PRI) */
00338    return "Unknown";
00339 }
00340 #endif   /* defined(KEEP_TILL_CHANNEL_PARTY_NUMBER_INFO_NEEDED) */
00341 
00342 int ast_channel_data_add_structure(struct ast_data *tree,
00343    struct ast_channel *chan, int add_bridged)
00344 {
00345    struct ast_channel *bc;
00346    struct ast_data *data_bridged;
00347    struct ast_data *data_cdr;
00348    struct ast_data *data_flags;
00349    struct ast_data *data_zones;
00350    struct ast_data *enum_node;
00351    struct ast_data *data_softhangup;
00352 #if 0 /* XXX AstData: ast_callerid no longer exists. (Equivalent code not readily apparent.) */
00353    struct ast_data *data_callerid;
00354    char value_str[100];
00355 #endif
00356 
00357    if (!tree) {
00358       return -1;
00359    }
00360 
00361    ast_data_add_structure(ast_channel, tree, chan);
00362 
00363    if (add_bridged) {
00364       bc = ast_bridged_channel(chan);
00365       if (bc) {
00366          data_bridged = ast_data_add_node(tree, "bridged");
00367          if (!data_bridged) {
00368             return -1;
00369          }
00370          ast_channel_data_add_structure(data_bridged, bc, 0);
00371       }
00372    }
00373 
00374    ast_data_add_codecs(tree, "oldwriteformat", chan->oldwriteformat);
00375    ast_data_add_codecs(tree, "nativeformats", chan->nativeformats);
00376    ast_data_add_codecs(tree, "readformat", chan->readformat);
00377    ast_data_add_codecs(tree, "writeformat", chan->writeformat);
00378    ast_data_add_codecs(tree, "rawreadformat", chan->rawreadformat);
00379    ast_data_add_codecs(tree, "rawwriteformat", chan->rawwriteformat);
00380 
00381    /* state */
00382    enum_node = ast_data_add_node(tree, "state");
00383    if (!enum_node) {
00384       return -1;
00385    }
00386    ast_data_add_str(enum_node, "text", ast_state2str(chan->_state));
00387    ast_data_add_int(enum_node, "value", chan->_state);
00388 
00389    /* hangupcause */
00390    enum_node = ast_data_add_node(tree, "hangupcause");
00391    if (!enum_node) {
00392       return -1;
00393    }
00394    ast_data_add_str(enum_node, "text", ast_cause2str(chan->hangupcause));
00395    ast_data_add_int(enum_node, "value", chan->hangupcause);
00396 
00397    /* amaflags */
00398    enum_node = ast_data_add_node(tree, "amaflags");
00399    if (!enum_node) {
00400       return -1;
00401    }
00402    ast_data_add_str(enum_node, "text", ast_cdr_flags2str(chan->amaflags));
00403    ast_data_add_int(enum_node, "value", chan->amaflags);
00404 
00405    /* transfercapability */
00406    enum_node = ast_data_add_node(tree, "transfercapability");
00407    if (!enum_node) {
00408       return -1;
00409    }
00410    ast_data_add_str(enum_node, "text", ast_transfercapability2str(chan->transfercapability));
00411    ast_data_add_int(enum_node, "value", chan->transfercapability);
00412 
00413    /* _softphangup */
00414    data_softhangup = ast_data_add_node(tree, "softhangup");
00415    if (!data_softhangup) {
00416       return -1;
00417    }
00418    ast_data_add_bool(data_softhangup, "dev", chan->_softhangup & AST_SOFTHANGUP_DEV);
00419    ast_data_add_bool(data_softhangup, "asyncgoto", chan->_softhangup & AST_SOFTHANGUP_ASYNCGOTO);
00420    ast_data_add_bool(data_softhangup, "shutdown", chan->_softhangup & AST_SOFTHANGUP_SHUTDOWN);
00421    ast_data_add_bool(data_softhangup, "timeout", chan->_softhangup & AST_SOFTHANGUP_TIMEOUT);
00422    ast_data_add_bool(data_softhangup, "appunload", chan->_softhangup & AST_SOFTHANGUP_APPUNLOAD);
00423    ast_data_add_bool(data_softhangup, "explicit", chan->_softhangup & AST_SOFTHANGUP_EXPLICIT);
00424    ast_data_add_bool(data_softhangup, "unbridge", chan->_softhangup & AST_SOFTHANGUP_UNBRIDGE);
00425 
00426    /* channel flags */
00427    data_flags = ast_data_add_node(tree, "flags");
00428    if (!data_flags) {
00429       return -1;
00430    }
00431    channel_data_add_flags(data_flags, chan);
00432 
00433    ast_data_add_uint(tree, "timetohangup", chan->whentohangup.tv_sec);
00434 
00435 #if 0 /* XXX AstData: ast_callerid no longer exists. (Equivalent code not readily apparent.) */
00436    /* callerid */
00437    data_callerid = ast_data_add_node(tree, "callerid");
00438    if (!data_callerid) {
00439       return -1;
00440    }
00441    ast_data_add_structure(ast_callerid, data_callerid, &(chan->cid));
00442    /* insert the callerid ton */
00443    enum_node = ast_data_add_node(data_callerid, "cid_ton");
00444    if (!enum_node) {
00445       return -1;
00446    }
00447    ast_data_add_int(enum_node, "value", chan->cid.cid_ton);
00448    snprintf(value_str, sizeof(value_str), "TON: %s/Plan: %s",
00449       party_number_ton2str(chan->cid.cid_ton),
00450       party_number_plan2str(chan->cid.cid_ton));
00451    ast_data_add_str(enum_node, "text", value_str);
00452 #endif
00453 
00454    /* tone zone */
00455    if (chan->zone) {
00456       data_zones = ast_data_add_node(tree, "zone");
00457       if (!data_zones) {
00458          return -1;
00459       }
00460       ast_tone_zone_data_add_structure(data_zones, chan->zone);
00461    }
00462 
00463    /* insert cdr */
00464    data_cdr = ast_data_add_node(tree, "cdr");
00465    if (!data_cdr) {
00466       return -1;
00467    }
00468 
00469    ast_cdr_data_add_structure(data_cdr, chan->cdr, 1);
00470 
00471    return 0;
00472 }
00473 
00474 int ast_channel_data_cmp_structure(const struct ast_data_search *tree,
00475    struct ast_channel *chan, const char *structure_name)
00476 {
00477    return ast_data_search_cmp_structure(tree, ast_channel, chan, structure_name);
00478 }
00479 
00480 /*! \brief Show channel types - CLI command */
00481 static char *handle_cli_core_show_channeltypes(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
00482 {
00483 #define FORMAT  "%-10.10s  %-40.40s %-12.12s %-12.12s %-12.12s\n"
00484    struct chanlist *cl;
00485    int count_chan = 0;
00486 
00487    switch (cmd) {
00488    case CLI_INIT:
00489       e->command = "core show channeltypes";
00490       e->usage =
00491          "Usage: core show channeltypes\n"
00492          "       Lists available channel types registered in your\n"
00493          "       Asterisk server.\n";
00494       return NULL;
00495    case CLI_GENERATE:
00496       return NULL;
00497    }
00498 
00499    if (a->argc != 3)
00500       return CLI_SHOWUSAGE;
00501 
00502    ast_cli(a->fd, FORMAT, "Type", "Description",       "Devicestate", "Indications", "Transfer");
00503    ast_cli(a->fd, FORMAT, "----------", "-----------", "-----------", "-----------", "--------");
00504 
00505    AST_RWLIST_RDLOCK(&backends);
00506    AST_RWLIST_TRAVERSE(&backends, cl, list) {
00507       ast_cli(a->fd, FORMAT, cl->tech->type, cl->tech->description,
00508          (cl->tech->devicestate) ? "yes" : "no",
00509          (cl->tech->indicate) ? "yes" : "no",
00510          (cl->tech->transfer) ? "yes" : "no");
00511       count_chan++;
00512    }
00513    AST_RWLIST_UNLOCK(&backends);
00514 
00515    ast_cli(a->fd, "----------\n%d channel drivers registered.\n", count_chan);
00516 
00517    return CLI_SUCCESS;
00518 
00519 #undef FORMAT
00520 }
00521 
00522 static char *complete_channeltypes(struct ast_cli_args *a)
00523 {
00524    struct chanlist *cl;
00525    int which = 0;
00526    int wordlen;
00527    char *ret = NULL;
00528 
00529    if (a->pos != 3)
00530       return NULL;
00531 
00532    wordlen = strlen(a->word);
00533 
00534    AST_RWLIST_RDLOCK(&backends);
00535    AST_RWLIST_TRAVERSE(&backends, cl, list) {
00536       if (!strncasecmp(a->word, cl->tech->type, wordlen) && ++which > a->n) {
00537          ret = ast_strdup(cl->tech->type);
00538          break;
00539       }
00540    }
00541    AST_RWLIST_UNLOCK(&backends);
00542    
00543    return ret;
00544 }
00545 
00546 /*! \brief Show details about a channel driver - CLI command */
00547 static char *handle_cli_core_show_channeltype(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
00548 {
00549    struct chanlist *cl = NULL;
00550    char buf[512];
00551 
00552    switch (cmd) {
00553    case CLI_INIT:
00554       e->command = "core show channeltype";
00555       e->usage =
00556          "Usage: core show channeltype <name>\n"
00557          "  Show details about the specified channel type, <name>.\n";
00558       return NULL;
00559    case CLI_GENERATE:
00560       return complete_channeltypes(a);
00561    }
00562 
00563    if (a->argc != 4)
00564       return CLI_SHOWUSAGE;
00565    
00566    AST_RWLIST_RDLOCK(&backends);
00567 
00568    AST_RWLIST_TRAVERSE(&backends, cl, list) {
00569       if (!strncasecmp(cl->tech->type, a->argv[3], strlen(cl->tech->type)))
00570          break;
00571    }
00572 
00573 
00574    if (!cl) {
00575       ast_cli(a->fd, "\n%s is not a registered channel driver.\n", a->argv[3]);
00576       AST_RWLIST_UNLOCK(&backends);
00577       return CLI_FAILURE;
00578    }
00579 
00580    ast_cli(a->fd,
00581       "-- Info about channel driver: %s --\n"
00582       "  Device State: %s\n"
00583       "    Indication: %s\n"
00584       "     Transfer : %s\n"
00585       "  Capabilities: %s\n"
00586       "   Digit Begin: %s\n"
00587       "     Digit End: %s\n"
00588       "    Send HTML : %s\n"
00589       " Image Support: %s\n"
00590       "  Text Support: %s\n",
00591       cl->tech->type,
00592       (cl->tech->devicestate) ? "yes" : "no",
00593       (cl->tech->indicate) ? "yes" : "no",
00594       (cl->tech->transfer) ? "yes" : "no",
00595       ast_getformatname_multiple(buf, sizeof(buf), (cl->tech->capabilities) ? cl->tech->capabilities : -1),
00596       (cl->tech->send_digit_begin) ? "yes" : "no",
00597       (cl->tech->send_digit_end) ? "yes" : "no",
00598       (cl->tech->send_html) ? "yes" : "no",
00599       (cl->tech->send_image) ? "yes" : "no",
00600       (cl->tech->send_text) ? "yes" : "no"
00601       
00602    );
00603 
00604    AST_RWLIST_UNLOCK(&backends);
00605 
00606    return CLI_SUCCESS;
00607 }
00608 
00609 static struct ast_cli_entry cli_channel[] = {
00610    AST_CLI_DEFINE(handle_cli_core_show_channeltypes, "List available channel types"),
00611    AST_CLI_DEFINE(handle_cli_core_show_channeltype,  "Give more details on that channel type")
00612 };
00613 
00614 static struct ast_frame *kill_read(struct ast_channel *chan)
00615 {
00616    /* Hangup channel. */
00617    return NULL;
00618 }
00619 
00620 static struct ast_frame *kill_exception(struct ast_channel *chan)
00621 {
00622    /* Hangup channel. */
00623    return NULL;
00624 }
00625 
00626 static int kill_write(struct ast_channel *chan, struct ast_frame *frame)
00627 {
00628    /* Hangup channel. */
00629    return -1;
00630 }
00631 
00632 static int kill_fixup(struct ast_channel *oldchan, struct ast_channel *newchan)
00633 {
00634    /* No problem fixing up the channel. */
00635    return 0;
00636 }
00637 
00638 static int kill_hangup(struct ast_channel *chan)
00639 {
00640    chan->tech_pvt = NULL;
00641    return 0;
00642 }
00643 
00644 /*!
00645  * \brief Kill the channel channel driver technology descriptor.
00646  *
00647  * \details
00648  * The purpose of this channel technology is to encourage the
00649  * channel to hangup as quickly as possible.
00650  *
00651  * \note Used by DTMF atxfer and zombie channels.
00652  */
00653 const struct ast_channel_tech ast_kill_tech = {
00654    .type = "Kill",
00655    .description = "Kill channel (should not see this)",
00656    .capabilities = -1,
00657    .read = kill_read,
00658    .exception = kill_exception,
00659    .write = kill_write,
00660    .fixup = kill_fixup,
00661    .hangup = kill_hangup,
00662 };
00663 
00664 #ifdef CHANNEL_TRACE
00665 /*! \brief Destructor for the channel trace datastore */
00666 static void ast_chan_trace_destroy_cb(void *data)
00667 {
00668    struct ast_chan_trace *trace;
00669    struct ast_chan_trace_data *traced = data;
00670    while ((trace = AST_LIST_REMOVE_HEAD(&traced->trace, entry))) {
00671       ast_free(trace);
00672    }
00673    ast_free(traced);
00674 }
00675 
00676 /*! \brief Datastore to put the linked list of ast_chan_trace and trace status */
00677 static const struct ast_datastore_info ast_chan_trace_datastore_info = {
00678    .type = "ChanTrace",
00679    .destroy = ast_chan_trace_destroy_cb
00680 };
00681 
00682 /*! \brief Put the channel backtrace in a string */
00683 int ast_channel_trace_serialize(struct ast_channel *chan, struct ast_str **buf)
00684 {
00685    int total = 0;
00686    struct ast_chan_trace *trace;
00687    struct ast_chan_trace_data *traced;
00688    struct ast_datastore *store;
00689 
00690    ast_channel_lock(chan);
00691    store = ast_channel_datastore_find(chan, &ast_chan_trace_datastore_info, NULL);
00692    if (!store) {
00693       ast_channel_unlock(chan);
00694       return total;
00695    }
00696    traced = store->data;
00697    ast_str_reset(*buf);
00698    AST_LIST_TRAVERSE(&traced->trace, trace, entry) {
00699       if (ast_str_append(buf, 0, "[%d] => %s, %s, %d\n", total, trace->context, trace->exten, trace->priority) < 0) {
00700          ast_log(LOG_ERROR, "Data Buffer Size Exceeded!\n");
00701          total = -1;
00702          break;
00703       }
00704       total++;
00705    }
00706    ast_channel_unlock(chan);
00707    return total;
00708 }
00709 
00710 /* !\brief Whether or not context tracing is enabled */
00711 int ast_channel_trace_is_enabled(struct ast_channel *chan)
00712 {
00713    struct ast_datastore *store = ast_channel_datastore_find(chan, &ast_chan_trace_datastore_info, NULL);
00714    if (!store)
00715       return 0;
00716    return ((struct ast_chan_trace_data *)store->data)->enabled;
00717 }
00718 
00719 /*! \brief Update the context backtrace data if tracing is enabled */
00720 static int ast_channel_trace_data_update(struct ast_channel *chan, struct ast_chan_trace_data *traced)
00721 {
00722    struct ast_chan_trace *trace;
00723    if (!traced->enabled)
00724       return 0;
00725    /* If the last saved context does not match the current one
00726       OR we have not saved any context so far, then save the current context */
00727    if ((!AST_LIST_EMPTY(&traced->trace) && strcasecmp(AST_LIST_FIRST(&traced->trace)->context, chan->context)) || 
00728        (AST_LIST_EMPTY(&traced->trace))) {
00729       /* Just do some debug logging */
00730       if (AST_LIST_EMPTY(&traced->trace))
00731          ast_log(LOG_DEBUG, "Setting initial trace context to %s\n", chan->context);
00732       else
00733          ast_log(LOG_DEBUG, "Changing trace context from %s to %s\n", AST_LIST_FIRST(&traced->trace)->context, chan->context);
00734       /* alloc or bail out */
00735       trace = ast_malloc(sizeof(*trace));
00736       if (!trace) 
00737          return -1;
00738       /* save the current location and store it in the trace list */
00739       ast_copy_string(trace->context, chan->context, sizeof(trace->context));
00740       ast_copy_string(trace->exten, chan->exten, sizeof(trace->exten));
00741       trace->priority = chan->priority;
00742       AST_LIST_INSERT_HEAD(&traced->trace, trace, entry);
00743    }
00744    return 0;
00745 }
00746 
00747 /*! \brief Update the context backtrace if tracing is enabled */
00748 int ast_channel_trace_update(struct ast_channel *chan)
00749 {
00750    struct ast_datastore *store = ast_channel_datastore_find(chan, &ast_chan_trace_datastore_info, NULL);
00751    if (!store)
00752       return 0;
00753    return ast_channel_trace_data_update(chan, store->data);
00754 }
00755 
00756 /*! \brief Enable context tracing in the channel */
00757 int ast_channel_trace_enable(struct ast_channel *chan)
00758 {
00759    struct ast_datastore *store = ast_channel_datastore_find(chan, &ast_chan_trace_datastore_info, NULL);
00760    struct ast_chan_trace_data *traced;
00761    if (!store) {
00762       store = ast_datastore_alloc(&ast_chan_trace_datastore_info, "ChanTrace");
00763       if (!store) 
00764          return -1;
00765       traced = ast_calloc(1, sizeof(*traced));
00766       if (!traced) {
00767          ast_datastore_free(store);
00768          return -1;
00769       }  
00770       store->data = traced;
00771       AST_LIST_HEAD_INIT_NOLOCK(&traced->trace);
00772       ast_channel_datastore_add(chan, store);
00773    }  
00774    ((struct ast_chan_trace_data *)store->data)->enabled = 1;
00775    ast_channel_trace_data_update(chan, store->data);
00776    return 0;
00777 }
00778 
00779 /*! \brief Disable context tracing in the channel */
00780 int ast_channel_trace_disable(struct ast_channel *chan)
00781 {
00782    struct ast_datastore *store = ast_channel_datastore_find(chan, &ast_chan_trace_datastore_info, NULL);
00783    if (!store)
00784       return 0;
00785    ((struct ast_chan_trace_data *)store->data)->enabled = 0;
00786    return 0;
00787 }
00788 #endif /* CHANNEL_TRACE */
00789 
00790 /*! \brief Checks to see if a channel is needing hang up */
00791 int ast_check_hangup(struct ast_channel *chan)
00792 {
00793    if (chan->_softhangup)     /* yes if soft hangup flag set */
00794       return 1;
00795    if (ast_tvzero(chan->whentohangup)) /* no if no hangup scheduled */
00796       return 0;
00797    if (ast_tvdiff_ms(chan->whentohangup, ast_tvnow()) > 0)  /* no if hangup time has not come yet. */
00798       return 0;
00799    ast_debug(4, "Hangup time has come: %" PRIi64 "\n", ast_tvdiff_ms(chan->whentohangup, ast_tvnow()));
00800    chan->_softhangup |= AST_SOFTHANGUP_TIMEOUT; /* record event */
00801    return 1;
00802 }
00803 
00804 int ast_check_hangup_locked(struct ast_channel *chan)
00805 {
00806    int res;
00807    ast_channel_lock(chan);
00808    res = ast_check_hangup(chan);
00809    ast_channel_unlock(chan);
00810    return res;
00811 }
00812 
00813 static int ast_channel_softhangup_cb(void *obj, void *arg, int flags)
00814 {
00815    struct ast_channel *chan = obj;
00816 
00817    ast_softhangup(chan, AST_SOFTHANGUP_SHUTDOWN);
00818 
00819    return 0;
00820 }
00821 
00822 void ast_begin_shutdown(int hangup)
00823 {
00824    shutting_down = 1;
00825 
00826    if (hangup) {
00827       ao2_callback(channels, OBJ_NODATA | OBJ_MULTIPLE, ast_channel_softhangup_cb, NULL);
00828    }
00829 }
00830 
00831 /*! \brief returns number of active/allocated channels */
00832 int ast_active_channels(void)
00833 {
00834    return channels ? ao2_container_count(channels) : 0;
00835 }
00836 
00837 /*! \brief Cancel a shutdown in progress */
00838 void ast_cancel_shutdown(void)
00839 {
00840    shutting_down = 0;
00841 }
00842 
00843 /*! \brief Returns non-zero if Asterisk is being shut down */
00844 int ast_shutting_down(void)
00845 {
00846    return shutting_down;
00847 }
00848 
00849 /*! \brief Set when to hangup channel */
00850 void ast_channel_setwhentohangup_tv(struct ast_channel *chan, struct timeval offset)
00851 {
00852    chan->whentohangup = ast_tvzero(offset) ? offset : ast_tvadd(offset, ast_tvnow());
00853    ast_queue_frame(chan, &ast_null_frame);
00854    return;
00855 }
00856 
00857 void ast_channel_setwhentohangup(struct ast_channel *chan, time_t offset)
00858 {
00859    struct timeval when = { offset, };
00860    ast_channel_setwhentohangup_tv(chan, when);
00861 }
00862 
00863 /*! \brief Compare a offset with when to hangup channel */
00864 int ast_channel_cmpwhentohangup_tv(struct ast_channel *chan, struct timeval offset)
00865 {
00866    struct timeval whentohangup;
00867 
00868    if (ast_tvzero(chan->whentohangup))
00869       return ast_tvzero(offset) ? 0 : -1;
00870 
00871    if (ast_tvzero(offset))
00872       return 1;
00873 
00874    whentohangup = ast_tvadd(offset, ast_tvnow());
00875 
00876    return ast_tvdiff_ms(whentohangup, chan->whentohangup);
00877 }
00878 
00879 int ast_channel_cmpwhentohangup(struct ast_channel *chan, time_t offset)
00880 {
00881    struct timeval when = { offset, };
00882    return ast_channel_cmpwhentohangup_tv(chan, when);
00883 }
00884 
00885 /*! \brief Register a new telephony channel in Asterisk */
00886 int ast_channel_register(const struct ast_channel_tech *tech)
00887 {
00888    struct chanlist *chan;
00889 
00890    AST_RWLIST_WRLOCK(&backends);
00891 
00892    AST_RWLIST_TRAVERSE(&backends, chan, list) {
00893       if (!strcasecmp(tech->type, chan->tech->type)) {
00894          ast_log(LOG_WARNING, "Already have a handler for type '%s'\n", tech->type);
00895          AST_RWLIST_UNLOCK(&backends);
00896          return -1;
00897       }
00898    }
00899    
00900    if (!(chan = ast_calloc(1, sizeof(*chan)))) {
00901       AST_RWLIST_UNLOCK(&backends);
00902       return -1;
00903    }
00904    chan->tech = tech;
00905    AST_RWLIST_INSERT_HEAD(&backends, chan, list);
00906 
00907    ast_debug(1, "Registered handler for '%s' (%s)\n", chan->tech->type, chan->tech->description);
00908 
00909    ast_verb(2, "Registered channel type '%s' (%s)\n", chan->tech->type, chan->tech->description);
00910 
00911    AST_RWLIST_UNLOCK(&backends);
00912 
00913    return 0;
00914 }
00915 
00916 /*! \brief Unregister channel driver */
00917 void ast_channel_unregister(const struct ast_channel_tech *tech)
00918 {
00919    struct chanlist *chan;
00920 
00921    ast_debug(1, "Unregistering channel type '%s'\n", tech->type);
00922 
00923    AST_RWLIST_WRLOCK(&backends);
00924 
00925    AST_RWLIST_TRAVERSE_SAFE_BEGIN(&backends, chan, list) {
00926       if (chan->tech == tech) {
00927          AST_LIST_REMOVE_CURRENT(list);
00928          ast_free(chan);
00929          ast_verb(2, "Unregistered channel type '%s'\n", tech->type);
00930          break;   
00931       }
00932    }
00933    AST_LIST_TRAVERSE_SAFE_END;
00934 
00935    AST_RWLIST_UNLOCK(&backends);
00936 }
00937 
00938 /*! \brief Get handle to channel driver based on name */
00939 const struct ast_channel_tech *ast_get_channel_tech(const char *name)
00940 {
00941    struct chanlist *chanls;
00942    const struct ast_channel_tech *ret = NULL;
00943 
00944    AST_RWLIST_RDLOCK(&backends);
00945 
00946    AST_RWLIST_TRAVERSE(&backends, chanls, list) {
00947       if (!strcasecmp(name, chanls->tech->type)) {
00948          ret = chanls->tech;
00949          break;
00950       }
00951    }
00952 
00953    AST_RWLIST_UNLOCK(&backends);
00954    
00955    return ret;
00956 }
00957 
00958 /*! \brief Gives the string form of a given hangup cause */
00959 const char *ast_cause2str(int cause)
00960 {
00961    int x;
00962 
00963    for (x = 0; x < ARRAY_LEN(causes); x++) {
00964       if (causes[x].cause == cause)
00965          return causes[x].desc;
00966    }
00967 
00968    return "Unknown";
00969 }
00970 
00971 /*! \brief Convert a symbolic hangup cause to number */
00972 int ast_str2cause(const char *name)
00973 {
00974    int x;
00975 
00976    for (x = 0; x < ARRAY_LEN(causes); x++)
00977       if (!strncasecmp(causes[x].name, name, strlen(causes[x].name)))
00978          return causes[x].cause;
00979 
00980    return -1;
00981 }
00982 
00983 /*! \brief Gives the string form of a given channel state.
00984    \note This function is not reentrant.
00985  */
00986 const char *ast_state2str(enum ast_channel_state state)
00987 {
00988    char *buf;
00989 
00990    switch (state) {
00991    case AST_STATE_DOWN:
00992       return "Down";
00993    case AST_STATE_RESERVED:
00994       return "Rsrvd";
00995    case AST_STATE_OFFHOOK:
00996       return "OffHook";
00997    case AST_STATE_DIALING:
00998       return "Dialing";
00999    case AST_STATE_RING:
01000       return "Ring";
01001    case AST_STATE_RINGING:
01002       return "Ringing";
01003    case AST_STATE_UP:
01004       return "Up";
01005    case AST_STATE_BUSY:
01006       return "Busy";
01007    case AST_STATE_DIALING_OFFHOOK:
01008       return "Dialing Offhook";
01009    case AST_STATE_PRERING:
01010       return "Pre-ring";
01011    default:
01012       if (!(buf = ast_threadstorage_get(&state2str_threadbuf, STATE2STR_BUFSIZE)))
01013          return "Unknown";
01014       snprintf(buf, STATE2STR_BUFSIZE, "Unknown (%d)", state);
01015       return buf;
01016    }
01017 }
01018 
01019 /*! \brief Gives the string form of a given transfer capability */
01020 char *ast_transfercapability2str(int transfercapability)
01021 {
01022    switch (transfercapability) {
01023    case AST_TRANS_CAP_SPEECH:
01024       return "SPEECH";
01025    case AST_TRANS_CAP_DIGITAL:
01026       return "DIGITAL";
01027    case AST_TRANS_CAP_RESTRICTED_DIGITAL:
01028       return "RESTRICTED_DIGITAL";
01029    case AST_TRANS_CAP_3_1K_AUDIO:
01030       return "3K1AUDIO";
01031    case AST_TRANS_CAP_DIGITAL_W_TONES:
01032       return "DIGITAL_W_TONES";
01033    case AST_TRANS_CAP_VIDEO:
01034       return "VIDEO";
01035    default:
01036       return "UNKNOWN";
01037    }
01038 }
01039 
01040 /*! \brief Pick the best audio codec */
01041 format_t ast_best_codec(format_t fmts)
01042 {
01043    /* This just our opinion, expressed in code.  We are asked to choose
01044       the best codec to use, given no information */
01045    int x;
01046    static const format_t prefs[] =
01047    {
01048       /*! Okay, ulaw is used by all telephony equipment, so start with it */
01049       AST_FORMAT_ULAW,
01050       /*! Unless of course, you're a silly European, so then prefer ALAW */
01051       AST_FORMAT_ALAW,
01052       AST_FORMAT_G719,
01053       AST_FORMAT_SIREN14,
01054       AST_FORMAT_SIREN7,
01055       AST_FORMAT_TESTLAW,
01056       /*! G.722 is better then all below, but not as common as the above... so give ulaw and alaw priority */
01057       AST_FORMAT_G722,
01058       /*! Okay, well, signed linear is easy to translate into other stuff */
01059       AST_FORMAT_SLINEAR16,
01060       AST_FORMAT_SLINEAR,
01061       /*! G.726 is standard ADPCM, in RFC3551 packing order */
01062       AST_FORMAT_G726,
01063       /*! G.726 is standard ADPCM, in AAL2 packing order */
01064       AST_FORMAT_G726_AAL2,
01065       /*! ADPCM has great sound quality and is still pretty easy to translate */
01066       AST_FORMAT_ADPCM,
01067       /*! Okay, we're down to vocoders now, so pick GSM because it's small and easier to
01068           translate and sounds pretty good */
01069       AST_FORMAT_GSM,
01070       /*! iLBC is not too bad */
01071       AST_FORMAT_ILBC,
01072       /*! Speex is free, but computationally more expensive than GSM */
01073       AST_FORMAT_SPEEX16,
01074       AST_FORMAT_SPEEX,
01075       /*! Ick, LPC10 sounds terrible, but at least we have code for it, if you're tacky enough
01076           to use it */
01077       AST_FORMAT_LPC10,
01078       /*! G.729a is faster than 723 and slightly less expensive */
01079       AST_FORMAT_G729A,
01080       /*! Down to G.723.1 which is proprietary but at least designed for voice */
01081       AST_FORMAT_G723_1,
01082    };
01083    char buf[512];
01084 
01085    /* Strip out video */
01086    fmts &= AST_FORMAT_AUDIO_MASK;
01087    
01088    /* Find the first preferred codec in the format given */
01089    for (x = 0; x < ARRAY_LEN(prefs); x++) {
01090       if (fmts & prefs[x])
01091          return prefs[x];
01092    }
01093 
01094    ast_log(LOG_WARNING, "Don't know any of %s formats\n", ast_getformatname_multiple(buf, sizeof(buf), fmts));
01095 
01096    return 0;
01097 }
01098 
01099 static const struct ast_channel_tech null_tech = {
01100    .type = "NULL",
01101    .description = "Null channel (should not see this)",
01102 };
01103 
01104 static void ast_channel_destructor(void *obj);
01105 static void ast_dummy_channel_destructor(void *obj);
01106 
01107 /*! \brief Create a new channel structure */
01108 static struct ast_channel * attribute_malloc __attribute__((format(printf, 13, 0)))
01109 __ast_channel_alloc_ap(int needqueue, int state, const char *cid_num, const char *cid_name,
01110              const char *acctcode, const char *exten, const char *context,
01111              const char *linkedid, const int amaflag, const char *file, int line,
01112              const char *function, const char *name_fmt, va_list ap1, va_list ap2)
01113 {
01114    struct ast_channel *tmp;
01115    int x;
01116    int flags;
01117    struct varshead *headp;
01118    char *tech = "", *tech2 = NULL;
01119 
01120    /* If shutting down, don't allocate any new channels */
01121    if (shutting_down) {
01122       ast_log(LOG_WARNING, "Channel allocation failed: Refusing due to active shutdown\n");
01123       return NULL;
01124    }
01125 
01126 #if defined(REF_DEBUG)
01127    tmp = __ao2_alloc_debug(sizeof(*tmp), ast_channel_destructor, "", file, line,
01128       function, 1);
01129 #elif defined(__AST_DEBUG_MALLOC)
01130    tmp = __ao2_alloc_debug(sizeof(*tmp), ast_channel_destructor, "", file, line,
01131       function, 0);
01132 #else
01133    tmp = ao2_alloc(sizeof(*tmp), ast_channel_destructor);
01134 #endif
01135    if (!tmp) {
01136       /* Channel structure allocation failure. */
01137       return NULL;
01138    }
01139 
01140    /*
01141     * Init file descriptors to unopened state so
01142     * the destructor can know not to close them.
01143     */
01144    tmp->timingfd = -1;
01145    for (x = 0; x < ARRAY_LEN(tmp->alertpipe); ++x) {
01146       tmp->alertpipe[x] = -1;
01147    }
01148    for (x = 0; x < ARRAY_LEN(tmp->fds); ++x) {
01149       tmp->fds[x] = -1;
01150    }
01151 #ifdef HAVE_EPOLL
01152    tmp->epfd = epoll_create(25);
01153 #endif
01154 
01155    if (!(tmp->sched = sched_context_create())) {
01156       ast_log(LOG_WARNING, "Channel allocation failed: Unable to create schedule context\n");
01157       return ast_channel_unref(tmp);
01158    }
01159    
01160    ast_party_dialed_init(&tmp->dialed);
01161    ast_party_caller_init(&tmp->caller);
01162    ast_party_connected_line_init(&tmp->connected);
01163    ast_party_redirecting_init(&tmp->redirecting);
01164 
01165    if (cid_name) {
01166       tmp->caller.id.name.valid = 1;
01167       tmp->caller.id.name.str = ast_strdup(cid_name);
01168       if (!tmp->caller.id.name.str) {
01169          return ast_channel_unref(tmp);
01170       }
01171    }
01172    if (cid_num) {
01173       tmp->caller.id.number.valid = 1;
01174       tmp->caller.id.number.str = ast_strdup(cid_num);
01175       if (!tmp->caller.id.number.str) {
01176          return ast_channel_unref(tmp);
01177       }
01178    }
01179 
01180    if ((tmp->timer = ast_timer_open())) {
01181       if (strcmp(ast_timer_get_name(tmp->timer), "timerfd")) {
01182          needqueue = 0;
01183       }
01184       tmp->timingfd = ast_timer_fd(tmp->timer);
01185    }
01186 
01187    if (needqueue) {
01188       if (pipe(tmp->alertpipe)) {
01189          ast_log(LOG_WARNING, "Channel allocation failed: Can't create alert pipe! Try increasing max file descriptors with ulimit -n\n");
01190          return ast_channel_unref(tmp);
01191       } else {
01192          flags = fcntl(tmp->alertpipe[0], F_GETFL);
01193          if (fcntl(tmp->alertpipe[0], F_SETFL, flags | O_NONBLOCK) < 0) {
01194             ast_log(LOG_WARNING, "Channel allocation failed: Unable to set alertpipe nonblocking! (%d: %s)\n", errno, strerror(errno));
01195             return ast_channel_unref(tmp);
01196          }
01197          flags = fcntl(tmp->alertpipe[1], F_GETFL);
01198          if (fcntl(tmp->alertpipe[1], F_SETFL, flags | O_NONBLOCK) < 0) {
01199             ast_log(LOG_WARNING, "Channel allocation failed: Unable to set alertpipe nonblocking! (%d: %s)\n", errno, strerror(errno));
01200             return ast_channel_unref(tmp);
01201          }
01202       }
01203    }
01204 
01205    /*
01206     * This is the last place the channel constructor can fail.
01207     *
01208     * The destructor takes advantage of this fact to ensure that the
01209     * AST_CEL_CHANNEL_END is not posted if we have not posted the
01210     * AST_CEL_CHANNEL_START yet.
01211     */
01212    if ((ast_string_field_init(tmp, 128))) {
01213       return ast_channel_unref(tmp);
01214    }
01215 
01216    /* Always watch the alertpipe */
01217    ast_channel_set_fd(tmp, AST_ALERT_FD, tmp->alertpipe[0]);
01218    /* And timing pipe */
01219    ast_channel_set_fd(tmp, AST_TIMING_FD, tmp->timingfd);
01220 
01221    /* Initial state */
01222    tmp->_state = state;
01223 
01224    tmp->streamid = -1;
01225    
01226    tmp->fin = global_fin;
01227    tmp->fout = global_fout;
01228 
01229    if (ast_strlen_zero(ast_config_AST_SYSTEM_NAME)) {
01230       ast_string_field_build(tmp, uniqueid, "%li.%d", (long) time(NULL), 
01231          ast_atomic_fetchadd_int(&uniqueint, 1));
01232    } else {
01233       ast_string_field_build(tmp, uniqueid, "%s-%li.%d", ast_config_AST_SYSTEM_NAME, 
01234          (long) time(NULL), ast_atomic_fetchadd_int(&uniqueint, 1));
01235    }
01236 
01237    if (!ast_strlen_zero(linkedid)) {
01238       ast_string_field_set(tmp, linkedid, linkedid);
01239    } else {
01240       ast_string_field_set(tmp, linkedid, tmp->uniqueid);
01241    }
01242 
01243    if (!ast_strlen_zero(name_fmt)) {
01244       char *slash, *slash2;
01245       /* Almost every channel is calling this function, and setting the name via the ast_string_field_build() call.
01246        * And they all use slightly different formats for their name string.
01247        * This means, to set the name here, we have to accept variable args, and call the string_field_build from here.
01248        * This means, that the stringfields must have a routine that takes the va_lists directly, and 
01249        * uses them to build the string, instead of forming the va_lists internally from the vararg ... list.
01250        * This new function was written so this can be accomplished.
01251        */
01252       ast_string_field_build_va(tmp, name, name_fmt, ap1, ap2);
01253       tech = ast_strdupa(tmp->name);
01254       if ((slash = strchr(tech, '/'))) {
01255          if ((slash2 = strchr(slash + 1, '/'))) {
01256             tech2 = slash + 1;
01257             *slash2 = '\0';
01258          }
01259          *slash = '\0';
01260       }
01261    } else {
01262       /*
01263        * Start the string with '-' so it becomes an empty string
01264        * in the destructor.
01265        */
01266       ast_string_field_set(tmp, name, "-**Unknown**");
01267    }
01268 
01269    /* Reminder for the future: under what conditions do we NOT want to track cdrs on channels? */
01270 
01271    /* These 4 variables need to be set up for the cdr_init() to work right */
01272    if (amaflag)
01273       tmp->amaflags = amaflag;
01274    else
01275       tmp->amaflags = ast_default_amaflags;
01276    
01277    if (!ast_strlen_zero(acctcode))
01278       ast_string_field_set(tmp, accountcode, acctcode);
01279    else
01280       ast_string_field_set(tmp, accountcode, ast_default_accountcode);
01281       
01282    if (!ast_strlen_zero(context))
01283       ast_copy_string(tmp->context, context, sizeof(tmp->context));
01284    else
01285       strcpy(tmp->context, "default");
01286 
01287    if (!ast_strlen_zero(exten))
01288       ast_copy_string(tmp->exten, exten, sizeof(tmp->exten));
01289    else
01290       strcpy(tmp->exten, "s");
01291 
01292    tmp->priority = 1;
01293 
01294    tmp->cdr = ast_cdr_alloc();
01295    ast_cdr_init(tmp->cdr, tmp);
01296    ast_cdr_start(tmp->cdr);
01297 
01298    ast_cel_report_event(tmp, AST_CEL_CHANNEL_START, NULL, NULL, NULL);
01299 
01300    headp = &tmp->varshead;
01301    AST_LIST_HEAD_INIT_NOLOCK(headp);
01302    
01303    AST_LIST_HEAD_INIT_NOLOCK(&tmp->datastores);
01304 
01305    AST_LIST_HEAD_INIT_NOLOCK(&tmp->autochans);
01306    
01307    ast_string_field_set(tmp, language, defaultlanguage);
01308 
01309    tmp->tech = &null_tech;
01310 
01311    ao2_link(channels, tmp);
01312 
01313    /*
01314     * And now, since the channel structure is built, and has its name, let's
01315     * call the manager event generator with this Newchannel event. This is the
01316     * proper and correct place to make this call, but you sure do have to pass
01317     * a lot of data into this func to do it here!
01318     */
01319    if (ast_get_channel_tech(tech) || (tech2 && ast_get_channel_tech(tech2))) {
01320       ast_manager_event(tmp, EVENT_FLAG_CALL, "Newchannel",
01321          "Channel: %s\r\n"
01322          "ChannelState: %d\r\n"
01323          "ChannelStateDesc: %s\r\n"
01324          "CallerIDNum: %s\r\n"
01325          "CallerIDName: %s\r\n"
01326          "AccountCode: %s\r\n"
01327          "Exten: %s\r\n"
01328          "Context: %s\r\n"
01329          "Uniqueid: %s\r\n",
01330          tmp->name, 
01331          state, 
01332          ast_state2str(state),
01333          S_OR(cid_num, ""),
01334          S_OR(cid_name, ""),
01335          tmp->accountcode,
01336          S_OR(exten, ""),
01337          S_OR(context, ""),
01338          tmp->uniqueid);
01339    }
01340 
01341    return tmp;
01342 }
01343 
01344 struct ast_channel *__ast_channel_alloc(int needqueue, int state, const char *cid_num,
01345                const char *cid_name, const char *acctcode,
01346                const char *exten, const char *context,
01347                const char *linkedid, const int amaflag,
01348                const char *file, int line, const char *function,
01349                const char *name_fmt, ...)
01350 {
01351    va_list ap1, ap2;
01352    struct ast_channel *result;
01353 
01354    va_start(ap1, name_fmt);
01355    va_start(ap2, name_fmt);
01356    result = __ast_channel_alloc_ap(needqueue, state, cid_num, cid_name, acctcode, exten, context,
01357                linkedid, amaflag, file, line, function, name_fmt, ap1, ap2);
01358    va_end(ap1);
01359    va_end(ap2);
01360 
01361    return result;
01362 }
01363 
01364 /* only do the minimum amount of work needed here to make a channel
01365  * structure that can be used to expand channel vars */
01366 #if defined(REF_DEBUG) || defined(__AST_DEBUG_MALLOC)
01367 struct ast_channel *__ast_dummy_channel_alloc(const char *file, int line, const char *function)
01368 #else
01369 struct ast_channel *ast_dummy_channel_alloc(void)
01370 #endif
01371 {
01372    struct ast_channel *tmp;
01373    struct varshead *headp;
01374 
01375 #if defined(REF_DEBUG)
01376    tmp = __ao2_alloc_debug(sizeof(*tmp), ast_dummy_channel_destructor, "dummy channel",
01377       file, line, function, 1);
01378 #elif defined(__AST_DEBUG_MALLOC)
01379    tmp = __ao2_alloc_debug(sizeof(*tmp), ast_dummy_channel_destructor, "dummy channel",
01380       file, line, function, 0);
01381 #else
01382    tmp = ao2_alloc(sizeof(*tmp), ast_dummy_channel_destructor);
01383 #endif
01384    if (!tmp) {
01385       /* Dummy channel structure allocation failure. */
01386       return NULL;
01387    }
01388 
01389    if ((ast_string_field_init(tmp, 128))) {
01390       return ast_channel_unref(tmp);
01391    }
01392 
01393    headp = &tmp->varshead;
01394    AST_LIST_HEAD_INIT_NOLOCK(headp);
01395 
01396    return tmp;
01397 }
01398 
01399 static int __ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin, int head, struct ast_frame *after)
01400 {
01401    struct ast_frame *f;
01402    struct ast_frame *cur;
01403    unsigned int new_frames = 0;
01404    unsigned int new_voice_frames = 0;
01405    unsigned int queued_frames = 0;
01406    unsigned int queued_voice_frames = 0;
01407    AST_LIST_HEAD_NOLOCK(, ast_frame) frames;
01408 
01409    ast_channel_lock(chan);
01410 
01411    /*
01412     * Check the last frame on the queue if we are queuing the new
01413     * frames after it.
01414     */
01415    cur = AST_LIST_LAST(&chan->readq);
01416    if (cur && cur->frametype == AST_FRAME_CONTROL && !head && (!after || after == cur)) {
01417       switch (cur->subclass.integer) {
01418       case AST_CONTROL_END_OF_Q:
01419          if (fin->frametype == AST_FRAME_CONTROL
01420             && fin->subclass.integer == AST_CONTROL_HANGUP) {
01421             /*
01422              * Destroy the end-of-Q marker frame so we can queue the hangup
01423              * frame in its place.
01424              */
01425             AST_LIST_REMOVE(&chan->readq, cur, frame_list);
01426             ast_frfree(cur);
01427 
01428             /*
01429              * This has degenerated to a normal queue append anyway.  Since
01430              * we just destroyed the last frame in the queue we must make
01431              * sure that "after" is NULL or bad things will happen.
01432              */
01433             after = NULL;
01434             break;
01435          }
01436          /* Fall through */
01437       case AST_CONTROL_HANGUP:
01438          /* Don't queue anything. */
01439          ast_channel_unlock(chan);
01440          return 0;
01441       default:
01442          break;
01443       }
01444    }
01445 
01446    /* Build copies of all the new frames and count them */
01447    AST_LIST_HEAD_INIT_NOLOCK(&frames);
01448    for (cur = fin; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
01449       if (!(f = ast_frdup(cur))) {
01450          if (AST_LIST_FIRST(&frames)) {
01451             ast_frfree(AST_LIST_FIRST(&frames));
01452          }
01453          ast_channel_unlock(chan);
01454          return -1;
01455       }
01456 
01457       AST_LIST_INSERT_TAIL(&frames, f, frame_list);
01458       new_frames++;
01459       if (f->frametype == AST_FRAME_VOICE) {
01460          new_voice_frames++;
01461       }
01462    }
01463 
01464    /* Count how many frames exist on the queue */
01465    AST_LIST_TRAVERSE(&chan->readq, cur, frame_list) {
01466       queued_frames++;
01467       if (cur->frametype == AST_FRAME_VOICE) {
01468          queued_voice_frames++;
01469       }
01470    }
01471 
01472    if ((queued_frames + new_frames > 128 || queued_voice_frames + new_voice_frames > 96)) {
01473       int count = 0;
01474       ast_log(LOG_WARNING, "Exceptionally long %squeue length queuing to %s\n", queued_frames + new_frames > 128 ? "" : "voice ", chan->name);
01475       AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->readq, cur, frame_list) {
01476          /* Save the most recent frame */
01477          if (!AST_LIST_NEXT(cur, frame_list)) {
01478             break;
01479          } else if (cur->frametype == AST_FRAME_VOICE || cur->frametype == AST_FRAME_VIDEO || cur->frametype == AST_FRAME_NULL) {
01480             if (++count > 64) {
01481                break;
01482             }
01483             AST_LIST_REMOVE_CURRENT(frame_list);
01484             ast_frfree(cur);
01485          }
01486       }
01487       AST_LIST_TRAVERSE_SAFE_END;
01488    }
01489 
01490    if (after) {
01491       AST_LIST_INSERT_LIST_AFTER(&chan->readq, &frames, after, frame_list);
01492    } else {
01493       if (head) {
01494          AST_LIST_APPEND_LIST(&frames, &chan->readq, frame_list);
01495          AST_LIST_HEAD_INIT_NOLOCK(&chan->readq);
01496       }
01497       AST_LIST_APPEND_LIST(&chan->readq, &frames, frame_list);
01498    }
01499 
01500    if (chan->alertpipe[1] > -1) {
01501       int blah[new_frames];
01502 
01503       memset(blah, 1, sizeof(blah));
01504       if (write(chan->alertpipe[1], &blah, sizeof(blah)) != (sizeof(blah))) {
01505          ast_log(LOG_WARNING, "Unable to write to alert pipe on %s (qlen = %d): %s!\n",
01506             chan->name, queued_frames, strerror(errno));
01507       }
01508    } else if (chan->timingfd > -1) {
01509       ast_timer_enable_continuous(chan->timer);
01510    } else if (ast_test_flag(chan, AST_FLAG_BLOCKING)) {
01511       pthread_kill(chan->blocker, SIGURG);
01512    }
01513 
01514    ast_channel_unlock(chan);
01515 
01516    return 0;
01517 }
01518 
01519 int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
01520 {
01521    return __ast_queue_frame(chan, fin, 0, NULL);
01522 }
01523 
01524 int ast_queue_frame_head(struct ast_channel *chan, struct ast_frame *fin)
01525 {
01526    return __ast_queue_frame(chan, fin, 1, NULL);
01527 }
01528 
01529 /*! \brief Queue a hangup frame for channel */
01530 int ast_queue_hangup(struct ast_channel *chan)
01531 {
01532    struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = AST_CONTROL_HANGUP };
01533    /* Yeah, let's not change a lock-critical value without locking */
01534    if (!ast_channel_trylock(chan)) {
01535       chan->_softhangup |= AST_SOFTHANGUP_DEV;
01536       ast_channel_unlock(chan);
01537    }
01538    return ast_queue_frame(chan, &f);
01539 }
01540 
01541 /*! \brief Queue a hangup frame for channel */
01542 int ast_queue_hangup_with_cause(struct ast_channel *chan, int cause)
01543 {
01544    struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = AST_CONTROL_HANGUP };
01545 
01546    if (cause >= 0)
01547       f.data.uint32 = cause;
01548 
01549    /* Yeah, let's not change a lock-critical value without locking */
01550    if (!ast_channel_trylock(chan)) {
01551       chan->_softhangup |= AST_SOFTHANGUP_DEV;
01552       if (cause < 0)
01553          f.data.uint32 = chan->hangupcause;
01554 
01555       ast_channel_unlock(chan);
01556    }
01557 
01558    return ast_queue_frame(chan, &f);
01559 }
01560 
01561 /*! \brief Queue a control frame */
01562 int ast_queue_control(struct ast_channel *chan, enum ast_control_frame_type control)
01563 {
01564    struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = control };
01565    return ast_queue_frame(chan, &f);
01566 }
01567 
01568 /*! \brief Queue a control frame with payload */
01569 int ast_queue_control_data(struct ast_channel *chan, enum ast_control_frame_type control,
01570             const void *data, size_t datalen)
01571 {
01572    struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = control, .data.ptr = (void *) data, .datalen = datalen };
01573    return ast_queue_frame(chan, &f);
01574 }
01575 
01576 /*! \brief Set defer DTMF flag on channel */
01577 int ast_channel_defer_dtmf(struct ast_channel *chan)
01578 {
01579    int pre = 0;
01580 
01581    if (chan) {
01582       pre = ast_test_flag(chan, AST_FLAG_DEFER_DTMF);
01583       ast_set_flag(chan, AST_FLAG_DEFER_DTMF);
01584    }
01585    return pre;
01586 }
01587 
01588 /*! \brief Unset defer DTMF flag on channel */
01589 void ast_channel_undefer_dtmf(struct ast_channel *chan)
01590 {
01591    if (chan)
01592       ast_clear_flag(chan, AST_FLAG_DEFER_DTMF);
01593 }
01594 
01595 struct ast_channel *ast_channel_callback(ao2_callback_data_fn *cb_fn, void *arg,
01596       void *data, int ao2_flags)
01597 {
01598    return ao2_callback_data(channels, ao2_flags, cb_fn, arg, data);
01599 }
01600 
01601 struct ast_channel_iterator {
01602    /* storage for non-dynamically allocated iterator */
01603    struct ao2_iterator simple_iterator;
01604    /* pointer to the actual iterator (simple_iterator or a dynamically
01605     * allocated iterator)
01606     */
01607    struct ao2_iterator *active_iterator;
01608 };
01609 
01610 struct ast_channel_iterator *ast_channel_iterator_destroy(struct ast_channel_iterator *i)
01611 {
01612    ao2_iterator_destroy(i->active_iterator);
01613    ast_free(i);
01614 
01615    return NULL;
01616 }
01617 
01618 static struct ast_channel_iterator *channel_iterator_search(const char *name,
01619                          size_t name_len, const char *exten,
01620                          const char *context)
01621 {
01622    struct ast_channel_iterator *i;
01623    struct ast_channel tmp_chan = {
01624       .name = name,
01625       /* This is sort of a hack.  Basically, we're using an arbitrary field
01626        * in ast_channel to pass the name_len for a prefix match.  If this
01627        * gets changed, then the compare callback must be changed, too. */
01628       .rings = name_len,
01629    };
01630 
01631    if (!(i = ast_calloc(1, sizeof(*i)))) {
01632       return NULL;
01633    }
01634 
01635    if (exten) {
01636       ast_copy_string(tmp_chan.exten, exten, sizeof(tmp_chan.exten));
01637    }
01638 
01639    if (context) {
01640       ast_copy_string(tmp_chan.context, context, sizeof(tmp_chan.context));
01641    }
01642 
01643    if (!(i->active_iterator = ao2_find(channels, &tmp_chan,
01644                    OBJ_MULTIPLE | ((!ast_strlen_zero(name) && (name_len == 0)) ? OBJ_POINTER : 0)))) {
01645           ast_free(i);
01646           return NULL;
01647    }
01648 
01649    return i;
01650 }
01651 
01652 struct ast_channel_iterator *ast_channel_iterator_by_exten_new(const char *exten, const char *context)
01653 {
01654    return channel_iterator_search(NULL, 0, exten, context);
01655 }
01656 
01657 struct ast_channel_iterator *ast_channel_iterator_by_name_new(const char *name, size_t name_len)
01658 {
01659    return channel_iterator_search(name, name_len, NULL, NULL);
01660 }
01661 
01662 struct ast_channel_iterator *ast_channel_iterator_all_new(void)
01663 {
01664    struct ast_channel_iterator *i;
01665 
01666    if (!(i = ast_calloc(1, sizeof(*i)))) {
01667       return NULL;
01668    }
01669 
01670    i->simple_iterator = ao2_iterator_init(channels, 0);
01671    i->active_iterator = &i->simple_iterator;
01672 
01673    return i;
01674 }
01675 
01676 struct ast_channel *ast_channel_iterator_next(struct ast_channel_iterator *i)
01677 {
01678    return ao2_iterator_next(i->active_iterator);
01679 }
01680 
01681 static int ast_channel_cmp_cb(void *obj, void *arg, int flags)
01682 {
01683    struct ast_channel *chan = obj, *cmp_args = arg;
01684    size_t name_len;
01685    int ret = CMP_MATCH;
01686 
01687    /* This is sort of a hack.  Basically, we're using an arbitrary field
01688     * in ast_channel to pass the name_len for a prefix match.  If this
01689     * gets changed, then the uses of ao2_find() must be changed, too. */
01690    name_len = cmp_args->rings;
01691 
01692    ast_channel_lock(chan);
01693 
01694    if (!ast_strlen_zero(cmp_args->name)) { /* match by name */
01695       if ((!name_len && strcasecmp(chan->name, cmp_args->name)) ||
01696             (name_len && strncasecmp(chan->name, cmp_args->name, name_len))) {
01697          ret = 0; /* name match failed */
01698       }
01699    } else if (!ast_strlen_zero(cmp_args->exten)) {
01700       if (cmp_args->context && strcasecmp(chan->context, cmp_args->context) &&
01701             strcasecmp(chan->macrocontext, cmp_args->context)) {
01702          ret = 0; /* context match failed */
01703       }
01704       if (ret && strcasecmp(chan->exten, cmp_args->exten) &&
01705             strcasecmp(chan->macroexten, cmp_args->exten)) {
01706          ret = 0; /* exten match failed */
01707       }
01708    } else if (!ast_strlen_zero(cmp_args->uniqueid)) {
01709       if ((!name_len && strcasecmp(chan->uniqueid, cmp_args->uniqueid)) ||
01710             (name_len && strncasecmp(chan->uniqueid, cmp_args->uniqueid, name_len))) {
01711          ret = 0; /* uniqueid match failed */
01712       }
01713    } else {
01714       ret = 0;
01715    }
01716 
01717    ast_channel_unlock(chan);
01718 
01719    return ret;
01720 }
01721 
01722 static struct ast_channel *ast_channel_get_full(const char *name, size_t name_len,
01723                   const char *exten, const char *context)
01724 {
01725    struct ast_channel tmp_chan = {
01726       .name = name,
01727       /* This is sort of a hack.  Basically, we're using an arbitrary field
01728        * in ast_channel to pass the name_len for a prefix match.  If this
01729        * gets changed, then the compare callback must be changed, too. */
01730       .rings = name_len,
01731    };
01732    struct ast_channel *chan;
01733 
01734    if (exten) {
01735       ast_copy_string(tmp_chan.exten, exten, sizeof(tmp_chan.exten));
01736    }
01737 
01738    if (context) {
01739       ast_copy_string(tmp_chan.context, context, sizeof(tmp_chan.context));
01740    }
01741 
01742    if ((chan = ao2_find(channels, &tmp_chan,
01743               (!ast_strlen_zero(name) && (name_len == 0)) ? OBJ_POINTER : 0))) {
01744       return chan;
01745    }
01746 
01747    if (!name) {
01748       return NULL;
01749    }
01750 
01751    /* If name was specified, but the result was NULL, 
01752     * try a search on uniqueid, instead. */
01753 
01754    {
01755       struct ast_channel tmp_chan2 = {
01756          .uniqueid = name,
01757          .rings = name_len,
01758       };
01759 
01760       return ao2_find(channels, &tmp_chan2, 0);
01761    }
01762 }
01763 
01764 struct ast_channel *ast_channel_get_by_name(const char *name)
01765 {
01766    return ast_channel_get_full(name, 0, NULL, NULL);
01767 }
01768 
01769 struct ast_channel *ast_channel_get_by_name_prefix(const char *name, size_t name_len)
01770 {
01771    return ast_channel_get_full(name, name_len, NULL, NULL);
01772 }
01773 
01774 struct ast_channel *ast_channel_get_by_exten(const char *exten, const char *context)
01775 {
01776    return ast_channel_get_full(NULL, 0, exten, context);
01777 }
01778 
01779 int ast_is_deferrable_frame(const struct ast_frame *frame)
01780 {
01781    /* Do not add a default entry in this switch statement.  Each new
01782     * frame type should be addressed directly as to whether it should
01783     * be queued up or not.
01784     */
01785    switch (frame->frametype) {
01786    case AST_FRAME_CONTROL:
01787    case AST_FRAME_TEXT:
01788    case AST_FRAME_IMAGE:
01789    case AST_FRAME_HTML:
01790       return 1;
01791 
01792    case AST_FRAME_DTMF_END:
01793    case AST_FRAME_DTMF_BEGIN:
01794    case AST_FRAME_VOICE:
01795    case AST_FRAME_VIDEO:
01796    case AST_FRAME_NULL:
01797    case AST_FRAME_IAX:
01798    case AST_FRAME_CNG:
01799    case AST_FRAME_MODEM:
01800       return 0;
01801    }
01802    return 0;
01803 }
01804 
01805 /*! \brief Wait, look for hangups and condition arg */
01806 int ast_safe_sleep_conditional(struct ast_channel *chan, int ms, int (*cond)(void*), void *data)
01807 {
01808    struct ast_frame *f;
01809    struct ast_silence_generator *silgen = NULL;
01810    int res = 0;
01811    AST_LIST_HEAD_NOLOCK(, ast_frame) deferred_frames;
01812 
01813    AST_LIST_HEAD_INIT_NOLOCK(&deferred_frames);
01814 
01815    /* If no other generator is present, start silencegen while waiting */
01816    if (ast_opt_transmit_silence && !chan->generatordata) {
01817       silgen = ast_channel_start_silence_generator(chan);
01818    }
01819 
01820    while (ms > 0) {
01821       struct ast_frame *dup_f = NULL;
01822       if (cond && ((*cond)(data) == 0)) {
01823          break;
01824       }
01825       ms = ast_waitfor(chan, ms);
01826       if (ms < 0) {
01827          res = -1;
01828          break;
01829       }
01830       if (ms > 0) {
01831          f = ast_read(chan);
01832          if (!f) {
01833             res = -1;
01834             break;
01835          }
01836 
01837          if (!ast_is_deferrable_frame(f)) {
01838             ast_frfree(f);
01839             continue;
01840          }
01841          
01842          if ((dup_f = ast_frisolate(f))) {
01843             if (dup_f != f) {
01844                ast_frfree(f);
01845             }
01846             AST_LIST_INSERT_HEAD(&deferred_frames, dup_f, frame_list);
01847          }
01848       }
01849    }
01850 
01851    /* stop silgen if present */
01852    if (silgen) {
01853       ast_channel_stop_silence_generator(chan, silgen);
01854    }
01855 
01856    /* We need to free all the deferred frames, but we only need to
01857     * queue the deferred frames if there was no error and no
01858     * hangup was received
01859     */
01860    ast_channel_lock(chan);
01861    while ((f = AST_LIST_REMOVE_HEAD(&deferred_frames, frame_list))) {
01862       if (!res) {
01863          ast_queue_frame_head(chan, f);
01864       }
01865       ast_frfree(f);
01866    }
01867    ast_channel_unlock(chan);
01868 
01869    return res;
01870 }
01871 
01872 /*! \brief Wait, look for hangups */
01873 int ast_safe_sleep(struct ast_channel *chan, int ms)
01874 {
01875    return ast_safe_sleep_conditional(chan, ms, NULL, NULL);
01876 }
01877 
01878 struct ast_channel *ast_channel_release(struct ast_channel *chan)
01879 {
01880    /* Safe, even if already unlinked. */
01881    ao2_unlink(channels, chan);
01882    return ast_channel_unref(chan);
01883 }
01884 
01885 void ast_party_name_init(struct ast_party_name *init)
01886 {
01887    init->str = NULL;
01888    init->char_set = AST_PARTY_CHAR_SET_ISO8859_1;
01889    init->presentation = AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED;
01890    init->valid = 0;
01891 }
01892 
01893 void ast_party_name_copy(struct ast_party_name *dest, const struct ast_party_name *src)
01894 {
01895    if (dest == src) {
01896       /* Don't copy to self */
01897       return;
01898    }
01899 
01900    ast_free(dest->str);
01901    dest->str = ast_strdup(src->str);
01902    dest->char_set = src->char_set;
01903    dest->presentation = src->presentation;
01904    dest->valid = src->valid;
01905 }
01906 
01907 void ast_party_name_set_init(struct ast_party_name *init, const struct ast_party_name *guide)
01908 {
01909    init->str = NULL;
01910    init->char_set = guide->char_set;
01911    init->presentation = guide->presentation;
01912    init->valid = guide->valid;
01913 }
01914 
01915 void ast_party_name_set(struct ast_party_name *dest, const struct ast_party_name *src)
01916 {
01917    if (dest == src) {
01918       /* Don't set to self */
01919       return;
01920    }
01921 
01922    if (src->str && src->str != dest->str) {
01923       ast_free(dest->str);
01924       dest->str = ast_strdup(src->str);
01925    }
01926 
01927    dest->char_set = src->char_set;
01928    dest->presentation = src->presentation;
01929    dest->valid = src->valid;
01930 }
01931 
01932 void ast_party_name_free(struct ast_party_name *doomed)
01933 {
01934    ast_free(doomed->str);
01935    doomed->str = NULL;
01936 }
01937 
01938 void ast_party_number_init(struct ast_party_number *init)
01939 {
01940    init->str = NULL;
01941    init->plan = 0;/* Unknown */
01942    init->presentation = AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED;
01943    init->valid = 0;
01944 }
01945 
01946 void ast_party_number_copy(struct ast_party_number *dest, const struct ast_party_number *src)
01947 {
01948    if (dest == src) {
01949       /* Don't copy to self */
01950       return;
01951    }
01952 
01953    ast_free(dest->str);
01954    dest->str = ast_strdup(src->str);
01955    dest->plan = src->plan;
01956    dest->presentation = src->presentation;
01957    dest->valid = src->valid;
01958 }
01959 
01960 void ast_party_number_set_init(struct ast_party_number *init, const struct ast_party_number *guide)
01961 {
01962    init->str = NULL;
01963    init->plan = guide->plan;
01964    init->presentation = guide->presentation;
01965    init->valid = guide->valid;
01966 }
01967 
01968 void ast_party_number_set(struct ast_party_number *dest, const struct ast_party_number *src)
01969 {
01970    if (dest == src) {
01971       /* Don't set to self */
01972       return;
01973    }
01974 
01975    if (src->str && src->str != dest->str) {
01976       ast_free(dest->str);
01977       dest->str = ast_strdup(src->str);
01978    }
01979 
01980    dest->plan = src->plan;
01981    dest->presentation = src->presentation;
01982    dest->valid = src->valid;
01983 }
01984 
01985 void ast_party_number_free(struct ast_party_number *doomed)
01986 {
01987    ast_free(doomed->str);
01988    doomed->str = NULL;
01989 }
01990 
01991 void ast_party_subaddress_init(struct ast_party_subaddress *init)
01992 {
01993    init->str = NULL;
01994    init->type = 0;
01995    init->odd_even_indicator = 0;
01996    init->valid = 0;
01997 }
01998 
01999 void ast_party_subaddress_copy(struct ast_party_subaddress *dest, const struct ast_party_subaddress *src)
02000 {
02001    if (dest == src) {
02002       /* Don't copy to self */
02003       return;
02004    }
02005 
02006    ast_free(dest->str);
02007    dest->str = ast_strdup(src->str);
02008    dest->type = src->type;
02009    dest->odd_even_indicator = src->odd_even_indicator;
02010    dest->valid = src->valid;
02011 }
02012 
02013 void ast_party_subaddress_set_init(struct ast_party_subaddress *init, const struct ast_party_subaddress *guide)
02014 {
02015    init->str = NULL;
02016    init->type = guide->type;
02017    init->odd_even_indicator = guide->odd_even_indicator;
02018    init->valid = guide->valid;
02019 }
02020 
02021 void ast_party_subaddress_set(struct ast_party_subaddress *dest, const struct ast_party_subaddress *src)
02022 {
02023    if (dest == src) {
02024       /* Don't set to self */
02025       return;
02026    }
02027 
02028    if (src->str && src->str != dest->str) {
02029       ast_free(dest->str);
02030       dest->str = ast_strdup(src->str);
02031    }
02032 
02033    dest->type = src->type;
02034    dest->odd_even_indicator = src->odd_even_indicator;
02035    dest->valid = src->valid;
02036 }
02037 
02038 void ast_party_subaddress_free(struct ast_party_subaddress *doomed)
02039 {
02040    ast_free(doomed->str);
02041    doomed->str = NULL;
02042 }
02043 
02044 void ast_party_id_init(struct ast_party_id *init)
02045 {
02046    ast_party_name_init(&init->name);
02047    ast_party_number_init(&init->number);
02048    ast_party_subaddress_init(&init->subaddress);
02049    init->tag = NULL;
02050 }
02051 
02052 void ast_party_id_copy(struct ast_party_id *dest, const struct ast_party_id *src)
02053 {
02054    if (dest == src) {
02055       /* Don't copy to self */
02056       return;
02057    }
02058 
02059    ast_party_name_copy(&dest->name, &src->name);
02060    ast_party_number_copy(&dest->number, &src->number);
02061    ast_party_subaddress_copy(&dest->subaddress, &src->subaddress);
02062 
02063    ast_free(dest->tag);
02064    dest->tag = ast_strdup(src->tag);
02065 }
02066 
02067 void ast_party_id_set_init(struct ast_party_id *init, const struct ast_party_id *guide)
02068 {
02069    ast_party_name_set_init(&init->name, &guide->name);
02070    ast_party_number_set_init(&init->number, &guide->number);
02071    ast_party_subaddress_set_init(&init->subaddress, &guide->subaddress);
02072    init->tag = NULL;
02073 }
02074 
02075 void ast_party_id_set(struct ast_party_id *dest, const struct ast_party_id *src, const struct ast_set_party_id *update)
02076 {
02077    if (dest == src) {
02078       /* Don't set to self */
02079       return;
02080    }
02081 
02082    if (!update || update->name) {
02083       ast_party_name_set(&dest->name, &src->name);
02084    }
02085    if (!update || update->number) {
02086       ast_party_number_set(&dest->number, &src->number);
02087    }
02088    if (!update || update->subaddress) {
02089       ast_party_subaddress_set(&dest->subaddress, &src->subaddress);
02090    }
02091 
02092    if (src->tag && src->tag != dest->tag) {
02093       ast_free(dest->tag);
02094       dest->tag = ast_strdup(src->tag);
02095    }
02096 }
02097 
02098 void ast_party_id_free(struct ast_party_id *doomed)
02099 {
02100    ast_party_name_free(&doomed->name);
02101    ast_party_number_free(&doomed->number);
02102    ast_party_subaddress_free(&doomed->subaddress);
02103 
02104    ast_free(doomed->tag);
02105    doomed->tag = NULL;
02106 }
02107 
02108 int ast_party_id_presentation(const struct ast_party_id *id)
02109 {
02110    int number_priority;
02111    int number_value;
02112    int number_screening;
02113    int name_priority;
02114    int name_value;
02115 
02116    /* Determine name presentation priority. */
02117    if (!id->name.valid) {
02118       name_value = AST_PRES_UNAVAILABLE;
02119       name_priority = 3;
02120    } else {
02121       name_value = id->name.presentation & AST_PRES_RESTRICTION;
02122       switch (name_value) {
02123       case AST_PRES_RESTRICTED:
02124          name_priority = 0;
02125          break;
02126       case AST_PRES_ALLOWED:
02127          name_priority = 1;
02128          break;
02129       case AST_PRES_UNAVAILABLE:
02130          name_priority = 2;
02131          break;
02132       default:
02133          name_value = AST_PRES_UNAVAILABLE;
02134          name_priority = 3;
02135          break;
02136       }
02137    }
02138 
02139    /* Determine number presentation priority. */
02140    if (!id->number.valid) {
02141       number_screening = AST_PRES_USER_NUMBER_UNSCREENED;
02142       number_value = AST_PRES_UNAVAILABLE;
02143       number_priority = 3;
02144    } else {
02145       number_screening = id->number.presentation & AST_PRES_NUMBER_TYPE;
02146       number_value = id->number.presentation & AST_PRES_RESTRICTION;
02147       switch (number_value) {
02148       case AST_PRES_RESTRICTED:
02149          number_priority = 0;
02150          break;
02151       case AST_PRES_ALLOWED:
02152          number_priority = 1;
02153          break;
02154       case AST_PRES_UNAVAILABLE:
02155          number_priority = 2;
02156          break;
02157       default:
02158          number_screening = AST_PRES_USER_NUMBER_UNSCREENED;
02159          number_value = AST_PRES_UNAVAILABLE;
02160          number_priority = 3;
02161          break;
02162       }
02163    }
02164 
02165    /* Select the wining presentation value. */
02166    if (name_priority < number_priority) {
02167       number_value = name_value;
02168    }
02169 
02170    return number_value | number_screening;
02171 }
02172 
02173 void ast_party_dialed_init(struct ast_party_dialed *init)
02174 {
02175    init->number.str = NULL;
02176    init->number.plan = 0;/* Unknown */
02177    ast_party_subaddress_init(&init->subaddress);
02178    init->transit_network_select = 0;
02179 }
02180 
02181 void ast_party_dialed_copy(struct ast_party_dialed *dest, const struct ast_party_dialed *src)
02182 {
02183    if (dest == src) {
02184       /* Don't copy to self */
02185       return;
02186    }
02187 
02188    ast_free(dest->number.str);
02189    dest->number.str = ast_strdup(src->number.str);
02190    dest->number.plan = src->number.plan;
02191    ast_party_subaddress_copy(&dest->subaddress, &src->subaddress);
02192    dest->transit_network_select = src->transit_network_select;
02193 }
02194 
02195 void ast_party_dialed_set_init(struct ast_party_dialed *init, const struct ast_party_dialed *guide)
02196 {
02197    init->number.str = NULL;
02198    init->number.plan = guide->number.plan;
02199    ast_party_subaddress_set_init(&init->subaddress, &guide->subaddress);
02200    init->transit_network_select = guide->transit_network_select;
02201 }
02202 
02203 void ast_party_dialed_set(struct ast_party_dialed *dest, const struct ast_party_dialed *src)
02204 {
02205    if (src->number.str && src->number.str != dest->number.str) {
02206       ast_free(dest->number.str);
02207       dest->number.str = ast_strdup(src->number.str);
02208    }
02209    dest->number.plan = src->number.plan;
02210 
02211    ast_party_subaddress_set(&dest->subaddress, &src->subaddress);
02212 
02213    dest->transit_network_select = src->transit_network_select;
02214 }
02215 
02216 void ast_party_dialed_free(struct ast_party_dialed *doomed)
02217 {
02218    ast_free(doomed->number.str);
02219    doomed->number.str = NULL;
02220    ast_party_subaddress_free(&doomed->subaddress);
02221 }
02222 
02223 void ast_party_caller_init(struct ast_party_caller *init)
02224 {
02225    ast_party_id_init(&init->id);
02226    ast_party_id_init(&init->ani);
02227    init->ani2 = 0;
02228 }
02229 
02230 void ast_party_caller_copy(struct ast_party_caller *dest, const struct ast_party_caller *src)
02231 {
02232    if (dest == src) {
02233       /* Don't copy to self */
02234       return;
02235    }
02236 
02237    ast_party_id_copy(&dest->id, &src->id);
02238    ast_party_id_copy(&dest->ani, &src->ani);
02239    dest->ani2 = src->ani2;
02240 }
02241 
02242 void ast_party_caller_set_init(struct ast_party_caller *init, const struct ast_party_caller *guide)
02243 {
02244    ast_party_id_set_init(&init->id, &guide->id);
02245    ast_party_id_set_init(&init->ani, &guide->ani);
02246    init->ani2 = guide->ani2;
02247 }
02248 
02249 void ast_party_caller_set(struct ast_party_caller *dest, const struct ast_party_caller *src, const struct ast_set_party_caller *update)
02250 {
02251    ast_party_id_set(&dest->id, &src->id, update ? &update->id : NULL);
02252    ast_party_id_set(&dest->ani, &src->ani, update ? &update->ani : NULL);
02253    dest->ani2 = src->ani2;
02254 }
02255 
02256 void ast_party_caller_free(struct ast_party_caller *doomed)
02257 {
02258    ast_party_id_free(&doomed->id);
02259    ast_party_id_free(&doomed->ani);
02260 }
02261 
02262 void ast_party_connected_line_init(struct ast_party_connected_line *init)
02263 {
02264    ast_party_id_init(&init->id);
02265    ast_party_id_init(&init->ani);
02266    init->ani2 = 0;
02267    init->source = AST_CONNECTED_LINE_UPDATE_SOURCE_UNKNOWN;
02268 }
02269 
02270 void ast_party_connected_line_copy(struct ast_party_connected_line *dest, const struct ast_party_connected_line *src)
02271 {
02272    if (dest == src) {
02273       /* Don't copy to self */
02274       return;
02275    }
02276 
02277    ast_party_id_copy(&dest->id, &src->id);
02278    ast_party_id_copy(&dest->ani, &src->ani);
02279    dest->ani2 = src->ani2;
02280    dest->source = src->source;
02281 }
02282 
02283 void ast_party_connected_line_set_init(struct ast_party_connected_line *init, const struct ast_party_connected_line *guide)
02284 {
02285    ast_party_id_set_init(&init->id, &guide->id);
02286    ast_party_id_set_init(&init->ani, &guide->ani);
02287    init->ani2 = guide->ani2;
02288    init->source = guide->source;
02289 }
02290 
02291 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)
02292 {
02293    ast_party_id_set(&dest->id, &src->id, update ? &update->id : NULL);
02294    ast_party_id_set(&dest->ani, &src->ani, update ? &update->ani : NULL);
02295    dest->ani2 = src->ani2;
02296    dest->source = src->source;
02297 }
02298 
02299 void ast_party_connected_line_collect_caller(struct ast_party_connected_line *connected, struct ast_party_caller *caller)
02300 {
02301    connected->id = caller->id;
02302    connected->ani = caller->ani;
02303    connected->ani2 = caller->ani2;
02304    connected->source = AST_CONNECTED_LINE_UPDATE_SOURCE_UNKNOWN;
02305 }
02306 
02307 void ast_party_connected_line_free(struct ast_party_connected_line *doomed)
02308 {
02309    ast_party_id_free(&doomed->id);
02310    ast_party_id_free(&doomed->ani);
02311 }
02312 
02313 void ast_party_redirecting_init(struct ast_party_redirecting *init)
02314 {
02315    ast_party_id_init(&init->from);
02316    ast_party_id_init(&init->to);
02317    init->count = 0;
02318    init->reason = AST_REDIRECTING_REASON_UNKNOWN;
02319 }
02320 
02321 void ast_party_redirecting_copy(struct ast_party_redirecting *dest, const struct ast_party_redirecting *src)
02322 {
02323    if (dest == src) {
02324       /* Don't copy to self */
02325       return;
02326    }
02327 
02328    ast_party_id_copy(&dest->from, &src->from);
02329    ast_party_id_copy(&dest->to, &src->to);
02330    dest->count = src->count;
02331    dest->reason = src->reason;
02332 }
02333 
02334 void ast_party_redirecting_set_init(struct ast_party_redirecting *init, const struct ast_party_redirecting *guide)
02335 {
02336    ast_party_id_set_init(&init->from, &guide->from);
02337    ast_party_id_set_init(&init->to, &guide->to);
02338    init->count = guide->count;
02339    init->reason = guide->reason;
02340 }
02341 
02342 void ast_party_redirecting_set(struct ast_party_redirecting *dest, const struct ast_party_redirecting *src, const struct ast_set_party_redirecting *update)
02343 {
02344    ast_party_id_set(&dest->from, &src->from, update ? &update->from : NULL);
02345    ast_party_id_set(&dest->to, &src->to, update ? &update->to : NULL);
02346    dest->reason = src->reason;
02347    dest->count = src->count;
02348 }
02349 
02350 void ast_party_redirecting_free(struct ast_party_redirecting *doomed)
02351 {
02352    ast_party_id_free(&doomed->from);
02353    ast_party_id_free(&doomed->to);
02354 }
02355 
02356 /*! \brief Free a channel structure */
02357 static void ast_channel_destructor(void *obj)
02358 {
02359    struct ast_channel *chan = obj;
02360    int fd;
02361 #ifdef HAVE_EPOLL
02362    int i;
02363 #endif
02364    struct ast_var_t *vardata;
02365    struct ast_frame *f;
02366    struct varshead *headp;
02367    struct ast_datastore *datastore;
02368    char device_name[AST_CHANNEL_NAME];
02369 
02370    if (chan->name) {
02371       /* The string fields were initialized. */
02372       ast_cel_report_event(chan, AST_CEL_CHANNEL_END, NULL, NULL, NULL);
02373       ast_cel_check_retire_linkedid(chan);
02374    }
02375 
02376    /* Get rid of each of the data stores on the channel */
02377    ast_channel_lock(chan);
02378    while ((datastore = AST_LIST_REMOVE_HEAD(&chan->datastores, entry)))
02379       /* Free the data store */
02380       ast_datastore_free(datastore);
02381    ast_channel_unlock(chan);
02382 
02383    /* Lock and unlock the channel just to be sure nobody has it locked still
02384       due to a reference that was stored in a datastore. (i.e. app_chanspy) */
02385    ast_channel_lock(chan);
02386    ast_channel_unlock(chan);
02387 
02388    if (chan->tech_pvt) {
02389       ast_log(LOG_WARNING, "Channel '%s' may not have been hung up properly\n", chan->name);
02390       ast_free(chan->tech_pvt);
02391    }
02392 
02393    if (chan->sched)
02394       sched_context_destroy(chan->sched);
02395 
02396    if (chan->name) {
02397       char *dashptr;
02398 
02399       /* The string fields were initialized. */
02400       ast_copy_string(device_name, chan->name, sizeof(device_name));
02401       if ((dashptr = strrchr(device_name, '-'))) {
02402          *dashptr = '\0';
02403       }
02404    } else {
02405       device_name[0] = '\0';
02406    }
02407 
02408    /* Stop monitoring */
02409    if (chan->monitor)
02410       chan->monitor->stop( chan, 0 );
02411 
02412    /* If there is native format music-on-hold state, free it */
02413    if (chan->music_state)
02414       ast_moh_cleanup(chan);
02415 
02416    /* Free translators */
02417    if (chan->readtrans)
02418       ast_translator_free_path(chan->readtrans);
02419    if (chan->writetrans)
02420       ast_translator_free_path(chan->writetrans);
02421    if (chan->pbx)
02422       ast_log(LOG_WARNING, "PBX may not have been terminated properly on '%s'\n", chan->name);
02423 
02424    ast_party_dialed_free(&chan->dialed);
02425    ast_party_caller_free(&chan->caller);
02426    ast_party_connected_line_free(&chan->connected);
02427    ast_party_redirecting_free(&chan->redirecting);
02428 
02429    /* Close pipes if appropriate */
02430    if ((fd = chan->alertpipe[0]) > -1)
02431       close(fd);
02432    if ((fd = chan->alertpipe[1]) > -1)
02433       close(fd);
02434    if (chan->timer) {
02435       ast_timer_close(chan->timer);
02436    }
02437 #ifdef HAVE_EPOLL
02438    for (i = 0; i < AST_MAX_FDS; i++) {
02439       if (chan->epfd_data[i])
02440          free(chan->epfd_data[i]);
02441    }
02442    close(chan->epfd);
02443 #endif
02444    while ((f = AST_LIST_REMOVE_HEAD(&chan->readq, frame_list)))
02445       ast_frfree(f);
02446    
02447    /* loop over the variables list, freeing all data and deleting list items */
02448    /* no need to lock the list, as the channel is already locked */
02449    headp = &chan->varshead;
02450    while ((vardata = AST_LIST_REMOVE_HEAD(headp, entries)))
02451       ast_var_delete(vardata);
02452 
02453    ast_app_group_discard(chan);
02454 
02455    /* Destroy the jitterbuffer */
02456    ast_jb_destroy(chan);
02457 
02458    if (chan->cdr) {
02459       ast_cdr_discard(chan->cdr);
02460       chan->cdr = NULL;
02461    }
02462 
02463    if (chan->zone) {
02464       chan->zone = ast_tone_zone_unref(chan->zone);
02465    }
02466 
02467    ast_string_field_free_memory(chan);
02468 
02469    if (device_name[0]) {
02470       /*
02471        * We have a device name to notify of a new state.
02472        *
02473        * Queue an unknown state, because, while we know that this particular
02474        * instance is dead, we don't know the state of all other possible
02475        * instances.
02476        */
02477       ast_devstate_changed_literal(AST_DEVICE_UNKNOWN, device_name);
02478    }
02479 }
02480 
02481 /*! \brief Free a dummy channel structure */
02482 static void ast_dummy_channel_destructor(void *obj)
02483 {
02484    struct ast_channel *chan = obj;
02485    struct ast_var_t *vardata;
02486    struct varshead *headp;
02487 
02488    headp = &chan->varshead;
02489 
02490    ast_party_dialed_free(&chan->dialed);
02491    ast_party_caller_free(&chan->caller);
02492    ast_party_connected_line_free(&chan->connected);
02493    ast_party_redirecting_free(&chan->redirecting);
02494 
02495    /* loop over the variables list, freeing all data and deleting list items */
02496    /* no need to lock the list, as the channel is already locked */
02497    while ((vardata = AST_LIST_REMOVE_HEAD(headp, entries)))
02498       ast_var_delete(vardata);
02499 
02500    if (chan->cdr) {
02501       ast_cdr_discard(chan->cdr);
02502       chan->cdr = NULL;
02503    }
02504 
02505    ast_string_field_free_memory(chan);
02506 }
02507 
02508 struct ast_datastore *ast_channel_datastore_alloc(const struct ast_datastore_info *info, const char *uid)
02509 {
02510    return ast_datastore_alloc(info, uid);
02511 }
02512 
02513 int ast_channel_datastore_free(struct ast_datastore *datastore)
02514 {
02515    return ast_datastore_free(datastore);
02516 }
02517 
02518 int ast_channel_datastore_inherit(struct ast_channel *from, struct ast_channel *to)
02519 {
02520    struct ast_datastore *datastore = NULL, *datastore2;
02521 
02522    AST_LIST_TRAVERSE(&from->datastores, datastore, entry) {
02523       if (datastore->inheritance > 0) {
02524          datastore2 = ast_datastore_alloc(datastore->info, datastore->uid);
02525          if (datastore2) {
02526             datastore2->data = datastore->info->duplicate ? datastore->info->duplicate(datastore->data) : NULL;
02527             datastore2->inheritance = datastore->inheritance == DATASTORE_INHERIT_FOREVER ? DATASTORE_INHERIT_FOREVER : datastore->inheritance - 1;
02528             AST_LIST_INSERT_TAIL(&to->datastores, datastore2, entry);
02529          }
02530       }
02531    }
02532    return 0;
02533 }
02534 
02535 int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
02536 {
02537    int res = 0;
02538 
02539    AST_LIST_INSERT_HEAD(&chan->datastores, datastore, entry);
02540 
02541    return res;
02542 }
02543 
02544 int ast_channel_datastore_remove(struct ast_channel *chan, struct ast_datastore *datastore)
02545 {
02546    return AST_LIST_REMOVE(&chan->datastores, datastore, entry) ? 0 : -1;
02547 }
02548 
02549 struct ast_datastore *ast_channel_datastore_find(struct ast_channel *chan, const struct ast_datastore_info *info, const char *uid)
02550 {
02551    struct ast_datastore *datastore = NULL;
02552    
02553    if (info == NULL)
02554       return NULL;
02555 
02556    AST_LIST_TRAVERSE(&chan->datastores, datastore, entry) {
02557       if (datastore->info != info) {
02558          continue;
02559       }
02560 
02561       if (uid == NULL) {
02562          /* matched by type only */
02563          break;
02564       }
02565 
02566       if ((datastore->uid != NULL) && !strcasecmp(uid, datastore->uid)) {
02567          /* Matched by type AND uid */
02568          break;
02569       }
02570    }
02571 
02572    return datastore;
02573 }
02574 
02575 /*! Set the file descriptor on the channel */
02576 void ast_channel_set_fd(struct ast_channel *chan, int which, int fd)
02577 {
02578 #ifdef HAVE_EPOLL
02579    struct epoll_event ev;
02580    struct ast_epoll_data *aed = NULL;
02581 
02582    if (chan->fds[which] > -1) {
02583       epoll_ctl(chan->epfd, EPOLL_CTL_DEL, chan->fds[which], &ev);
02584       aed = chan->epfd_data[which];
02585    }
02586 
02587    /* If this new fd is valid, add it to the epoll */
02588    if (fd > -1) {
02589       if (!aed && (!(aed = ast_calloc(1, sizeof(*aed)))))
02590          return;
02591       
02592       chan->epfd_data[which] = aed;
02593       aed->chan = chan;
02594       aed->which = which;
02595       
02596       ev.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP;
02597       ev.data.ptr = aed;
02598       epoll_ctl(chan->epfd, EPOLL_CTL_ADD, fd, &ev);
02599    } else if (aed) {
02600       /* We don't have to keep around this epoll data structure now */
02601       free(aed);
02602       chan->epfd_data[which] = NULL;
02603    }
02604 #endif
02605    chan->fds[which] = fd;
02606    return;
02607 }
02608 
02609 /*! Add a channel to an optimized waitfor */
02610 void ast_poll_channel_add(struct ast_channel *chan0, struct ast_channel *chan1)
02611 {
02612 #ifdef HAVE_EPOLL
02613    struct epoll_event ev;
02614    int i = 0;
02615 
02616    if (chan0->epfd == -1)
02617       return;
02618 
02619    /* Iterate through the file descriptors on chan1, adding them to chan0 */
02620    for (i = 0; i < AST_MAX_FDS; i++) {
02621       if (chan1->fds[i] == -1)
02622          continue;
02623       ev.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP;
02624       ev.data.ptr = chan1->epfd_data[i];
02625       epoll_ctl(chan0->epfd, EPOLL_CTL_ADD, chan1->fds[i], &ev);
02626    }
02627 
02628 #endif
02629    return;
02630 }
02631 
02632 /*! Delete a channel from an optimized waitfor */
02633 void ast_poll_channel_del(struct ast_channel *chan0, struct ast_channel *chan1)
02634 {
02635 #ifdef HAVE_EPOLL
02636    struct epoll_event ev;
02637    int i = 0;
02638 
02639    if (chan0->epfd == -1)
02640       return;
02641 
02642    for (i = 0; i < AST_MAX_FDS; i++) {
02643       if (chan1->fds[i] == -1)
02644          continue;
02645       epoll_ctl(chan0->epfd, EPOLL_CTL_DEL, chan1->fds[i], &ev);
02646    }
02647 
02648 #endif
02649    return;
02650 }
02651 
02652 void ast_channel_clear_softhangup(struct ast_channel *chan, int flag)
02653 {
02654    ast_channel_lock(chan);
02655 
02656    chan->_softhangup &= ~flag;
02657 
02658    if (!chan->_softhangup) {
02659       struct ast_frame *fr;
02660 
02661       /* If we have completely cleared the softhangup flag,
02662        * then we need to fully abort the hangup process.  This requires
02663        * pulling the END_OF_Q frame out of the channel frame queue if it
02664        * still happens to be there. */
02665 
02666       fr = AST_LIST_LAST(&chan->readq);
02667       if (fr && fr->frametype == AST_FRAME_CONTROL &&
02668             fr->subclass.integer == AST_CONTROL_END_OF_Q) {
02669          AST_LIST_REMOVE(&chan->readq, fr, frame_list);
02670          ast_frfree(fr);
02671       }
02672    }
02673 
02674    ast_channel_unlock(chan);
02675 }
02676 
02677 /*! \brief Softly hangup a channel, don't lock */
02678 int ast_softhangup_nolock(struct ast_channel *chan, int cause)
02679 {
02680    ast_debug(1, "Soft-Hanging up channel '%s'\n", chan->name);
02681    /* Inform channel driver that we need to be hung up, if it cares */
02682    chan->_softhangup |= cause;
02683    ast_queue_frame(chan, &ast_null_frame);
02684    /* Interrupt any poll call or such */
02685    if (ast_test_flag(chan, AST_FLAG_BLOCKING))
02686       pthread_kill(chan->blocker, SIGURG);
02687    return 0;
02688 }
02689 
02690 /*! \brief Softly hangup a channel, lock */
02691 int ast_softhangup(struct ast_channel *chan, int cause)
02692 {
02693    int res;
02694 
02695    ast_channel_lock(chan);
02696    res = ast_softhangup_nolock(chan, cause);
02697    ast_channel_unlock(chan);
02698 
02699    return res;
02700 }
02701 
02702 static void free_translation(struct ast_channel *clonechan)
02703 {
02704    if (clonechan->writetrans)
02705       ast_translator_free_path(clonechan->writetrans);
02706    if (clonechan->readtrans)
02707       ast_translator_free_path(clonechan->readtrans);
02708    clonechan->writetrans = NULL;
02709    clonechan->readtrans = NULL;
02710    clonechan->rawwriteformat = clonechan->nativeformats;
02711    clonechan->rawreadformat = clonechan->nativeformats;
02712 }
02713 
02714 void ast_set_hangupsource(struct ast_channel *chan, const char *source, int force)
02715 {
02716    struct ast_channel *bridge;
02717 
02718    ast_channel_lock(chan);
02719    if (force || ast_strlen_zero(chan->hangupsource)) {
02720       ast_string_field_set(chan, hangupsource, source);
02721    }
02722    bridge = ast_bridged_channel(chan);
02723    ast_channel_unlock(chan);
02724 
02725    if (bridge && (force || ast_strlen_zero(bridge->hangupsource))) {
02726       ast_channel_lock(bridge);
02727       ast_string_field_set(chan, hangupsource, source);
02728       ast_channel_unlock(bridge);
02729    }
02730 }
02731 
02732 /*! \brief Hangup a channel */
02733 int ast_hangup(struct ast_channel *chan)
02734 {
02735    char extra_str[64]; /* used for cel logging below */
02736 
02737    ast_autoservice_stop(chan);
02738 
02739    ao2_lock(channels);
02740    ast_channel_lock(chan);
02741 
02742    if (chan->audiohooks) {
02743       ast_audiohook_detach_list(chan->audiohooks);
02744       chan->audiohooks = NULL;
02745    }
02746    ast_framehook_list_destroy(chan);
02747 
02748    /*
02749     * Do the masquerade if someone is setup to masquerade into us.
02750     *
02751     * NOTE: We must hold the channel lock after testing for a
02752     * pending masquerade and setting the channel as a zombie to
02753     * prevent __ast_channel_masquerade() from setting up a
02754     * masquerade with a dead channel.
02755     */
02756    while (chan->masq) {
02757       ast_channel_unlock(chan);
02758       ao2_unlock(channels);
02759       if (ast_do_masquerade(chan)) {
02760          ast_log(LOG_WARNING, "Failed to perform masquerade\n");
02761 
02762          /* Abort the loop or we might never leave. */
02763          ao2_lock(channels);
02764          ast_channel_lock(chan);
02765          break;
02766       }
02767       ao2_lock(channels);
02768       ast_channel_lock(chan);
02769    }
02770 
02771    if (chan->masqr) {
02772       /*
02773        * This channel is one which will be masqueraded into something.
02774        * Mark it as a zombie already so ast_do_masquerade() will know
02775        * to free it later.
02776        */
02777       ast_set_flag(chan, AST_FLAG_ZOMBIE);
02778       ast_channel_unlock(chan);
02779       ao2_unlock(channels);
02780       return 0;
02781    }
02782 
02783    ao2_unlink(channels, chan);
02784    ao2_unlock(channels);
02785 
02786    free_translation(chan);
02787    /* Close audio stream */
02788    if (chan->stream) {
02789       ast_closestream(chan->stream);
02790       chan->stream = NULL;
02791    }
02792    /* Close video stream */
02793    if (chan->vstream) {
02794       ast_closestream(chan->vstream);
02795       chan->vstream = NULL;
02796    }
02797    if (chan->sched) {
02798       sched_context_destroy(chan->sched);
02799       chan->sched = NULL;
02800    }
02801 
02802    if (chan->generatordata) { /* Clear any tone stuff remaining */
02803       if (chan->generator && chan->generator->release) {
02804          chan->generator->release(chan, chan->generatordata);
02805       }
02806    }
02807    chan->generatordata = NULL;
02808    chan->generator = NULL;
02809 
02810    snprintf(extra_str, sizeof(extra_str), "%d,%s,%s", chan->hangupcause, chan->hangupsource, S_OR(pbx_builtin_getvar_helper(chan, "DIALSTATUS"), ""));
02811    ast_cel_report_event(chan, AST_CEL_HANGUP, NULL, extra_str, NULL);
02812 
02813    if (ast_test_flag(chan, AST_FLAG_BLOCKING)) {
02814       ast_log(LOG_WARNING, "Hard hangup called by thread %ld on %s, while fd "
02815          "is blocked by thread %ld in procedure %s!  Expect a failure\n",
02816          (long) pthread_self(), chan->name, (long)chan->blocker, chan->blockproc);
02817       ast_assert(ast_test_flag(chan, AST_FLAG_BLOCKING) == 0);
02818    }
02819    if (!ast_test_flag(chan, AST_FLAG_ZOMBIE)) {
02820       ast_debug(1, "Hanging up channel '%s'\n", chan->name);
02821 
02822       /*
02823        * This channel is now dead so mark it as a zombie so anyone
02824        * left holding a reference to this channel will not use it.
02825        */
02826       ast_set_flag(chan, AST_FLAG_ZOMBIE);
02827       if (chan->tech->hangup) {
02828          chan->tech->hangup(chan);
02829       }
02830    } else {
02831       ast_debug(1, "Hanging up zombie '%s'\n", chan->name);
02832    }
02833 
02834    ast_channel_unlock(chan);
02835 
02836    ast_cc_offer(chan);
02837    ast_manager_event(chan, EVENT_FLAG_CALL, "Hangup",
02838       "Channel: %s\r\n"
02839       "Uniqueid: %s\r\n"
02840       "CallerIDNum: %s\r\n"
02841       "CallerIDName: %s\r\n"
02842       "ConnectedLineNum: %s\r\n"
02843       "ConnectedLineName: %s\r\n"
02844       "Cause: %d\r\n"
02845       "Cause-txt: %s\r\n",
02846       chan->name,
02847       chan->uniqueid,
02848       S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, "<unknown>"),
02849       S_COR(chan->caller.id.name.valid, chan->caller.id.name.str, "<unknown>"),
02850       S_COR(chan->connected.id.number.valid, chan->connected.id.number.str, "<unknown>"),
02851       S_COR(chan->connected.id.name.valid, chan->connected.id.name.str, "<unknown>"),
02852       chan->hangupcause,
02853       ast_cause2str(chan->hangupcause)
02854       );
02855 
02856    if (chan->cdr && !ast_test_flag(chan->cdr, AST_CDR_FLAG_BRIDGED) &&
02857       !ast_test_flag(chan->cdr, AST_CDR_FLAG_POST_DISABLED) &&
02858       (chan->cdr->disposition != AST_CDR_NULL || ast_test_flag(chan->cdr, AST_CDR_FLAG_DIALED))) {
02859       ast_channel_lock(chan);
02860       ast_cdr_end(chan->cdr);
02861       ast_cdr_detach(chan->cdr);
02862       chan->cdr = NULL;
02863       ast_channel_unlock(chan);
02864    }
02865 
02866    ast_channel_unref(chan);
02867 
02868    return 0;
02869 }
02870 
02871 int ast_raw_answer(struct ast_channel *chan, int cdr_answer)
02872 {
02873    int res = 0;
02874 
02875    ast_channel_lock(chan);
02876 
02877    /* You can't answer an outbound call */
02878    if (ast_test_flag(chan, AST_FLAG_OUTGOING)) {
02879       ast_channel_unlock(chan);
02880       return 0;
02881    }
02882 
02883    /* Stop if we're a zombie or need a soft hangup */
02884    if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
02885       ast_channel_unlock(chan);
02886       return -1;
02887    }
02888 
02889    ast_channel_unlock(chan);
02890 
02891    switch (chan->_state) {
02892    case AST_STATE_RINGING:
02893    case AST_STATE_RING:
02894       ast_channel_lock(chan);
02895       if (chan->tech->answer) {
02896          res = chan->tech->answer(chan);
02897       }
02898       ast_setstate(chan, AST_STATE_UP);
02899       if (cdr_answer) {
02900          ast_cdr_answer(chan->cdr);
02901       }
02902       ast_cel_report_event(chan, AST_CEL_ANSWER, NULL, NULL, NULL);
02903       ast_channel_unlock(chan);
02904       break;
02905    case AST_STATE_UP:
02906       ast_cel_report_event(chan, AST_CEL_ANSWER, NULL, NULL, NULL);
02907       /* Calling ast_cdr_answer when it it has previously been called
02908        * is essentially a no-op, so it is safe.
02909        */
02910       if (cdr_answer) {
02911          ast_cdr_answer(chan->cdr);
02912       }
02913       break;
02914    default:
02915       break;
02916    }
02917 
02918    ast_indicate(chan, -1);
02919 
02920    return res;
02921 }
02922 
02923 int __ast_answer(struct ast_channel *chan, unsigned int delay, int cdr_answer)
02924 {
02925    int res = 0;
02926    enum ast_channel_state old_state;
02927 
02928    old_state = chan->_state;
02929    if ((res = ast_raw_answer(chan, cdr_answer))) {
02930       return res;
02931    }
02932 
02933    switch (old_state) {
02934    case AST_STATE_RINGING:
02935    case AST_STATE_RING:
02936       /* wait for media to start flowing, but don't wait any longer
02937        * than 'delay' or 500 milliseconds, whichever is longer
02938        */
02939       do {
02940          AST_LIST_HEAD_NOLOCK(, ast_frame) frames;
02941          struct ast_frame *cur, *new;
02942          int ms = MAX(delay, 500);
02943          unsigned int done = 0;
02944 
02945          AST_LIST_HEAD_INIT_NOLOCK(&frames);
02946 
02947          for (;;) {
02948             ms = ast_waitfor(chan, ms);
02949             if (ms < 0) {
02950                ast_log(LOG_WARNING, "Error condition occurred when polling channel %s for a voice frame: %s\n", chan->name, strerror(errno));
02951                res = -1;
02952                break;
02953             }
02954             if (ms == 0) {
02955                ast_debug(2, "Didn't receive a media frame from %s within %d ms of answering. Continuing anyway\n", chan->name, MAX(delay, 500));
02956                break;
02957             }
02958             cur = ast_read(chan);
02959             if (!cur || ((cur->frametype == AST_FRAME_CONTROL) &&
02960                     (cur->subclass.integer == AST_CONTROL_HANGUP))) {
02961                if (cur) {
02962                   ast_frfree(cur);
02963                }
02964                res = -1;
02965                ast_debug(2, "Hangup of channel %s detected in answer routine\n", chan->name);
02966                break;
02967             }
02968 
02969             if ((new = ast_frisolate(cur)) != cur) {
02970                ast_frfree(cur);
02971             }
02972 
02973             AST_LIST_INSERT_HEAD(&frames, new, frame_list);
02974 
02975             /* if a specific delay period was requested, continue
02976              * until that delay has passed. don't stop just because
02977              * incoming media has arrived.
02978              */
02979             if (delay) {
02980                continue;
02981             }
02982 
02983             switch (new->frametype) {
02984                /* all of these frametypes qualify as 'media' */
02985             case AST_FRAME_VOICE:
02986             case AST_FRAME_VIDEO:
02987             case AST_FRAME_TEXT:
02988             case AST_FRAME_DTMF_BEGIN:
02989             case AST_FRAME_DTMF_END:
02990             case AST_FRAME_IMAGE:
02991             case AST_FRAME_HTML:
02992             case AST_FRAME_MODEM:
02993                done = 1;
02994                break;
02995             case AST_FRAME_CONTROL:
02996             case AST_FRAME_IAX:
02997             case AST_FRAME_NULL:
02998             case AST_FRAME_CNG:
02999                break;
03000             }
03001 
03002             if (done) {
03003                break;
03004             }
03005          }
03006 
03007          if (res == 0) {
03008             ast_channel_lock(chan);
03009             while ((cur = AST_LIST_REMOVE_HEAD(&frames, frame_list))) {
03010                ast_queue_frame_head(chan, cur);
03011                ast_frfree(cur);
03012             }
03013             ast_channel_unlock(chan);
03014          }
03015       } while (0);
03016       break;
03017    default:
03018       break;
03019    }
03020 
03021    return res;
03022 }
03023 
03024 int ast_answer(struct ast_channel *chan)
03025 {
03026    return __ast_answer(chan, 0, 1);
03027 }
03028 
03029 void ast_deactivate_generator(struct ast_channel *chan)
03030 {
03031    ast_channel_lock(chan);
03032    if (chan->generatordata) {
03033       if (chan->generator && chan->generator->release)
03034          chan->generator->release(chan, chan->generatordata);
03035       chan->generatordata = NULL;
03036       chan->generator = NULL;
03037       ast_channel_set_fd(chan, AST_GENERATOR_FD, -1);
03038       ast_clear_flag(chan, AST_FLAG_WRITE_INT);
03039       ast_settimeout(chan, 0, NULL, NULL);
03040    }
03041    ast_channel_unlock(chan);
03042 }
03043 
03044 static int generator_force(const void *data)
03045 {
03046    /* Called if generator doesn't have data */
03047    void *tmp;
03048    int res;
03049    int (*generate)(struct ast_channel *chan, void *tmp, int datalen, int samples) = NULL;
03050    struct ast_channel *chan = (struct ast_channel *)data;
03051 
03052    ast_channel_lock(chan);
03053    tmp = chan->generatordata;
03054    chan->generatordata = NULL;
03055    if (chan->generator)
03056       generate = chan->generator->generate;
03057    ast_channel_unlock(chan);
03058 
03059    if (!tmp || !generate)
03060       return 0;
03061 
03062    res = generate(chan, tmp, 0, ast_format_rate(chan->writeformat & AST_FORMAT_AUDIO_MASK) / 50);
03063 
03064    chan->generatordata = tmp;
03065 
03066    if (res) {
03067       ast_debug(1, "Auto-deactivating generator\n");
03068       ast_deactivate_generator(chan);
03069    }
03070 
03071    return 0;
03072 }
03073 
03074 int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen, void *params)
03075 {
03076    int res = 0;
03077 
03078    ast_channel_lock(chan);
03079    if (chan->generatordata) {
03080       if (chan->generator && chan->generator->release)
03081          chan->generator->release(chan, chan->generatordata);
03082       chan->generatordata = NULL;
03083    }
03084    if (gen->alloc && !(chan->generatordata = gen->alloc(chan, params))) {
03085       res = -1;
03086    }
03087    if (!res) {
03088       ast_settimeout(chan, 50, generator_force, chan);
03089       chan->generator = gen;
03090    }
03091    ast_channel_unlock(chan);
03092 
03093    ast_prod(chan);
03094 
03095    return res;
03096 }
03097 
03098 /*! \brief Wait for x amount of time on a file descriptor to have input.  */
03099 int ast_waitfor_n_fd(int *fds, int n, int *ms, int *exception)
03100 {
03101    int winner = -1;
03102    ast_waitfor_nandfds(NULL, 0, fds, n, exception, &winner, ms);
03103    return winner;
03104 }
03105 
03106 /*! \brief Wait for x amount of time on a file descriptor to have input.  */
03107 #ifdef HAVE_EPOLL
03108 static struct ast_channel *ast_waitfor_nandfds_classic(struct ast_channel **c, int n, int *fds, int nfds,
03109                int *exception, int *outfd, int *ms)
03110 #else
03111 struct ast_channel *ast_waitfor_nandfds(struct ast_channel **c, int n, int *fds, int nfds,
03112                int *exception, int *outfd, int *ms)
03113 #endif
03114 {
03115    struct timeval start = { 0 , 0 };
03116    struct pollfd *pfds = NULL;
03117    int res;
03118    long rms;
03119    int x, y, max;
03120    int sz;
03121    struct timeval now = { 0, 0 };
03122    struct timeval whentohangup = { 0, 0 }, diff;
03123    struct ast_channel *winner = NULL;
03124    struct fdmap {
03125       int chan;
03126       int fdno;
03127    } *fdmap = NULL;
03128 
03129    if ((sz = n * AST_MAX_FDS + nfds)) {
03130       pfds = alloca(sizeof(*pfds) * sz);
03131       fdmap = alloca(sizeof(*fdmap) * sz);
03132    }
03133 
03134    if (outfd)
03135       *outfd = -99999;
03136    if (exception)
03137       *exception = 0;
03138    
03139    /* Perform any pending masquerades */
03140    for (x = 0; x < n; x++) {
03141       if (c[x]->masq && ast_do_masquerade(c[x])) {
03142          ast_log(LOG_WARNING, "Masquerade failed\n");
03143          *ms = -1;
03144          return NULL;
03145       }
03146 
03147       ast_channel_lock(c[x]);
03148       if (!ast_tvzero(c[x]->whentohangup)) {
03149          if (ast_tvzero(whentohangup))
03150             now = ast_tvnow();
03151          diff = ast_tvsub(c[x]->whentohangup, now);
03152          if (diff.tv_sec < 0 || ast_tvzero(diff)) {
03153             /* Should already be hungup */
03154             c[x]->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
03155             ast_channel_unlock(c[x]);
03156             return c[x];
03157          }
03158          if (ast_tvzero(whentohangup) || ast_tvcmp(diff, whentohangup) < 0)
03159             whentohangup = diff;
03160       }
03161       ast_channel_unlock(c[x]);
03162    }
03163    /* Wait full interval */
03164    rms = *ms;
03165    /* INT_MAX, not LONG_MAX, because it matters on 64-bit */
03166    if (!ast_tvzero(whentohangup) && whentohangup.tv_sec < INT_MAX / 1000) {
03167       rms = whentohangup.tv_sec * 1000 + whentohangup.tv_usec / 1000;              /* timeout in milliseconds */
03168       if (*ms >= 0 && *ms < rms) {                                                 /* original *ms still smaller */
03169          rms =  *ms;
03170       }
03171    } else if (!ast_tvzero(whentohangup) && rms < 0) {
03172       /* Tiny corner case... call would need to last >24 days */
03173       rms = INT_MAX;
03174    }
03175    /*
03176     * Build the pollfd array, putting the channels' fds first,
03177     * followed by individual fds. Order is important because
03178     * individual fd's must have priority over channel fds.
03179     */
03180    max = 0;
03181    for (x = 0; x < n; x++) {
03182       for (y = 0; y < AST_MAX_FDS; y++) {
03183          fdmap[max].fdno = y;  /* fd y is linked to this pfds */
03184          fdmap[max].chan = x;  /* channel x is linked to this pfds */
03185          max += ast_add_fd(&pfds[max], c[x]->fds[y]);
03186       }
03187       CHECK_BLOCKING(c[x]);
03188    }
03189    /* Add the individual fds */
03190    for (x = 0; x < nfds; x++) {
03191       fdmap[max].chan = -1;
03192       max += ast_add_fd(&pfds[max], fds[x]);
03193    }
03194 
03195    if (*ms > 0)
03196       start = ast_tvnow();
03197    
03198    if (sizeof(int) == 4) { /* XXX fix timeout > 600000 on linux x86-32 */
03199       do {
03200          int kbrms = rms;
03201          if (kbrms > 600000)
03202             kbrms = 600000;
03203          res = ast_poll(pfds, max, kbrms);
03204          if (!res)
03205             rms -= kbrms;
03206       } while (!res && (rms > 0));
03207    } else {
03208       res = ast_poll(pfds, max, rms);
03209    }
03210    for (x = 0; x < n; x++)
03211       ast_clear_flag(c[x], AST_FLAG_BLOCKING);
03212    if (res < 0) { /* Simulate a timeout if we were interrupted */
03213       if (errno != EINTR)
03214          *ms = -1;
03215       return NULL;
03216    }
03217    if (!ast_tvzero(whentohangup)) {   /* if we have a timeout, check who expired */
03218       now = ast_tvnow();
03219       for (x = 0; x < n; x++) {
03220          if (!ast_tvzero(c[x]->whentohangup) && ast_tvcmp(c[x]->whentohangup, now) <= 0) {
03221             c[x]->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
03222             if (winner == NULL)
03223                winner = c[x];
03224          }
03225       }
03226    }
03227    if (res == 0) { /* no fd ready, reset timeout and done */
03228       *ms = 0; /* XXX use 0 since we may not have an exact timeout. */
03229       return winner;
03230    }
03231    /*
03232     * Then check if any channel or fd has a pending event.
03233     * Remember to check channels first and fds last, as they
03234     * must have priority on setting 'winner'
03235     */
03236    for (x = 0; x < max; x++) {
03237       res = pfds[x].revents;
03238       if (res == 0)
03239          continue;
03240       if (fdmap[x].chan >= 0) {  /* this is a channel */
03241          winner = c[fdmap[x].chan]; /* override previous winners */
03242          if (res & POLLPRI)
03243             ast_set_flag(winner, AST_FLAG_EXCEPTION);
03244          else
03245             ast_clear_flag(winner, AST_FLAG_EXCEPTION);
03246          winner->fdno = fdmap[x].fdno;
03247       } else {       /* this is an fd */
03248          if (outfd)
03249             *outfd = pfds[x].fd;
03250          if (exception)
03251             *exception = (res & POLLPRI) ? -1 : 0;
03252          winner = NULL;
03253       }
03254    }
03255    if (*ms > 0) {
03256       *ms -= ast_tvdiff_ms(ast_tvnow(), start);
03257       if (*ms < 0)
03258          *ms = 0;
03259    }
03260    return winner;
03261 }
03262 
03263 #ifdef HAVE_EPOLL
03264 static struct ast_channel *ast_waitfor_nandfds_simple(struct ast_channel *chan, int *ms)
03265 {
03266    struct timeval start = { 0 , 0 };
03267    int res = 0;
03268    struct epoll_event ev[1];
03269    long diff, rms = *ms;
03270    struct ast_channel *winner = NULL;
03271    struct ast_epoll_data *aed = NULL;
03272 
03273 
03274    /* See if this channel needs to be masqueraded */
03275    if (chan->masq && ast_do_masquerade(chan)) {
03276       ast_log(LOG_WARNING, "Failed to perform masquerade on %s\n", chan->name);
03277       *ms = -1;
03278       return NULL;
03279    }
03280 
03281    ast_channel_lock(chan);
03282    /* Figure out their timeout */
03283    if (!ast_tvzero(chan->whentohangup)) {
03284       if ((diff = ast_tvdiff_ms(chan->whentohangup, ast_tvnow())) < 0) {
03285          /* They should already be hungup! */
03286          chan->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
03287          ast_channel_unlock(chan);
03288          return NULL;
03289       }
03290       /* If this value is smaller then the current one... make it priority */
03291       if (rms > diff)
03292          rms = diff;
03293    }
03294 
03295    ast_channel_unlock(chan);
03296 
03297    /* Time to make this channel block... */
03298    CHECK_BLOCKING(chan);
03299 
03300    if (*ms > 0)
03301       start = ast_tvnow();
03302 
03303    /* We don't have to add any file descriptors... they are already added, we just have to wait! */
03304    res = epoll_wait(chan->epfd, ev, 1, rms);
03305 
03306    /* Stop blocking */
03307    ast_clear_flag(chan, AST_FLAG_BLOCKING);
03308 
03309    /* Simulate a timeout if we were interrupted */
03310    if (res < 0) {
03311       if (errno != EINTR)
03312          *ms = -1;
03313       return NULL;
03314    }
03315 
03316    /* If this channel has a timeout see if it expired */
03317    if (!ast_tvzero(chan->whentohangup)) {
03318       if (ast_tvdiff_ms(ast_tvnow(), chan->whentohangup) >= 0) {
03319          chan->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
03320          winner = chan;
03321       }
03322    }
03323 
03324    /* No fd ready, reset timeout and be done for now */
03325    if (!res) {
03326       *ms = 0;
03327       return winner;
03328    }
03329 
03330    /* See what events are pending */
03331    aed = ev[0].data.ptr;
03332    chan->fdno = aed->which;
03333    if (ev[0].events & EPOLLPRI)
03334       ast_set_flag(chan, AST_FLAG_EXCEPTION);
03335    else
03336       ast_clear_flag(chan, AST_FLAG_EXCEPTION);
03337 
03338    if (*ms > 0) {
03339       *ms -= ast_tvdiff_ms(ast_tvnow(), start);
03340       if (*ms < 0)
03341          *ms = 0;
03342    }
03343 
03344    return chan;
03345 }
03346 
03347 static struct ast_channel *ast_waitfor_nandfds_complex(struct ast_channel **c, int n, int *ms)
03348 {
03349    struct timeval start = { 0 , 0 };
03350    int res = 0, i;
03351    struct epoll_event ev[25] = { { 0, } };
03352    struct timeval now = { 0, 0 };
03353    long whentohangup = 0, diff = 0, rms = *ms;
03354    struct ast_channel *winner = NULL;
03355 
03356    for (i = 0; i < n; i++) {
03357       if (c[i]->masq && ast_do_masquerade(c[i])) {
03358          ast_log(LOG_WARNING, "Masquerade failed\n");
03359          *ms = -1;
03360          return NULL;
03361       }
03362 
03363       ast_channel_lock(c[i]);
03364       if (!ast_tvzero(c[i]->whentohangup)) {
03365          if (whentohangup == 0)
03366             now = ast_tvnow();
03367          if ((diff = ast_tvdiff_ms(c[i]->whentohangup, now)) < 0) {
03368             c[i]->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
03369             ast_channel_unlock(c[i]);
03370             return c[i];
03371          }
03372          if (!whentohangup || whentohangup > diff)
03373             whentohangup = diff;
03374       }
03375       ast_channel_unlock(c[i]);
03376       CHECK_BLOCKING(c[i]);
03377    }
03378 
03379    rms = *ms;
03380    if (whentohangup) {
03381       rms = whentohangup;
03382       if (*ms >= 0 && *ms < rms)
03383          rms = *ms;
03384    }
03385 
03386    if (*ms > 0)
03387       start = ast_tvnow();
03388 
03389    res = epoll_wait(c[0]->epfd, ev, 25, rms);
03390 
03391    for (i = 0; i < n; i++)
03392       ast_clear_flag(c[i], AST_FLAG_BLOCKING);
03393 
03394    if (res < 0) {
03395       if (errno != EINTR)
03396          *ms = -1;
03397       return NULL;
03398    }
03399 
03400    if (whentohangup) {
03401       now = ast_tvnow();
03402       for (i = 0; i < n; i++) {
03403          if (!ast_tvzero(c[i]->whentohangup) && ast_tvdiff_ms(now, c[i]->whentohangup) >= 0) {
03404             c[i]->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
03405             if (!winner)
03406                winner = c[i];
03407          }
03408       }
03409    }
03410 
03411    if (!res) {
03412       *ms = 0;
03413       return winner;
03414    }
03415 
03416    for (i = 0; i < res; i++) {
03417       struct ast_epoll_data *aed = ev[i].data.ptr;
03418 
03419       if (!ev[i].events || !aed)
03420          continue;
03421 
03422       winner = aed->chan;
03423       if (ev[i].events & EPOLLPRI)
03424          ast_set_flag(winner, AST_FLAG_EXCEPTION);
03425       else
03426          ast_clear_flag(winner, AST_FLAG_EXCEPTION);
03427       winner->fdno = aed->which;
03428    }
03429 
03430    if (*ms > 0) {
03431       *ms -= ast_tvdiff_ms(ast_tvnow(), start);
03432       if (*ms < 0)
03433          *ms = 0;
03434    }
03435 
03436    return winner;
03437 }
03438 
03439 struct ast_channel *ast_waitfor_nandfds(struct ast_channel **c, int n, int *fds, int nfds,
03440                int *exception, int *outfd, int *ms)
03441 {
03442    /* Clear all provided values in one place. */
03443    if (outfd)
03444       *outfd = -99999;
03445    if (exception)
03446       *exception = 0;
03447 
03448    /* If no epoll file descriptor is available resort to classic nandfds */
03449    if (!n || nfds || c[0]->epfd == -1)
03450       return ast_waitfor_nandfds_classic(c, n, fds, nfds, exception, outfd, ms);
03451    else if (!nfds && n == 1)
03452       return ast_waitfor_nandfds_simple(c[0], ms);
03453    else
03454       return ast_waitfor_nandfds_complex(c, n, ms);
03455 }
03456 #endif
03457 
03458 struct ast_channel *ast_waitfor_n(struct ast_channel **c, int n, int *ms)
03459 {
03460    return ast_waitfor_nandfds(c, n, NULL, 0, NULL, NULL, ms);
03461 }
03462 
03463 int ast_waitfor(struct ast_channel *c, int ms)
03464 {
03465    int oldms = ms;   /* -1 if no timeout */
03466 
03467    ast_waitfor_nandfds(&c, 1, NULL, 0, NULL, NULL, &ms);
03468    if ((ms < 0) && (oldms < 0))
03469       ms = 0;
03470    return ms;
03471 }
03472 
03473 /* XXX never to be called with ms = -1 */
03474 int ast_waitfordigit(struct ast_channel *c, int ms)
03475 {
03476    return ast_waitfordigit_full(c, ms, -1, -1);
03477 }
03478 
03479 int ast_settimeout(struct ast_channel *c, unsigned int rate, int (*func)(const void *data), void *data)
03480 {
03481    int res;
03482    unsigned int real_rate = rate, max_rate;
03483 
03484    ast_channel_lock(c);
03485 
03486    if (c->timingfd == -1) {
03487       ast_channel_unlock(c);
03488       return -1;
03489    }
03490 
03491    if (!func) {
03492       rate = 0;
03493       data = NULL;
03494    }
03495 
03496    if (rate && rate > (max_rate = ast_timer_get_max_rate(c->timer))) {
03497       real_rate = max_rate;
03498    }
03499 
03500    ast_debug(1, "Scheduling timer at (%u requested / %u actual) timer ticks per second\n", rate, real_rate);
03501 
03502    res = ast_timer_set_rate(c->timer, real_rate);
03503 
03504    c->timingfunc = func;
03505    c->timingdata = data;
03506 
03507    ast_channel_unlock(c);
03508 
03509    return res;
03510 }
03511 
03512 int ast_waitfordigit_full(struct ast_channel *c, int ms, int audiofd, int cmdfd)
03513 {
03514    /* Stop if we're a zombie or need a soft hangup */
03515    if (ast_test_flag(c, AST_FLAG_ZOMBIE) || ast_check_hangup(c))
03516       return -1;
03517 
03518    /* Only look for the end of DTMF, don't bother with the beginning and don't emulate things */
03519    ast_set_flag(c, AST_FLAG_END_DTMF_ONLY);
03520 
03521    /* Wait for a digit, no more than ms milliseconds total. */
03522    
03523    while (ms) {
03524       struct ast_channel *rchan;
03525       int outfd=-1;
03526 
03527       errno = 0;
03528       rchan = ast_waitfor_nandfds(&c, 1, &cmdfd, (cmdfd > -1) ? 1 : 0, NULL, &outfd, &ms);
03529       
03530       if (!rchan && outfd < 0 && ms) {
03531          if (errno == 0 || errno == EINTR)
03532             continue;
03533          ast_log(LOG_WARNING, "Wait failed (%s)\n", strerror(errno));
03534          ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY);
03535          return -1;
03536       } else if (outfd > -1) {
03537          /* The FD we were watching has something waiting */
03538          ast_log(LOG_WARNING, "The FD we were waiting for has something waiting. Waitfordigit returning numeric 1\n");
03539          ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY);
03540          return 1;
03541       } else if (rchan) {
03542          int res;
03543          struct ast_frame *f = ast_read(c);
03544          if (!f)
03545             return -1;
03546 
03547          switch (f->frametype) {
03548          case AST_FRAME_DTMF_BEGIN:
03549             break;
03550          case AST_FRAME_DTMF_END:
03551             res = f->subclass.integer;
03552             ast_frfree(f);
03553             ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY);
03554             return res;
03555          case AST_FRAME_CONTROL:
03556             switch (f->subclass.integer) {
03557             case AST_CONTROL_HANGUP:
03558                ast_frfree(f);
03559                ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY);
03560                return -1;
03561             case AST_CONTROL_RINGING:
03562             case AST_CONTROL_ANSWER:
03563             case AST_CONTROL_SRCUPDATE:
03564             case AST_CONTROL_SRCCHANGE:
03565             case AST_CONTROL_CONNECTED_LINE:
03566             case AST_CONTROL_REDIRECTING:
03567             case AST_CONTROL_UPDATE_RTP_PEER:
03568             case -1:
03569                /* Unimportant */
03570                break;
03571             default:
03572                ast_log(LOG_WARNING, "Unexpected control subclass '%d'\n", f->subclass.integer);
03573                break;
03574             }
03575             break;
03576          case AST_FRAME_VOICE:
03577             /* Write audio if appropriate */
03578             if (audiofd > -1) {
03579                if (write(audiofd, f->data.ptr, f->datalen) < 0) {
03580                   ast_log(LOG_WARNING, "write() failed: %s\n", strerror(errno));
03581                }
03582             }
03583          default:
03584             /* Ignore */
03585             break;
03586          }
03587          ast_frfree(f);
03588       }
03589    }
03590 
03591    ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY);
03592 
03593    return 0; /* Time is up */
03594 }
03595 
03596 static void send_dtmf_event(struct ast_channel *chan, const char *direction, const char digit, const char *begin, const char *end)
03597 {
03598    ast_manager_event(chan, EVENT_FLAG_DTMF,
03599          "DTMF",
03600          "Channel: %s\r\n"
03601          "Uniqueid: %s\r\n"
03602          "Digit: %c\r\n"
03603          "Direction: %s\r\n"
03604          "Begin: %s\r\n"
03605          "End: %s\r\n",
03606          chan->name, chan->uniqueid, digit, direction, begin, end);
03607 }
03608 
03609 static void ast_read_generator_actions(struct ast_channel *chan, struct ast_frame *f)
03610 {
03611    if (chan->generator && chan->generator->generate && chan->generatordata &&  !ast_internal_timing_enabled(chan)) {
03612       void *tmp = chan->generatordata;
03613       int (*generate)(struct ast_channel *chan, void *tmp, int datalen, int samples) = chan->generator->generate;
03614       int res;
03615       int samples;
03616 
03617       if (chan->timingfunc) {
03618          ast_debug(1, "Generator got voice, switching to phase locked mode\n");
03619          ast_settimeout(chan, 0, NULL, NULL);
03620       }
03621 
03622       chan->generatordata = NULL;     /* reset, to let writes go through */
03623 
03624       if (f->subclass.codec != chan->writeformat) {
03625          float factor;
03626          factor = ((float) ast_format_rate(chan->writeformat)) / ((float) ast_format_rate(f->subclass.codec));
03627          samples = (int) ( ((float) f->samples) * factor );
03628       } else {
03629          samples = f->samples;
03630       }
03631       
03632       /* This unlock is here based on two assumptions that hold true at this point in the
03633        * code. 1) this function is only called from within __ast_read() and 2) all generators
03634        * call ast_write() in their generate callback.
03635        *
03636        * The reason this is added is so that when ast_write is called, the lock that occurs 
03637        * there will not recursively lock the channel. Doing this will cause intended deadlock 
03638        * avoidance not to work in deeper functions
03639        */
03640       ast_channel_unlock(chan);
03641       res = generate(chan, tmp, f->datalen, samples);
03642       ast_channel_lock(chan);
03643       chan->generatordata = tmp;
03644       if (res) {
03645          ast_debug(1, "Auto-deactivating generator\n");
03646          ast_deactivate_generator(chan);
03647       }
03648 
03649    } else if (f->frametype == AST_FRAME_CNG) {
03650       if (chan->generator && !chan->timingfunc && (chan->timingfd > -1)) {
03651          ast_debug(1, "Generator got CNG, switching to timed mode\n");
03652          ast_settimeout(chan, 50, generator_force, chan);
03653       }
03654    }
03655 }
03656 
03657 static inline void queue_dtmf_readq(struct ast_channel *chan, struct ast_frame *f)
03658 {
03659    struct ast_frame *fr = &chan->dtmff;
03660 
03661    fr->frametype = AST_FRAME_DTMF_END;
03662    fr->subclass.integer = f->subclass.integer;
03663    fr->len = f->len;
03664 
03665    /* The only time this function will be called is for a frame that just came
03666     * out of the channel driver.  So, we want to stick it on the tail of the
03667     * readq. */
03668 
03669    ast_queue_frame(chan, fr);
03670 }
03671 
03672 /*!
03673  * \brief Determine whether or not we should ignore DTMF in the readq
03674  */
03675 static inline int should_skip_dtmf(struct ast_channel *chan)
03676 {
03677    if (ast_test_flag(chan, AST_FLAG_DEFER_DTMF | AST_FLAG_EMULATE_DTMF)) {
03678       /* We're in the middle of emulating a digit, or DTMF has been
03679        * explicitly deferred.  Skip this digit, then. */
03680       return 1;
03681    }
03682          
03683    if (!ast_tvzero(chan->dtmf_tv) && 
03684          ast_tvdiff_ms(ast_tvnow(), chan->dtmf_tv) < AST_MIN_DTMF_GAP) {
03685       /* We're not in the middle of a digit, but it hasn't been long enough
03686        * since the last digit, so we'll have to skip DTMF for now. */
03687       return 1;
03688    }
03689 
03690    return 0;
03691 }
03692 
03693 /*!
03694  * \brief calculates the number of samples to jump forward with in a monitor stream.
03695  
03696  * \note When using ast_seekstream() with the read and write streams of a monitor,
03697  * the number of samples to seek forward must be of the same sample rate as the stream
03698  * or else the jump will not be calculated correctly.
03699  *
03700  * \retval number of samples to seek forward after rate conversion.
03701  */
03702 static inline int calc_monitor_jump(int samples, int sample_rate, int seek_rate)
03703 {
03704    int diff = sample_rate - seek_rate;
03705 
03706    if (diff > 0) {
03707       samples = samples / (float) (sample_rate / seek_rate);
03708    } else if (diff < 0) {
03709       samples = samples * (float) (seek_rate / sample_rate);
03710    }
03711 
03712    return samples;
03713 }
03714 
03715 static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio)
03716 {
03717    struct ast_frame *f = NULL;   /* the return value */
03718    int blah;
03719    int prestate;
03720    int cause = 0;
03721 
03722    /* this function is very long so make sure there is only one return
03723     * point at the end (there are only two exceptions to this).
03724     */
03725 
03726    if (chan->masq) {
03727       if (ast_do_masquerade(chan))
03728          ast_log(LOG_WARNING, "Failed to perform masquerade\n");
03729       else
03730          f =  &ast_null_frame;
03731       return f;
03732    }
03733 
03734    /* if here, no masq has happened, lock the channel and proceed */
03735    ast_channel_lock(chan);
03736 
03737    /* Stop if we're a zombie or need a soft hangup */
03738    if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
03739       if (chan->generator)
03740          ast_deactivate_generator(chan);
03741 
03742       /*
03743        * It is possible for chan->_softhangup to be set and there
03744        * still be control frames that need to be read.  Instead of
03745        * just going to 'done' in the case of ast_check_hangup(), we
03746        * need to queue the end-of-Q frame so that it can mark the end
03747        * of the read queue.  If there are frames to be read,
03748        * ast_queue_control() will be called repeatedly, but will only
03749        * queue the first end-of-Q frame.
03750        */
03751       if (chan->_softhangup) {
03752          ast_queue_control(chan, AST_CONTROL_END_OF_Q);
03753       } else {
03754          goto done;
03755       }
03756    } else {
03757 #ifdef AST_DEVMODE
03758       /*
03759        * The ast_waitfor() code records which of the channel's file
03760        * descriptors reported that data is available.  In theory,
03761        * ast_read() should only be called after ast_waitfor() reports
03762        * that a channel has data available for reading.  However,
03763        * there still may be some edge cases throughout the code where
03764        * ast_read() is called improperly.  This can potentially cause
03765        * problems, so if this is a developer build, make a lot of
03766        * noise if this happens so that it can be addressed.
03767        *
03768        * One of the potential problems is blocking on a dead channel.
03769        */
03770       if (chan->fdno == -1) {
03771          ast_log(LOG_ERROR,
03772             "ast_read() on chan '%s' called with no recorded file descriptor.\n",
03773             chan->name);
03774       }
03775 #endif
03776    }
03777 
03778    prestate = chan->_state;
03779 
03780    /* Read and ignore anything on the alertpipe, but read only
03781       one sizeof(blah) per frame that we send from it */
03782    if (chan->alertpipe[0] > -1) {
03783       int flags = fcntl(chan->alertpipe[0], F_GETFL);
03784       /* For some odd reason, the alertpipe occasionally loses nonblocking status,
03785        * which immediately causes a deadlock scenario.  Detect and prevent this. */
03786       if ((flags & O_NONBLOCK) == 0) {
03787          ast_log(LOG_ERROR, "Alertpipe on channel %s lost O_NONBLOCK?!!\n", chan->name);
03788          if (fcntl(chan->alertpipe[0], F_SETFL, flags | O_NONBLOCK) < 0) {
03789             ast_log(LOG_WARNING, "Unable to set alertpipe nonblocking! (%d: %s)\n", errno, strerror(errno));
03790             f = &ast_null_frame;
03791             goto done;
03792          }
03793       }
03794       if (read(chan->alertpipe[0], &blah, sizeof(blah)) < 0) {
03795          if (errno != EINTR && errno != EAGAIN)
03796             ast_log(LOG_WARNING, "read() failed: %s\n", strerror(errno));
03797       }
03798    }
03799 
03800    if (chan->timingfd > -1 && chan->fdno == AST_TIMING_FD) {
03801       enum ast_timer_event res;
03802 
03803       ast_clear_flag(chan, AST_FLAG_EXCEPTION);
03804 
03805       res = ast_timer_get_event(chan->timer);
03806 
03807       switch (res) {
03808       case AST_TIMING_EVENT_EXPIRED:
03809          ast_timer_ack(chan->timer, 1);
03810 
03811          if (chan->timingfunc) {
03812             /* save a copy of func/data before unlocking the channel */
03813             int (*func)(const void *) = chan->timingfunc;
03814             void *data = chan->timingdata;
03815             chan->fdno = -1;
03816             ast_channel_unlock(chan);
03817             func(data);
03818          } else {
03819             ast_timer_set_rate(chan->timer, 0);
03820             chan->fdno = -1;
03821             ast_channel_unlock(chan);
03822          }
03823 
03824          /* cannot 'goto done' because the channel is already unlocked */
03825          return &ast_null_frame;
03826 
03827       case AST_TIMING_EVENT_CONTINUOUS:
03828          if (AST_LIST_EMPTY(&chan->readq) || 
03829             !AST_LIST_NEXT(AST_LIST_FIRST(&chan->readq), frame_list)) {
03830             ast_timer_disable_continuous(chan->timer);
03831          }
03832          break;
03833       }
03834 
03835    } else if (chan->fds[AST_GENERATOR_FD] > -1 && chan->fdno == AST_GENERATOR_FD) {
03836       /* if the AST_GENERATOR_FD is set, call the generator with args
03837        * set to -1 so it can do whatever it needs to.
03838        */
03839       void *tmp = chan->generatordata;
03840       chan->generatordata = NULL;     /* reset to let ast_write get through */
03841       chan->generator->generate(chan, tmp, -1, -1);
03842       chan->generatordata = tmp;
03843       f = &ast_null_frame;
03844       chan->fdno = -1;
03845       goto done;
03846    }
03847 
03848    /* Check for pending read queue */
03849    if (!AST_LIST_EMPTY(&chan->readq)) {
03850       int skip_dtmf = should_skip_dtmf(chan);
03851 
03852       AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->readq, f, frame_list) {
03853          /* We have to be picky about which frame we pull off of the readq because
03854           * there are cases where we want to leave DTMF frames on the queue until
03855           * some later time. */
03856 
03857          if ( (f->frametype == AST_FRAME_DTMF_BEGIN || f->frametype == AST_FRAME_DTMF_END) && skip_dtmf) {
03858             continue;
03859          }
03860 
03861          AST_LIST_REMOVE_CURRENT(frame_list);
03862          break;
03863       }
03864       AST_LIST_TRAVERSE_SAFE_END;
03865       
03866       if (!f) {
03867          /* There were no acceptable frames on the readq. */
03868          f = &ast_null_frame;
03869          if (chan->alertpipe[0] > -1) {
03870             int poke = 0;
03871             /* Restore the state of the alertpipe since we aren't ready for any
03872              * of the frames in the readq. */
03873             if (write(chan->alertpipe[1], &poke, sizeof(poke)) != sizeof(poke)) {
03874                ast_log(LOG_ERROR, "Failed to write to alertpipe: %s\n", strerror(errno));
03875             }
03876          }
03877       }
03878 
03879       /* Interpret hangup and end-of-Q frames to return NULL */
03880       /* XXX why not the same for frames from the channel ? */
03881       if (f->frametype == AST_FRAME_CONTROL) {
03882          switch (f->subclass.integer) {
03883          case AST_CONTROL_HANGUP:
03884             chan->_softhangup |= AST_SOFTHANGUP_DEV;
03885             cause = f->data.uint32;
03886             /* Fall through */
03887          case AST_CONTROL_END_OF_Q:
03888             ast_frfree(f);
03889             f = NULL;
03890             break;
03891          default:
03892             break;
03893          }
03894       }
03895    } else {
03896       chan->blocker = pthread_self();
03897       if (ast_test_flag(chan, AST_FLAG_EXCEPTION)) {
03898          if (chan->tech->exception)
03899             f = chan->tech->exception(chan);
03900          else {
03901             ast_log(LOG_WARNING, "Exception flag set on '%s', but no exception handler\n", chan->name);
03902             f = &ast_null_frame;
03903          }
03904          /* Clear the exception flag */
03905          ast_clear_flag(chan, AST_FLAG_EXCEPTION);
03906       } else if (chan->tech && chan->tech->read)
03907          f = chan->tech->read(chan);
03908       else
03909          ast_log(LOG_WARNING, "No read routine on channel %s\n", chan->name);
03910    }
03911 
03912    /*
03913     * Reset the recorded file descriptor that triggered this read so that we can
03914     * easily detect when ast_read() is called without properly using ast_waitfor().
03915     */
03916    chan->fdno = -1;
03917 
03918    /* Perform the framehook read event here. After the frame enters the framehook list
03919     * there is no telling what will happen, <insert mad scientist laugh here>!!! */
03920    f = ast_framehook_list_read_event(chan->framehooks, f);
03921 
03922    if (f) {
03923       struct ast_frame *readq_tail = AST_LIST_LAST(&chan->readq);
03924       struct ast_control_read_action_payload *read_action_payload;
03925       struct ast_party_connected_line connected;
03926 
03927       /* if the channel driver returned more than one frame, stuff the excess
03928          into the readq for the next ast_read call
03929       */
03930       if (AST_LIST_NEXT(f, frame_list)) {
03931          ast_queue_frame(chan, AST_LIST_NEXT(f, frame_list));
03932          ast_frfree(AST_LIST_NEXT(f, frame_list));
03933          AST_LIST_NEXT(f, frame_list) = NULL;
03934       }
03935 
03936       switch (f->frametype) {
03937       case AST_FRAME_CONTROL:
03938          if (f->subclass.integer == AST_CONTROL_ANSWER) {
03939             if (!ast_test_flag(chan, AST_FLAG_OUTGOING)) {
03940                ast_debug(1, "Ignoring answer on an inbound call!\n");
03941                ast_frfree(f);
03942                f = &ast_null_frame;
03943             } else if (prestate == AST_STATE_UP && ast_bridged_channel(chan)) {
03944                ast_debug(1, "Dropping duplicate answer!\n");
03945                ast_frfree(f);
03946                f = &ast_null_frame;
03947             } else {
03948                /* Answer the CDR */
03949                ast_setstate(chan, AST_STATE_UP);
03950                /* removed a call to ast_cdr_answer(chan->cdr) from here. */
03951                ast_cel_report_event(chan, AST_CEL_ANSWER, NULL, NULL, NULL);
03952             }
03953          } else if (f->subclass.integer == AST_CONTROL_READ_ACTION) {
03954             read_action_payload = f->data.ptr;
03955             switch (read_action_payload->action) {
03956             case AST_FRAME_READ_ACTION_CONNECTED_LINE_MACRO:
03957                ast_party_connected_line_init(&connected);
03958                ast_party_connected_line_copy(&connected, &chan->connected);
03959                if (ast_connected_line_parse_data(read_action_payload->payload,
03960                   read_action_payload->payload_size, &connected)) {
03961                   ast_party_connected_line_free(&connected);
03962                   break;
03963                }
03964                if (ast_channel_connected_line_macro(NULL, chan, &connected, 1, 0)) {
03965                   ast_indicate_data(chan, AST_CONTROL_CONNECTED_LINE,
03966                      read_action_payload->payload,
03967                      read_action_payload->payload_size);
03968                }
03969                ast_party_connected_line_free(&connected);
03970                break;
03971             }
03972             ast_frfree(f);
03973             f = &ast_null_frame;
03974          }
03975          break;
03976       case AST_FRAME_DTMF_END:
03977          send_dtmf_event(chan, "Received", f->subclass.integer, "No", "Yes");
03978          ast_log(LOG_DTMF, "DTMF end '%c' received on %s, duration %ld ms\n", f->subclass.integer, chan->name, f->len);
03979          /* Queue it up if DTMF is deferred, or if DTMF emulation is forced. */
03980          if (ast_test_flag(chan, AST_FLAG_DEFER_DTMF) || ast_test_flag(chan, AST_FLAG_EMULATE_DTMF)) {
03981             queue_dtmf_readq(chan, f);
03982             ast_frfree(f);
03983             f = &ast_null_frame;
03984          } else if (!ast_test_flag(chan, AST_FLAG_IN_DTMF | AST_FLAG_END_DTMF_ONLY)) {
03985             if (!ast_tvzero(chan->dtmf_tv) && 
03986                 ast_tvdiff_ms(ast_tvnow(), chan->dtmf_tv) < AST_MIN_DTMF_GAP) {
03987                /* If it hasn't been long enough, defer this digit */
03988                queue_dtmf_readq(chan, f);
03989                ast_frfree(f);
03990                f = &ast_null_frame;
03991             } else {
03992                /* There was no begin, turn this into a begin and send the end later */
03993                f->frametype = AST_FRAME_DTMF_BEGIN;
03994                ast_set_flag(chan, AST_FLAG_EMULATE_DTMF);
03995                chan->emulate_dtmf_digit = f->subclass.integer;
03996                chan->dtmf_tv = ast_tvnow();
03997                if (f->len) {
03998                   if (f->len > AST_MIN_DTMF_DURATION)
03999                      chan->emulate_dtmf_duration = f->len;
04000                   else 
04001                      chan->emulate_dtmf_duration = AST_MIN_DTMF_DURATION;
04002                } else
04003                   chan->emulate_dtmf_duration = AST_DEFAULT_EMULATE_DTMF_DURATION;
04004                ast_log(LOG_DTMF, "DTMF begin emulation of '%c' with duration %u queued on %s\n", f->subclass.integer, chan->emulate_dtmf_duration, chan->name);
04005             }
04006             if (chan->audiohooks) {
04007                struct ast_frame *old_frame = f;
04008                /*!
04009                 * \todo XXX It is possible to write a digit to the audiohook twice
04010                 * if the digit was originally read while the channel was in autoservice. */
04011                f = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_READ, f);
04012                if (old_frame != f)
04013                   ast_frfree(old_frame);
04014             }
04015          } else {
04016             struct timeval now = ast_tvnow();
04017             if (ast_test_flag(chan, AST_FLAG_IN_DTMF)) {
04018                ast_log(LOG_DTMF, "DTMF end accepted with begin '%c' on %s\n", f->subclass.integer, chan->name);
04019                ast_clear_flag(chan, AST_FLAG_IN_DTMF);
04020                if (!f->len)
04021                   f->len = ast_tvdiff_ms(now, chan->dtmf_tv);
04022 
04023                /* detect tones that were received on
04024                 * the wire with durations shorter than
04025                 * AST_MIN_DTMF_DURATION and set f->len
04026                 * to the actual duration of the DTMF
04027                 * frames on the wire.  This will cause
04028                 * dtmf emulation to be triggered later
04029                 * on.
04030                 */
04031                if (ast_tvdiff_ms(now, chan->dtmf_tv) < AST_MIN_DTMF_DURATION) {
04032                   f->len = ast_tvdiff_ms(now, chan->dtmf_tv);
04033                   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, chan->name);
04034                }
04035             } else if (!f->len) {
04036                ast_log(LOG_DTMF, "DTMF end accepted without begin '%c' on %s\n", f->subclass.integer, chan->name);
04037                f->len = AST_MIN_DTMF_DURATION;
04038             }
04039             if (f->len < AST_MIN_DTMF_DURATION && !ast_test_flag(chan, AST_FLAG_END_DTMF_ONLY)) {
04040                ast_log(LOG_DTMF, "DTMF end '%c' has duration %ld but want minimum %d, emulating on %s\n", f->subclass.integer, f->len, AST_MIN_DTMF_DURATION, chan->name);
04041                ast_set_flag(chan, AST_FLAG_EMULATE_DTMF);
04042                chan->emulate_dtmf_digit = f->subclass.integer;
04043                chan->emulate_dtmf_duration = AST_MIN_DTMF_DURATION - f->len;
04044                ast_frfree(f);
04045                f = &ast_null_frame;
04046             } else {
04047                ast_log(LOG_DTMF, "DTMF end passthrough '%c' on %s\n", f->subclass.integer, chan->name);
04048                if (f->len < AST_MIN_DTMF_DURATION) {
04049                   f->len = AST_MIN_DTMF_DURATION;
04050                }
04051                chan->dtmf_tv = now;
04052             }
04053             if (chan->audiohooks) {
04054                struct ast_frame *old_frame = f;
04055                f = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_READ, f);
04056                if (old_frame != f)
04057                   ast_frfree(old_frame);
04058             }
04059          }
04060          break;
04061       case AST_FRAME_DTMF_BEGIN:
04062          send_dtmf_event(chan, "Received", f->subclass.integer, "Yes", "No");
04063          ast_log(LOG_DTMF, "DTMF begin '%c' received on %s\n", f->subclass.integer, chan->name);
04064          if ( ast_test_flag(chan, AST_FLAG_DEFER_DTMF | AST_FLAG_END_DTMF_ONLY | AST_FLAG_EMULATE_DTMF) || 
04065              (!ast_tvzero(chan->dtmf_tv) && 
04066                ast_tvdiff_ms(ast_tvnow(), chan->dtmf_tv) < AST_MIN_DTMF_GAP) ) {
04067             ast_log(LOG_DTMF, "DTMF begin ignored '%c' on %s\n", f->subclass.integer, chan->name);
04068             ast_frfree(f);
04069             f = &ast_null_frame;
04070          } else {
04071             ast_set_flag(chan, AST_FLAG_IN_DTMF);
04072             chan->dtmf_tv = ast_tvnow();
04073             ast_log(LOG_DTMF, "DTMF begin passthrough '%c' on %s\n", f->subclass.integer, chan->name);
04074          }
04075          break;
04076       case AST_FRAME_NULL:
04077          /* The EMULATE_DTMF flag must be cleared here as opposed to when the duration
04078           * is reached , because we want to make sure we pass at least one
04079           * voice frame through before starting the next digit, to ensure a gap
04080           * between DTMF digits. */
04081          if (ast_test_flag(chan, AST_FLAG_EMULATE_DTMF)) {
04082             struct timeval now = ast_tvnow();
04083             if (!chan->emulate_dtmf_duration) {
04084                ast_clear_flag(chan, AST_FLAG_EMULATE_DTMF);
04085                chan->emulate_dtmf_digit = 0;
04086             } else if (ast_tvdiff_ms(now, chan->dtmf_tv) >= chan->emulate_dtmf_duration) {
04087                chan->emulate_dtmf_duration = 0;
04088                ast_frfree(f);
04089                f = &chan->dtmff;
04090                f->frametype = AST_FRAME_DTMF_END;
04091                f->subclass.integer = chan->emulate_dtmf_digit;
04092                f->len = ast_tvdiff_ms(now, chan->dtmf_tv);
04093                chan->dtmf_tv = now;
04094                ast_clear_flag(chan, AST_FLAG_EMULATE_DTMF);
04095                chan->emulate_dtmf_digit = 0;
04096                ast_log(LOG_DTMF, "DTMF end emulation of '%c' queued on %s\n", f->subclass.integer, chan->name);
04097                if (chan->audiohooks) {
04098                   struct ast_frame *old_frame = f;
04099                   f = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_READ, f);
04100                   if (old_frame != f) {
04101                      ast_frfree(old_frame);
04102                   }
04103                }
04104             }
04105          }
04106          break;
04107       case AST_FRAME_VOICE:
04108          /* The EMULATE_DTMF flag must be cleared here as opposed to when the duration
04109           * is reached , because we want to make sure we pass at least one
04110           * voice frame through before starting the next digit, to ensure a gap
04111           * between DTMF digits. */
04112          if (ast_test_flag(chan, AST_FLAG_EMULATE_DTMF) && !chan->emulate_dtmf_duration) {
04113             ast_clear_flag(chan, AST_FLAG_EMULATE_DTMF);
04114             chan->emulate_dtmf_digit = 0;
04115          }
04116 
04117          if (dropaudio || ast_test_flag(chan, AST_FLAG_IN_DTMF)) {
04118             if (dropaudio)
04119                ast_read_generator_actions(chan, f);
04120             ast_frfree(f);
04121             f = &ast_null_frame;
04122          }
04123 
04124          if (ast_test_flag(chan, AST_FLAG_EMULATE_DTMF) && !ast_test_flag(chan, AST_FLAG_IN_DTMF)) {
04125             struct timeval now = ast_tvnow();
04126             if (ast_tvdiff_ms(now, chan->dtmf_tv) >= chan->emulate_dtmf_duration) {
04127                chan->emulate_dtmf_duration = 0;
04128                ast_frfree(f);
04129                f = &chan->dtmff;
04130                f->frametype = AST_FRAME_DTMF_END;
04131                f->subclass.integer = chan->emulate_dtmf_digit;
04132                f->len = ast_tvdiff_ms(now, chan->dtmf_tv);
04133                chan->dtmf_tv = now;
04134                if (chan->audiohooks) {
04135                   struct ast_frame *old_frame = f;
04136                   f = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_READ, f);
04137                   if (old_frame != f)
04138                      ast_frfree(old_frame);
04139                }
04140                ast_log(LOG_DTMF, "DTMF end emulation of '%c' queued on %s\n", f->subclass.integer, chan->name);
04141             } else {
04142                /* Drop voice frames while we're still in the middle of the digit */
04143                ast_frfree(f);
04144                f = &ast_null_frame;
04145             }
04146          } else if ((f->frametype == AST_FRAME_VOICE) && !(f->subclass.codec & chan->nativeformats)) {
04147             /* This frame is not one of the current native formats -- drop it on the floor */
04148             char to[200];
04149             ast_log(LOG_NOTICE, "Dropping incompatible voice frame on %s of format %s since our native format has changed to %s\n",
04150                chan->name, ast_getformatname(f->subclass.codec), ast_getformatname_multiple(to, sizeof(to), chan->nativeformats));
04151             ast_frfree(f);
04152             f = &ast_null_frame;
04153          } else if ((f->frametype == AST_FRAME_VOICE)) {
04154             /* Send frame to audiohooks if present */
04155             if (chan->audiohooks) {
04156                struct ast_frame *old_frame = f;
04157                f = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_READ, f);
04158                if (old_frame != f)
04159                   ast_frfree(old_frame);
04160             }
04161             if (chan->monitor && chan->monitor->read_stream ) {
04162                /* XXX what does this do ? */
04163 #ifndef MONITOR_CONSTANT_DELAY
04164                int jump = chan->outsmpl - chan->insmpl - 4 * f->samples;
04165                if (jump >= 0) {
04166                   jump = calc_monitor_jump((chan->outsmpl - chan->insmpl), ast_format_rate(f->subclass.codec), ast_format_rate(chan->monitor->read_stream->fmt->format));
04167                   if (ast_seekstream(chan->monitor->read_stream, jump, SEEK_FORCECUR) == -1)
04168                      ast_log(LOG_WARNING, "Failed to perform seek in monitoring read stream, synchronization between the files may be broken\n");
04169                   chan->insmpl += (chan->outsmpl - chan->insmpl) + f->samples;
04170                } else
04171                   chan->insmpl+= f->samples;
04172 #else
04173                int jump = calc_monitor_jump((chan->outsmpl - chan->insmpl), ast_format_rate(f->subclass.codec), ast_format_rate(chan->monitor->read_stream->fmt->format));
04174                if (jump - MONITOR_DELAY >= 0) {
04175                   if (ast_seekstream(chan->monitor->read_stream, jump - f->samples, SEEK_FORCECUR) == -1)
04176                      ast_log(LOG_WARNING, "Failed to perform seek in monitoring read stream, synchronization between the files may be broken\n");
04177                   chan->insmpl += chan->outsmpl - chan->insmpl;
04178                } else
04179                   chan->insmpl += f->samples;
04180 #endif
04181                if (chan->monitor->state == AST_MONITOR_RUNNING) {
04182                   if (ast_writestream(chan->monitor->read_stream, f) < 0)
04183                      ast_log(LOG_WARNING, "Failed to write data to channel monitor read stream\n");
04184                }
04185             }
04186 
04187             if (chan->readtrans && (f = ast_translate(chan->readtrans, f, 1)) == NULL) {
04188                f = &ast_null_frame;
04189             }
04190 
04191             /* it is possible for the translation process on chan->readtrans to have
04192                produced multiple frames from the single input frame we passed it; if
04193                this happens, queue the additional frames *before* the frames we may
04194                have queued earlier. if the readq was empty, put them at the head of
04195                the queue, and if it was not, put them just after the frame that was
04196                at the end of the queue.
04197             */
04198             if (AST_LIST_NEXT(f, frame_list)) {
04199                if (!readq_tail) {
04200                   ast_queue_frame_head(chan, AST_LIST_NEXT(f, frame_list));
04201                } else {
04202                   __ast_queue_frame(chan, AST_LIST_NEXT(f, frame_list), 0, readq_tail);
04203                }
04204                ast_frfree(AST_LIST_NEXT(f, frame_list));
04205                AST_LIST_NEXT(f, frame_list) = NULL;
04206             }
04207 
04208             /* Run generator sitting on the line if timing device not available
04209             * and synchronous generation of outgoing frames is necessary       */
04210             ast_read_generator_actions(chan, f);
04211          }
04212          break;
04213       default:
04214          /* Just pass it on! */
04215          break;
04216       }
04217    } else {
04218       /* Make sure we always return NULL in the future */
04219       if (!chan->_softhangup) {
04220          chan->_softhangup |= AST_SOFTHANGUP_DEV;
04221       }
04222       if (cause)
04223          chan->hangupcause = cause;
04224       if (chan->generator)
04225          ast_deactivate_generator(chan);
04226       /* We no longer End the CDR here */
04227    }
04228 
04229    /* High bit prints debugging */
04230    if (chan->fin & DEBUGCHAN_FLAG)
04231       ast_frame_dump(chan->name, f, "<<");
04232    chan->fin = FRAMECOUNT_INC(chan->fin);
04233 
04234 done:
04235    if (chan->music_state && chan->generator && chan->generator->digit && f && f->frametype == AST_FRAME_DTMF_END)
04236       chan->generator->digit(chan, f->subclass.integer);
04237 
04238    if (chan->audiohooks && ast_audiohook_write_list_empty(chan->audiohooks)) {
04239       /* The list gets recreated if audiohooks are added again later */
04240       ast_audiohook_detach_list(chan->audiohooks);
04241       chan->audiohooks = NULL;
04242    }
04243    ast_channel_unlock(chan);
04244    return f;
04245 }
04246 
04247 int ast_internal_timing_enabled(struct ast_channel *chan)
04248 {
04249    return (ast_opt_internal_timing && chan->timingfd > -1);
04250 }
04251 
04252 struct ast_frame *ast_read(struct ast_channel *chan)
04253 {
04254    return __ast_read(chan, 0);
04255 }
04256 
04257 struct ast_frame *ast_read_noaudio(struct ast_channel *chan)
04258 {
04259    return __ast_read(chan, 1);
04260 }
04261 
04262 int ast_indicate(struct ast_channel *chan, int condition)
04263 {
04264    return ast_indicate_data(chan, condition, NULL, 0);
04265 }
04266 
04267 static int attribute_const is_visible_indication(enum ast_control_frame_type condition)
04268 {
04269    /* Don't include a default case here so that we get compiler warnings
04270     * when a new type is added. */
04271 
04272    switch (condition) {
04273    case AST_CONTROL_PROGRESS:
04274    case AST_CONTROL_PROCEEDING:
04275    case AST_CONTROL_VIDUPDATE:
04276    case AST_CONTROL_SRCUPDATE:
04277    case AST_CONTROL_SRCCHANGE:
04278    case AST_CONTROL_RADIO_KEY:
04279    case AST_CONTROL_RADIO_UNKEY:
04280    case AST_CONTROL_OPTION:
04281    case AST_CONTROL_WINK:
04282    case AST_CONTROL_FLASH:
04283    case AST_CONTROL_OFFHOOK:
04284    case AST_CONTROL_TAKEOFFHOOK:
04285    case AST_CONTROL_ANSWER:
04286    case AST_CONTROL_HANGUP:
04287    case AST_CONTROL_CONNECTED_LINE:
04288    case AST_CONTROL_REDIRECTING:
04289    case AST_CONTROL_TRANSFER:
04290    case AST_CONTROL_T38_PARAMETERS:
04291    case _XXX_AST_CONTROL_T38:
04292    case AST_CONTROL_CC:
04293    case AST_CONTROL_READ_ACTION:
04294    case AST_CONTROL_AOC:
04295    case AST_CONTROL_END_OF_Q:
04296    case AST_CONTROL_UPDATE_RTP_PEER:
04297       break;
04298 
04299    case AST_CONTROL_INCOMPLETE:
04300    case AST_CONTROL_CONGESTION:
04301    case AST_CONTROL_BUSY:
04302    case AST_CONTROL_RINGING:
04303    case AST_CONTROL_RING:
04304    case AST_CONTROL_HOLD:
04305       /* You can hear these */
04306       return 1;
04307 
04308    case AST_CONTROL_UNHOLD:
04309       /* This is a special case.  You stop hearing this. */
04310       break;
04311    }
04312 
04313    return 0;
04314 }
04315 
04316 int ast_indicate_data(struct ast_channel *chan, int _condition,
04317       const void *data, size_t datalen)
04318 {
04319    /* By using an enum, we'll get compiler warnings for values not handled 
04320     * in switch statements. */
04321    enum ast_control_frame_type condition = _condition;
04322    struct ast_tone_zone_sound *ts = NULL;
04323    int res;
04324    /* this frame is used by framehooks. if it is set, we must free it at the end of this function */
04325    struct ast_frame *awesome_frame = NULL;
04326 
04327    ast_channel_lock(chan);
04328 
04329    /* Don't bother if the channel is about to go away, anyway. */
04330    if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
04331       res = -1;
04332       goto indicate_cleanup;
04333    }
04334 
04335    if (!ast_framehook_list_is_empty(chan->framehooks)) {
04336       /* Do framehooks now, do it, go, go now */
04337       struct ast_frame frame = {
04338          .frametype = AST_FRAME_CONTROL,
04339          .subclass.integer = condition,
04340          .data.ptr = (void *) data, /* this cast from const is only okay because we do the ast_frdup below */
04341          .datalen = datalen
04342       };
04343 
04344       /* we have now committed to freeing this frame */
04345       awesome_frame = ast_frdup(&frame);
04346 
04347       /* who knows what we will get back! the anticipation is killing me. */
04348       if (!(awesome_frame = ast_framehook_list_write_event(chan->framehooks, awesome_frame))
04349          || awesome_frame->frametype != AST_FRAME_CONTROL) {
04350 
04351          res = 0;
04352          goto indicate_cleanup;
04353       }
04354 
04355       condition = awesome_frame->subclass.integer;
04356       data = awesome_frame->data.ptr;
04357       datalen = awesome_frame->datalen;
04358    }
04359 
04360    switch (condition) {
04361    case AST_CONTROL_CONNECTED_LINE:
04362       {
04363          struct ast_party_connected_line connected;
04364 
04365          ast_party_connected_line_set_init(&connected, &chan->connected);
04366          res = ast_connected_line_parse_data(data, datalen, &connected);
04367          if (!res) {
04368             ast_channel_set_connected_line(chan, &connected, NULL);
04369          }
04370          ast_party_connected_line_free(&connected);
04371       }
04372       break;
04373 
04374    case AST_CONTROL_REDIRECTING:
04375       {
04376          struct ast_party_redirecting redirecting;
04377 
04378          ast_party_redirecting_set_init(&redirecting, &chan->redirecting);
04379          res = ast_redirecting_parse_data(data, datalen, &redirecting);
04380          if (!res) {
04381             ast_channel_set_redirecting(chan, &redirecting, NULL);
04382          }
04383          ast_party_redirecting_free(&redirecting);
04384       }
04385       break;
04386    
04387    default:
04388       break;
04389    }
04390 
04391    if (is_visible_indication(condition)) {
04392       /* A new visible indication is requested. */
04393       chan->visible_indication = condition;
04394    } else if (condition == AST_CONTROL_UNHOLD || _condition < 0) {
04395       /* Visible indication is cleared/stopped. */
04396       chan->visible_indication = 0;
04397    }
04398 
04399    if (chan->tech->indicate) {
04400       /* See if the channel driver can handle this condition. */
04401       res = chan->tech->indicate(chan, condition, data, datalen);
04402    } else {
04403       res = -1;
04404    }
04405 
04406    if (!res) {
04407       /* The channel driver successfully handled this indication */
04408       res = 0;
04409       goto indicate_cleanup;
04410    }
04411 
04412    /* The channel driver does not support this indication, let's fake
04413     * it by doing our own tone generation if applicable. */
04414 
04415    /*!\note If we compare the enumeration type, which does not have any
04416     * negative constants, the compiler may optimize this code away.
04417     * Therefore, we must perform an integer comparison here. */
04418    if (_condition < 0) {
04419       /* Stop any tones that are playing */
04420       ast_playtones_stop(chan);
04421       res = 0;
04422       goto indicate_cleanup;
04423    }
04424 
04425    /* Handle conditions that we have tones for. */
04426    switch (condition) {
04427    case _XXX_AST_CONTROL_T38:
04428       /* deprecated T.38 control frame */
04429       res = -1;
04430       goto indicate_cleanup;
04431    case AST_CONTROL_T38_PARAMETERS:
04432       /* there is no way to provide 'default' behavior for these
04433        * control frames, so we need to return failure, but there
04434        * is also no value in the log message below being emitted
04435        * since failure to handle these frames is not an 'error'
04436        * so just return right now. in addition, we want to return
04437        * whatever value the channel driver returned, in case it
04438        * has some meaning.*/
04439       goto indicate_cleanup;
04440    case AST_CONTROL_RINGING:
04441       ts = ast_get_indication_tone(chan->zone, "ring");
04442       /* It is common practice for channel drivers to return -1 if trying
04443        * to indicate ringing on a channel which is up. The idea is to let the
04444        * core generate the ringing inband. However, we don't want the
04445        * warning message about not being able to handle the specific indication
04446        * to print nor do we want ast_indicate_data to return an "error" for this
04447        * condition
04448        */
04449       if (chan->_state == AST_STATE_UP) {
04450          res = 0;
04451       }
04452       break;
04453    case AST_CONTROL_BUSY:
04454       ts = ast_get_indication_tone(chan->zone, "busy");
04455       break;
04456    case AST_CONTROL_INCOMPLETE:
04457    case AST_CONTROL_CONGESTION:
04458       ts = ast_get_indication_tone(chan->zone, "congestion");
04459       break;
04460    case AST_CONTROL_PROGRESS:
04461    case AST_CONTROL_PROCEEDING:
04462    case AST_CONTROL_VIDUPDATE:
04463    case AST_CONTROL_SRCUPDATE:
04464    case AST_CONTROL_SRCCHANGE:
04465    case AST_CONTROL_RADIO_KEY:
04466    case AST_CONTROL_RADIO_UNKEY:
04467    case AST_CONTROL_OPTION:
04468    case AST_CONTROL_WINK:
04469    case AST_CONTROL_FLASH:
04470    case AST_CONTROL_OFFHOOK:
04471    case AST_CONTROL_TAKEOFFHOOK:
04472    case AST_CONTROL_ANSWER:
04473    case AST_CONTROL_HANGUP:
04474    case AST_CONTROL_RING:
04475    case AST_CONTROL_HOLD:
04476    case AST_CONTROL_UNHOLD:
04477    case AST_CONTROL_TRANSFER:
04478    case AST_CONTROL_CONNECTED_LINE:
04479    case AST_CONTROL_REDIRECTING:
04480    case AST_CONTROL_CC:
04481    case AST_CONTROL_READ_ACTION:
04482    case AST_CONTROL_AOC:
04483    case AST_CONTROL_END_OF_Q:
04484    case AST_CONTROL_UPDATE_RTP_PEER:
04485       /* Nothing left to do for these. */
04486       res = 0;
04487       break;
04488    }
04489 
04490    if (ts) {
04491       /* We have a tone to play, yay. */
04492       ast_debug(1, "Driver for channel '%s' does not support indication %d, emulating it\n", chan->name, condition);
04493       res = ast_playtones_start(chan, 0, ts->data, 1);
04494       ts = ast_tone_zone_sound_unref(ts);
04495    }
04496 
04497    if (res) {
04498       /* not handled */
04499       ast_log(LOG_WARNING, "Unable to handle indication %d for '%s'\n", condition, chan->name);
04500    }
04501 
04502 indicate_cleanup:
04503    ast_channel_unlock(chan);
04504    if (awesome_frame) {
04505       ast_frfree(awesome_frame);
04506    }
04507 
04508    return res;
04509 }
04510 
04511 int ast_recvchar(struct ast_channel *chan, int timeout)
04512 {
04513    int c;
04514    char *buf = ast_recvtext(chan, timeout);
04515    if (buf == NULL)
04516       return -1;  /* error or timeout */
04517    c = *(unsigned char *)buf;
04518    ast_free(buf);
04519    return c;
04520 }
04521 
04522 char *ast_recvtext(struct ast_channel *chan, int timeout)
04523 {
04524    int res, done = 0;
04525    char *buf = NULL;
04526    
04527    while (!done) {
04528       struct ast_frame *f;
04529       if (ast_check_hangup(chan))
04530          break;
04531       res = ast_waitfor(chan, timeout);
04532       if (res <= 0) /* timeout or error */
04533          break;
04534       timeout = res; /* update timeout */
04535       f = ast_read(chan);
04536       if (f == NULL)
04537          break; /* no frame */
04538       if (f->frametype == AST_FRAME_CONTROL && f->subclass.integer == AST_CONTROL_HANGUP)
04539          done = 1;   /* force a break */
04540       else if (f->frametype == AST_FRAME_TEXT) {      /* what we want */
04541          buf = ast_strndup((char *) f->data.ptr, f->datalen);  /* dup and break */
04542          done = 1;
04543       }
04544       ast_frfree(f);
04545    }
04546    return buf;
04547 }
04548 
04549 int ast_sendtext(struct ast_channel *chan, const char *text)
04550 {
04551    int res = 0;
04552 
04553    ast_channel_lock(chan);
04554    /* Stop if we're a zombie or need a soft hangup */
04555    if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
04556       ast_channel_unlock(chan);
04557       return -1;
04558    }
04559    CHECK_BLOCKING(chan);
04560    if (chan->tech->send_text)
04561       res = chan->tech->send_text(chan, text);
04562    ast_clear_flag(chan, AST_FLAG_BLOCKING);
04563    ast_channel_unlock(chan);
04564    return res;
04565 }
04566 
04567 int ast_senddigit_begin(struct ast_channel *chan, char digit)
04568 {
04569    /* Device does not support DTMF tones, lets fake
04570     * it by doing our own generation. */
04571    static const char * const dtmf_tones[] = {
04572       "941+1336", /* 0 */
04573       "697+1209", /* 1 */
04574       "697+1336", /* 2 */
04575       "697+1477", /* 3 */
04576       "770+1209", /* 4 */
04577       "770+1336", /* 5 */
04578       "770+1477", /* 6 */
04579       "852+1209", /* 7 */
04580       "852+1336", /* 8 */
04581       "852+1477", /* 9 */
04582       "697+1633", /* A */
04583       "770+1633", /* B */
04584       "852+1633", /* C */
04585       "941+1633", /* D */
04586       "941+1209", /* * */
04587       "941+1477"  /* # */
04588    };
04589 
04590    if (!chan->tech->send_digit_begin)
04591       return 0;
04592 
04593    if (!chan->tech->send_digit_begin(chan, digit))
04594       return 0;
04595 
04596    if (digit >= '0' && digit <='9')
04597       ast_playtones_start(chan, 0, dtmf_tones[digit-'0'], 0);
04598    else if (digit >= 'A' && digit <= 'D')
04599       ast_playtones_start(chan, 0, dtmf_tones[digit-'A'+10], 0);
04600    else if (digit == '*')
04601       ast_playtones_start(chan, 0, dtmf_tones[14], 0);
04602    else if (digit == '#')
04603       ast_playtones_start(chan, 0, dtmf_tones[15], 0);
04604    else {
04605       /* not handled */
04606       ast_debug(1, "Unable to generate DTMF tone '%c' for '%s'\n", digit, chan->name);
04607    }
04608 
04609    return 0;
04610 }
04611 
04612 int ast_senddigit_end(struct ast_channel *chan, char digit, unsigned int duration)
04613 {
04614    int res = -1;
04615 
04616    if (chan->tech->send_digit_end)
04617       res = chan->tech->send_digit_end(chan, digit, duration);
04618 
04619    if (res && chan->generator)
04620       ast_playtones_stop(chan);
04621    
04622    return 0;
04623 }
04624 
04625 int ast_senddigit(struct ast_channel *chan, char digit, unsigned int duration)
04626 {
04627    if (chan->tech->send_digit_begin) {
04628       ast_senddigit_begin(chan, digit);
04629       ast_safe_sleep(chan, (duration >= AST_DEFAULT_EMULATE_DTMF_DURATION ? duration : AST_DEFAULT_EMULATE_DTMF_DURATION));
04630    }
04631    
04632    return ast_senddigit_end(chan, digit, (duration >= AST_DEFAULT_EMULATE_DTMF_DURATION ? duration : AST_DEFAULT_EMULATE_DTMF_DURATION));
04633 }
04634 
04635 int ast_prod(struct ast_channel *chan)
04636 {
04637    struct ast_frame a = { AST_FRAME_VOICE };
04638    char nothing[128];
04639 
04640    /* Send an empty audio frame to get things moving */
04641    if (chan->_state != AST_STATE_UP) {
04642       ast_debug(1, "Prodding channel '%s'\n", chan->name);
04643       a.subclass.codec = chan->rawwriteformat;
04644       a.data.ptr = nothing + AST_FRIENDLY_OFFSET;
04645       a.src = "ast_prod"; /* this better match check in ast_write */
04646       if (ast_write(chan, &a))
04647          ast_log(LOG_WARNING, "Prodding channel '%s' failed\n", chan->name);
04648    }
04649    return 0;
04650 }
04651 
04652 int ast_write_video(struct ast_channel *chan, struct ast_frame *fr)
04653 {
04654    int res;
04655    if (!chan->tech->write_video)
04656       return 0;
04657    res = ast_write(chan, fr);
04658    if (!res)
04659       res = 1;
04660    return res;
04661 }
04662 
04663 struct plc_ds {
04664    /* A buffer in which to store SLIN PLC
04665     * samples generated by the generic PLC
04666     * functionality in plc.c
04667     */
04668    int16_t *samples_buf;
04669    /* The current number of samples in the
04670     * samples_buf
04671     */
04672    size_t num_samples;
04673    plc_state_t plc_state;
04674 };
04675 
04676 static void plc_ds_destroy(void *data)
04677 {
04678    struct plc_ds *plc = data;
04679    ast_free(plc->samples_buf);
04680    ast_free(plc);
04681 }
04682 
04683 static struct ast_datastore_info plc_ds_info = {
04684    .type = "plc",
04685    .destroy = plc_ds_destroy,
04686 };
04687 
04688 static void adjust_frame_for_plc(struct ast_channel *chan, struct ast_frame *frame, struct ast_datastore *datastore)
04689 {
04690    int num_new_samples = frame->samples;
04691    struct plc_ds *plc = datastore->data;
04692 
04693    /* As a general note, let me explain the somewhat odd calculations used when taking
04694     * the frame offset into account here. According to documentation in frame.h, the frame's
04695     * offset field indicates the number of bytes that the audio is offset. The plc->samples_buf
04696     * is not an array of bytes, but rather an array of 16-bit integers since it holds SLIN
04697     * samples. So I had two choices to make here with the offset.
04698     * 
04699     * 1. Make the offset AST_FRIENDLY_OFFSET bytes. The main downside for this is that
04700     *    I can't just add AST_FRIENDLY_OFFSET to the plc->samples_buf and have the pointer
04701     *    arithmetic come out right. I would have to do some odd casting or division for this to
04702     *    work as I wanted.
04703     * 2. Make the offset AST_FRIENDLY_OFFSET * 2 bytes. This allows the pointer arithmetic
04704     *    to work out better with the plc->samples_buf. The downside here is that the buffer's
04705     *    allocation contains an extra 64 bytes of unused space.
04706     * 
04707     * I decided to go with option 2. This is why in the calloc statement and the statement that
04708     * sets the frame's offset, AST_FRIENDLY_OFFSET is multiplied by 2.
04709     */
04710 
04711    /* If this audio frame has no samples to fill in, ignore it */
04712    if (!num_new_samples) {
04713       return;
04714    }
04715 
04716    /* First, we need to be sure that our buffer is large enough to accomodate
04717     * the samples we need to fill in. This will likely only occur on the first
04718     * frame we write.
04719     */
04720    if (plc->num_samples < num_new_samples) {
04721       ast_free(plc->samples_buf);
04722       plc->samples_buf = ast_calloc(1, (num_new_samples * sizeof(*plc->samples_buf)) + (AST_FRIENDLY_OFFSET * 2));
04723       if (!plc->samples_buf) {
04724          ast_channel_datastore_remove(chan, datastore);
04725          ast_datastore_free(datastore);
04726          return;
04727       }
04728       plc->num_samples = num_new_samples;
04729    }
04730 
04731    if (frame->datalen == 0) {
04732       plc_fillin(&plc->plc_state, plc->samples_buf + AST_FRIENDLY_OFFSET, frame->samples);
04733       frame->data.ptr = plc->samples_buf + AST_FRIENDLY_OFFSET;
04734       frame->datalen = num_new_samples * 2;
04735       frame->offset = AST_FRIENDLY_OFFSET * 2;
04736    } else {
04737       plc_rx(&plc->plc_state, frame->data.ptr, frame->samples);
04738    }
04739 }
04740 
04741 static void apply_plc(struct ast_channel *chan, struct ast_frame *frame)
04742 {
04743    struct ast_datastore *datastore;
04744    struct plc_ds *plc;
04745 
04746    datastore = ast_channel_datastore_find(chan, &plc_ds_info, NULL);
04747    if (datastore) {
04748       plc = datastore->data;
04749       adjust_frame_for_plc(chan, frame, datastore);
04750       return;
04751    }
04752 
04753    datastore = ast_datastore_alloc(&plc_ds_info, NULL);
04754    if (!datastore) {
04755       return;
04756    }
04757    plc = ast_calloc(1, sizeof(*plc));
04758    if (!plc) {
04759       ast_datastore_free(datastore);
04760       return;
04761    }
04762    datastore->data = plc;
04763    ast_channel_datastore_add(chan, datastore);
04764    adjust_frame_for_plc(chan, frame, datastore);
04765 }
04766 
04767 int ast_write(struct ast_channel *chan, struct ast_frame *fr)
04768 {
04769    int res = -1;
04770    struct ast_frame *f = NULL;
04771    int count = 0;
04772 
04773    /*Deadlock avoidance*/
04774    while(ast_channel_trylock(chan)) {
04775       /*cannot goto done since the channel is not locked*/
04776       if(count++ > 10) {
04777          ast_debug(1, "Deadlock avoided for write to channel '%s'\n", chan->name);
04778          return 0;
04779       }
04780       usleep(1);
04781    }
04782    /* Stop if we're a zombie or need a soft hangup */
04783    if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan))
04784       goto done;
04785 
04786    /* Handle any pending masquerades */
04787    if (chan->masq) {
04788       ast_channel_unlock(chan);
04789       if (ast_do_masquerade(chan)) {
04790          ast_log(LOG_WARNING, "Failed to perform masquerade\n");
04791          return res; /* no need to goto done: chan is already unlocked for masq */
04792       }
04793       ast_channel_lock(chan);
04794    }
04795    if (chan->masqr) {
04796       res = 0; /* XXX explain, why 0 ? */
04797       goto done;
04798    }
04799 
04800    /* Perform the framehook write event here. After the frame enters the framehook list
04801     * there is no telling what will happen, how awesome is that!!! */
04802    if (!(fr = ast_framehook_list_write_event(chan->framehooks, fr))) {
04803       res = 0;
04804       goto done;
04805    }
04806 
04807    if (chan->generatordata && (!fr->src || strcasecmp(fr->src, "ast_prod"))) {
04808       if (ast_test_flag(chan, AST_FLAG_WRITE_INT)) {
04809             ast_deactivate_generator(chan);
04810       } else {
04811          if (fr->frametype == AST_FRAME_DTMF_END) {
04812             /* There is a generator running while we're in the middle of a digit.
04813              * It's probably inband DTMF, so go ahead and pass it so it can
04814              * stop the generator */
04815             ast_clear_flag(chan, AST_FLAG_BLOCKING);
04816             ast_channel_unlock(chan);
04817             res = ast_senddigit_end(chan, fr->subclass.integer, fr->len);
04818             ast_channel_lock(chan);
04819             CHECK_BLOCKING(chan);
04820          } else if (fr->frametype == AST_FRAME_CONTROL && fr->subclass.integer == AST_CONTROL_UNHOLD) {
04821             /* This is a side case where Echo is basically being called and the person put themselves on hold and took themselves off hold */
04822             res = (chan->tech->indicate == NULL) ? 0 :
04823                chan->tech->indicate(chan, fr->subclass.integer, fr->data.ptr, fr->datalen);
04824          }
04825          res = 0; /* XXX explain, why 0 ? */
04826          goto done;
04827       }
04828    }
04829    /* High bit prints debugging */
04830    if (chan->fout & DEBUGCHAN_FLAG)
04831       ast_frame_dump(chan->name, fr, ">>");
04832    CHECK_BLOCKING(chan);
04833    switch (fr->frametype) {
04834    case AST_FRAME_CONTROL:
04835       res = (chan->tech->indicate == NULL) ? 0 :
04836          chan->tech->indicate(chan, fr->subclass.integer, fr->data.ptr, fr->datalen);
04837       break;
04838    case AST_FRAME_DTMF_BEGIN:
04839       if (chan->audiohooks) {
04840          struct ast_frame *old_frame = fr;
04841          fr = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_WRITE, fr);
04842          if (old_frame != fr)
04843             f = fr;
04844       }
04845       send_dtmf_event(chan, "Sent", fr->subclass.integer, "Yes", "No");
04846       ast_clear_flag(chan, AST_FLAG_BLOCKING);
04847       ast_channel_unlock(chan);
04848       res = ast_senddigit_begin(chan, fr->subclass.integer);
04849       ast_channel_lock(chan);
04850       CHECK_BLOCKING(chan);
04851       break;
04852    case AST_FRAME_DTMF_END:
04853       if (chan->audiohooks) {
04854          struct ast_frame *new_frame = fr;
04855 
04856          new_frame = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_WRITE, fr);
04857          if (new_frame != fr) {
04858             ast_frfree(new_frame);
04859          }
04860       }
04861       send_dtmf_event(chan, "Sent", fr->subclass.integer, "No", "Yes");
04862       ast_clear_flag(chan, AST_FLAG_BLOCKING);
04863       ast_channel_unlock(chan);
04864       res = ast_senddigit_end(chan, fr->subclass.integer, fr->len);
04865       ast_channel_lock(chan);
04866       CHECK_BLOCKING(chan);
04867       break;
04868    case AST_FRAME_TEXT:
04869       if (fr->subclass.integer == AST_FORMAT_T140) {
04870          res = (chan->tech->write_text == NULL) ? 0 :
04871             chan->tech->write_text(chan, fr);
04872       } else {
04873          res = (chan->tech->send_text == NULL) ? 0 :
04874             chan->tech->send_text(chan, (char *) fr->data.ptr);
04875       }
04876       break;
04877    case AST_FRAME_HTML:
04878       res = (chan->tech->send_html == NULL) ? 0 :
04879          chan->tech->send_html(chan, fr->subclass.integer, (char *) fr->data.ptr, fr->datalen);
04880       break;
04881    case AST_FRAME_VIDEO:
04882       /* XXX Handle translation of video codecs one day XXX */
04883       res = (chan->tech->write_video == NULL) ? 0 :
04884          chan->tech->write_video(chan, fr);
04885       break;
04886    case AST_FRAME_MODEM:
04887       res = (chan->tech->write == NULL) ? 0 :
04888          chan->tech->write(chan, fr);
04889       break;
04890    case AST_FRAME_VOICE:
04891       if (chan->tech->write == NULL)
04892          break;   /*! \todo XXX should return 0 maybe ? */
04893 
04894       if (ast_opt_generic_plc && fr->subclass.codec == AST_FORMAT_SLINEAR) {
04895          apply_plc(chan, fr);
04896       }
04897 
04898       /* If the frame is in the raw write format, then it's easy... just use the frame - otherwise we will have to translate */
04899       if (fr->subclass.codec == chan->rawwriteformat) {
04900          f = fr;
04901       } else {
04902          /* XXX Something is not right we are not compatible with this frame bad things can happen
04903           * problems range from no/one-way audio to unexplained line hangups as a last resort try adjust the format
04904           * ideally we do not want to do this and this indicates a deeper problem for now we log these events to
04905           * eliminate user impact and help identify the problem areas
04906           * JIRA issues related to this :-
04907           * ASTERISK-14384, ASTERISK-17502, ASTERISK-17541, ASTERISK-18063, ASTERISK-18325, ASTERISK-18422*/
04908          if ((!(fr->subclass.codec & chan->nativeformats)) && (chan->writeformat != fr->subclass.codec)) {
04909             char nf[512];
04910             ast_log(LOG_WARNING, "Codec mismatch on channel %s setting write format to %s from %s native formats %s\n",
04911                chan->name, ast_getformatname(fr->subclass.codec), ast_getformatname(chan->writeformat),
04912                ast_getformatname_multiple(nf, sizeof(nf), chan->nativeformats & AST_FORMAT_AUDIO_MASK));
04913             ast_set_write_format(chan, fr->subclass.codec);
04914          }
04915 
04916          f = (chan->writetrans) ? ast_translate(chan->writetrans, fr, 0) : fr;
04917       }
04918 
04919       if (!f) {
04920          res = 0;
04921          break;
04922       }
04923 
04924       if (chan->audiohooks) {
04925          struct ast_frame *prev = NULL, *new_frame, *cur, *dup;
04926          int freeoldlist = 0;
04927 
04928          if (f != fr) {
04929             freeoldlist = 1;
04930          }
04931 
04932          /* Since ast_audiohook_write may return a new frame, and the cur frame is
04933           * an item in a list of frames, create a new list adding each cur frame back to it
04934           * regardless if the cur frame changes or not. */
04935          for (cur = f; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
04936             new_frame = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_WRITE, cur);
04937 
04938             /* if this frame is different than cur, preserve the end of the list,
04939              * free the old frames, and set cur to be the new frame */
04940             if (new_frame != cur) {
04941 
04942                /* doing an ast_frisolate here seems silly, but we are not guaranteed the new_frame
04943                 * isn't part of local storage, meaning if ast_audiohook_write is called multiple
04944                 * times it may override the previous frame we got from it unless we dup it */
04945                if ((dup = ast_frisolate(new_frame))) {
04946                   AST_LIST_NEXT(dup, frame_list) = AST_LIST_NEXT(cur, frame_list);
04947                   if (freeoldlist) {
04948                      AST_LIST_NEXT(cur, frame_list) = NULL;
04949                      ast_frfree(cur);
04950                   }
04951                   if (new_frame != dup) {
04952                      ast_frfree(new_frame);
04953                   }
04954                   cur = dup;
04955                }
04956             }
04957 
04958             /* now, regardless if cur is new or not, add it to the new list,
04959              * if the new list has not started, cur will become the first item. */
04960             if (prev) {
04961                AST_LIST_NEXT(prev, frame_list) = cur;
04962             } else {
04963                f = cur; /* set f to be the beginning of our new list */
04964             }
04965             prev = cur;
04966          }
04967       }
04968       
04969       /* If Monitor is running on this channel, then we have to write frames out there too */
04970       /* the translator on chan->writetrans may have returned multiple frames
04971          from the single frame we passed in; if so, feed each one of them to the
04972          monitor */
04973       if (chan->monitor && chan->monitor->write_stream) {
04974          struct ast_frame *cur;
04975 
04976          for (cur = f; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
04977          /* XXX must explain this code */
04978 #ifndef MONITOR_CONSTANT_DELAY
04979             int jump = chan->insmpl - chan->outsmpl - 4 * cur->samples;
04980             if (jump >= 0) {
04981                jump = calc_monitor_jump((chan->insmpl - chan->outsmpl), ast_format_rate(f->subclass.codec), ast_format_rate(chan->monitor->read_stream->fmt->format));
04982                if (ast_seekstream(chan->monitor->write_stream, jump, SEEK_FORCECUR) == -1)
04983                   ast_log(LOG_WARNING, "Failed to perform seek in monitoring write stream, synchronization between the files may be broken\n");
04984                chan->outsmpl += (chan->insmpl - chan->outsmpl) + cur->samples;
04985             } else {
04986                chan->outsmpl += cur->samples;
04987             }
04988 #else
04989             int jump = calc_monitor_jump((chan->insmpl - chan->outsmpl), ast_format_rate(f->subclass.codec), ast_format_rate(chan->monitor->read_stream->fmt->format));
04990             if (jump - MONITOR_DELAY >= 0) {
04991                if (ast_seekstream(chan->monitor->write_stream, jump - cur->samples, SEEK_FORCECUR) == -1)
04992                   ast_log(LOG_WARNING, "Failed to perform seek in monitoring write stream, synchronization between the files may be broken\n");
04993                chan->outsmpl += chan->insmpl - chan->outsmpl;
04994             } else {
04995                chan->outsmpl += cur->samples;
04996             }
04997 #endif
04998             if (chan->monitor->state == AST_MONITOR_RUNNING) {
04999                if (ast_writestream(chan->monitor->write_stream, cur) < 0)
05000                   ast_log(LOG_WARNING, "Failed to write data to channel monitor write stream\n");
05001             }
05002          }
05003       }
05004 
05005       /* the translator on chan->writetrans may have returned multiple frames
05006          from the single frame we passed in; if so, feed each one of them to the
05007          channel, freeing each one after it has been written */
05008       if ((f != fr) && AST_LIST_NEXT(f, frame_list)) {
05009          struct ast_frame *cur, *next;
05010          unsigned int skip = 0;
05011 
05012          for (cur = f, next = AST_LIST_NEXT(cur, frame_list);
05013               cur;
05014               cur = next, next = cur ? AST_LIST_NEXT(cur, frame_list) : NULL) {
05015             if (!skip) {
05016                if ((res = chan->tech->write(chan, cur)) < 0) {
05017                   chan->_softhangup |= AST_SOFTHANGUP_DEV;
05018                   skip = 1;
05019                } else if (next) {
05020                   /* don't do this for the last frame in the list,
05021                      as the code outside the loop will do it once
05022                   */
05023                   chan->fout = FRAMECOUNT_INC(chan->fout);
05024                }
05025             }
05026             ast_frfree(cur);
05027          }
05028 
05029          /* reset f so the code below doesn't attempt to free it */
05030          f = NULL;
05031       } else {
05032          res = chan->tech->write(chan, f);
05033       }
05034       break;
05035    case AST_FRAME_NULL:
05036    case AST_FRAME_IAX:
05037       /* Ignore these */
05038       res = 0;
05039       break;
05040    default:
05041       /* At this point, fr is the incoming frame and f is NULL.  Channels do
05042        * not expect to get NULL as a frame pointer and will segfault.  Hence,
05043        * we output the original frame passed in. */
05044       res = chan->tech->write(chan, fr);
05045       break;
05046    }
05047 
05048    if (f && f != fr)
05049       ast_frfree(f);
05050    ast_clear_flag(chan, AST_FLAG_BLOCKING);
05051 
05052    /* Consider a write failure to force a soft hangup */
05053    if (res < 0) {
05054       chan->_softhangup |= AST_SOFTHANGUP_DEV;
05055    } else {
05056       chan->fout = FRAMECOUNT_INC(chan->fout);
05057    }
05058 done:
05059    if (chan->audiohooks && ast_audiohook_write_list_empty(chan->audiohooks)) {
05060       /* The list gets recreated if audiohooks are added again later */
05061       ast_audiohook_detach_list(chan->audiohooks);
05062       chan->audiohooks = NULL;
05063    }
05064    ast_channel_unlock(chan);
05065    return res;
05066 }
05067 
05068 static int set_format(struct ast_channel *chan, format_t fmt, format_t *rawformat, format_t *format,
05069             struct ast_trans_pvt **trans, const int direction)
05070 {
05071    format_t native, native_fmt = ast_best_codec(fmt);
05072    int res;
05073    char from[200], to[200];
05074    
05075    /* Make sure we only consider audio */
05076    fmt &= AST_FORMAT_AUDIO_MASK;
05077    
05078    native = chan->nativeformats;
05079 
05080    if (!fmt || !native) /* No audio requested */
05081       return 0;   /* Let's try a call without any sounds (video, text) */
05082 
05083    /* See if the underlying channel driver is capable of performing transcoding for us */
05084    if (!ast_channel_setoption(chan, direction ? AST_OPTION_FORMAT_WRITE : AST_OPTION_FORMAT_READ, &native_fmt, sizeof(int*), 0)) {
05085       ast_debug(1, "Channel driver natively set channel %s to %s format %s\n", chan->name,
05086            direction ? "write" : "read", ast_getformatname(native_fmt));
05087       chan->nativeformats = *rawformat = *format = native_fmt;
05088       if (*trans) {
05089          ast_translator_free_path(*trans);
05090       }
05091       *trans = NULL;
05092       return 0;
05093    }
05094 
05095    /* Find a translation path from the native format to one of the desired formats */
05096    if (!direction)
05097       /* reading */
05098       res = ast_translator_best_choice(&fmt, &native);
05099    else
05100       /* writing */
05101       res = ast_translator_best_choice(&native, &fmt);
05102 
05103    if (res < 0) {
05104       ast_log(LOG_WARNING, "Unable to find a codec translation path from %s to %s\n",
05105          ast_getformatname_multiple(from, sizeof(from), native),
05106          ast_getformatname_multiple(to, sizeof(to), fmt));
05107       return -1;
05108    }
05109    
05110    /* Now we have a good choice for both. */
05111    ast_channel_lock(chan);
05112 
05113    if ((*rawformat == native) && (*format == fmt) && ((*rawformat == *format) || (*trans))) {
05114       /* the channel is already in these formats, so nothing to do */
05115       ast_channel_unlock(chan);
05116       return 0;
05117    }
05118 
05119    *rawformat = native;
05120    /* User perspective is fmt */
05121    *format = fmt;
05122    /* Free any read translation we have right now */
05123    if (*trans) {
05124       ast_translator_free_path(*trans);
05125       *trans = NULL;
05126    }
05127    /* Build a translation path from the raw format to the desired format */
05128    if (*format == *rawformat) {
05129       /*
05130        * If we were able to swap the native format to the format that
05131        * has been requested, then there is no need to try to build
05132        * a translation path.
05133        */
05134       res = 0;
05135    } else {
05136       if (!direction) {
05137          /* reading */
05138          *trans = ast_translator_build_path(*format, *rawformat);
05139       } else {
05140          /* writing */
05141          *trans = ast_translator_build_path(*rawformat, *format);
05142       }
05143       res = *trans ? 0 : -1;
05144    }
05145    ast_channel_unlock(chan);
05146    ast_debug(1, "Set channel %s to %s format %s\n", chan->name,
05147       direction ? "write" : "read", ast_getformatname(fmt));
05148    return res;
05149 }
05150 
05151 int ast_set_read_format(struct ast_channel *chan, format_t fmt)
05152 {
05153    return set_format(chan, fmt, &chan->rawreadformat, &chan->readformat,
05154            &chan->readtrans, 0);
05155 }
05156 
05157 int ast_set_write_format(struct ast_channel *chan, format_t fmt)
05158 {
05159    return set_format(chan, fmt, &chan->rawwriteformat, &chan->writeformat,
05160            &chan->writetrans, 1);
05161 }
05162 
05163 const char *ast_channel_reason2str(int reason)
05164 {
05165    switch (reason) /* the following appear to be the only ones actually returned by request_and_dial */
05166    {
05167    case 0:
05168       return "Call Failure (not BUSY, and not NO_ANSWER, maybe Circuit busy or down?)";
05169    case AST_CONTROL_HANGUP:
05170       return "Hangup";
05171    case AST_CONTROL_RING:
05172       return "Local Ring";
05173    case AST_CONTROL_RINGING:
05174       return "Remote end Ringing";
05175    case AST_CONTROL_ANSWER:
05176       return "Remote end has Answered";
05177    case AST_CONTROL_BUSY:
05178       return "Remote end is Busy";
05179    case AST_CONTROL_CONGESTION:
05180       return "Congestion (circuits busy)";
05181    default:
05182       return "Unknown Reason!!";
05183    }
05184 }
05185 
05186 static void handle_cause(int cause, int *outstate)
05187 {
05188    if (outstate) {
05189       /* compute error and return */
05190       if (cause == AST_CAUSE_BUSY)
05191          *outstate = AST_CONTROL_BUSY;
05192       else if (cause == AST_CAUSE_CONGESTION)
05193          *outstate = AST_CONTROL_CONGESTION;
05194       else
05195          *outstate = 0;
05196    }
05197 }
05198 
05199 /*!
05200  * \internal
05201  * \brief Helper function to inherit info from parent channel.
05202  *
05203  * \param new_chan Channel inheriting information.
05204  * \param parent Channel new_chan inherits information.
05205  * \param orig Channel being replaced by the call forward channel.
05206  *
05207  * \return Nothing
05208  */
05209 static void call_forward_inherit(struct ast_channel *new_chan, struct ast_channel *parent, struct ast_channel *orig)
05210 {
05211    if (!ast_test_flag(parent, AST_FLAG_ZOMBIE) && !ast_check_hangup(parent)) {
05212       struct ast_party_redirecting redirecting;
05213 
05214       /*
05215        * The parent is not a ZOMBIE or hungup so update it with the
05216        * original channel's redirecting information.
05217        */
05218       ast_party_redirecting_init(&redirecting);
05219       ast_channel_lock(orig);
05220       ast_party_redirecting_copy(&redirecting, &orig->redirecting);
05221       ast_channel_unlock(orig);
05222       if (ast_channel_redirecting_macro(orig, parent, &redirecting, 1, 0)) {
05223          ast_channel_update_redirecting(parent, &redirecting, NULL);
05224       }
05225       ast_party_redirecting_free(&redirecting);
05226    }
05227 
05228    /* Safely inherit variables and datastores from the parent channel. */
05229    ast_channel_lock_both(parent, new_chan);
05230    ast_channel_inherit_variables(parent, new_chan);
05231    ast_channel_datastore_inherit(parent, new_chan);
05232    ast_channel_unlock(new_chan);
05233    ast_channel_unlock(parent);
05234 }
05235 
05236 struct ast_channel *ast_call_forward(struct ast_channel *caller, struct ast_channel *orig, int *timeout, format_t format, struct outgoing_helper *oh, int *outstate)
05237 {
05238    char tmpchan[256];
05239    struct ast_channel *new_chan = NULL;
05240    char *data, *type;
05241    int cause = 0;
05242    int res;
05243 
05244    /* gather data and request the new forward channel */
05245    ast_copy_string(tmpchan, orig->call_forward, sizeof(tmpchan));
05246    if ((data = strchr(tmpchan, '/'))) {
05247       *data++ = '\0';
05248       type = tmpchan;
05249    } else {
05250       const char *forward_context;
05251       ast_channel_lock(orig);
05252       forward_context = pbx_builtin_getvar_helper(orig, "FORWARD_CONTEXT");
05253       snprintf(tmpchan, sizeof(tmpchan), "%s@%s", orig->call_forward, S_OR(forward_context, orig->context));
05254       ast_channel_unlock(orig);
05255       data = tmpchan;
05256       type = "Local";
05257    }
05258    if (!(new_chan = ast_request(type, format, orig, data, &cause))) {
05259       ast_log(LOG_NOTICE, "Unable to create channel for call forward to '%s/%s' (cause = %d)\n", type, data, cause);
05260       handle_cause(cause, outstate);
05261       ast_hangup(orig);
05262       return NULL;
05263    }
05264 
05265    /* Copy/inherit important information into new channel */
05266    if (oh) {
05267       if (oh->vars) {
05268          ast_set_variables(new_chan, oh->vars);
05269       }
05270       if (oh->parent_channel) {
05271          call_forward_inherit(new_chan, oh->parent_channel, orig);
05272       }
05273       if (oh->account) {
05274          ast_channel_lock(new_chan);
05275          ast_cdr_setaccount(new_chan, oh->account);
05276          ast_channel_unlock(new_chan);
05277       }
05278    } else if (caller) { /* no outgoing helper so use caller if avaliable */
05279       call_forward_inherit(new_chan, caller, orig);
05280    }
05281 
05282    ast_channel_lock_both(orig, new_chan);
05283    ast_copy_flags(new_chan->cdr, orig->cdr, AST_CDR_FLAG_ORIGINATED);
05284    ast_string_field_set(new_chan, accountcode, orig->accountcode);
05285    ast_party_connected_line_copy(&new_chan->connected, &orig->connected);
05286    ast_party_redirecting_copy(&new_chan->redirecting, &orig->redirecting);
05287    ast_channel_unlock(new_chan);
05288    ast_channel_unlock(orig);
05289 
05290    /* call new channel */
05291    res = ast_call(new_chan, data, 0);
05292    if (timeout) {
05293       *timeout = res;
05294    }
05295    if (res) {
05296       ast_log(LOG_NOTICE, "Unable to call forward to channel %s/%s\n", type, (char *)data);
05297       ast_hangup(orig);
05298       ast_hangup(new_chan);
05299       return NULL;
05300    }
05301    ast_hangup(orig);
05302 
05303    return new_chan;
05304 }
05305 
05306 struct ast_channel *__ast_request_and_dial(const char *type, format_t format, const struct ast_channel *requestor, void *data, int timeout, int *outstate, const char *cid_num, const char *cid_name, struct outgoing_helper *oh)
05307 {
05308    int dummy_outstate;
05309    int cause = 0;
05310    struct ast_channel *chan;
05311    int res = 0;
05312    int last_subclass = 0;
05313    struct ast_party_connected_line connected;
05314    
05315    if (outstate)
05316       *outstate = 0;
05317    else
05318       outstate = &dummy_outstate;   /* make outstate always a valid pointer */
05319 
05320    chan = ast_request(type, format, requestor, data, &cause);
05321    if (!chan) {
05322       ast_log(LOG_NOTICE, "Unable to request channel %s/%s\n", type, (char *)data);
05323       handle_cause(cause, outstate);
05324       return NULL;
05325    }
05326 
05327    if (oh) {
05328       if (oh->vars) {
05329          ast_set_variables(chan, oh->vars);
05330       }
05331       if (!ast_strlen_zero(oh->cid_num) && !ast_strlen_zero(oh->cid_name)) {
05332          /*
05333           * Use the oh values instead of the function parameters for the
05334           * outgoing CallerID.
05335           */
05336          cid_num = oh->cid_num;
05337          cid_name = oh->cid_name;
05338       }
05339       if (oh->parent_channel) {
05340          /* Safely inherit variables and datastores from the parent channel. */
05341          ast_channel_lock_both(oh->parent_channel, chan);
05342          ast_channel_inherit_variables(oh->parent_channel, chan);
05343          ast_channel_datastore_inherit(oh->parent_channel, chan);
05344          ast_channel_unlock(oh->parent_channel);
05345          ast_channel_unlock(chan);
05346       }
05347       if (oh->account) {
05348          ast_channel_lock(chan);
05349          ast_cdr_setaccount(chan, oh->account);
05350          ast_channel_unlock(chan);
05351       }
05352    }
05353 
05354    ast_set_flag(chan->cdr, AST_CDR_FLAG_ORIGINATED);
05355    ast_party_connected_line_set_init(&connected, &chan->connected);
05356    if (cid_num) {
05357       connected.id.number.valid = 1;
05358       connected.id.number.str = (char *) cid_num;
05359       connected.id.number.presentation = AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED;
05360    }
05361    if (cid_name) {
05362       connected.id.name.valid = 1;
05363       connected.id.name.str = (char *) cid_name;
05364       connected.id.name.presentation = AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED;
05365    }
05366    ast_channel_set_connected_line(chan, &connected, NULL);
05367 
05368    if (ast_call(chan, data, 0)) {   /* ast_call failed... */
05369       ast_log(LOG_NOTICE, "Unable to call channel %s/%s\n", type, (char *)data);
05370    } else {
05371       res = 1; /* mark success in case chan->_state is already AST_STATE_UP */
05372       while (timeout && chan->_state != AST_STATE_UP) {
05373          struct ast_frame *f;
05374          res = ast_waitfor(chan, timeout);
05375          if (res == 0) { /* timeout, treat it like ringing */
05376             *outstate = AST_CONTROL_RINGING;
05377             break;
05378          }
05379          if (res < 0) /* error or done */
05380             break;
05381          if (timeout > -1)
05382             timeout = res;
05383          if (!ast_strlen_zero(chan->call_forward)) {
05384             if (!(chan = ast_call_forward(NULL, chan, NULL, format, oh, outstate))) {
05385                return NULL;
05386             }
05387             continue;
05388          }
05389 
05390          f = ast_read(chan);
05391          if (!f) {
05392             *outstate = AST_CONTROL_HANGUP;
05393             res = 0;
05394             break;
05395          }
05396          if (f->frametype == AST_FRAME_CONTROL) {
05397             switch (f->subclass.integer) {
05398             case AST_CONTROL_RINGING:  /* record but keep going */
05399                *outstate = f->subclass.integer;
05400                break;
05401 
05402             case AST_CONTROL_BUSY:
05403                ast_cdr_busy(chan->cdr);
05404                *outstate = f->subclass.integer;
05405                timeout = 0;
05406                break;
05407 
05408             case AST_CONTROL_INCOMPLETE:
05409                ast_cdr_failed(chan->cdr);
05410                *outstate = AST_CONTROL_CONGESTION;
05411                timeout = 0;
05412                break;
05413 
05414             case AST_CONTROL_CONGESTION:
05415                ast_cdr_failed(chan->cdr);
05416                *outstate = f->subclass.integer;
05417                timeout = 0;
05418                break;
05419 
05420             case AST_CONTROL_ANSWER:
05421                ast_cdr_answer(chan->cdr);
05422                *outstate = f->subclass.integer;
05423                timeout = 0;      /* trick to force exit from the while() */
05424                break;
05425 
05426             /* Ignore these */
05427             case AST_CONTROL_PROGRESS:
05428             case AST_CONTROL_PROCEEDING:
05429             case AST_CONTROL_HOLD:
05430             case AST_CONTROL_UNHOLD:
05431             case AST_CONTROL_VIDUPDATE:
05432             case AST_CONTROL_SRCUPDATE:
05433             case AST_CONTROL_SRCCHANGE:
05434             case AST_CONTROL_CONNECTED_LINE:
05435             case AST_CONTROL_REDIRECTING:
05436             case AST_CONTROL_CC:
05437             case -1:       /* Ignore -- just stopping indications */
05438                break;
05439 
05440             default:
05441                ast_log(LOG_NOTICE, "Don't know what to do with control frame %d\n", f->subclass.integer);
05442             }
05443             last_subclass = f->subclass.integer;
05444          }
05445          ast_frfree(f);
05446       }
05447    }
05448 
05449    /* Final fixups */
05450    if (oh) {
05451       if (!ast_strlen_zero(oh->context))
05452          ast_copy_string(chan->context, oh->context, sizeof(chan->context));
05453       if (!ast_strlen_zero(oh->exten))
05454          ast_copy_string(chan->exten, oh->exten, sizeof(chan->exten));
05455       if (oh->priority) 
05456          chan->priority = oh->priority;
05457    }
05458    if (chan->_state == AST_STATE_UP)
05459       *outstate = AST_CONTROL_ANSWER;
05460 
05461    if (res <= 0) {
05462       ast_channel_lock(chan);
05463       if (AST_CONTROL_RINGING == last_subclass) {
05464          chan->hangupcause = AST_CAUSE_NO_ANSWER;
05465       }
05466       if (!chan->cdr && (chan->cdr = ast_cdr_alloc())) {
05467          ast_cdr_init(chan->cdr, chan);
05468       }
05469       if (chan->cdr) {
05470          char tmp[256];
05471 
05472          snprintf(tmp, sizeof(tmp), "%s/%s", type, (char *)data);
05473          ast_cdr_setapp(chan->cdr, "Dial", tmp);
05474          ast_cdr_update(chan);
05475          ast_cdr_start(chan->cdr);
05476          ast_cdr_end(chan->cdr);
05477          /* If the cause wasn't handled properly */
05478          if (ast_cdr_disposition(chan->cdr, chan->hangupcause)) {
05479             ast_cdr_failed(chan->cdr);
05480          }
05481       }
05482       ast_channel_unlock(chan);
05483       ast_hangup(chan);
05484       chan = NULL;
05485    }
05486    return chan;
05487 }
05488 
05489 struct ast_channel *ast_request_and_dial(const char *type, format_t format, const struct ast_channel *requestor, void *data, int timeout, int *outstate, const char *cidnum, const char *cidname)
05490 {
05491    return __ast_request_and_dial(type, format, requestor, data, timeout, outstate, cidnum, cidname, NULL);
05492 }
05493 
05494 static int set_security_requirements(const struct ast_channel *requestor, struct ast_channel *out)
05495 {
05496    int ops[2][2] = {
05497       {AST_OPTION_SECURE_SIGNALING, 0},
05498       {AST_OPTION_SECURE_MEDIA, 0},
05499    };
05500    int i;
05501    struct ast_channel *r = (struct ast_channel *) requestor; /* UGLY */
05502    struct ast_datastore *ds;
05503 
05504    if (!requestor || !out) {
05505       return 0;
05506    }
05507 
05508    ast_channel_lock(r);
05509    if ((ds = ast_channel_datastore_find(r, &secure_call_info, NULL))) {
05510       struct ast_secure_call_store *encrypt = ds->data;
05511       ops[0][1] = encrypt->signaling;
05512       ops[1][1] = encrypt->media;
05513    } else {
05514       ast_channel_unlock(r);
05515       return 0;
05516    }
05517    ast_channel_unlock(r);
05518 
05519    for (i = 0; i < 2; i++) {
05520       if (ops[i][1]) {
05521          if (ast_channel_setoption(out, ops[i][0], &ops[i][1], sizeof(ops[i][1]), 0)) {
05522             /* We require a security feature, but the channel won't provide it */
05523             return -1;
05524          }
05525       } else {
05526          /* We don't care if we can't clear the option on a channel that doesn't support it */
05527          ast_channel_setoption(out, ops[i][0], &ops[i][1], sizeof(ops[i][1]), 0);
05528       }
05529    }
05530 
05531    return 0;
05532 }
05533 
05534 struct ast_channel *ast_request(const char *type, format_t format, const struct ast_channel *requestor, void *data, int *cause)
05535 {
05536    struct chanlist *chan;
05537    struct ast_channel *c;
05538    format_t capabilities;
05539    format_t fmt;
05540    int res;
05541    int foo;
05542    format_t videoformat = format & AST_FORMAT_VIDEO_MASK;
05543    format_t textformat = format & AST_FORMAT_TEXT_MASK;
05544 
05545    if (!cause)
05546       cause = &foo;
05547    *cause = AST_CAUSE_NOTDEFINED;
05548 
05549    if (AST_RWLIST_RDLOCK(&backends)) {
05550       ast_log(LOG_WARNING, "Unable to lock technology backend list\n");
05551       return NULL;
05552    }
05553 
05554    AST_RWLIST_TRAVERSE(&backends, chan, list) {
05555       if (strcasecmp(type, chan->tech->type))
05556          continue;
05557 
05558       capabilities = chan->tech->capabilities;
05559       fmt = format & AST_FORMAT_AUDIO_MASK;
05560       if (fmt) {
05561          /* We have audio - is it possible to connect the various calls to each other? 
05562             (Avoid this check for calls without audio, like text+video calls)
05563          */
05564          res = ast_translator_best_choice(&fmt, &capabilities);
05565          if (res < 0) {
05566             char tmp1[256], tmp2[256];
05567             ast_log(LOG_WARNING, "No translator path exists for channel type %s (native %s) to %s\n", type,
05568                ast_getformatname_multiple(tmp1, sizeof(tmp1), chan->tech->capabilities),
05569                ast_getformatname_multiple(tmp2, sizeof(tmp2), format));
05570             *cause = AST_CAUSE_BEARERCAPABILITY_NOTAVAIL;
05571             AST_RWLIST_UNLOCK(&backends);
05572             return NULL;
05573          }
05574       }
05575       AST_RWLIST_UNLOCK(&backends);
05576       if (!chan->tech->requester)
05577          return NULL;
05578 
05579       if (!(c = chan->tech->requester(type, capabilities | videoformat | textformat, requestor, data, cause)))
05580          return NULL;
05581 
05582       if (set_security_requirements(requestor, c)) {
05583          ast_log(LOG_WARNING, "Setting security requirements failed\n");
05584          c = ast_channel_release(c);
05585          *cause = AST_CAUSE_BEARERCAPABILITY_NOTAVAIL;
05586          return NULL;
05587       }
05588 
05589       /* no need to generate a Newchannel event here; it is done in the channel_alloc call */
05590       return c;
05591    }
05592 
05593    ast_log(LOG_WARNING, "No channel type registered for '%s'\n", type);
05594    *cause = AST_CAUSE_NOSUCHDRIVER;
05595    AST_RWLIST_UNLOCK(&backends);
05596 
05597    return NULL;
05598 }
05599 
05600 int ast_call(struct ast_channel *chan, char *addr, int timeout)
05601 {
05602    /* Place an outgoing call, but don't wait any longer than timeout ms before returning.
05603       If the remote end does not answer within the timeout, then do NOT hang up, but
05604       return anyway.  */
05605    int res = -1;
05606    /* Stop if we're a zombie or need a soft hangup */
05607    ast_channel_lock(chan);
05608    if (!ast_test_flag(chan, AST_FLAG_ZOMBIE) && !ast_check_hangup(chan)) {
05609       if (chan->cdr) {
05610          ast_set_flag(chan->cdr, AST_CDR_FLAG_DIALED);
05611       }
05612       if (chan->tech->call)
05613          res = chan->tech->call(chan, addr, timeout);
05614       ast_set_flag(chan, AST_FLAG_OUTGOING);
05615    }
05616    ast_channel_unlock(chan);
05617    return res;
05618 }
05619 
05620 /*!
05621   \brief Transfer a call to dest, if the channel supports transfer
05622 
05623   Called by:
05624    \arg app_transfer
05625    \arg the manager interface
05626 */
05627 int ast_transfer(struct ast_channel *chan, char *dest)
05628 {
05629    int res = -1;
05630 
05631    /* Stop if we're a zombie or need a soft hangup */
05632    ast_channel_lock(chan);
05633    if (!ast_test_flag(chan, AST_FLAG_ZOMBIE) && !ast_check_hangup(chan)) {
05634       if (chan->tech->transfer) {
05635          res = chan->tech->transfer(chan, dest);
05636          if (!res)
05637             res = 1;
05638       } else
05639          res = 0;
05640    }
05641    ast_channel_unlock(chan);
05642 
05643    if (res <= 0) {
05644       return res;
05645    }
05646 
05647    for (;;) {
05648       struct ast_frame *fr;
05649 
05650       res = ast_waitfor(chan, -1);
05651 
05652       if (res < 0 || !(fr = ast_read(chan))) {
05653          res = -1;
05654          break;
05655       }
05656 
05657       if (fr->frametype == AST_FRAME_CONTROL && fr->subclass.integer == AST_CONTROL_TRANSFER) {
05658          enum ast_control_transfer *message = fr->data.ptr;
05659 
05660          if (*message == AST_TRANSFER_SUCCESS) {
05661             res = 1;
05662          } else {
05663             res = -1;
05664          }
05665 
05666          ast_frfree(fr);
05667          break;
05668       }
05669 
05670       ast_frfree(fr);
05671    }
05672 
05673    return res;
05674 }
05675 
05676 int ast_readstring(struct ast_channel *c, char *s, int len, int timeout, int ftimeout, char *enders)
05677 {
05678    return ast_readstring_full(c, s, len, timeout, ftimeout, enders, -1, -1);
05679 }
05680 
05681 int ast_readstring_full(struct ast_channel *c, char *s, int len, int timeout, int ftimeout, char *enders, int audiofd, int ctrlfd)
05682 {
05683    int pos = 0;   /* index in the buffer where we accumulate digits */
05684    int to = ftimeout;
05685 
05686    struct ast_silence_generator *silgen = NULL;
05687 
05688    /* Stop if we're a zombie or need a soft hangup */
05689    if (ast_test_flag(c, AST_FLAG_ZOMBIE) || ast_check_hangup(c))
05690       return -1;
05691    if (!len)
05692       return -1;
05693    for (;;) {
05694       int d;
05695       if (c->stream) {
05696          d = ast_waitstream_full(c, AST_DIGIT_ANY, audiofd, ctrlfd);
05697          ast_stopstream(c);
05698          if (!silgen && ast_opt_transmit_silence)
05699             silgen = ast_channel_start_silence_generator(c);
05700          usleep(1000);
05701          if (!d)
05702             d = ast_waitfordigit_full(c, to, audiofd, ctrlfd);
05703       } else {
05704          if (!silgen && ast_opt_transmit_silence)
05705             silgen = ast_channel_start_silence_generator(c);
05706          d = ast_waitfordigit_full(c, to, audiofd, ctrlfd);
05707       }
05708       if (d < 0) {
05709          ast_channel_stop_silence_generator(c, silgen);
05710          return AST_GETDATA_FAILED;
05711       }
05712       if (d == 0) {
05713          s[pos] = '\0';
05714          ast_channel_stop_silence_generator(c, silgen);
05715          return AST_GETDATA_TIMEOUT;
05716       }
05717       if (d == 1) {
05718          s[pos] = '\0';
05719          ast_channel_stop_silence_generator(c, silgen);
05720          return AST_GETDATA_INTERRUPTED;
05721       }
05722       if (strchr(enders, d) && (pos == 0)) {
05723          s[pos] = '\0';
05724          ast_channel_stop_silence_generator(c, silgen);
05725          return AST_GETDATA_EMPTY_END_TERMINATED;
05726       }
05727       if (!strchr(enders, d)) {
05728          s[pos++] = d;
05729       }
05730       if (strchr(enders, d) || (pos >= len)) {
05731          s[pos] = '\0';
05732          ast_channel_stop_silence_generator(c, silgen);
05733          return AST_GETDATA_COMPLETE;
05734       }
05735       to = timeout;
05736    }
05737    /* Never reached */
05738    return 0;
05739 }
05740 
05741 int ast_channel_supports_html(struct ast_channel *chan)
05742 {
05743    return (chan->tech->send_html) ? 1 : 0;
05744 }
05745 
05746 int ast_channel_sendhtml(struct ast_channel *chan, int subclass, const char *data, int datalen)
05747 {
05748    if (chan->tech->send_html)
05749       return chan->tech->send_html(chan, subclass, data, datalen);
05750    return -1;
05751 }
05752 
05753 int ast_channel_sendurl(struct ast_channel *chan, const char *url)
05754 {
05755    return ast_channel_sendhtml(chan, AST_HTML_URL, url, strlen(url) + 1);
05756 }
05757 
05758 /*! \brief Set up translation from one channel to another */
05759 static int ast_channel_make_compatible_helper(struct ast_channel *from, struct ast_channel *to)
05760 {
05761    format_t src, dst;
05762    int use_slin;
05763 
05764    /* See if the channel driver can natively make these two channels compatible */
05765    if (from->tech->bridge && from->tech->bridge == to->tech->bridge &&
05766        !ast_channel_setoption(from, AST_OPTION_MAKE_COMPATIBLE, to, sizeof(struct ast_channel *), 0)) {
05767       return 0;
05768    }
05769 
05770    if (from->readformat == to->writeformat && from->writeformat == to->readformat) {
05771       /* Already compatible!  Moving on ... */
05772       return 0;
05773    }
05774 
05775    /* Set up translation from the 'from' channel to the 'to' channel */
05776    src = from->nativeformats;
05777    dst = to->nativeformats;
05778 
05779    /* If there's no audio in this call, don't bother with trying to find a translation path */
05780    if ((src & AST_FORMAT_AUDIO_MASK) == 0 || (dst & AST_FORMAT_AUDIO_MASK) == 0)
05781       return 0;
05782 
05783    if (ast_translator_best_choice(&dst, &src) < 0) {
05784       ast_log(LOG_WARNING, "No path to translate from %s to %s\n", from->name, to->name);
05785       return -1;
05786    }
05787 
05788    /* if the best path is not 'pass through', then
05789     * transcoding is needed; if desired, force transcode path
05790     * to use SLINEAR between channels, but only if there is
05791     * no direct conversion available. If generic PLC is
05792     * desired, then transcoding via SLINEAR is a requirement
05793     */
05794    use_slin = (src == AST_FORMAT_SLINEAR || dst == AST_FORMAT_SLINEAR);
05795    if ((src != dst) && (ast_opt_generic_plc || ast_opt_transcode_via_slin) &&
05796        (ast_translate_path_steps(dst, src) != 1 || use_slin))
05797       dst = AST_FORMAT_SLINEAR;
05798    if (ast_set_read_format(from, dst) < 0) {
05799       ast_log(LOG_WARNING, "Unable to set read format on channel %s to %s\n", from->name, ast_getformatname(dst));
05800       return -1;
05801    }
05802    if (ast_set_write_format(to, dst) < 0) {
05803       ast_log(LOG_WARNING, "Unable to set write format on channel %s to %s\n", to->name, ast_getformatname(dst));
05804       return -1;
05805    }
05806    return 0;
05807 }
05808 
05809 int ast_channel_make_compatible(struct ast_channel *chan, struct ast_channel *peer)
05810 {
05811    /* Some callers do not check return code, and we must try to set all call legs correctly */
05812    int rc = 0;
05813 
05814    /* Set up translation from the chan to the peer */
05815    rc = ast_channel_make_compatible_helper(chan, peer);
05816 
05817    if (rc < 0)
05818       return rc;
05819 
05820    /* Set up translation from the peer to the chan */
05821    rc = ast_channel_make_compatible_helper(peer, chan);
05822 
05823    return rc;
05824 }
05825 
05826 static int __ast_channel_masquerade(struct ast_channel *original, struct ast_channel *clonechan, struct ast_datastore *xfer_ds)
05827 {
05828    int res = -1;
05829    struct ast_channel *final_orig, *final_clone, *base;
05830 
05831    for (;;) {
05832       final_orig = original;
05833       final_clone = clonechan;
05834 
05835       ast_channel_lock_both(original, clonechan);
05836 
05837       if (ast_test_flag(original, AST_FLAG_ZOMBIE)
05838          || ast_test_flag(clonechan, AST_FLAG_ZOMBIE)) {
05839          /* Zombies! Run! */
05840          ast_log(LOG_WARNING,
05841             "Can't setup masquerade. One or both channels is dead. (%s <-- %s)\n",
05842             original->name, clonechan->name);
05843          ast_channel_unlock(clonechan);
05844          ast_channel_unlock(original);
05845          return -1;
05846       }
05847 
05848       /*
05849        * Each of these channels may be sitting behind a channel proxy
05850        * (i.e. chan_agent) and if so, we don't really want to
05851        * masquerade it, but its proxy
05852        */
05853       if (original->_bridge
05854          && (original->_bridge != ast_bridged_channel(original))
05855          && (original->_bridge->_bridge != original)) {
05856          final_orig = original->_bridge;
05857       }
05858       if (clonechan->_bridge
05859          && (clonechan->_bridge != ast_bridged_channel(clonechan))
05860          && (clonechan->_bridge->_bridge != clonechan)) {
05861          final_clone = clonechan->_bridge;
05862       }
05863       if (final_clone->tech->get_base_channel
05864          && (base = final_clone->tech->get_base_channel(final_clone))) {
05865          final_clone = base;
05866       }
05867 
05868       if ((final_orig != original) || (final_clone != clonechan)) {
05869          /*
05870           * Lots and lots of deadlock avoidance.  The main one we're
05871           * competing with is ast_write(), which locks channels
05872           * recursively, when working with a proxy channel.
05873           */
05874          if (ast_channel_trylock(final_orig)) {
05875             ast_channel_unlock(clonechan);
05876             ast_channel_unlock(original);
05877 
05878             /* Try again */
05879             continue;
05880          }
05881          if (ast_channel_trylock(final_clone)) {
05882             ast_channel_unlock(final_orig);
05883             ast_channel_unlock(clonechan);
05884             ast_channel_unlock(original);
05885 
05886             /* Try again */
05887             continue;
05888          }
05889          ast_channel_unlock(clonechan);
05890          ast_channel_unlock(original);
05891          original = final_orig;
05892          clonechan = final_clone;
05893 
05894          if (ast_test_flag(original, AST_FLAG_ZOMBIE)
05895             || ast_test_flag(clonechan, AST_FLAG_ZOMBIE)) {
05896             /* Zombies! Run! */
05897             ast_log(LOG_WARNING,
05898                "Can't setup masquerade. One or both channels is dead. (%s <-- %s)\n",
05899                original->name, clonechan->name);
05900             ast_channel_unlock(clonechan);
05901             ast_channel_unlock(original);
05902             return -1;
05903          }
05904       }
05905       break;
05906    }
05907 
05908    if (original == clonechan) {
05909       ast_log(LOG_WARNING, "Can't masquerade channel '%s' into itself!\n", original->name);
05910       ast_channel_unlock(clonechan);
05911       ast_channel_unlock(original);
05912       return -1;
05913    }
05914 
05915    ast_debug(1, "Planning to masquerade channel %s into the structure of %s\n",
05916       clonechan->name, original->name);
05917 
05918    if (!original->masqr && !original->masq && !clonechan->masq && !clonechan->masqr) {
05919       original->masq = clonechan;
05920       clonechan->masqr = original;
05921       if (xfer_ds) {
05922          ast_channel_datastore_add(original, xfer_ds);
05923       }
05924       ast_queue_frame(original, &ast_null_frame);
05925       ast_queue_frame(clonechan, &ast_null_frame);
05926       ast_debug(1, "Done planning to masquerade channel %s into the structure of %s\n", clonechan->name, original->name);
05927       res = 0;
05928    } else if (original->masq) {
05929       ast_log(LOG_WARNING, "%s is already going to masquerade as %s\n",
05930          original->masq->name, original->name);
05931    } else if (original->masqr) {
05932       /* not yet as a previously planned masq hasn't yet happened */
05933       ast_log(LOG_WARNING, "%s is already going to masquerade as %s\n",
05934          original->name, original->masqr->name);
05935    } else if (clonechan->masq) {
05936       ast_log(LOG_WARNING, "%s is already going to masquerade as %s\n",
05937          clonechan->masq->name, clonechan->name);
05938    } else { /* (clonechan->masqr) */
05939       ast_log(LOG_WARNING, "%s is already going to masquerade as %s\n",
05940       clonechan->name, clonechan->masqr->name);
05941    }
05942 
05943    ast_channel_unlock(clonechan);
05944    ast_channel_unlock(original);
05945 
05946    return res;
05947 }
05948 
05949 int ast_channel_masquerade(struct ast_channel *original, struct ast_channel *clone)
05950 {
05951    return __ast_channel_masquerade(original, clone, NULL);
05952 }
05953 
05954 /*!
05955  * \internal
05956  * \brief Copy the source connected line information to the destination for a transfer.
05957  * \since 1.8
05958  *
05959  * \param dest Destination connected line
05960  * \param src Source connected line
05961  *
05962  * \return Nothing
05963  */
05964 static void party_connected_line_copy_transfer(struct ast_party_connected_line *dest, const struct ast_party_connected_line *src)
05965 {
05966    struct ast_party_connected_line connected;
05967 
05968    connected = *((struct ast_party_connected_line *) src);
05969    connected.source = AST_CONNECTED_LINE_UPDATE_SOURCE_TRANSFER;
05970 
05971    /* Make sure empty strings will be erased. */
05972    if (!connected.id.name.str) {
05973       connected.id.name.str = "";
05974    }
05975    if (!connected.id.number.str) {
05976       connected.id.number.str = "";
05977    }
05978    if (!connected.id.subaddress.str) {
05979       connected.id.subaddress.str = "";
05980    }
05981    if (!connected.id.tag) {
05982       connected.id.tag = "";
05983    }
05984 
05985    ast_party_connected_line_copy(dest, &connected);
05986 }
05987 
05988 /*! Transfer masquerade connected line exchange data. */
05989 struct xfer_masquerade_ds {
05990    /*! New ID for the target of the transfer (Masquerade original channel) */
05991    struct ast_party_connected_line target_id;
05992    /*! New ID for the transferee of the transfer (Masquerade clone channel) */
05993    struct ast_party_connected_line transferee_id;
05994    /*! TRUE if the target call is held. (Masquerade original channel) */
05995    int target_held;
05996    /*! TRUE if the transferee call is held. (Masquerade clone channel) */
05997    int transferee_held;
05998 };
05999 
06000 /*!
06001  * \internal
06002  * \brief Destroy the transfer connected line exchange datastore information.
06003  * \since 1.8
06004  *
06005  * \param data The datastore payload to destroy.
06006  *
06007  * \return Nothing
06008  */
06009 static void xfer_ds_destroy(void *data)
06010 {
06011    struct xfer_masquerade_ds *ds = data;
06012 
06013    ast_party_connected_line_free(&ds->target_id);
06014    ast_party_connected_line_free(&ds->transferee_id);
06015    ast_free(ds);
06016 }
06017 
06018 static const struct ast_datastore_info xfer_ds_info = {
06019    .type = "xfer_colp",
06020    .destroy = xfer_ds_destroy,
06021 };
06022 
06023 int ast_channel_transfer_masquerade(
06024    struct ast_channel *target_chan,
06025    const struct ast_party_connected_line *target_id,
06026    int target_held,
06027    struct ast_channel *transferee_chan,
06028    const struct ast_party_connected_line *transferee_id,
06029    int transferee_held)
06030 {
06031    struct ast_datastore *xfer_ds;
06032    struct xfer_masquerade_ds *xfer_colp;
06033    int res;
06034 
06035    xfer_ds = ast_datastore_alloc(&xfer_ds_info, NULL);
06036    if (!xfer_ds) {
06037       return -1;
06038    }
06039 
06040    xfer_colp = ast_calloc(1, sizeof(*xfer_colp));
06041    if (!xfer_colp) {
06042       ast_datastore_free(xfer_ds);
06043       return -1;
06044    }
06045    party_connected_line_copy_transfer(&xfer_colp->target_id, target_id);
06046    xfer_colp->target_held = target_held;
06047    party_connected_line_copy_transfer(&xfer_colp->transferee_id, transferee_id);
06048    xfer_colp->transferee_held = transferee_held;
06049    xfer_ds->data = xfer_colp;
06050 
06051    res = __ast_channel_masquerade(target_chan, transferee_chan, xfer_ds);
06052    if (res) {
06053       ast_datastore_free(xfer_ds);
06054    }
06055    return res;
06056 }
06057 
06058 /*! \brief this function simply changes the name of the channel and issues a manager_event
06059  *         with out unlinking and linking the channel from the ao2_container.  This should
06060  *         only be used when the channel has already been unlinked from the ao2_container.
06061  */
06062 static void __ast_change_name_nolink(struct ast_channel *chan, const char *newname)
06063 {
06064    ast_manager_event(chan, EVENT_FLAG_CALL, "Rename", "Channel: %s\r\nNewname: %s\r\nUniqueid: %s\r\n", chan->name, newname, chan->uniqueid);
06065    ast_string_field_set(chan, name, newname);
06066 }
06067 
06068 void ast_change_name(struct ast_channel *chan, const char *newname)
06069 {
06070    /* We must re-link, as the hash value will change here. */
06071    ao2_unlink(channels, chan);
06072    ast_channel_lock(chan);
06073    __ast_change_name_nolink(chan, newname);
06074    ast_channel_unlock(chan);
06075    ao2_link(channels, chan);
06076 }
06077 
06078 void ast_channel_inherit_variables(const struct ast_channel *parent, struct ast_channel *child)
06079 {
06080    struct ast_var_t *current, *newvar;
06081    const char *varname;
06082 
06083    AST_LIST_TRAVERSE(&parent->varshead, current, entries) {
06084       int vartype = 0;
06085 
06086       varname = ast_var_full_name(current);
06087       if (!varname)
06088          continue;
06089 
06090       if (varname[0] == '_') {
06091          vartype = 1;
06092          if (varname[1] == '_')
06093             vartype = 2;
06094       }
06095 
06096       switch (vartype) {
06097       case 1:
06098          newvar = ast_var_assign(&varname[1], ast_var_value(current));
06099          if (newvar) {
06100             AST_LIST_INSERT_TAIL(&child->varshead, newvar, entries);
06101             ast_debug(1, "Copying soft-transferable variable %s.\n", ast_var_name(newvar));
06102          }
06103          break;
06104       case 2:
06105          newvar = ast_var_assign(varname, ast_var_value(current));
06106          if (newvar) {
06107             AST_LIST_INSERT_TAIL(&child->varshead, newvar, entries);
06108             ast_debug(1, "Copying hard-transferable variable %s.\n", ast_var_name(newvar));
06109          }
06110          break;
06111       default:
06112          ast_debug(1, "Not copying variable %s.\n", ast_var_name(current));
06113          break;
06114       }
06115    }
06116 }
06117 
06118 /*!
06119   \brief Clone channel variables from 'clone' channel into 'original' channel
06120 
06121   All variables except those related to app_groupcount are cloned.
06122   Variables are actually _removed_ from 'clone' channel, presumably
06123   because it will subsequently be destroyed.
06124 
06125   \note Assumes locks will be in place on both channels when called.
06126 */
06127 static void clone_variables(struct ast_channel *original, struct ast_channel *clonechan)
06128 {
06129    struct ast_var_t *current, *newvar;
06130    /* Append variables from clone channel into original channel */
06131    /* XXX Is this always correct?  We have to in order to keep MACROS working XXX */
06132    if (AST_LIST_FIRST(&clonechan->varshead))
06133       AST_LIST_APPEND_LIST(&original->varshead, &clonechan->varshead, entries);
06134 
06135    /* then, dup the varshead list into the clone */
06136    
06137    AST_LIST_TRAVERSE(&original->varshead, current, entries) {
06138       newvar = ast_var_assign(current->name, current->value);
06139       if (newvar)
06140          AST_LIST_INSERT_TAIL(&clonechan->varshead, newvar, entries);
06141    }
06142 }
06143 
06144 
06145 
06146 /* return the oldest of two linkedids.  linkedid is derived from
06147    uniqueid which is formed like this: [systemname-]ctime.seq
06148 
06149    The systemname, and the dash are optional, followed by the epoch
06150    time followed by an integer sequence.  Note that this is not a
06151    decimal number, since 1.2 is less than 1.11 in uniqueid land.
06152 
06153    To compare two uniqueids, we parse out the integer values of the
06154    time and the sequence numbers and compare them, with time trumping
06155    sequence.
06156 */
06157 static const char *oldest_linkedid(const char *a, const char *b)
06158 {
06159    const char *satime, *saseq;
06160    const char *sbtime, *sbseq;
06161    const char *dash;
06162 
06163    unsigned int atime, aseq, btime, bseq;
06164 
06165    if (ast_strlen_zero(a))
06166       return b;
06167 
06168    if (ast_strlen_zero(b))
06169       return a;
06170 
06171    satime = a;
06172    sbtime = b;
06173 
06174    /* jump over the system name */
06175    if ((dash = strrchr(satime, '-'))) {
06176       satime = dash+1;
06177    }
06178    if ((dash = strrchr(sbtime, '-'))) {
06179       sbtime = dash+1;
06180    }
06181 
06182    /* the sequence comes after the '.' */
06183    saseq = strchr(satime, '.');
06184    sbseq = strchr(sbtime, '.');
06185    if (!saseq || !sbseq)
06186       return NULL;
06187    saseq++;
06188    sbseq++;
06189 
06190    /* convert it all to integers */
06191    atime = atoi(satime); /* note that atoi is ignoring the '.' after the time string */
06192    btime = atoi(sbtime); /* note that atoi is ignoring the '.' after the time string */
06193    aseq = atoi(saseq);
06194    bseq = atoi(sbseq);
06195 
06196    /* and finally compare */
06197    if (atime == btime) {
06198       return (aseq < bseq) ? a : b;
06199    }
06200    else {
06201       return (atime < btime) ? a : b;
06202    }
06203 }
06204 
06205 /*! Set the channel's linkedid to the given string, and also check to
06206  *  see if the channel's old linkedid is now being retired */
06207 static void ast_channel_change_linkedid(struct ast_channel *chan, const char *linkedid)
06208 {
06209    /* if the linkedid for this channel is being changed from something, check... */
06210    if (!ast_strlen_zero(chan->linkedid) && 0 != strcmp(chan->linkedid, linkedid)) {
06211       ast_cel_check_retire_linkedid(chan);
06212    }
06213 
06214    ast_string_field_set(chan, linkedid, linkedid);
06215 }
06216 
06217 
06218 /*!
06219   \brief Propagate the oldest linkedid between associated channels
06220 
06221 */
06222 void ast_channel_set_linkgroup(struct ast_channel *chan, struct ast_channel *peer)
06223 {
06224    const char* linkedid=NULL;
06225    struct ast_channel *bridged;
06226 
06227    linkedid = oldest_linkedid(chan->linkedid, peer->linkedid);
06228    linkedid = oldest_linkedid(linkedid, chan->uniqueid);
06229    linkedid = oldest_linkedid(linkedid, peer->uniqueid);
06230    if (chan->_bridge) {
06231       bridged = ast_bridged_channel(chan);
06232       if (bridged != peer) {
06233          linkedid = oldest_linkedid(linkedid, bridged->linkedid);
06234          linkedid = oldest_linkedid(linkedid, bridged->uniqueid);
06235       }
06236    }
06237    if (peer->_bridge) {
06238       bridged = ast_bridged_channel(peer);
06239       if (bridged != chan) {
06240          linkedid = oldest_linkedid(linkedid, bridged->linkedid);
06241          linkedid = oldest_linkedid(linkedid, bridged->uniqueid);
06242       }
06243    }
06244 
06245    /* just in case setting a stringfield to itself causes problems */
06246    linkedid = ast_strdupa(linkedid);
06247 
06248    ast_channel_change_linkedid(chan, linkedid);
06249    ast_channel_change_linkedid(peer, linkedid);
06250    if (chan->_bridge) {
06251       bridged = ast_bridged_channel(chan);
06252       if (bridged != peer) {
06253          ast_channel_change_linkedid(bridged, linkedid);
06254       }
06255    }
06256    if (peer->_bridge) {
06257       bridged = ast_bridged_channel(peer);
06258       if (bridged != chan) {
06259          ast_channel_change_linkedid(bridged, linkedid);
06260       }
06261    }
06262 }
06263 
06264 /* copy accountcode and peeraccount across during a link */
06265 static void ast_set_owners_and_peers(struct ast_channel *chan1,
06266                             struct ast_channel *chan2)
06267 {
06268    if (!ast_strlen_zero(chan1->accountcode) && ast_strlen_zero(chan2->peeraccount)) {
06269       ast_log(LOG_DEBUG, "setting peeraccount to %s for %s from data on channel %s\n",
06270             chan1->accountcode, chan2->name, chan1->name);
06271       ast_string_field_set(chan2, peeraccount, chan1->accountcode);
06272    }
06273    if (!ast_strlen_zero(chan2->accountcode) && ast_strlen_zero(chan1->peeraccount)) {
06274       ast_log(LOG_DEBUG, "setting peeraccount to %s for %s from data on channel %s\n",
06275             chan2->accountcode, chan1->name, chan2->name);
06276       ast_string_field_set(chan1, peeraccount, chan2->accountcode);
06277    }
06278    if (!ast_strlen_zero(chan1->peeraccount) && ast_strlen_zero(chan2->accountcode)) {
06279       ast_log(LOG_DEBUG, "setting accountcode to %s for %s from data on channel %s\n",
06280             chan1->peeraccount, chan2->name, chan1->name);
06281       ast_string_field_set(chan2, accountcode, chan1->peeraccount);
06282    }
06283    if (!ast_strlen_zero(chan2->peeraccount) && ast_strlen_zero(chan1->accountcode)) {
06284       ast_log(LOG_DEBUG, "setting accountcode to %s for %s from data on channel %s\n",
06285             chan2->peeraccount, chan1->name, chan2->name);
06286       ast_string_field_set(chan1, accountcode, chan2->peeraccount);
06287    }
06288    if (0 != strcmp(chan1->accountcode, chan2->peeraccount)) {
06289       ast_log(LOG_DEBUG, "changing peeraccount from %s to %s on %s to match channel %s\n",
06290             chan2->peeraccount, chan1->peeraccount, chan2->name, chan1->name);
06291       ast_string_field_set(chan2, peeraccount, chan1->accountcode);
06292    }
06293    if (0 != strcmp(chan2->accountcode, chan1->peeraccount)) {
06294       ast_log(LOG_DEBUG, "changing peeraccount from %s to %s on %s to match channel %s\n",
06295             chan1->peeraccount, chan2->peeraccount, chan1->name, chan2->name);
06296       ast_string_field_set(chan1, peeraccount, chan2->accountcode);
06297    }
06298 }
06299 
06300 /*!
06301  * \pre chan is locked
06302  */
06303 static void report_new_callerid(struct ast_channel *chan)
06304 {
06305    int pres;
06306 
06307    pres = ast_party_id_presentation(&chan->caller.id);
06308    ast_manager_event(chan, EVENT_FLAG_CALL, "NewCallerid",
06309       "Channel: %s\r\n"
06310       "CallerIDNum: %s\r\n"
06311       "CallerIDName: %s\r\n"
06312       "Uniqueid: %s\r\n"
06313       "CID-CallingPres: %d (%s)\r\n",
06314       chan->name,
06315       S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, ""),
06316       S_COR(chan->caller.id.name.valid, chan->caller.id.name.str, ""),
06317       chan->uniqueid,
06318       pres,
06319       ast_describe_caller_presentation(pres)
06320       );
06321 }
06322 
06323 /*!
06324  * \internal
06325  * \brief Transfer COLP between target and transferee channels.
06326  * \since 1.8
06327  *
06328  * \param transferee Transferee channel to exchange connected line information.
06329  * \param colp Connected line information to exchange.
06330  *
06331  * \return Nothing
06332  */
06333 static void masquerade_colp_transfer(struct ast_channel *transferee, struct xfer_masquerade_ds *colp)
06334 {
06335    struct ast_control_read_action_payload *frame_payload;
06336    int payload_size;
06337    int frame_size;
06338    unsigned char connected_line_data[1024];
06339 
06340    /* Release any hold on the target. */
06341    if (colp->target_held) {
06342       ast_queue_control(transferee, AST_CONTROL_UNHOLD);
06343    }
06344 
06345    /*
06346     * Since transferee may not actually be bridged to another channel,
06347     * there is no way for us to queue a frame so that its connected
06348     * line status will be updated.  Instead, we use the somewhat
06349     * hackish approach of using a special control frame type that
06350     * instructs ast_read() to perform a specific action.  In this
06351     * case, the frame we queue tells ast_read() to call the
06352     * connected line interception macro configured for transferee.
06353     */
06354    payload_size = ast_connected_line_build_data(connected_line_data,
06355       sizeof(connected_line_data), &colp->target_id, NULL);
06356    if (payload_size != -1) {
06357       frame_size = payload_size + sizeof(*frame_payload);
06358       frame_payload = alloca(frame_size);
06359       frame_payload->action = AST_FRAME_READ_ACTION_CONNECTED_LINE_MACRO;
06360       frame_payload->payload_size = payload_size;
06361       memcpy(frame_payload->payload, connected_line_data, payload_size);
06362       ast_queue_control_data(transferee, AST_CONTROL_READ_ACTION, frame_payload,
06363          frame_size);
06364    }
06365    /*
06366     * In addition to queueing the read action frame so that the
06367     * connected line info on transferee will be updated, we also are
06368     * going to queue a plain old connected line update on transferee to
06369     * update the target.
06370     */
06371    ast_channel_queue_connected_line_update(transferee, &colp->transferee_id, NULL);
06372 }
06373 
06374 /*!
06375  * \brief Masquerade a channel
06376  *
06377  * \note Assumes _NO_ channels and _NO_ channel pvt's are locked.  If a channel is locked while calling
06378  *       this function, it invalidates our channel container locking order.  All channels
06379  *       must be unlocked before it is permissible to lock the channels' ao2 container.
06380  */
06381 int ast_do_masquerade(struct ast_channel *original)
06382 {
06383    format_t x;
06384    int i;
06385    int res=0;
06386    int origstate;
06387    int visible_indication;
06388    struct ast_frame *current;
06389    const struct ast_channel_tech *t;
06390    void *t_pvt;
06391    union {
06392       struct ast_party_dialed dialed;
06393       struct ast_party_caller caller;
06394       struct ast_party_connected_line connected;
06395       struct ast_party_redirecting redirecting;
06396    } exchange;
06397    struct ast_channel *clonechan, *chans[2];
06398    struct ast_channel *bridged;
06399    struct ast_cdr *cdr;
06400    struct ast_datastore *xfer_ds;
06401    struct xfer_masquerade_ds *xfer_colp;
06402    format_t rformat = original->readformat;
06403    format_t wformat = original->writeformat;
06404    char newn[AST_CHANNEL_NAME];
06405    char orig[AST_CHANNEL_NAME];
06406    char masqn[AST_CHANNEL_NAME];
06407    char zombn[AST_CHANNEL_NAME];
06408 
06409    /* XXX This operation is a bit odd.  We're essentially putting the guts of
06410     * the clone channel into the original channel.  Start by killing off the
06411     * original channel's backend.  While the features are nice, which is the
06412     * reason we're keeping it, it's still awesomely weird. XXX */
06413 
06414    /* The reasoning for the channels ao2_container lock here is complex.
06415     * 
06416     * In order to check for a race condition, the original channel must
06417     * be locked.  If it is determined that the masquerade should proceed
06418     * the original channel can absolutely not be unlocked until the end
06419     * of the function.  Since after determining the masquerade should
06420     * continue requires the channels to be unlinked from the ao2_container,
06421     * the container lock must be held first to achieve proper locking order.
06422     */
06423    ao2_lock(channels);
06424 
06425    /* lock the original channel to determine if the masquerade is required or not */
06426    ast_channel_lock(original);
06427 
06428    /*
06429     * This checks to see if the masquerade has already happened or
06430     * not.  There is a race condition that exists for this
06431     * function.  Since all pvt and channel locks must be let go
06432     * before calling do_masquerade, it is possible that it could be
06433     * called multiple times for the same channel.  This check
06434     * verifies whether or not the masquerade has already been
06435     * completed by another thread.
06436     */
06437    while ((clonechan = original->masq) && ast_channel_trylock(clonechan)) {
06438       /*
06439        * A masq is needed but we could not get the clonechan lock
06440        * immediately.  Since this function already holds the global
06441        * container lock, unlocking original for deadlock avoidance
06442        * will not result in any sort of masquerade race condition.  If
06443        * masq is called by a different thread while this happens, it
06444        * will be stuck waiting until we unlock the container.
06445        */
06446       CHANNEL_DEADLOCK_AVOIDANCE(original);
06447    }
06448 
06449    /*
06450     * A final masq check must be done after deadlock avoidance for
06451     * clonechan above or we could get a double masq.  This is
06452     * posible with ast_hangup at least.
06453     */
06454    if (!clonechan) {
06455       /* masq already completed by another thread, or never needed to be done to begin with */
06456       ast_channel_unlock(original);
06457       ao2_unlock(channels);
06458       return 0;
06459    }
06460 
06461    /* Get any transfer masquerade connected line exchange data. */
06462    xfer_ds = ast_channel_datastore_find(original, &xfer_ds_info, NULL);
06463    if (xfer_ds) {
06464       ast_channel_datastore_remove(original, xfer_ds);
06465       xfer_colp = xfer_ds->data;
06466    } else {
06467       xfer_colp = NULL;
06468    }
06469 
06470    /*
06471     * Release any hold on the transferee channel before proceeding
06472     * with the masquerade.
06473     */
06474    if (xfer_colp && xfer_colp->transferee_held) {
06475       ast_indicate(clonechan, AST_CONTROL_UNHOLD);
06476    }
06477 
06478    /* clear the masquerade channels */
06479    original->masq = NULL;
06480    clonechan->masqr = NULL;
06481 
06482    /* unlink from channels container as name (which is the hash value) will change */
06483    ao2_unlink(channels, original);
06484    ao2_unlink(channels, clonechan);
06485 
06486    ast_debug(4, "Actually Masquerading %s(%d) into the structure of %s(%d)\n",
06487       clonechan->name, clonechan->_state, original->name, original->_state);
06488 
06489    /*
06490     * Stop any visible indiction on the original channel so we can
06491     * transfer it to the clonechan taking the original's place.
06492     */
06493    visible_indication = original->visible_indication;
06494    ast_indicate(original, -1);
06495 
06496    chans[0] = clonechan;
06497    chans[1] = original;
06498    ast_manager_event_multichan(EVENT_FLAG_CALL, "Masquerade", 2, chans,
06499       "Clone: %s\r\n"
06500       "CloneState: %s\r\n"
06501       "Original: %s\r\n"
06502       "OriginalState: %s\r\n",
06503       clonechan->name, ast_state2str(clonechan->_state), original->name, ast_state2str(original->_state));
06504 
06505    /* Having remembered the original read/write formats, we turn off any translation on either
06506       one */
06507    free_translation(clonechan);
06508    free_translation(original);
06509 
06510    /* Save the original name */
06511    ast_copy_string(orig, original->name, sizeof(orig));
06512    /* Save the new name */
06513    ast_copy_string(newn, clonechan->name, sizeof(newn));
06514    /* Create the masq name */
06515    snprintf(masqn, sizeof(masqn), "%s<MASQ>", newn);
06516 
06517    /* Mangle the name of the clone channel */
06518    __ast_change_name_nolink(clonechan, masqn);
06519 
06520    /* Copy the name from the clone channel */
06521    __ast_change_name_nolink(original, newn);
06522 
06523    /* share linked id's */
06524    ast_channel_set_linkgroup(original, clonechan);
06525 
06526    /* Swap the technologies */
06527    t = original->tech;
06528    original->tech = clonechan->tech;
06529    clonechan->tech = t;
06530 
06531    /* Swap the cdrs */
06532    cdr = original->cdr;
06533    original->cdr = clonechan->cdr;
06534    clonechan->cdr = cdr;
06535 
06536    t_pvt = original->tech_pvt;
06537    original->tech_pvt = clonechan->tech_pvt;
06538    clonechan->tech_pvt = t_pvt;
06539 
06540    /* Swap the alertpipes */
06541    for (i = 0; i < 2; i++) {
06542       x = original->alertpipe[i];
06543       original->alertpipe[i] = clonechan->alertpipe[i];
06544       clonechan->alertpipe[i] = x;
06545    }
06546 
06547    /* 
06548     * Swap the readq's.  The end result should be this:
06549     *
06550     *  1) All frames should be on the new (original) channel.
06551     *  2) Any frames that were already on the new channel before this
06552     *     masquerade need to be at the end of the readq, after all of the
06553     *     frames on the old (clone) channel.
06554     *  3) The alertpipe needs to get poked for every frame that was already
06555     *     on the new channel, since we are now using the alert pipe from the
06556     *     old (clone) channel.
06557     */
06558    {
06559       AST_LIST_HEAD_NOLOCK(, ast_frame) tmp_readq;
06560       AST_LIST_HEAD_SET_NOLOCK(&tmp_readq, NULL);
06561 
06562       AST_LIST_APPEND_LIST(&tmp_readq, &original->readq, frame_list);
06563       AST_LIST_APPEND_LIST(&original->readq, &clonechan->readq, frame_list);
06564 
06565       while ((current = AST_LIST_REMOVE_HEAD(&tmp_readq, frame_list))) {
06566          AST_LIST_INSERT_TAIL(&original->readq, current, frame_list);
06567          if (original->alertpipe[1] > -1) {
06568             int poke = 0;
06569 
06570             if (write(original->alertpipe[1], &poke, sizeof(poke)) < 0) {
06571                ast_log(LOG_WARNING, "write() failed: %s\n", strerror(errno));
06572             }
06573          }
06574       }
06575    }
06576 
06577    /* Swap the raw formats */
06578    x = original->rawreadformat;
06579    original->rawreadformat = clonechan->rawreadformat;
06580    clonechan->rawreadformat = x;
06581    x = original->rawwriteformat;
06582    original->rawwriteformat = clonechan->rawwriteformat;
06583    clonechan->rawwriteformat = x;
06584 
06585    clonechan->_softhangup = AST_SOFTHANGUP_DEV;
06586 
06587    /* And of course, so does our current state.  Note we need not
06588       call ast_setstate since the event manager doesn't really consider
06589       these separate.  We do this early so that the clone has the proper
06590       state of the original channel. */
06591    origstate = original->_state;
06592    original->_state = clonechan->_state;
06593    clonechan->_state = origstate;
06594 
06595    if (clonechan->tech->fixup && clonechan->tech->fixup(original, clonechan)) {
06596       ast_log(LOG_WARNING, "Fixup failed on channel %s, strange things may happen.\n", clonechan->name);
06597    }
06598 
06599    /* Start by disconnecting the original's physical side */
06600    if (clonechan->tech->hangup && clonechan->tech->hangup(clonechan)) {
06601       ast_log(LOG_WARNING, "Hangup failed!  Strange things may happen!\n");
06602       res = -1;
06603       goto done;
06604    }
06605 
06606    /*
06607     * We just hung up the physical side of the channel.  Set the
06608     * new zombie to use the kill channel driver for safety.
06609     */
06610    clonechan->tech = &ast_kill_tech;
06611 
06612    /* Mangle the name of the clone channel */
06613    snprintf(zombn, sizeof(zombn), "%s<ZOMBIE>", orig); /* quick, hide the brains! */
06614    __ast_change_name_nolink(clonechan, zombn);
06615 
06616    /* Update the type. */
06617    t_pvt = original->monitor;
06618    original->monitor = clonechan->monitor;
06619    clonechan->monitor = t_pvt;
06620 
06621    /* Keep the same language.  */
06622    ast_string_field_set(original, language, clonechan->language);
06623    /* Copy the FD's other than the generator fd */
06624    for (x = 0; x < AST_MAX_FDS; x++) {
06625       if (x != AST_GENERATOR_FD)
06626          ast_channel_set_fd(original, x, clonechan->fds[x]);
06627    }
06628 
06629    ast_app_group_update(clonechan, original);
06630 
06631    /* Move data stores over */
06632    if (AST_LIST_FIRST(&clonechan->datastores)) {
06633       struct ast_datastore *ds;
06634       /* We use a safe traversal here because some fixup routines actually
06635        * remove the datastore from the list and free them.
06636        */
06637       AST_LIST_TRAVERSE_SAFE_BEGIN(&clonechan->datastores, ds, entry) {
06638          if (ds->info->chan_fixup)
06639             ds->info->chan_fixup(ds->data, clonechan, original);
06640       }
06641       AST_LIST_TRAVERSE_SAFE_END;
06642       AST_LIST_APPEND_LIST(&original->datastores, &clonechan->datastores, entry);
06643    }
06644 
06645    ast_autochan_new_channel(clonechan, original);
06646 
06647    clone_variables(original, clonechan);
06648    /* Presense of ADSI capable CPE follows clone */
06649    original->adsicpe = clonechan->adsicpe;
06650    /* Bridge remains the same */
06651    /* CDR fields remain the same */
06652    /* XXX What about blocking, softhangup, blocker, and lock and blockproc? XXX */
06653    /* Application and data remain the same */
06654    /* Clone exception  becomes real one, as with fdno */
06655    ast_set_flag(original, ast_test_flag(clonechan, AST_FLAG_EXCEPTION | AST_FLAG_OUTGOING));
06656    original->fdno = clonechan->fdno;
06657    /* Schedule context remains the same */
06658    /* Stream stuff stays the same */
06659    /* Keep the original state.  The fixup code will need to work with it most likely */
06660 
06661    /*
06662     * Just swap the whole structures, nevermind the allocations,
06663     * they'll work themselves out.
06664     */
06665    exchange.dialed = original->dialed;
06666    original->dialed = clonechan->dialed;
06667    clonechan->dialed = exchange.dialed;
06668 
06669    exchange.caller = original->caller;
06670    original->caller = clonechan->caller;
06671    clonechan->caller = exchange.caller;
06672 
06673    exchange.connected = original->connected;
06674    original->connected = clonechan->connected;
06675    clonechan->connected = exchange.connected;
06676 
06677    exchange.redirecting = original->redirecting;
06678    original->redirecting = clonechan->redirecting;
06679    clonechan->redirecting = exchange.redirecting;
06680 
06681    report_new_callerid(original);
06682 
06683    /* Restore original timing file descriptor */
06684    ast_channel_set_fd(original, AST_TIMING_FD, original->timingfd);
06685 
06686    /* Our native formats are different now */
06687    original->nativeformats = clonechan->nativeformats;
06688 
06689    /* Context, extension, priority, app data, jump table,  remain the same */
06690    /* pvt switches.  pbx stays the same, as does next */
06691 
06692    /* Set the write format */
06693    ast_set_write_format(original, wformat);
06694 
06695    /* Set the read format */
06696    ast_set_read_format(original, rformat);
06697 
06698    /* Copy the music class */
06699    ast_string_field_set(original, musicclass, clonechan->musicclass);
06700 
06701    /* copy over accuntcode and set peeraccount across the bridge */
06702    ast_string_field_set(original, accountcode, S_OR(clonechan->accountcode, ""));
06703    if (original->_bridge) {
06704       /* XXX - should we try to lock original->_bridge here? */
06705       ast_string_field_set(original->_bridge, peeraccount, S_OR(clonechan->accountcode, ""));
06706       ast_cel_report_event(original, AST_CEL_BRIDGE_UPDATE, NULL, NULL, NULL);
06707    }
06708 
06709    ast_debug(1, "Putting channel %s in %s/%s formats\n", original->name,
06710       ast_getformatname(wformat), ast_getformatname(rformat));
06711 
06712    /* Okay.  Last thing is to let the channel driver know about all this mess, so he
06713       can fix up everything as best as possible */
06714    if (original->tech->fixup) {
06715       if (original->tech->fixup(clonechan, original)) {
06716          ast_log(LOG_WARNING, "Channel for type '%s' could not fixup channel %s\n",
06717             original->tech->type, original->name);
06718          res = -1;
06719          goto done;
06720       }
06721    } else
06722       ast_log(LOG_WARNING, "Channel type '%s' does not have a fixup routine (for %s)!  Bad things may happen.\n",
06723          original->tech->type, original->name);
06724 
06725    /* 
06726     * If an indication is currently playing, maintain it on the channel 
06727     * that is taking the place of original 
06728     *
06729     * This is needed because the masquerade is swapping out in the internals
06730     * of this channel, and the new channel private data needs to be made
06731     * aware of the current visible indication (RINGING, CONGESTION, etc.)
06732     */
06733    if (visible_indication) {
06734       ast_indicate(original, visible_indication);
06735    }
06736 
06737    /* Now, at this point, the "clone" channel is totally F'd up.  We mark it as
06738       a zombie so nothing tries to touch it.  If it's already been marked as a
06739       zombie, then free it now (since it already is considered invalid). */
06740    if (ast_test_flag(clonechan, AST_FLAG_ZOMBIE)) {
06741       ast_debug(1, "Destroying channel clone '%s'\n", clonechan->name);
06742       ast_channel_unlock(clonechan);
06743       ast_manager_event(clonechan, EVENT_FLAG_CALL, "Hangup",
06744          "Channel: %s\r\n"
06745          "Uniqueid: %s\r\n"
06746          "Cause: %d\r\n"
06747          "Cause-txt: %s\r\n",
06748          clonechan->name,
06749          clonechan->uniqueid,
06750          clonechan->hangupcause,
06751          ast_cause2str(clonechan->hangupcause)
06752          );
06753       clonechan = ast_channel_release(clonechan);
06754    } else {
06755       ast_debug(1, "Released clone lock on '%s'\n", clonechan->name);
06756       ast_set_flag(clonechan, AST_FLAG_ZOMBIE);
06757       ast_queue_frame(clonechan, &ast_null_frame);
06758    }
06759 
06760    /* Signal any blocker */
06761    if (ast_test_flag(original, AST_FLAG_BLOCKING))
06762       pthread_kill(original->blocker, SIGURG);
06763    ast_debug(1, "Done Masquerading %s (%d)\n", original->name, original->_state);
06764 
06765    if ((bridged = ast_bridged_channel(original))) {
06766       ast_channel_lock(bridged);
06767       ast_indicate(bridged, AST_CONTROL_SRCCHANGE);
06768       ast_channel_unlock(bridged);
06769    }
06770    ast_indicate(original, AST_CONTROL_SRCCHANGE);
06771 
06772    if (xfer_colp) {
06773       /*
06774        * After the masquerade, the original channel pointer actually
06775        * points to the new transferee channel and the bridged channel
06776        * is still the intended transfer target party.
06777        */
06778       masquerade_colp_transfer(original, xfer_colp);
06779    }
06780 
06781 done:
06782    if (xfer_ds) {
06783       ast_datastore_free(xfer_ds);
06784    }
06785    /* it is possible for the clone channel to disappear during this */
06786    if (clonechan) {
06787       ast_channel_unlock(original);
06788       ast_channel_unlock(clonechan);
06789       ao2_link(channels, clonechan);
06790       ao2_link(channels, original);
06791    } else {
06792       ast_channel_unlock(original);
06793       ao2_link(channels, original);
06794    }
06795 
06796    ao2_unlock(channels);
06797 
06798    return res;
06799 }
06800 
06801 void ast_set_callerid(struct ast_channel *chan, const char *cid_num, const char *cid_name, const char *cid_ani)
06802 {
06803    ast_channel_lock(chan);
06804 
06805    if (cid_num) {
06806       chan->caller.id.number.valid = 1;
06807       ast_free(chan->caller.id.number.str);
06808       chan->caller.id.number.str = ast_strdup(cid_num);
06809    }
06810    if (cid_name) {
06811       chan->caller.id.name.valid = 1;
06812       ast_free(chan->caller.id.name.str);
06813       chan->caller.id.name.str = ast_strdup(cid_name);
06814    }
06815    if (cid_ani) {
06816       chan->caller.ani.number.valid = 1;
06817       ast_free(chan->caller.ani.number.str);
06818       chan->caller.ani.number.str = ast_strdup(cid_ani);
06819    }
06820    if (chan->cdr) {
06821       ast_cdr_setcid(chan->cdr, chan);
06822    }
06823 
06824    report_new_callerid(chan);
06825 
06826    ast_channel_unlock(chan);
06827 }
06828 
06829 void ast_channel_set_caller(struct ast_channel *chan, const struct ast_party_caller *caller, const struct ast_set_party_caller *update)
06830 {
06831    if (&chan->caller == caller) {
06832       /* Don't set to self */
06833       return;
06834    }
06835 
06836    ast_channel_lock(chan);
06837    ast_party_caller_set(&chan->caller, caller, update);
06838    ast_channel_unlock(chan);
06839 }
06840 
06841 void ast_channel_set_caller_event(struct ast_channel *chan, const struct ast_party_caller *caller, const struct ast_set_party_caller *update)
06842 {
06843    const char *pre_set_number;
06844    const char *pre_set_name;
06845 
06846    if (&chan->caller == caller) {
06847       /* Don't set to self */
06848       return;
06849    }
06850 
06851    ast_channel_lock(chan);
06852    pre_set_number =
06853       S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, NULL);
06854    pre_set_name = S_COR(chan->caller.id.name.valid, chan->caller.id.name.str, NULL);
06855    ast_party_caller_set(&chan->caller, caller, update);
06856    if (S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, NULL)
06857          != pre_set_number
06858       || S_COR(chan->caller.id.name.valid, chan->caller.id.name.str, NULL)
06859          != pre_set_name) {
06860       /* The caller id name or number changed. */
06861       report_new_callerid(chan);
06862    }
06863    if (chan->cdr) {
06864       ast_cdr_setcid(chan->cdr, chan);
06865    }
06866    ast_channel_unlock(chan);
06867 }
06868 
06869 int ast_setstate(struct ast_channel *chan, enum ast_channel_state state)
06870 {
06871    int oldstate = chan->_state;
06872    char name[AST_CHANNEL_NAME], *dashptr;
06873 
06874    if (oldstate == state)
06875       return 0;
06876 
06877    ast_copy_string(name, chan->name, sizeof(name));
06878    if ((dashptr = strrchr(name, '-'))) {
06879       *dashptr = '\0';
06880    }
06881 
06882    chan->_state = state;
06883 
06884    /* We have to pass AST_DEVICE_UNKNOWN here because it is entirely possible that the channel driver
06885     * for this channel is using the callback method for device state. If we pass in an actual state here
06886     * we override what they are saying the state is and things go amuck. */
06887    ast_devstate_changed_literal(AST_DEVICE_UNKNOWN, name);
06888 
06889    /* setstate used to conditionally report Newchannel; this is no more */
06890    ast_manager_event(chan, EVENT_FLAG_CALL, "Newstate",
06891       "Channel: %s\r\n"
06892       "ChannelState: %d\r\n"
06893       "ChannelStateDesc: %s\r\n"
06894       "CallerIDNum: %s\r\n"
06895       "CallerIDName: %s\r\n"
06896       "ConnectedLineNum: %s\r\n"
06897       "ConnectedLineName: %s\r\n"
06898       "Uniqueid: %s\r\n",
06899       chan->name, chan->_state, ast_state2str(chan->_state),
06900       S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, ""),
06901       S_COR(chan->caller.id.name.valid, chan->caller.id.name.str, ""),
06902       S_COR(chan->connected.id.number.valid, chan->connected.id.number.str, ""),
06903       S_COR(chan->connected.id.name.valid, chan->connected.id.name.str, ""),
06904       chan->uniqueid);
06905 
06906    return 0;
06907 }
06908 
06909 /*! \brief Find bridged channel */
06910 struct ast_channel *ast_bridged_channel(struct ast_channel *chan)
06911 {
06912    struct ast_channel *bridged;
06913    bridged = chan->_bridge;
06914    if (bridged && bridged->tech->bridged_channel)
06915       bridged = bridged->tech->bridged_channel(chan, bridged);
06916    return bridged;
06917 }
06918 
06919 static void bridge_playfile(struct ast_channel *chan, struct ast_channel *peer, const char *sound, int remain)
06920 {
06921    int min = 0, sec = 0, check;
06922 
06923    check = ast_autoservice_start(peer);
06924    if (check)
06925       return;
06926 
06927    if (remain > 0) {
06928       if (remain / 60 > 1) {
06929          min = remain / 60;
06930          sec = remain % 60;
06931       } else {
06932          sec = remain;
06933       }
06934    }
06935    
06936    if (!strcmp(sound,"timeleft")) { /* Queue support */
06937       ast_stream_and_wait(chan, "vm-youhave", "");
06938       if (min) {
06939          ast_say_number(chan, min, AST_DIGIT_ANY, chan->language, NULL);
06940          ast_stream_and_wait(chan, "queue-minutes", "");
06941       }
06942       if (sec) {
06943          ast_say_number(chan, sec, AST_DIGIT_ANY, chan->language, NULL);
06944          ast_stream_and_wait(chan, "queue-seconds", "");
06945       }
06946    } else {
06947       ast_stream_and_wait(chan, sound, "");
06948    }
06949 
06950    ast_autoservice_stop(peer);
06951 }
06952 
06953 static enum ast_bridge_result ast_generic_bridge(struct ast_channel *c0, struct ast_channel *c1,
06954                    struct ast_bridge_config *config, struct ast_frame **fo,
06955                    struct ast_channel **rc)
06956 {
06957    /* Copy voice back and forth between the two channels. */
06958    struct ast_channel *cs[3];
06959    struct ast_frame *f;
06960    enum ast_bridge_result res = AST_BRIDGE_COMPLETE;
06961    format_t o0nativeformats;
06962    format_t o1nativeformats;
06963    int watch_c0_dtmf;
06964    int watch_c1_dtmf;
06965    void *pvt0, *pvt1;
06966    /* Indicates whether a frame was queued into a jitterbuffer */
06967    int frame_put_in_jb = 0;
06968    int jb_in_use;
06969    int to;
06970    
06971    cs[0] = c0;
06972    cs[1] = c1;
06973    pvt0 = c0->tech_pvt;
06974    pvt1 = c1->tech_pvt;
06975    o0nativeformats = c0->nativeformats;
06976    o1nativeformats = c1->nativeformats;
06977    watch_c0_dtmf = config->flags & AST_BRIDGE_DTMF_CHANNEL_0;
06978    watch_c1_dtmf = config->flags & AST_BRIDGE_DTMF_CHANNEL_1;
06979 
06980    /* Check the need of a jitterbuffer for each channel */
06981    jb_in_use = ast_jb_do_usecheck(c0, c1);
06982    if (jb_in_use)
06983       ast_jb_empty_and_reset(c0, c1);
06984 
06985    ast_poll_channel_add(c0, c1);
06986 
06987    if (config->feature_timer > 0 && ast_tvzero(config->nexteventts)) {
06988       /* nexteventts is not set when the bridge is not scheduled to
06989        * break, so calculate when the bridge should possibly break
06990        * if a partial feature match timed out */
06991       config->nexteventts = ast_tvadd(ast_tvnow(), ast_samp2tv(config->feature_timer, 1000));
06992    }
06993 
06994    for (;;) {
06995       struct ast_channel *who, *other;
06996 
06997       if ((c0->tech_pvt != pvt0) || (c1->tech_pvt != pvt1) ||
06998           (o0nativeformats != c0->nativeformats) ||
06999           (o1nativeformats != c1->nativeformats)) {
07000          /* Check for Masquerade, codec changes, etc */
07001          res = AST_BRIDGE_RETRY;
07002          break;
07003       }
07004       if (config->nexteventts.tv_sec) {
07005          to = ast_tvdiff_ms(config->nexteventts, ast_tvnow());
07006          if (to <= 0) {
07007             if (config->timelimit && !config->feature_timer && !ast_test_flag(config, AST_FEATURE_WARNING_ACTIVE)) {
07008                res = AST_BRIDGE_RETRY;
07009                /* generic bridge ending to play warning */
07010                ast_set_flag(config, AST_FEATURE_WARNING_ACTIVE);
07011             } else if (config->feature_timer) {
07012                /* feature timer expired - make sure we do not play warning */
07013                ast_clear_flag(config, AST_FEATURE_WARNING_ACTIVE);
07014                res = AST_BRIDGE_RETRY;
07015             } else {
07016                res = AST_BRIDGE_COMPLETE;
07017             }
07018             break;
07019          }
07020       } else {
07021          /* If a feature has been started and the bridge is configured to 
07022           * to not break, leave the channel bridge when the feature timer
07023           * time has elapsed so the DTMF will be sent to the other side. 
07024           */
07025          if (!ast_tvzero(config->nexteventts)) {
07026             int diff = ast_tvdiff_ms(config->nexteventts, ast_tvnow());
07027             if (diff <= 0) {
07028                res = AST_BRIDGE_RETRY;
07029                break;
07030             }
07031          }
07032          to = -1;
07033       }
07034       /* Calculate the appropriate max sleep interval - in general, this is the time,
07035          left to the closest jb delivery moment */
07036       if (jb_in_use)
07037          to = ast_jb_get_when_to_wakeup(c0, c1, to);
07038       who = ast_waitfor_n(cs, 2, &to);
07039       if (!who) {
07040          /* No frame received within the specified timeout - check if we have to deliver now */
07041          if (jb_in_use)
07042             ast_jb_get_and_deliver(c0, c1);
07043          if ((c0->_softhangup | c1->_softhangup) & AST_SOFTHANGUP_UNBRIDGE) {/* Bit operators are intentional. */
07044             if (c0->_softhangup & AST_SOFTHANGUP_UNBRIDGE) {
07045                ast_channel_clear_softhangup(c0, AST_SOFTHANGUP_UNBRIDGE);
07046             }
07047             if (c1->_softhangup & AST_SOFTHANGUP_UNBRIDGE) {
07048                ast_channel_clear_softhangup(c1, AST_SOFTHANGUP_UNBRIDGE);
07049             }
07050             c0->_bridge = c1;
07051             c1->_bridge = c0;
07052          }
07053          continue;
07054       }
07055       f = ast_read(who);
07056       if (!f) {
07057          *fo = NULL;
07058          *rc = who;
07059          ast_debug(1, "Didn't get a frame from channel: %s\n",who->name);
07060          break;
07061       }
07062 
07063       other = (who == c0) ? c1 : c0; /* the 'other' channel */
07064       /* Try add the frame info the who's bridged channel jitterbuff */
07065       if (jb_in_use)
07066          frame_put_in_jb = !ast_jb_put(other, f);
07067 
07068       if ((f->frametype == AST_FRAME_CONTROL) && !(config->flags & AST_BRIDGE_IGNORE_SIGS)) {
07069          int bridge_exit = 0;
07070 
07071          switch (f->subclass.integer) {
07072          case AST_CONTROL_AOC:
07073             ast_indicate_data(other, f->subclass.integer, f->data.ptr, f->datalen);
07074             break;
07075          case AST_CONTROL_REDIRECTING:
07076             if (ast_channel_redirecting_macro(who, other, f, other == c0, 1)) {
07077                ast_indicate_data(other, f->subclass.integer, f->data.ptr, f->datalen);
07078             }
07079             break;
07080          case AST_CONTROL_CONNECTED_LINE:
07081             if (ast_channel_connected_line_macro(who, other, f, other == c0, 1)) {
07082                ast_indicate_data(other, f->subclass.integer, f->data.ptr, f->datalen);
07083             }
07084             break;
07085          case AST_CONTROL_HOLD:
07086          case AST_CONTROL_UNHOLD:
07087          case AST_CONTROL_VIDUPDATE:
07088          case AST_CONTROL_SRCUPDATE:
07089          case AST_CONTROL_SRCCHANGE:
07090          case AST_CONTROL_T38_PARAMETERS:
07091             ast_indicate_data(other, f->subclass.integer, f->data.ptr, f->datalen);
07092             if (jb_in_use) {
07093                ast_jb_empty_and_reset(c0, c1);
07094             }
07095             break;
07096          default:
07097             *fo = f;
07098             *rc = who;
07099             bridge_exit = 1;
07100             ast_debug(1, "Got a FRAME_CONTROL (%d) frame on channel %s\n", f->subclass.integer, who->name);
07101             break;
07102          }
07103          if (bridge_exit)
07104             break;
07105       }
07106       if ((f->frametype == AST_FRAME_VOICE) ||
07107           (f->frametype == AST_FRAME_DTMF_BEGIN) ||
07108           (f->frametype == AST_FRAME_DTMF) ||
07109           (f->frametype == AST_FRAME_VIDEO) ||
07110           (f->frametype == AST_FRAME_IMAGE) ||
07111           (f->frametype == AST_FRAME_HTML) ||
07112           (f->frametype == AST_FRAME_MODEM) ||
07113           (f->frametype == AST_FRAME_TEXT)) {
07114          /* monitored dtmf causes exit from bridge */
07115          int monitored_source = (who == c0) ? watch_c0_dtmf : watch_c1_dtmf;
07116 
07117          if (monitored_source &&
07118             (f->frametype == AST_FRAME_DTMF_END ||
07119             f->frametype == AST_FRAME_DTMF_BEGIN)) {
07120             *fo = f;
07121             *rc = who;
07122             ast_debug(1, "Got DTMF %s on channel (%s)\n", 
07123                f->frametype == AST_FRAME_DTMF_END ? "end" : "begin",
07124                who->name);
07125 
07126             break;
07127          }
07128          /* Write immediately frames, not passed through jb */
07129          if (!frame_put_in_jb)
07130             ast_write(other, f);
07131             
07132          /* Check if we have to deliver now */
07133          if (jb_in_use)
07134             ast_jb_get_and_deliver(c0, c1);
07135       }
07136       /* XXX do we want to pass on also frames not matched above ? */
07137       ast_frfree(f);
07138 
07139 #ifndef HAVE_EPOLL
07140       /* Swap who gets priority */
07141       cs[2] = cs[0];
07142       cs[0] = cs[1];
07143       cs[1] = cs[2];
07144 #endif
07145    }
07146 
07147    ast_poll_channel_del(c0, c1);
07148 
07149    return res;
07150 }
07151 
07152 /*! \brief Bridge two channels together (early) */
07153 int ast_channel_early_bridge(struct ast_channel *c0, struct ast_channel *c1)
07154 {
07155    /* Make sure we can early bridge, if not error out */
07156    if (!c0->tech->early_bridge || (c1 && (!c1->tech->early_bridge || c0->tech->early_bridge != c1->tech->early_bridge)))
07157       return -1;
07158 
07159    return c0->tech->early_bridge(c0, c1);
07160 }
07161 
07162 /*! \brief Send manager event for bridge link and unlink events.
07163  * \param onoff Link/Unlinked 
07164  * \param type 1 for core, 2 for native
07165  * \param c0 first channel in bridge
07166  * \param c1 second channel in bridge
07167 */
07168 static void manager_bridge_event(int onoff, int type, struct ast_channel *c0, struct ast_channel *c1)
07169 {
07170    struct ast_channel *chans[2] = { c0, c1 };
07171    ast_manager_event_multichan(EVENT_FLAG_CALL, "Bridge", 2, chans,
07172       "Bridgestate: %s\r\n"
07173       "Bridgetype: %s\r\n"
07174       "Channel1: %s\r\n"
07175       "Channel2: %s\r\n"
07176       "Uniqueid1: %s\r\n"
07177       "Uniqueid2: %s\r\n"
07178       "CallerID1: %s\r\n"
07179       "CallerID2: %s\r\n",
07180       onoff ? "Link" : "Unlink",
07181       type == 1 ? "core" : "native",
07182       c0->name, c1->name,
07183       c0->uniqueid, c1->uniqueid,
07184       S_COR(c0->caller.id.number.valid, c0->caller.id.number.str, ""),
07185       S_COR(c1->caller.id.number.valid, c1->caller.id.number.str, ""));
07186 }
07187 
07188 static void update_bridge_vars(struct ast_channel *c0, struct ast_channel *c1)
07189 {
07190    const char *c0_name;
07191    const char *c1_name;
07192    const char *c0_pvtid = NULL;
07193    const char *c1_pvtid = NULL;
07194 
07195    ast_channel_lock(c1);
07196    c1_name = ast_strdupa(c1->name);
07197    if (c1->tech->get_pvt_uniqueid) {
07198       c1_pvtid = ast_strdupa(c1->tech->get_pvt_uniqueid(c1));
07199    }
07200    ast_channel_unlock(c1);
07201 
07202    ast_channel_lock(c0);
07203    if (!ast_strlen_zero(pbx_builtin_getvar_helper(c0, "BRIDGEPEER"))) {
07204       pbx_builtin_setvar_helper(c0, "BRIDGEPEER", c1_name);
07205    }
07206    if (c1_pvtid) {
07207       pbx_builtin_setvar_helper(c0, "BRIDGEPVTCALLID", c1_pvtid);
07208    }
07209    c0_name = ast_strdupa(c0->name);
07210    if (c0->tech->get_pvt_uniqueid) {
07211       c0_pvtid = ast_strdupa(c0->tech->get_pvt_uniqueid(c0));
07212    }
07213    ast_channel_unlock(c0);
07214 
07215    ast_channel_lock(c1);
07216    if (!ast_strlen_zero(pbx_builtin_getvar_helper(c1, "BRIDGEPEER"))) {
07217       pbx_builtin_setvar_helper(c1, "BRIDGEPEER", c0_name);
07218    }
07219    if (c0_pvtid) {
07220       pbx_builtin_setvar_helper(c1, "BRIDGEPVTCALLID", c0_pvtid);
07221    }
07222    ast_channel_unlock(c1);
07223 }
07224 
07225 static void bridge_play_sounds(struct ast_channel *c0, struct ast_channel *c1)
07226 {
07227    const char *s, *sound;
07228 
07229    /* See if we need to play an audio file to any side of the bridge */
07230 
07231    ast_channel_lock(c0);
07232    if ((s = pbx_builtin_getvar_helper(c0, "BRIDGE_PLAY_SOUND"))) {
07233       sound = ast_strdupa(s);
07234       ast_channel_unlock(c0);
07235       bridge_playfile(c0, c1, sound, 0);
07236       pbx_builtin_setvar_helper(c0, "BRIDGE_PLAY_SOUND", NULL);
07237    } else {
07238       ast_channel_unlock(c0);
07239    }
07240 
07241    ast_channel_lock(c1);
07242    if ((s = pbx_builtin_getvar_helper(c1, "BRIDGE_PLAY_SOUND"))) {
07243       sound = ast_strdupa(s);
07244       ast_channel_unlock(c1);
07245       bridge_playfile(c1, c0, sound, 0);
07246       pbx_builtin_setvar_helper(c1, "BRIDGE_PLAY_SOUND", NULL);
07247    } else {
07248       ast_channel_unlock(c1);
07249    }
07250 }
07251 
07252 /*! \brief Bridge two channels together */
07253 enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_channel *c1,
07254                  struct ast_bridge_config *config, struct ast_frame **fo, struct ast_channel **rc)
07255 {
07256    struct ast_channel *chans[2] = { c0, c1 };
07257    enum ast_bridge_result res = AST_BRIDGE_COMPLETE;
07258    format_t o0nativeformats;
07259    format_t o1nativeformats;
07260    long time_left_ms=0;
07261    char caller_warning = 0;
07262    char callee_warning = 0;
07263 
07264    *fo = NULL;
07265 
07266    if (c0->_bridge) {
07267       ast_log(LOG_WARNING, "%s is already in a bridge with %s\n",
07268          c0->name, c0->_bridge->name);
07269       return -1;
07270    }
07271    if (c1->_bridge) {
07272       ast_log(LOG_WARNING, "%s is already in a bridge with %s\n",
07273          c1->name, c1->_bridge->name);
07274       return -1;
07275    }
07276    
07277    /* Stop if we're a zombie or need a soft hangup */
07278    if (ast_test_flag(c0, AST_FLAG_ZOMBIE) || ast_check_hangup_locked(c0) ||
07279        ast_test_flag(c1, AST_FLAG_ZOMBIE) || ast_check_hangup_locked(c1))
07280       return -1;
07281 
07282    caller_warning = ast_test_flag(&config->features_caller, AST_FEATURE_PLAY_WARNING);
07283    callee_warning = ast_test_flag(&config->features_callee, AST_FEATURE_PLAY_WARNING);
07284 
07285    if (ast_tvzero(config->start_time)) {
07286       config->start_time = ast_tvnow();
07287       if (config->start_sound) {
07288          if (caller_warning) {
07289             bridge_playfile(c0, c1, config->start_sound, config->timelimit / 1000);
07290          }
07291          if (callee_warning) {
07292             bridge_playfile(c1, c0, config->start_sound, config->timelimit / 1000);
07293          }
07294       }
07295    }
07296 
07297    /* Keep track of bridge */
07298    c0->_bridge = c1;
07299    c1->_bridge = c0;
07300 
07301    ast_set_owners_and_peers(c0, c1);
07302 
07303    o0nativeformats = c0->nativeformats;
07304    o1nativeformats = c1->nativeformats;
07305 
07306    if (config->feature_timer && !ast_tvzero(config->nexteventts)) {
07307       config->nexteventts = ast_tvadd(config->feature_start_time, ast_samp2tv(config->feature_timer, 1000));
07308    } else if (config->timelimit) {
07309       time_left_ms = config->timelimit - ast_tvdiff_ms(ast_tvnow(), config->start_time);
07310       config->nexteventts = ast_tvadd(config->start_time, ast_samp2tv(config->timelimit, 1000));
07311       if ((caller_warning || callee_warning) && config->play_warning) {
07312          long next_warn = config->play_warning;
07313          if (time_left_ms < config->play_warning && config->warning_freq > 0) {
07314             /* At least one warning was played, which means we are returning after feature */
07315             long warns_passed = (config->play_warning - time_left_ms) / config->warning_freq;
07316             /* It is 'warns_passed * warning_freq' NOT '(warns_passed + 1) * warning_freq',
07317                because nexteventts will be updated once again in the 'if (!to)' block */
07318             next_warn = config->play_warning - warns_passed * config->warning_freq;
07319          }
07320          config->nexteventts = ast_tvsub(config->nexteventts, ast_samp2tv(next_warn, 1000));
07321       }
07322    } else {
07323       config->nexteventts.tv_sec = 0;
07324       config->nexteventts.tv_usec = 0;
07325    }
07326 
07327    if (!c0->tech->send_digit_begin)
07328       ast_set_flag(c1, AST_FLAG_END_DTMF_ONLY);
07329    if (!c1->tech->send_digit_begin)
07330       ast_set_flag(c0, AST_FLAG_END_DTMF_ONLY);
07331    manager_bridge_event(1, 1, c0, c1);
07332 
07333    /* Before we enter in and bridge these two together tell them both the source of audio has changed */
07334    ast_indicate(c0, AST_CONTROL_SRCUPDATE);
07335    ast_indicate(c1, AST_CONTROL_SRCUPDATE);
07336 
07337    for (/* ever */;;) {
07338       struct timeval now = { 0, };
07339       int to;
07340 
07341       to = -1;
07342 
07343       if (!ast_tvzero(config->nexteventts)) {
07344          now = ast_tvnow();
07345          to = ast_tvdiff_ms(config->nexteventts, now);
07346          if (to <= 0) {
07347             if (!config->timelimit) {
07348                res = AST_BRIDGE_COMPLETE;
07349                break;
07350             }
07351             to = 0;
07352          }
07353       }
07354 
07355       if (config->timelimit) {
07356          time_left_ms = config->timelimit - ast_tvdiff_ms(now, config->start_time);
07357          if (time_left_ms < to)
07358             to = time_left_ms;
07359 
07360          if (time_left_ms <= 0) {
07361             if (caller_warning && config->end_sound)
07362                bridge_playfile(c0, c1, config->end_sound, 0);
07363             if (callee_warning && config->end_sound)
07364                bridge_playfile(c1, c0, config->end_sound, 0);
07365             *fo = NULL;
07366             res = 0;
07367             break;
07368          }
07369 
07370          if (!to) {
07371             if (time_left_ms >= 5000 && config->warning_sound && config->play_warning && ast_test_flag(config, AST_FEATURE_WARNING_ACTIVE)) {
07372                int t = (time_left_ms + 500) / 1000; /* round to nearest second */
07373                if (caller_warning)
07374                   bridge_playfile(c0, c1, config->warning_sound, t);
07375                if (callee_warning)
07376                   bridge_playfile(c1, c0, config->warning_sound, t);
07377             }
07378 
07379             if (config->warning_freq && (time_left_ms > (config->warning_freq + 5000))) {
07380                config->nexteventts = ast_tvadd(config->nexteventts, ast_samp2tv(config->warning_freq, 1000));
07381             } else {
07382                config->nexteventts = ast_tvadd(config->start_time, ast_samp2tv(config->timelimit, 1000));
07383             }
07384          }
07385          ast_clear_flag(config, AST_FEATURE_WARNING_ACTIVE);
07386       }
07387 
07388       if ((c0->_softhangup | c1->_softhangup) & AST_SOFTHANGUP_UNBRIDGE) {/* Bit operators are intentional. */
07389          if (c0->_softhangup & AST_SOFTHANGUP_UNBRIDGE) {
07390             ast_channel_clear_softhangup(c0, AST_SOFTHANGUP_UNBRIDGE);
07391          }
07392          if (c1->_softhangup & AST_SOFTHANGUP_UNBRIDGE) {
07393             ast_channel_clear_softhangup(c1, AST_SOFTHANGUP_UNBRIDGE);
07394          }
07395          c0->_bridge = c1;
07396          c1->_bridge = c0;
07397          ast_debug(1, "Unbridge signal received. Ending native bridge.\n");
07398          continue;
07399       }
07400 
07401       /* Stop if we're a zombie or need a soft hangup */
07402       if (ast_test_flag(c0, AST_FLAG_ZOMBIE) || ast_check_hangup_locked(c0) ||
07403           ast_test_flag(c1, AST_FLAG_ZOMBIE) || ast_check_hangup_locked(c1)) {
07404          *fo = NULL;
07405          res = 0;
07406          ast_debug(1, "Bridge stops because we're zombie or need a soft hangup: c0=%s, c1=%s, flags: %s,%s,%s,%s\n",
07407             c0->name, c1->name,
07408             ast_test_flag(c0, AST_FLAG_ZOMBIE) ? "Yes" : "No",
07409             ast_check_hangup(c0) ? "Yes" : "No",
07410             ast_test_flag(c1, AST_FLAG_ZOMBIE) ? "Yes" : "No",
07411             ast_check_hangup(c1) ? "Yes" : "No");
07412          break;
07413       }
07414 
07415       update_bridge_vars(c0, c1);
07416 
07417       bridge_play_sounds(c0, c1);
07418 
07419       if (c0->tech->bridge &&
07420          /* if < 1 ms remains use generic bridging for accurate timing */
07421          (!config->timelimit || to > 1000 || to == 0) &&
07422           (c0->tech->bridge == c1->tech->bridge) &&
07423           !c0->monitor && !c1->monitor &&
07424           !c0->audiohooks && !c1->audiohooks &&
07425           ast_framehook_list_is_empty(c0->framehooks) && ast_framehook_list_is_empty(c1->framehooks) &&
07426           !c0->masq && !c0->masqr && !c1->masq && !c1->masqr) {
07427          int timeoutms = to - 1000 > 0 ? to - 1000 : to;
07428          /* Looks like they share a bridge method and nothing else is in the way */
07429          ast_set_flag(c0, AST_FLAG_NBRIDGE);
07430          ast_set_flag(c1, AST_FLAG_NBRIDGE);
07431          if ((res = c0->tech->bridge(c0, c1, config->flags, fo, rc, timeoutms)) == AST_BRIDGE_COMPLETE) {
07432             ast_manager_event_multichan(EVENT_FLAG_CALL, "Unlink", 2, chans,
07433                "Channel1: %s\r\n"
07434                "Channel2: %s\r\n"
07435                "Uniqueid1: %s\r\n"
07436                "Uniqueid2: %s\r\n"
07437                "CallerID1: %s\r\n"
07438                "CallerID2: %s\r\n",
07439                c0->name, c1->name,
07440                c0->uniqueid, c1->uniqueid,
07441                S_COR(c0->caller.id.number.valid, c0->caller.id.number.str, "<unknown>"),
07442                S_COR(c1->caller.id.number.valid, c1->caller.id.number.str, "<unknown>"));
07443 
07444             ast_debug(1, "Returning from native bridge, channels: %s, %s\n", c0->name, c1->name);
07445 
07446             ast_clear_flag(c0, AST_FLAG_NBRIDGE);
07447             ast_clear_flag(c1, AST_FLAG_NBRIDGE);
07448 
07449             if ((c0->_softhangup | c1->_softhangup) & AST_SOFTHANGUP_UNBRIDGE) {/* Bit operators are intentional. */
07450                continue;
07451             }
07452 
07453             c0->_bridge = NULL;
07454             c1->_bridge = NULL;
07455             return res;
07456          } else {
07457             ast_clear_flag(c0, AST_FLAG_NBRIDGE);
07458             ast_clear_flag(c1, AST_FLAG_NBRIDGE);
07459          }
07460          switch (res) {
07461          case AST_BRIDGE_RETRY:
07462             if (config->play_warning) {
07463                ast_set_flag(config, AST_FEATURE_WARNING_ACTIVE);
07464             }
07465             continue;
07466          default:
07467             ast_verb(3, "Native bridging %s and %s ended\n", c0->name, c1->name);
07468             /* fallthrough */
07469          case AST_BRIDGE_FAILED_NOWARN:
07470             break;
07471          }
07472       }
07473 
07474       if (((c0->writeformat != c1->readformat) || (c0->readformat != c1->writeformat) ||
07475           (c0->nativeformats != o0nativeformats) || (c1->nativeformats != o1nativeformats)) &&
07476           !(c0->generator || c1->generator)) {
07477          if (ast_channel_make_compatible(c0, c1)) {
07478             ast_log(LOG_WARNING, "Can't make %s and %s compatible\n", c0->name, c1->name);
07479             manager_bridge_event(0, 1, c0, c1);
07480             return AST_BRIDGE_FAILED;
07481          }
07482          o0nativeformats = c0->nativeformats;
07483          o1nativeformats = c1->nativeformats;
07484       }
07485 
07486       update_bridge_vars(c0, c1);
07487 
07488       res = ast_generic_bridge(c0, c1, config, fo, rc);
07489       if (res != AST_BRIDGE_RETRY) {
07490          break;
07491       } else if (config->feature_timer) {
07492          /* feature timer expired but has not been updated, sending to ast_bridge_call to do so */
07493          break;
07494       }
07495    }
07496 
07497    ast_clear_flag(c0, AST_FLAG_END_DTMF_ONLY);
07498    ast_clear_flag(c1, AST_FLAG_END_DTMF_ONLY);
07499 
07500    /* Now that we have broken the bridge the source will change yet again */
07501    ast_indicate(c0, AST_CONTROL_SRCUPDATE);
07502    ast_indicate(c1, AST_CONTROL_SRCUPDATE);
07503 
07504    c0->_bridge = NULL;
07505    c1->_bridge = NULL;
07506 
07507    ast_manager_event_multichan(EVENT_FLAG_CALL, "Unlink", 2, chans,
07508       "Channel1: %s\r\n"
07509       "Channel2: %s\r\n"
07510       "Uniqueid1: %s\r\n"
07511       "Uniqueid2: %s\r\n"
07512       "CallerID1: %s\r\n"
07513       "CallerID2: %s\r\n",
07514       c0->name, c1->name,
07515       c0->uniqueid, c1->uniqueid,
07516       S_COR(c0->caller.id.number.valid, c0->caller.id.number.str, "<unknown>"),
07517       S_COR(c1->caller.id.number.valid, c1->caller.id.number.str, "<unknown>"));
07518    ast_debug(1, "Bridge stops bridging channels %s and %s\n", c0->name, c1->name);
07519 
07520    return res;
07521 }
07522 
07523 /*! \brief Sets an option on a channel */
07524 int ast_channel_setoption(struct ast_channel *chan, int option, void *data, int datalen, int block)
07525 {
07526    int res;
07527 
07528    ast_channel_lock(chan);
07529    if (!chan->tech->setoption) {
07530       errno = ENOSYS;
07531       ast_channel_unlock(chan);
07532       return -1;
07533    }
07534 
07535    if (block)
07536       ast_log(LOG_ERROR, "XXX Blocking not implemented yet XXX\n");
07537 
07538    res = chan->tech->setoption(chan, option, data, datalen);
07539    ast_channel_unlock(chan);
07540 
07541    return res;
07542 }
07543 
07544 int ast_channel_queryoption(struct ast_channel *chan, int option, void *data, int *datalen, int block)
07545 {
07546    int res;
07547 
07548    ast_channel_lock(chan);
07549    if (!chan->tech->queryoption) {
07550       errno = ENOSYS;
07551       ast_channel_unlock(chan);
07552       return -1;
07553    }
07554 
07555    if (block)
07556       ast_log(LOG_ERROR, "XXX Blocking not implemented yet XXX\n");
07557 
07558    res = chan->tech->queryoption(chan, option, data, datalen);
07559    ast_channel_unlock(chan);
07560 
07561    return res;
07562 }
07563 
07564 struct tonepair_def {
07565    int freq1;
07566    int freq2;
07567    int duration;
07568    int vol;
07569 };
07570 
07571 struct tonepair_state {
07572    int fac1;
07573    int fac2;
07574    int v1_1;
07575    int v2_1;
07576    int v3_1;
07577    int v1_2;
07578    int v2_2;
07579    int v3_2;
07580    format_t origwfmt;
07581    int pos;
07582    int duration;
07583    int modulate;
07584    struct ast_frame f;
07585    unsigned char offset[AST_FRIENDLY_OFFSET];
07586    short data[4000];
07587 };
07588 
07589 static void tonepair_release(struct ast_channel *chan, void *params)
07590 {
07591    struct tonepair_state *ts = params;
07592 
07593    if (chan)
07594       ast_set_write_format(chan, ts->origwfmt);
07595    ast_free(ts);
07596 }
07597 
07598 static void *tonepair_alloc(struct ast_channel *chan, void *params)
07599 {
07600    struct tonepair_state *ts;
07601    struct tonepair_def *td = params;
07602 
07603    if (!(ts = ast_calloc(1, sizeof(*ts))))
07604       return NULL;
07605    ts->origwfmt = chan->writeformat;
07606    if (ast_set_write_format(chan, AST_FORMAT_SLINEAR)) {
07607       ast_log(LOG_WARNING, "Unable to set '%s' to signed linear format (write)\n", chan->name);
07608       tonepair_release(NULL, ts);
07609       ts = NULL;
07610    } else {
07611       ts->fac1 = 2.0 * cos(2.0 * M_PI * (td->freq1 / 8000.0)) * 32768.0;
07612       ts->v1_1 = 0;
07613       ts->v2_1 = sin(-4.0 * M_PI * (td->freq1 / 8000.0)) * td->vol;
07614       ts->v3_1 = sin(-2.0 * M_PI * (td->freq1 / 8000.0)) * td->vol;
07615       ts->v2_1 = 0;
07616       ts->fac2 = 2.0 * cos(2.0 * M_PI * (td->freq2 / 8000.0)) * 32768.0;
07617       ts->v2_2 = sin(-4.0 * M_PI * (td->freq2 / 8000.0)) * td->vol;
07618       ts->v3_2 = sin(-2.0 * M_PI * (td->freq2 / 8000.0)) * td->vol;
07619       ts->duration = td->duration;
07620       ts->modulate = 0;
07621    }
07622    /* Let interrupts interrupt :) */
07623    ast_set_flag(chan, AST_FLAG_WRITE_INT);
07624    return ts;
07625 }
07626 
07627 static int tonepair_generator(struct ast_channel *chan, void *data, int len, int samples)
07628 {
07629    struct tonepair_state *ts = data;
07630    int x;
07631 
07632    /* we need to prepare a frame with 16 * timelen samples as we're
07633     * generating SLIN audio
07634     */
07635    len = samples * 2;
07636 
07637    if (len > sizeof(ts->data) / 2 - 1) {
07638       ast_log(LOG_WARNING, "Can't generate that much data!\n");
07639       return -1;
07640    }
07641    memset(&ts->f, 0, sizeof(ts->f));
07642    for (x=0;x<len/2;x++) {
07643       ts->v1_1 = ts->v2_1;
07644       ts->v2_1 = ts->v3_1;
07645       ts->v3_1 = (ts->fac1 * ts->v2_1 >> 15) - ts->v1_1;
07646       
07647       ts->v1_2 = ts->v2_2;
07648       ts->v2_2 = ts->v3_2;
07649       ts->v3_2 = (ts->fac2 * ts->v2_2 >> 15) - ts->v1_2;
07650       if (ts->modulate) {
07651          int p;
07652          p = ts->v3_2 - 32768;
07653          if (p < 0) p = -p;
07654          p = ((p * 9) / 10) + 1;
07655          ts->data[x] = (ts->v3_1 * p) >> 15;
07656       } else
07657          ts->data[x] = ts->v3_1 + ts->v3_2; 
07658    }
07659    ts->f.frametype = AST_FRAME_VOICE;
07660    ts->f.subclass.codec = AST_FORMAT_SLINEAR;
07661    ts->f.datalen = len;
07662    ts->f.samples = samples;
07663    ts->f.offset = AST_FRIENDLY_OFFSET;
07664    ts->f.data.ptr = ts->data;
07665    ast_write(chan, &ts->f);
07666    ts->pos += x;
07667    if (ts->duration > 0) {
07668       if (ts->pos >= ts->duration * 8)
07669          return -1;
07670    }
07671    return 0;
07672 }
07673 
07674 static struct ast_generator tonepair = {
07675    alloc: tonepair_alloc,
07676    release: tonepair_release,
07677    generate: tonepair_generator,
07678 };
07679 
07680 int ast_tonepair_start(struct ast_channel *chan, int freq1, int freq2, int duration, int vol)
07681 {
07682    struct tonepair_def d = { 0, };
07683 
07684    d.freq1 = freq1;
07685    d.freq2 = freq2;
07686    d.duration = duration;
07687    d.vol = (vol < 1) ? 8192 : vol; /* force invalid to 8192 */
07688    if (ast_activate_generator(chan, &tonepair, &d))
07689       return -1;
07690    return 0;
07691 }
07692 
07693 void ast_tonepair_stop(struct ast_channel *chan)
07694 {
07695    ast_deactivate_generator(chan);
07696 }
07697 
07698 int ast_tonepair(struct ast_channel *chan, int freq1, int freq2, int duration, int vol)
07699 {
07700    int res;
07701 
07702    if ((res = ast_tonepair_start(chan, freq1, freq2, duration, vol)))
07703       return res;
07704 
07705    /* Give us some wiggle room */
07706    while (chan->generatordata && ast_waitfor(chan, 100) >= 0) {
07707       struct ast_frame *f = ast_read(chan);
07708       if (f)
07709          ast_frfree(f);
07710       else
07711          return -1;
07712    }
07713    return 0;
07714 }
07715 
07716 ast_group_t ast_get_group(const char *s)
07717 {
07718    char *piece;
07719    char *c;
07720    int start=0, finish=0, x;
07721    ast_group_t group = 0;
07722 
07723    if (ast_strlen_zero(s))
07724       return 0;
07725 
07726    c = ast_strdupa(s);
07727    
07728    while ((piece = strsep(&c, ","))) {
07729       if (sscanf(piece, "%30d-%30d", &start, &finish) == 2) {
07730          /* Range */
07731       } else if (sscanf(piece, "%30d", &start)) {
07732          /* Just one */
07733          finish = start;
07734       } else {
07735          ast_log(LOG_ERROR, "Syntax error parsing group configuration '%s' at '%s'. Ignoring.\n", s, piece);
07736          continue;
07737       }
07738       for (x = start; x <= finish; x++) {
07739          if ((x > 63) || (x < 0)) {
07740             ast_log(LOG_WARNING, "Ignoring invalid group %d (maximum group is 63)\n", x);
07741          } else
07742             group |= ((ast_group_t) 1 << x);
07743       }
07744    }
07745    return group;
07746 }
07747 
07748 static int (*ast_moh_start_ptr)(struct ast_channel *, const char *, const char *) = NULL;
07749 static void (*ast_moh_stop_ptr)(struct ast_channel *) = NULL;
07750 static void (*ast_moh_cleanup_ptr)(struct ast_channel *) = NULL;
07751 
07752 void ast_install_music_functions(int (*start_ptr)(struct ast_channel *, const char *, const char *),
07753              void (*stop_ptr)(struct ast_channel *),
07754              void (*cleanup_ptr)(struct ast_channel *))
07755 {
07756    ast_moh_start_ptr = start_ptr;
07757    ast_moh_stop_ptr = stop_ptr;
07758    ast_moh_cleanup_ptr = cleanup_ptr;
07759 }
07760 
07761 void ast_uninstall_music_functions(void)
07762 {
07763    ast_moh_start_ptr = NULL;
07764    ast_moh_stop_ptr = NULL;
07765    ast_moh_cleanup_ptr = NULL;
07766 }
07767 
07768 /*! \brief Turn on music on hold on a given channel */
07769 int ast_moh_start(struct ast_channel *chan, const char *mclass, const char *interpclass)
07770 {
07771    if (ast_moh_start_ptr)
07772       return ast_moh_start_ptr(chan, mclass, interpclass);
07773 
07774    ast_verb(3, "Music class %s requested but no musiconhold loaded.\n", mclass ? mclass : (interpclass ? interpclass : "default"));
07775 
07776    return 0;
07777 }
07778 
07779 /*! \brief Turn off music on hold on a given channel */
07780 void ast_moh_stop(struct ast_channel *chan)
07781 {
07782    if (ast_moh_stop_ptr)
07783       ast_moh_stop_ptr(chan);
07784 }
07785 
07786 void ast_moh_cleanup(struct ast_channel *chan)
07787 {
07788    if (ast_moh_cleanup_ptr)
07789       ast_moh_cleanup_ptr(chan);
07790 }
07791 
07792 static int ast_channel_hash_cb(const void *obj, const int flags)
07793 {
07794    const struct ast_channel *chan = obj;
07795 
07796    /* If the name isn't set, return 0 so that the ao2_find() search will
07797     * start in the first bucket. */
07798    if (ast_strlen_zero(chan->name)) {
07799       return 0;
07800    }
07801 
07802    return ast_str_case_hash(chan->name);
07803 }
07804 
07805 int ast_plc_reload(void)
07806 {
07807    struct ast_variable *var;
07808    struct ast_flags config_flags = { 0 };
07809    struct ast_config *cfg = ast_config_load("codecs.conf", config_flags);
07810    if (cfg == CONFIG_STATUS_FILEMISSING || cfg == CONFIG_STATUS_FILEUNCHANGED || cfg == CONFIG_STATUS_FILEINVALID)
07811       return 0;
07812    for (var = ast_variable_browse(cfg, "plc"); var; var = var->next) {
07813       if (!strcasecmp(var->name, "genericplc")) {
07814          ast_set2_flag(&ast_options, ast_true(var->value), AST_OPT_FLAG_GENERIC_PLC);
07815       }
07816    }
07817    ast_config_destroy(cfg);
07818    return 0;
07819 }
07820 
07821 /*!
07822  * \internal
07823  * \brief Implements the channels provider.
07824  */
07825 static int data_channels_provider_handler(const struct ast_data_search *search,
07826    struct ast_data *root)
07827 {
07828    struct ast_channel *c;
07829    struct ast_channel_iterator *iter = NULL;
07830    struct ast_data *data_channel;
07831 
07832    for (iter = ast_channel_iterator_all_new();
07833       iter && (c = ast_channel_iterator_next(iter)); ast_channel_unref(c)) {
07834       ast_channel_lock(c);
07835 
07836       data_channel = ast_data_add_node(root, "channel");
07837       if (!data_channel) {
07838          ast_channel_unlock(c);
07839          continue;
07840       }
07841 
07842       if (ast_channel_data_add_structure(data_channel, c, 1) < 0) {
07843          ast_log(LOG_ERROR, "Unable to add channel structure for channel: %s\n", c->name);
07844       }
07845 
07846       ast_channel_unlock(c);
07847 
07848       if (!ast_data_search_match(search, data_channel)) {
07849          ast_data_remove_node(root, data_channel);
07850       }
07851    }
07852    if (iter) {
07853       ast_channel_iterator_destroy(iter);
07854    }
07855 
07856    return 0;
07857 }
07858 
07859 /*!
07860  * \internal
07861  * \brief Implements the channeltypes provider.
07862  */
07863 static int data_channeltypes_provider_handler(const struct ast_data_search *search,
07864    struct ast_data *data_root)
07865 {
07866    struct chanlist *cl;
07867    struct ast_data *data_type;
07868 
07869    AST_RWLIST_RDLOCK(&backends);
07870    AST_RWLIST_TRAVERSE(&backends, cl, list) {
07871       data_type = ast_data_add_node(data_root, "type");
07872       if (!data_type) {
07873          continue;
07874       }
07875       ast_data_add_str(data_type, "name", cl->tech->type);
07876       ast_data_add_str(data_type, "description", cl->tech->description);
07877       ast_data_add_bool(data_type, "devicestate", cl->tech->devicestate ? 1 : 0);
07878       ast_data_add_bool(data_type, "indications", cl->tech->indicate ? 1 : 0);
07879       ast_data_add_bool(data_type, "transfer", cl->tech->transfer ? 1 : 0);
07880       ast_data_add_bool(data_type, "send_digit_begin", cl->tech->send_digit_begin ? 1 : 0);
07881       ast_data_add_bool(data_type, "send_digit_end", cl->tech->send_digit_end ? 1 : 0);
07882       ast_data_add_bool(data_type, "call", cl->tech->call ? 1 : 0);
07883       ast_data_add_bool(data_type, "hangup", cl->tech->hangup ? 1 : 0);
07884       ast_data_add_bool(data_type, "answer", cl->tech->answer ? 1 : 0);
07885       ast_data_add_bool(data_type, "read", cl->tech->read ? 1 : 0);
07886       ast_data_add_bool(data_type, "write", cl->tech->write ? 1 : 0);
07887       ast_data_add_bool(data_type, "send_text", cl->tech->send_text ? 1 : 0);
07888       ast_data_add_bool(data_type, "send_image", cl->tech->send_image ? 1 : 0);
07889       ast_data_add_bool(data_type, "send_html", cl->tech->send_html ? 1 : 0);
07890       ast_data_add_bool(data_type, "exception", cl->tech->exception ? 1 : 0);
07891       ast_data_add_bool(data_type, "bridge", cl->tech->bridge ? 1 : 0);
07892       ast_data_add_bool(data_type, "early_bridge", cl->tech->early_bridge ? 1 : 0);
07893       ast_data_add_bool(data_type, "fixup", cl->tech->fixup ? 1 : 0);
07894       ast_data_add_bool(data_type, "setoption", cl->tech->setoption ? 1 : 0);
07895       ast_data_add_bool(data_type, "queryoption", cl->tech->queryoption ? 1 : 0);
07896       ast_data_add_bool(data_type, "write_video", cl->tech->write_video ? 1 : 0);
07897       ast_data_add_bool(data_type, "write_text", cl->tech->write_text ? 1 : 0);
07898       ast_data_add_bool(data_type, "bridged_channel", cl->tech->bridged_channel ? 1 : 0);
07899       ast_data_add_bool(data_type, "func_channel_read", cl->tech->func_channel_read ? 1 : 0);
07900       ast_data_add_bool(data_type, "func_channel_write", cl->tech->func_channel_write ? 1 : 0);
07901       ast_data_add_bool(data_type, "get_base_channel", cl->tech->get_base_channel ? 1 : 0);
07902       ast_data_add_bool(data_type, "set_base_channel", cl->tech->set_base_channel ? 1 : 0);
07903       ast_data_add_bool(data_type, "get_pvt_uniqueid", cl->tech->get_pvt_uniqueid ? 1 : 0);
07904       ast_data_add_bool(data_type, "cc_callback", cl->tech->cc_callback ? 1 : 0);
07905 
07906       ast_data_add_codecs(data_type, "capabilities", cl->tech->capabilities);
07907 
07908       if (!ast_data_search_match(search, data_type)) {
07909          ast_data_remove_node(data_root, data_type);
07910       }
07911    }
07912    AST_RWLIST_UNLOCK(&backends);
07913 
07914    return 0;
07915 }
07916 
07917 /*!
07918  * \internal
07919  * \brief /asterisk/core/channels provider.
07920  */
07921 static const struct ast_data_handler channels_provider = {
07922    .version = AST_DATA_HANDLER_VERSION,
07923    .get = data_channels_provider_handler
07924 };
07925 
07926 /*!
07927  * \internal
07928  * \brief /asterisk/core/channeltypes provider.
07929  */
07930 static const struct ast_data_handler channeltypes_provider = {
07931    .version = AST_DATA_HANDLER_VERSION,
07932    .get = data_channeltypes_provider_handler
07933 };
07934 
07935 static const struct ast_data_entry channel_providers[] = {
07936    AST_DATA_ENTRY("/asterisk/core/channels", &channels_provider),
07937    AST_DATA_ENTRY("/asterisk/core/channeltypes", &channeltypes_provider),
07938 };
07939 
07940 void ast_channels_init(void)
07941 {
07942    channels = ao2_container_alloc(NUM_CHANNEL_BUCKETS,
07943          ast_channel_hash_cb, ast_channel_cmp_cb);
07944 
07945    ast_cli_register_multiple(cli_channel, ARRAY_LEN(cli_channel));
07946 
07947    ast_data_register_multiple_core(channel_providers, ARRAY_LEN(channel_providers));
07948 
07949    ast_plc_reload();
07950 }
07951 
07952 /*! \brief Print call group and pickup group ---*/
07953 char *ast_print_group(char *buf, int buflen, ast_group_t group)
07954 {
07955    unsigned int i;
07956    int first = 1;
07957    char num[3];
07958 
07959    buf[0] = '\0';
07960    
07961    if (!group) /* Return empty string if no group */
07962       return buf;
07963 
07964    for (i = 0; i <= 63; i++) {   /* Max group is 63 */
07965       if (group & ((ast_group_t) 1 << i)) {
07966             if (!first) {
07967             strncat(buf, ", ", buflen - strlen(buf) - 1);
07968          } else {
07969             first = 0;
07970          }
07971          snprintf(num, sizeof(num), "%u", i);
07972          strncat(buf, num, buflen - strlen(buf) - 1);
07973       }
07974    }
07975    return buf;
07976 }
07977 
07978 void ast_set_variables(struct ast_channel *chan, struct ast_variable *vars)
07979 {
07980    struct ast_variable *cur;
07981 
07982    for (cur = vars; cur; cur = cur->next)
07983       pbx_builtin_setvar_helper(chan, cur->name, cur->value);  
07984 }
07985 
07986 static void *silence_generator_alloc(struct ast_channel *chan, void *data)
07987 {
07988    /* just store the data pointer in the channel structure */
07989    return data;
07990 }
07991 
07992 static void silence_generator_release(struct ast_channel *chan, void *data)
07993 {
07994    /* nothing to do */
07995 }
07996 
07997 static int silence_generator_generate(struct ast_channel *chan, void *data, int len, int samples)
07998 {
07999    short buf[samples];
08000    struct ast_frame frame = {
08001       .frametype = AST_FRAME_VOICE,
08002       .subclass.codec = AST_FORMAT_SLINEAR,
08003       .data.ptr = buf,
08004       .samples = samples,
08005       .datalen = sizeof(buf),
08006    };
08007 
08008    memset(buf, 0, sizeof(buf));
08009 
08010    if (ast_write(chan, &frame))
08011       return -1;
08012 
08013    return 0;
08014 }
08015 
08016 static struct ast_generator silence_generator = {
08017    .alloc = silence_generator_alloc,
08018    .release = silence_generator_release,
08019    .generate = silence_generator_generate,
08020 };
08021 
08022 struct ast_silence_generator {
08023    int old_write_format;
08024 };
08025 
08026 struct ast_silence_generator *ast_channel_start_silence_generator(struct ast_channel *chan)
08027 {
08028    struct ast_silence_generator *state;
08029 
08030    if (!(state = ast_calloc(1, sizeof(*state)))) {
08031       return NULL;
08032    }
08033 
08034    state->old_write_format = chan->writeformat;
08035 
08036    if (ast_set_write_format(chan, AST_FORMAT_SLINEAR) < 0) {
08037       ast_log(LOG_ERROR, "Could not set write format to SLINEAR\n");
08038       ast_free(state);
08039       return NULL;
08040    }
08041 
08042    ast_activate_generator(chan, &silence_generator, state);
08043 
08044    ast_debug(1, "Started silence generator on '%s'\n", chan->name);
08045 
08046    return state;
08047 }
08048 
08049 void ast_channel_stop_silence_generator(struct ast_channel *chan, struct ast_silence_generator *state)
08050 {
08051    if (!state)
08052       return;
08053 
08054    ast_deactivate_generator(chan);
08055 
08056    ast_debug(1, "Stopped silence generator on '%s'\n", chan->name);
08057 
08058    if (ast_set_write_format(chan, state->old_write_format) < 0)
08059       ast_log(LOG_ERROR, "Could not return write format to its original state\n");
08060 
08061    ast_free(state);
08062 }
08063 
08064 
08065 /*! \ brief Convert channel reloadreason (ENUM) to text string for manager event */
08066 const char *channelreloadreason2txt(enum channelreloadreason reason)
08067 {
08068    switch (reason) {
08069    case CHANNEL_MODULE_LOAD:
08070       return "LOAD (Channel module load)";
08071 
08072    case CHANNEL_MODULE_RELOAD:
08073       return "RELOAD (Channel module reload)";
08074 
08075    case CHANNEL_CLI_RELOAD:
08076       return "CLIRELOAD (Channel module reload by CLI command)";
08077 
08078    default:
08079       return "MANAGERRELOAD (Channel module reload by manager)";
08080    }
08081 };
08082 
08083 /*
08084  * Wrappers for various ast_say_*() functions that call the full version
08085  * of the same functions.
08086  * The proper place would be say.c, but that file is optional and one
08087  * must be able to build asterisk even without it (using a loadable 'say'
08088  * implementation that only supplies the 'full' version of the functions.
08089  */
08090 
08091 int ast_say_number(struct ast_channel *chan, int num,
08092    const char *ints, const char *language, const char *options)
08093 {
08094    return ast_say_number_full(chan, num, ints, language, options, -1, -1);
08095 }
08096 
08097 int ast_say_enumeration(struct ast_channel *chan, int num,
08098    const char *ints, const char *language, const char *options)
08099 {
08100    return ast_say_enumeration_full(chan, num, ints, language, options, -1, -1);
08101 }
08102 
08103 int ast_say_digits(struct ast_channel *chan, int num,
08104    const char *ints, const char *lang)
08105 {
08106    return ast_say_digits_full(chan, num, ints, lang, -1, -1);
08107 }
08108 
08109 int ast_say_digit_str(struct ast_channel *chan, const char *str,
08110    const char *ints, const char *lang)
08111 {
08112    return ast_say_digit_str_full(chan, str, ints, lang, -1, -1);
08113 }
08114 
08115 int ast_say_character_str(struct ast_channel *chan, const char *str,
08116    const char *ints, const char *lang)
08117 {
08118    return ast_say_character_str_full(chan, str, ints, lang, -1, -1);
08119 }
08120 
08121 int ast_say_phonetic_str(struct ast_channel *chan, const char *str,
08122    const char *ints, const char *lang)
08123 {
08124    return ast_say_phonetic_str_full(chan, str, ints, lang, -1, -1);
08125 }
08126 
08127 int ast_say_digits_full(struct ast_channel *chan, int num,
08128    const char *ints, const char *lang, int audiofd, int ctrlfd)
08129 {
08130    char buf[256];
08131 
08132    snprintf(buf, sizeof(buf), "%d", num);
08133 
08134    return ast_say_digit_str_full(chan, buf, ints, lang, audiofd, ctrlfd);
08135 }
08136 
08137 void ast_connected_line_copy_from_caller(struct ast_party_connected_line *dest, const struct ast_party_caller *src)
08138 {
08139    ast_party_id_copy(&dest->id, &src->id);
08140    ast_party_id_copy(&dest->ani, &src->ani);
08141    dest->ani2 = src->ani2;
08142 }
08143 
08144 void ast_connected_line_copy_to_caller(struct ast_party_caller *dest, const struct ast_party_connected_line *src)
08145 {
08146    ast_party_id_copy(&dest->id, &src->id);
08147    ast_party_id_copy(&dest->ani, &src->ani);
08148 
08149    dest->ani2 = src->ani2;
08150 }
08151 
08152 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)
08153 {
08154    if (&chan->connected == connected) {
08155       /* Don't set to self */
08156       return;
08157    }
08158 
08159    ast_channel_lock(chan);
08160    ast_party_connected_line_set(&chan->connected, connected, update);
08161    ast_channel_unlock(chan);
08162 }
08163 
08164 /*! \note Should follow struct ast_party_name */
08165 struct ast_party_name_ies {
08166    /*! \brief Subscriber name ie */
08167    int str;
08168    /*! \brief Character set ie. */
08169    int char_set;
08170    /*! \brief presentation-indicator ie */
08171    int presentation;
08172    /*! \brief valid/present ie */
08173    int valid;
08174 };
08175 
08176 /*!
08177  * \internal
08178  * \since 1.8
08179  * \brief Build a party name information data frame component.
08180  *
08181  * \param data Buffer to fill with the frame data
08182  * \param datalen Size of the buffer to fill
08183  * \param name Party name information
08184  * \param label Name of particular party name
08185  * \param ies Data frame ie values for the party name components
08186  *
08187  * \retval -1 if error
08188  * \retval Amount of data buffer used
08189  */
08190 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)
08191 {
08192    size_t length;
08193    size_t pos = 0;
08194 
08195    /*
08196     * The size of integer values must be fixed in case the frame is
08197     * shipped to another machine.
08198     */
08199    if (name->str) {
08200       length = strlen(name->str);
08201       if (datalen < pos + (sizeof(data[0]) * 2) + length) {
08202          ast_log(LOG_WARNING, "No space left for %s name\n", label);
08203          return -1;
08204       }
08205       data[pos++] = ies->str;
08206       data[pos++] = length;
08207       memcpy(data + pos, name->str, length);
08208       pos += length;
08209    }
08210 
08211    if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
08212       ast_log(LOG_WARNING, "No space left for %s name char set\n", label);
08213       return -1;
08214    }
08215    data[pos++] = ies->char_set;
08216    data[pos++] = 1;
08217    data[pos++] = name->char_set;
08218 
08219    if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
08220       ast_log(LOG_WARNING, "No space left for %s name presentation\n", label);
08221       return -1;
08222    }
08223    data[pos++] = ies->presentation;
08224    data[pos++] = 1;
08225    data[pos++] = name->presentation;
08226 
08227    if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
08228       ast_log(LOG_WARNING, "No space left for %s name valid\n", label);
08229       return -1;
08230    }
08231    data[pos++] = ies->valid;
08232    data[pos++] = 1;
08233    data[pos++] = name->valid;
08234 
08235    return pos;
08236 }
08237 
08238 /*! \note Should follow struct ast_party_number */
08239 struct ast_party_number_ies {
08240    /*! \brief Subscriber phone number ie */
08241    int str;
08242    /*! \brief Type-Of-Number and Numbering-Plan ie */
08243    int plan;
08244    /*! \brief presentation-indicator ie */
08245    int presentation;
08246    /*! \brief valid/present ie */
08247    int valid;
08248 };
08249 
08250 /*!
08251  * \internal
08252  * \since 1.8
08253  * \brief Build a party number information data frame component.
08254  *
08255  * \param data Buffer to fill with the frame data
08256  * \param datalen Size of the buffer to fill
08257  * \param number Party number information
08258  * \param label Name of particular party number
08259  * \param ies Data frame ie values for the party number components
08260  *
08261  * \retval -1 if error
08262  * \retval Amount of data buffer used
08263  */
08264 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)
08265 {
08266    size_t length;
08267    size_t pos = 0;
08268 
08269    /*
08270     * The size of integer values must be fixed in case the frame is
08271     * shipped to another machine.
08272     */
08273    if (number->str) {
08274       length = strlen(number->str);
08275       if (datalen < pos + (sizeof(data[0]) * 2) + length) {
08276          ast_log(LOG_WARNING, "No space left for %s number\n", label);
08277          return -1;
08278       }
08279       data[pos++] = ies->str;
08280       data[pos++] = length;
08281       memcpy(data + pos, number->str, length);
08282       pos += length;
08283    }
08284 
08285    if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
08286       ast_log(LOG_WARNING, "No space left for %s numbering plan\n", label);
08287       return -1;
08288    }
08289    data[pos++] = ies->plan;
08290    data[pos++] = 1;
08291    data[pos++] = number->plan;
08292 
08293    if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
08294       ast_log(LOG_WARNING, "No space left for %s number presentation\n", label);
08295       return -1;
08296    }
08297    data[pos++] = ies->presentation;
08298    data[pos++] = 1;
08299    data[pos++] = number->presentation;
08300 
08301    if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
08302       ast_log(LOG_WARNING, "No space left for %s number valid\n", label);
08303       return -1;
08304    }
08305    data[pos++] = ies->valid;
08306    data[pos++] = 1;
08307    data[pos++] = number->valid;
08308 
08309    return pos;
08310 }
08311 
08312 /*! \note Should follow struct ast_party_subaddress */
08313 struct ast_party_subaddress_ies {
08314    /*! \brief subaddress ie. */
08315    int str;
08316    /*! \brief subaddress type ie */
08317    int type;
08318    /*! \brief odd/even indicator ie */
08319    int odd_even_indicator;
08320    /*! \brief valid/present ie */
08321    int valid;
08322 };
08323 
08324 /*!
08325  * \internal
08326  * \since 1.8
08327  * \brief Build a party subaddress information data frame component.
08328  *
08329  * \param data Buffer to fill with the frame data
08330  * \param datalen Size of the buffer to fill
08331  * \param subaddress Party subaddress information
08332  * \param label Name of particular party subaddress
08333  * \param ies Data frame ie values for the party subaddress components
08334  *
08335  * \retval -1 if error
08336  * \retval Amount of data buffer used
08337  */
08338 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)
08339 {
08340    size_t length;
08341    size_t pos = 0;
08342 
08343    /*
08344     * The size of integer values must be fixed in case the frame is
08345     * shipped to another machine.
08346     */
08347    if (subaddress->str) {
08348       length = strlen(subaddress->str);
08349       if (datalen < pos + (sizeof(data[0]) * 2) + length) {
08350          ast_log(LOG_WARNING, "No space left for %s subaddress\n", label);
08351          return -1;
08352       }
08353       data[pos++] = ies->str;
08354       data[pos++] = length;
08355       memcpy(data + pos, subaddress->str, length);
08356       pos += length;
08357    }
08358 
08359    if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
08360       ast_log(LOG_WARNING, "No space left for %s type of subaddress\n", label);
08361       return -1;
08362    }
08363    data[pos++] = ies->type;
08364    data[pos++] = 1;
08365    data[pos++] = subaddress->type;
08366 
08367    if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
08368       ast_log(LOG_WARNING,
08369          "No space left for %s subaddress odd-even indicator\n", label);
08370       return -1;
08371    }
08372    data[pos++] = ies->odd_even_indicator;
08373    data[pos++] = 1;
08374    data[pos++] = subaddress->odd_even_indicator;
08375 
08376    if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
08377       ast_log(LOG_WARNING, "No space left for %s subaddress valid\n", label);
08378       return -1;
08379    }
08380    data[pos++] = ies->valid;
08381    data[pos++] = 1;
08382    data[pos++] = subaddress->valid;
08383 
08384    return pos;
08385 }
08386 
08387 /*! \note Should follow struct ast_party_id */
08388 struct ast_party_id_ies {
08389    /*! \brief Subscriber name ies */
08390    struct ast_party_name_ies name;
08391    /*! \brief Subscriber phone number ies */
08392    struct ast_party_number_ies number;
08393    /*! \brief Subscriber subaddress ies. */
08394    struct ast_party_subaddress_ies subaddress;
08395    /*! \brief User party id tag ie. */
08396    int tag;
08397    /*! \brief Combined name and number presentation ie. */
08398    int combined_presentation;
08399 };
08400 
08401 /*!
08402  * \internal
08403  * \since 1.8
08404  * \brief Build a party id information data frame component.
08405  *
08406  * \param data Buffer to fill with the frame data
08407  * \param datalen Size of the buffer to fill
08408  * \param id Party id information
08409  * \param label Name of particular party id
08410  * \param ies Data frame ie values for the party id components
08411  * \param update What id information to build.  NULL if all.
08412  *
08413  * \retval -1 if error
08414  * \retval Amount of data buffer used
08415  */
08416 static int party_id_build_data(unsigned char *data, size_t datalen,
08417    const struct ast_party_id *id, const char *label, const struct ast_party_id_ies *ies,
08418    const struct ast_set_party_id *update)
08419 {
08420    size_t length;
08421    size_t pos = 0;
08422    int res;
08423 
08424    /*
08425     * The size of integer values must be fixed in case the frame is
08426     * shipped to another machine.
08427     */
08428 
08429    if (!update || update->name) {
08430       res = party_name_build_data(data + pos, datalen - pos, &id->name, label,
08431          &ies->name);
08432       if (res < 0) {
08433          return -1;
08434       }
08435       pos += res;
08436    }
08437 
08438    if (!update || update->number) {
08439       res = party_number_build_data(data + pos, datalen - pos, &id->number, label,
08440          &ies->number);
08441       if (res < 0) {
08442          return -1;
08443       }
08444       pos += res;
08445    }
08446 
08447    if (!update || update->subaddress) {
08448       res = party_subaddress_build_data(data + pos, datalen - pos, &id->subaddress,
08449          label, &ies->subaddress);
08450       if (res < 0) {
08451          return -1;
08452       }
08453       pos += res;
08454    }
08455 
08456    /* *************** Party id user tag **************************** */
08457    if (id->tag) {
08458       length = strlen(id->tag);
08459       if (datalen < pos + (sizeof(data[0]) * 2) + length) {
08460          ast_log(LOG_WARNING, "No space left for %s tag\n", label);
08461          return -1;
08462       }
08463       data[pos++] = ies->tag;
08464       data[pos++] = length;
08465       memcpy(data + pos, id->tag, length);
08466       pos += length;
08467    }
08468 
08469    /* *************** Party id combined presentation *************** */
08470    if (!update || update->number) {
08471       int presentation;
08472 
08473       if (!update || update->name) {
08474          presentation = ast_party_id_presentation(id);
08475       } else {
08476          /*
08477           * We must compromise because not all the information is available
08478           * to determine a combined presentation value.
08479           * We will only send the number presentation instead.
08480           */
08481          presentation = id->number.presentation;
08482       }
08483 
08484       if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
08485          ast_log(LOG_WARNING, "No space left for %s combined presentation\n", label);
08486          return -1;
08487       }
08488       data[pos++] = ies->combined_presentation;
08489       data[pos++] = 1;
08490       data[pos++] = presentation;
08491    }
08492 
08493    return pos;
08494 }
08495 
08496 /*!
08497  * \brief Element identifiers for connected line indication frame data
08498  * \note Only add to the end of this enum.
08499  */
08500 enum {
08501    AST_CONNECTED_LINE_NUMBER,
08502    AST_CONNECTED_LINE_NAME,
08503    AST_CONNECTED_LINE_NUMBER_PLAN,
08504    AST_CONNECTED_LINE_ID_PRESENTATION,/* Combined number and name presentation. */
08505    AST_CONNECTED_LINE_SOURCE,
08506    AST_CONNECTED_LINE_SUBADDRESS,
08507    AST_CONNECTED_LINE_SUBADDRESS_TYPE,
08508    AST_CONNECTED_LINE_SUBADDRESS_ODD_EVEN,
08509    AST_CONNECTED_LINE_SUBADDRESS_VALID,
08510    AST_CONNECTED_LINE_TAG,
08511    AST_CONNECTED_LINE_VERSION,
08512    AST_CONNECTED_LINE_NAME_VALID,
08513    AST_CONNECTED_LINE_NAME_CHAR_SET,
08514    AST_CONNECTED_LINE_NAME_PRESENTATION,
08515    AST_CONNECTED_LINE_NUMBER_VALID,
08516    AST_CONNECTED_LINE_NUMBER_PRESENTATION,
08517 };
08518 
08519 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)
08520 {
08521    int32_t value;
08522    size_t pos = 0;
08523    int res;
08524 
08525    static const struct ast_party_id_ies ies = {
08526       .name.str = AST_CONNECTED_LINE_NAME,
08527       .name.char_set = AST_CONNECTED_LINE_NAME_CHAR_SET,
08528       .name.presentation = AST_CONNECTED_LINE_NAME_PRESENTATION,
08529       .name.valid = AST_CONNECTED_LINE_NAME_VALID,
08530 
08531       .number.str = AST_CONNECTED_LINE_NUMBER,
08532       .number.plan = AST_CONNECTED_LINE_NUMBER_PLAN,
08533       .number.presentation = AST_CONNECTED_LINE_NUMBER_PRESENTATION,
08534       .number.valid = AST_CONNECTED_LINE_NUMBER_VALID,
08535 
08536       .subaddress.str = AST_CONNECTED_LINE_SUBADDRESS,
08537       .subaddress.type = AST_CONNECTED_LINE_SUBADDRESS_TYPE,
08538       .subaddress.odd_even_indicator = AST_CONNECTED_LINE_SUBADDRESS_ODD_EVEN,
08539       .subaddress.valid = AST_CONNECTED_LINE_SUBADDRESS_VALID,
08540 
08541       .tag = AST_CONNECTED_LINE_TAG,
08542       .combined_presentation = AST_CONNECTED_LINE_ID_PRESENTATION,
08543    };
08544 
08545    /*
08546     * The size of integer values must be fixed in case the frame is
08547     * shipped to another machine.
08548     */
08549 
08550    /* Connected line frame version */
08551    if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
08552       ast_log(LOG_WARNING, "No space left for connected line frame version\n");
08553       return -1;
08554    }
08555    data[pos++] = AST_CONNECTED_LINE_VERSION;
08556    data[pos++] = 1;
08557    data[pos++] = 2;/* Version 1 did not have a version ie */
08558 
08559    res = party_id_build_data(data + pos, datalen - pos, &connected->id,
08560       "connected line", &ies, update ? &update->id : NULL);
08561    if (res < 0) {
08562       return -1;
08563    }
08564    pos += res;
08565 
08566    /* Connected line source */
08567    if (datalen < pos + (sizeof(data[0]) * 2) + sizeof(value)) {
08568       ast_log(LOG_WARNING, "No space left for connected line source\n");
08569       return -1;
08570    }
08571    data[pos++] = AST_CONNECTED_LINE_SOURCE;
08572    data[pos++] = sizeof(value);
08573    value = htonl(connected->source);
08574    memcpy(data + pos, &value, sizeof(value));
08575    pos += sizeof(value);
08576 
08577    return pos;
08578 }
08579 
08580 int ast_connected_line_parse_data(const unsigned char *data, size_t datalen, struct ast_party_connected_line *connected)
08581 {
08582    size_t pos;
08583    unsigned char ie_len;
08584    unsigned char ie_id;
08585    int32_t value;
08586    int frame_version = 1;
08587    int combined_presentation = 0;
08588    int got_combined_presentation = 0;/* TRUE if got a combined name and number presentation value. */
08589 
08590    for (pos = 0; pos < datalen; pos += ie_len) {
08591       if (datalen < pos + sizeof(ie_id) + sizeof(ie_len)) {
08592          ast_log(LOG_WARNING, "Invalid connected line update\n");
08593          return -1;
08594       }
08595       ie_id = data[pos++];
08596       ie_len = data[pos++];
08597       if (datalen < pos + ie_len) {
08598          ast_log(LOG_WARNING, "Invalid connected line update\n");
08599          return -1;
08600       }
08601 
08602       switch (ie_id) {
08603 /* Connected line party frame version */
08604       case AST_CONNECTED_LINE_VERSION:
08605          if (ie_len != 1) {
08606             ast_log(LOG_WARNING, "Invalid connected line frame version (%u)\n",
08607                (unsigned) ie_len);
08608             break;
08609          }
08610          frame_version = data[pos];
08611          break;
08612 /* Connected line party id name */
08613       case AST_CONNECTED_LINE_NAME:
08614          ast_free(connected->id.name.str);
08615          connected->id.name.str = ast_malloc(ie_len + 1);
08616          if (connected->id.name.str) {
08617             memcpy(connected->id.name.str, data + pos, ie_len);
08618             connected->id.name.str[ie_len] = 0;
08619          }
08620          break;
08621       case AST_CONNECTED_LINE_NAME_CHAR_SET:
08622          if (ie_len != 1) {
08623             ast_log(LOG_WARNING, "Invalid connected line name char set (%u)\n",
08624                (unsigned) ie_len);
08625             break;
08626          }
08627          connected->id.name.char_set = data[pos];
08628          break;
08629       case AST_CONNECTED_LINE_NAME_PRESENTATION:
08630          if (ie_len != 1) {
08631             ast_log(LOG_WARNING, "Invalid connected line name presentation (%u)\n",
08632                (unsigned) ie_len);
08633             break;
08634          }
08635          connected->id.name.presentation = data[pos];
08636          break;
08637       case AST_CONNECTED_LINE_NAME_VALID:
08638          if (ie_len != 1) {
08639             ast_log(LOG_WARNING, "Invalid connected line name valid (%u)\n",
08640                (unsigned) ie_len);
08641             break;
08642          }
08643          connected->id.name.valid = data[pos];
08644          break;
08645 /* Connected line party id number */
08646       case AST_CONNECTED_LINE_NUMBER:
08647          ast_free(connected->id.number.str);
08648          connected->id.number.str = ast_malloc(ie_len + 1);
08649          if (connected->id.number.str) {
08650             memcpy(connected->id.number.str, data + pos, ie_len);
08651             connected->id.number.str[ie_len] = 0;
08652          }
08653          break;
08654       case AST_CONNECTED_LINE_NUMBER_PLAN:
08655          if (ie_len != 1) {
08656             ast_log(LOG_WARNING, "Invalid connected line numbering plan (%u)\n",
08657                (unsigned) ie_len);
08658             break;
08659          }
08660          connected->id.number.plan = data[pos];
08661          break;
08662       case AST_CONNECTED_LINE_NUMBER_PRESENTATION:
08663          if (ie_len != 1) {
08664             ast_log(LOG_WARNING, "Invalid connected line number presentation (%u)\n",
08665                (unsigned) ie_len);
08666             break;
08667          }
08668          connected->id.number.presentation = data[pos];
08669          break;
08670       case AST_CONNECTED_LINE_NUMBER_VALID:
08671          if (ie_len != 1) {
08672             ast_log(LOG_WARNING, "Invalid connected line number valid (%u)\n",
08673                (unsigned) ie_len);
08674             break;
08675          }
08676          connected->id.number.valid = data[pos];
08677          break;
08678 /* Connected line party id combined presentation */
08679       case AST_CONNECTED_LINE_ID_PRESENTATION:
08680          if (ie_len != 1) {
08681             ast_log(LOG_WARNING, "Invalid connected line combined presentation (%u)\n",
08682                (unsigned) ie_len);
08683             break;
08684          }
08685          combined_presentation = data[pos];
08686          got_combined_presentation = 1;
08687          break;
08688 /* Connected line party id subaddress */
08689       case AST_CONNECTED_LINE_SUBADDRESS:
08690          ast_free(connected->id.subaddress.str);
08691          connected->id.subaddress.str = ast_malloc(ie_len + 1);
08692          if (connected->id.subaddress.str) {
08693             memcpy(connected->id.subaddress.str, data + pos, ie_len);
08694             connected->id.subaddress.str[ie_len] = 0;
08695          }
08696          break;
08697       case AST_CONNECTED_LINE_SUBADDRESS_TYPE:
08698          if (ie_len != 1) {
08699             ast_log(LOG_WARNING, "Invalid connected line type of subaddress (%u)\n",
08700                (unsigned) ie_len);
08701             break;
08702          }
08703          connected->id.subaddress.type = data[pos];
08704          break;
08705       case AST_CONNECTED_LINE_SUBADDRESS_ODD_EVEN:
08706          if (ie_len != 1) {
08707             ast_log(LOG_WARNING,
08708                "Invalid connected line subaddress odd-even indicator (%u)\n",
08709                (unsigned) ie_len);
08710             break;
08711          }
08712          connected->id.subaddress.odd_even_indicator = data[pos];
08713          break;
08714       case AST_CONNECTED_LINE_SUBADDRESS_VALID:
08715          if (ie_len != 1) {
08716             ast_log(LOG_WARNING, "Invalid connected line subaddress valid (%u)\n",
08717                (unsigned) ie_len);
08718             break;
08719          }
08720          connected->id.subaddress.valid = data[pos];
08721          break;
08722 /* Connected line party tag */
08723       case AST_CONNECTED_LINE_TAG:
08724          ast_free(connected->id.tag);
08725          connected->id.tag = ast_malloc(ie_len + 1);
08726          if (connected->id.tag) {
08727             memcpy(connected->id.tag, data + pos, ie_len);
08728             connected->id.tag[ie_len] = 0;
08729          }
08730          break;
08731 /* Connected line party source */
08732       case AST_CONNECTED_LINE_SOURCE:
08733          if (ie_len != sizeof(value)) {
08734             ast_log(LOG_WARNING, "Invalid connected line source (%u)\n",
08735                (unsigned) ie_len);
08736             break;
08737          }
08738          memcpy(&value, data + pos, sizeof(value));
08739          connected->source = ntohl(value);
08740          break;
08741 /* Connected line party unknown element */
08742       default:
08743          ast_log(LOG_DEBUG, "Unknown connected line element: %u (%u)\n",
08744             (unsigned) ie_id, (unsigned) ie_len);
08745          break;
08746       }
08747    }
08748 
08749    switch (frame_version) {
08750    case 1:
08751       /*
08752        * The other end is an earlier version that we need to adjust
08753        * for compatibility.
08754        */
08755       connected->id.name.valid = 1;
08756       connected->id.name.char_set = AST_PARTY_CHAR_SET_ISO8859_1;
08757       connected->id.number.valid = 1;
08758       if (got_combined_presentation) {
08759          connected->id.name.presentation = combined_presentation;
08760          connected->id.number.presentation = combined_presentation;
08761       }
08762       break;
08763    case 2:
08764       /* The other end is at the same level as we are. */
08765       break;
08766    default:
08767       /*
08768        * The other end is newer than we are.
08769        * We need to assume that they are compatible with us.
08770        */
08771       ast_log(LOG_DEBUG, "Connected line frame has newer version: %u\n",
08772          (unsigned) frame_version);
08773       break;
08774    }
08775 
08776    return 0;
08777 }
08778 
08779 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)
08780 {
08781    unsigned char data[1024];  /* This should be large enough */
08782    size_t datalen;
08783 
08784    datalen = ast_connected_line_build_data(data, sizeof(data), connected, update);
08785    if (datalen == (size_t) -1) {
08786       return;
08787    }
08788 
08789    ast_indicate_data(chan, AST_CONTROL_CONNECTED_LINE, data, datalen);
08790 }
08791 
08792 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)
08793 {
08794    unsigned char data[1024];  /* This should be large enough */
08795    size_t datalen;
08796 
08797    datalen = ast_connected_line_build_data(data, sizeof(data), connected, update);
08798    if (datalen == (size_t) -1) {
08799       return;
08800    }
08801 
08802    ast_queue_control_data(chan, AST_CONTROL_CONNECTED_LINE, data, datalen);
08803 }
08804 
08805 void ast_channel_set_redirecting(struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
08806 {
08807    if (&chan->redirecting == redirecting) {
08808       /* Don't set to self */
08809       return;
08810    }
08811 
08812    ast_channel_lock(chan);
08813    ast_party_redirecting_set(&chan->redirecting, redirecting, update);
08814    ast_channel_unlock(chan);
08815 }
08816 
08817 /*!
08818  * \brief Element identifiers for redirecting indication frame data
08819  * \note Only add to the end of this enum.
08820  */
08821 enum {
08822    AST_REDIRECTING_FROM_NUMBER,
08823    AST_REDIRECTING_FROM_NAME,
08824    AST_REDIRECTING_FROM_NUMBER_PLAN,
08825    AST_REDIRECTING_FROM_ID_PRESENTATION,
08826    AST_REDIRECTING_TO_NUMBER,
08827    AST_REDIRECTING_TO_NAME,
08828    AST_REDIRECTING_TO_NUMBER_PLAN,
08829    AST_REDIRECTING_TO_ID_PRESENTATION,
08830    AST_REDIRECTING_REASON,
08831    AST_REDIRECTING_COUNT,
08832    AST_REDIRECTING_FROM_SUBADDRESS,
08833    AST_REDIRECTING_FROM_SUBADDRESS_TYPE,
08834    AST_REDIRECTING_FROM_SUBADDRESS_ODD_EVEN,
08835    AST_REDIRECTING_FROM_SUBADDRESS_VALID,
08836    AST_REDIRECTING_TO_SUBADDRESS,
08837    AST_REDIRECTING_TO_SUBADDRESS_TYPE,
08838    AST_REDIRECTING_TO_SUBADDRESS_ODD_EVEN,
08839    AST_REDIRECTING_TO_SUBADDRESS_VALID,
08840    AST_REDIRECTING_FROM_TAG,
08841    AST_REDIRECTING_TO_TAG,
08842    AST_REDIRECTING_VERSION,
08843    AST_REDIRECTING_FROM_NAME_VALID,
08844    AST_REDIRECTING_FROM_NAME_CHAR_SET,
08845    AST_REDIRECTING_FROM_NAME_PRESENTATION,
08846    AST_REDIRECTING_FROM_NUMBER_VALID,
08847    AST_REDIRECTING_FROM_NUMBER_PRESENTATION,
08848    AST_REDIRECTING_TO_NAME_VALID,
08849    AST_REDIRECTING_TO_NAME_CHAR_SET,
08850    AST_REDIRECTING_TO_NAME_PRESENTATION,
08851    AST_REDIRECTING_TO_NUMBER_VALID,
08852    AST_REDIRECTING_TO_NUMBER_PRESENTATION,
08853 };
08854 
08855 int ast_redirecting_build_data(unsigned char *data, size_t datalen, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
08856 {
08857    int32_t value;
08858    size_t pos = 0;
08859    int res;
08860 
08861    static const struct ast_party_id_ies from_ies = {
08862       .name.str = AST_REDIRECTING_FROM_NAME,
08863       .name.char_set = AST_REDIRECTING_FROM_NAME_CHAR_SET,
08864       .name.presentation = AST_REDIRECTING_FROM_NAME_PRESENTATION,
08865       .name.valid = AST_REDIRECTING_FROM_NAME_VALID,
08866 
08867       .number.str = AST_REDIRECTING_FROM_NUMBER,
08868       .number.plan = AST_REDIRECTING_FROM_NUMBER_PLAN,
08869       .number.presentation = AST_REDIRECTING_FROM_NUMBER_PRESENTATION,
08870       .number.valid = AST_REDIRECTING_FROM_NUMBER_VALID,
08871 
08872       .subaddress.str = AST_REDIRECTING_FROM_SUBADDRESS,
08873       .subaddress.type = AST_REDIRECTING_FROM_SUBADDRESS_TYPE,
08874       .subaddress.odd_even_indicator = AST_REDIRECTING_FROM_SUBADDRESS_ODD_EVEN,
08875       .subaddress.valid = AST_REDIRECTING_FROM_SUBADDRESS_VALID,
08876 
08877       .tag = AST_REDIRECTING_FROM_TAG,
08878       .combined_presentation = AST_REDIRECTING_FROM_ID_PRESENTATION,
08879    };
08880    static const struct ast_party_id_ies to_ies = {
08881       .name.str = AST_REDIRECTING_TO_NAME,
08882       .name.char_set = AST_REDIRECTING_TO_NAME_CHAR_SET,
08883       .name.presentation = AST_REDIRECTING_TO_NAME_PRESENTATION,
08884       .name.valid = AST_REDIRECTING_TO_NAME_VALID,
08885 
08886       .number.str = AST_REDIRECTING_TO_NUMBER,
08887       .number.plan = AST_REDIRECTING_TO_NUMBER_PLAN,
08888       .number.presentation = AST_REDIRECTING_TO_NUMBER_PRESENTATION,
08889       .number.valid = AST_REDIRECTING_TO_NUMBER_VALID,
08890 
08891       .subaddress.str = AST_REDIRECTING_TO_SUBADDRESS,
08892       .subaddress.type = AST_REDIRECTING_TO_SUBADDRESS_TYPE,
08893       .subaddress.odd_even_indicator = AST_REDIRECTING_TO_SUBADDRESS_ODD_EVEN,
08894       .subaddress.valid = AST_REDIRECTING_TO_SUBADDRESS_VALID,
08895 
08896       .tag = AST_REDIRECTING_TO_TAG,
08897       .combined_presentation = AST_REDIRECTING_TO_ID_PRESENTATION,
08898    };
08899 
08900    /* Redirecting frame version */
08901    if (datalen < pos + (sizeof(data[0]) * 2) + 1) {
08902       ast_log(LOG_WARNING, "No space left for redirecting frame version\n");
08903       return -1;
08904    }
08905    data[pos++] = AST_REDIRECTING_VERSION;
08906    data[pos++] = 1;
08907    data[pos++] = 2;/* Version 1 did not have a version ie */
08908 
08909    res = party_id_build_data(data + pos, datalen - pos, &redirecting->from,
08910       "redirecting-from", &from_ies, update ? &update->from : NULL);
08911    if (res < 0) {
08912       return -1;
08913    }
08914    pos += res;
08915 
08916    res = party_id_build_data(data + pos, datalen - pos, &redirecting->to,
08917       "redirecting-to", &to_ies, update ? &update->to : NULL);
08918    if (res < 0) {
08919       return -1;
08920    }
08921    pos += res;
08922 
08923    /* Redirecting reason */
08924    if (datalen < pos + (sizeof(data[0]) * 2) + sizeof(value)) {
08925       ast_log(LOG_WARNING, "No space left for redirecting reason\n");
08926       return -1;
08927    }
08928    data[pos++] = AST_REDIRECTING_REASON;
08929    data[pos++] = sizeof(value);
08930    value = htonl(redirecting->reason);
08931    memcpy(data + pos, &value, sizeof(value));
08932    pos += sizeof(value);
08933 
08934    /* Redirecting count */
08935    if (datalen < pos + (sizeof(data[0]) * 2) + sizeof(value)) {
08936       ast_log(LOG_WARNING, "No space left for redirecting count\n");
08937       return -1;
08938    }
08939    data[pos++] = AST_REDIRECTING_COUNT;
08940    data[pos++] = sizeof(value);
08941    value = htonl(redirecting->count);
08942    memcpy(data + pos, &value, sizeof(value));
08943    pos += sizeof(value);
08944 
08945    return pos;
08946 }
08947 
08948 int ast_redirecting_parse_data(const unsigned char *data, size_t datalen, struct ast_party_redirecting *redirecting)
08949 {
08950    size_t pos;
08951    unsigned char ie_len;
08952    unsigned char ie_id;
08953    int32_t value;
08954    int frame_version = 1;
08955    int from_combined_presentation = 0;
08956    int got_from_combined_presentation = 0;/* TRUE if got a combined name and number presentation value. */
08957    int to_combined_presentation = 0;
08958    int got_to_combined_presentation = 0;/* TRUE if got a combined name and number presentation value. */
08959 
08960    for (pos = 0; pos < datalen; pos += ie_len) {
08961       if (datalen < pos + sizeof(ie_id) + sizeof(ie_len)) {
08962          ast_log(LOG_WARNING, "Invalid redirecting update\n");
08963          return -1;
08964       }
08965       ie_id = data[pos++];
08966       ie_len = data[pos++];
08967       if (datalen < pos + ie_len) {
08968          ast_log(LOG_WARNING, "Invalid redirecting update\n");
08969          return -1;
08970       }
08971 
08972       switch (ie_id) {
08973 /* Redirecting frame version */
08974       case AST_REDIRECTING_VERSION:
08975          if (ie_len != 1) {
08976             ast_log(LOG_WARNING, "Invalid redirecting frame version (%u)\n",
08977                (unsigned) ie_len);
08978             break;
08979          }
08980          frame_version = data[pos];
08981          break;
08982 /* Redirecting-from party id name */
08983       case AST_REDIRECTING_FROM_NAME:
08984          ast_free(redirecting->from.name.str);
08985          redirecting->from.name.str = ast_malloc(ie_len + 1);
08986          if (redirecting->from.name.str) {
08987             memcpy(redirecting->from.name.str, data + pos, ie_len);
08988             redirecting->from.name.str[ie_len] = 0;
08989          }
08990          break;
08991       case AST_REDIRECTING_FROM_NAME_CHAR_SET:
08992          if (ie_len != 1) {
08993             ast_log(LOG_WARNING, "Invalid redirecting-from name char set (%u)\n",
08994                (unsigned) ie_len);
08995             break;
08996          }
08997          redirecting->from.name.char_set = data[pos];
08998          break;
08999       case AST_REDIRECTING_FROM_NAME_PRESENTATION:
09000          if (ie_len != 1) {
09001             ast_log(LOG_WARNING, "Invalid redirecting-from name presentation (%u)\n",
09002                (unsigned) ie_len);
09003             break;
09004          }
09005          redirecting->from.name.presentation = data[pos];
09006          break;
09007       case AST_REDIRECTING_FROM_NAME_VALID:
09008          if (ie_len != 1) {
09009             ast_log(LOG_WARNING, "Invalid redirecting-from name valid (%u)\n",
09010                (unsigned) ie_len);
09011             break;
09012          }
09013          redirecting->from.name.valid = data[pos];
09014          break;
09015 /* Redirecting-from party id number */
09016       case AST_REDIRECTING_FROM_NUMBER:
09017          ast_free(redirecting->from.number.str);
09018          redirecting->from.number.str = ast_malloc(ie_len + 1);
09019          if (redirecting->from.number.str) {
09020             memcpy(redirecting->from.number.str, data + pos, ie_len);
09021             redirecting->from.number.str[ie_len] = 0;
09022          }
09023          break;
09024       case AST_REDIRECTING_FROM_NUMBER_PLAN:
09025          if (ie_len != 1) {
09026             ast_log(LOG_WARNING, "Invalid redirecting-from numbering plan (%u)\n",
09027                (unsigned) ie_len);
09028             break;
09029          }
09030          redirecting->from.number.plan = data[pos];
09031          break;
09032       case AST_REDIRECTING_FROM_NUMBER_PRESENTATION:
09033          if (ie_len != 1) {
09034             ast_log(LOG_WARNING, "Invalid redirecting-from number presentation (%u)\n",
09035                (unsigned) ie_len);
09036             break;
09037          }
09038          redirecting->from.number.presentation = data[pos];
09039          break;
09040       case AST_REDIRECTING_FROM_NUMBER_VALID:
09041          if (ie_len != 1) {
09042             ast_log(LOG_WARNING, "Invalid redirecting-from number valid (%u)\n",
09043                (unsigned) ie_len);
09044             break;
09045          }
09046          redirecting->from.number.valid = data[pos];
09047          break;
09048 /* Redirecting-from party id combined presentation */
09049       case AST_REDIRECTING_FROM_ID_PRESENTATION:
09050          if (ie_len != 1) {
09051             ast_log(LOG_WARNING, "Invalid redirecting-from combined presentation (%u)\n",
09052                (unsigned) ie_len);
09053             break;
09054          }
09055          from_combined_presentation = data[pos];
09056          got_from_combined_presentation = 1;
09057          break;
09058 /* Redirecting-from party id subaddress */
09059       case AST_REDIRECTING_FROM_SUBADDRESS:
09060          ast_free(redirecting->from.subaddress.str);
09061          redirecting->from.subaddress.str = ast_malloc(ie_len + 1);
09062          if (redirecting->from.subaddress.str) {
09063             memcpy(redirecting->from.subaddress.str, data + pos, ie_len);
09064             redirecting->from.subaddress.str[ie_len] = 0;
09065          }
09066          break;
09067       case AST_REDIRECTING_FROM_SUBADDRESS_TYPE:
09068          if (ie_len != 1) {
09069             ast_log(LOG_WARNING, "Invalid redirecting-from type of subaddress (%u)\n",
09070                (unsigned) ie_len);
09071             break;
09072          }
09073          redirecting->from.subaddress.type = data[pos];
09074          break;
09075       case AST_REDIRECTING_FROM_SUBADDRESS_ODD_EVEN:
09076          if (ie_len != 1) {
09077             ast_log(LOG_WARNING,
09078                "Invalid redirecting-from subaddress odd-even indicator (%u)\n",
09079                (unsigned) ie_len);
09080             break;
09081          }
09082          redirecting->from.subaddress.odd_even_indicator = data[pos];
09083          break;
09084       case AST_REDIRECTING_FROM_SUBADDRESS_VALID:
09085          if (ie_len != 1) {
09086             ast_log(LOG_WARNING, "Invalid redirecting-from subaddress valid (%u)\n",
09087                (unsigned) ie_len);
09088             break;
09089          }
09090          redirecting->from.subaddress.valid = data[pos];
09091          break;
09092 /* Redirecting-from party id tag */
09093       case AST_REDIRECTING_FROM_TAG:
09094          ast_free(redirecting->from.tag);
09095          redirecting->from.tag = ast_malloc(ie_len + 1);
09096          if (redirecting->from.tag) {
09097             memcpy(redirecting->from.tag, data + pos, ie_len);
09098             redirecting->from.tag[ie_len] = 0;
09099          }
09100          break;
09101 /* Redirecting-to party id name */
09102       case AST_REDIRECTING_TO_NAME:
09103          ast_free(redirecting->to.name.str);
09104          redirecting->to.name.str = ast_malloc(ie_len + 1);
09105          if (redirecting->to.name.str) {
09106             memcpy(redirecting->to.name.str, data + pos, ie_len);
09107             redirecting->to.name.str[ie_len] = 0;
09108          }
09109          break;
09110       case AST_REDIRECTING_TO_NAME_CHAR_SET:
09111          if (ie_len != 1) {
09112             ast_log(LOG_WARNING, "Invalid redirecting-to name char set (%u)\n",
09113                (unsigned) ie_len);
09114             break;
09115          }
09116          redirecting->to.name.char_set = data[pos];
09117          break;
09118       case AST_REDIRECTING_TO_NAME_PRESENTATION:
09119          if (ie_len != 1) {
09120             ast_log(LOG_WARNING, "Invalid redirecting-to name presentation (%u)\n",
09121                (unsigned) ie_len);
09122             break;
09123          }
09124          redirecting->to.name.presentation = data[pos];
09125          break;
09126       case AST_REDIRECTING_TO_NAME_VALID:
09127          if (ie_len != 1) {
09128             ast_log(LOG_WARNING, "Invalid redirecting-to name valid (%u)\n",
09129                (unsigned) ie_len);
09130             break;
09131          }
09132          redirecting->to.name.valid = data[pos];
09133          break;
09134 /* Redirecting-to party id number */
09135       case AST_REDIRECTING_TO_NUMBER:
09136          ast_free(redirecting->to.number.str);
09137          redirecting->to.number.str = ast_malloc(ie_len + 1);
09138          if (redirecting->to.number.str) {
09139             memcpy(redirecting->to.number.str, data + pos, ie_len);
09140             redirecting->to.number.str[ie_len] = 0;
09141          }
09142          break;
09143       case AST_REDIRECTING_TO_NUMBER_PLAN:
09144          if (ie_len != 1) {
09145             ast_log(LOG_WARNING, "Invalid redirecting-to numbering plan (%u)\n",
09146                (unsigned) ie_len);
09147             break;
09148          }
09149          redirecting->to.number.plan = data[pos];
09150          break;
09151       case AST_REDIRECTING_TO_NUMBER_PRESENTATION:
09152          if (ie_len != 1) {
09153             ast_log(LOG_WARNING, "Invalid redirecting-to number presentation (%u)\n",
09154                (unsigned) ie_len);
09155             break;
09156          }
09157          redirecting->to.number.presentation = data[pos];
09158          break;
09159       case AST_REDIRECTING_TO_NUMBER_VALID:
09160          if (ie_len != 1) {
09161             ast_log(LOG_WARNING, "Invalid redirecting-to number valid (%u)\n",
09162                (unsigned) ie_len);
09163             break;
09164          }
09165          redirecting->to.number.valid = data[pos];
09166          break;
09167 /* Redirecting-to party id combined presentation */
09168       case AST_REDIRECTING_TO_ID_PRESENTATION:
09169          if (ie_len != 1) {
09170             ast_log(LOG_WARNING, "Invalid redirecting-to combined presentation (%u)\n",
09171                (unsigned) ie_len);
09172             break;
09173          }
09174          to_combined_presentation = data[pos];
09175          got_to_combined_presentation = 1;
09176          break;
09177 /* Redirecting-to party id subaddress */
09178       case AST_REDIRECTING_TO_SUBADDRESS:
09179          ast_free(redirecting->to.subaddress.str);
09180          redirecting->to.subaddress.str = ast_malloc(ie_len + 1);
09181          if (redirecting->to.subaddress.str) {
09182             memcpy(redirecting->to.subaddress.str, data + pos, ie_len);
09183             redirecting->to.subaddress.str[ie_len] = 0;
09184          }
09185          break;
09186       case AST_REDIRECTING_TO_SUBADDRESS_TYPE:
09187          if (ie_len != 1) {
09188             ast_log(LOG_WARNING, "Invalid redirecting-to type of subaddress (%u)\n",
09189                (unsigned) ie_len);
09190             break;
09191          }
09192          redirecting->to.subaddress.type = data[pos];
09193          break;
09194       case AST_REDIRECTING_TO_SUBADDRESS_ODD_EVEN:
09195          if (ie_len != 1) {
09196             ast_log(LOG_WARNING,
09197                "Invalid redirecting-to subaddress odd-even indicator (%u)\n",
09198                (unsigned) ie_len);
09199             break;
09200          }
09201          redirecting->to.subaddress.odd_even_indicator = data[pos];
09202          break;
09203       case AST_REDIRECTING_TO_SUBADDRESS_VALID:
09204          if (ie_len != 1) {
09205             ast_log(LOG_WARNING, "Invalid redirecting-to subaddress valid (%u)\n",
09206                (unsigned) ie_len);
09207             break;
09208          }
09209          redirecting->to.subaddress.valid = data[pos];
09210          break;
09211 /* Redirecting-to party id tag */
09212       case AST_REDIRECTING_TO_TAG:
09213          ast_free(redirecting->to.tag);
09214          redirecting->to.tag = ast_malloc(ie_len + 1);
09215          if (redirecting->to.tag) {
09216             memcpy(redirecting->to.tag, data + pos, ie_len);
09217             redirecting->to.tag[ie_len] = 0;
09218          }
09219          break;
09220 /* Redirecting reason */
09221       case AST_REDIRECTING_REASON:
09222          if (ie_len != sizeof(value)) {
09223             ast_log(LOG_WARNING, "Invalid redirecting reason (%u)\n",
09224                (unsigned) ie_len);
09225             break;
09226          }
09227          memcpy(&value, data + pos, sizeof(value));
09228          redirecting->reason = ntohl(value);
09229          break;
09230 /* Redirecting count */
09231       case AST_REDIRECTING_COUNT:
09232          if (ie_len != sizeof(value)) {
09233             ast_log(LOG_WARNING, "Invalid redirecting count (%u)\n",
09234                (unsigned) ie_len);
09235             break;
09236          }
09237          memcpy(&value, data + pos, sizeof(value));
09238          redirecting->count = ntohl(value);
09239          break;
09240 /* Redirecting unknown element */
09241       default:
09242          ast_log(LOG_DEBUG, "Unknown redirecting element: %u (%u)\n",
09243             (unsigned) ie_id, (unsigned) ie_len);
09244          break;
09245       }
09246    }
09247 
09248    switch (frame_version) {
09249    case 1:
09250       /*
09251        * The other end is an earlier version that we need to adjust
09252        * for compatibility.
09253        */
09254       redirecting->from.name.valid = 1;
09255       redirecting->from.name.char_set = AST_PARTY_CHAR_SET_ISO8859_1;
09256       redirecting->from.number.valid = 1;
09257       if (got_from_combined_presentation) {
09258          redirecting->from.name.presentation = from_combined_presentation;
09259          redirecting->from.number.presentation = from_combined_presentation;
09260       }
09261 
09262       redirecting->to.name.valid = 1;
09263       redirecting->to.name.char_set = AST_PARTY_CHAR_SET_ISO8859_1;
09264       redirecting->to.number.valid = 1;
09265       if (got_to_combined_presentation) {
09266          redirecting->to.name.presentation = to_combined_presentation;
09267          redirecting->to.number.presentation = to_combined_presentation;
09268       }
09269       break;
09270    case 2:
09271       /* The other end is at the same level as we are. */
09272       break;
09273    default:
09274       /*
09275        * The other end is newer than we are.
09276        * We need to assume that they are compatible with us.
09277        */
09278       ast_log(LOG_DEBUG, "Redirecting frame has newer version: %u\n",
09279          (unsigned) frame_version);
09280       break;
09281    }
09282 
09283    return 0;
09284 }
09285 
09286 void ast_channel_update_redirecting(struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
09287 {
09288    unsigned char data[1024];  /* This should be large enough */
09289    size_t datalen;
09290 
09291    datalen = ast_redirecting_build_data(data, sizeof(data), redirecting, update);
09292    if (datalen == (size_t) -1) {
09293       return;
09294    }
09295 
09296    ast_indicate_data(chan, AST_CONTROL_REDIRECTING, data, datalen);
09297 }
09298 
09299 void ast_channel_queue_redirecting_update(struct ast_channel *chan, const struct ast_party_redirecting *redirecting, const struct ast_set_party_redirecting *update)
09300 {
09301    unsigned char data[1024];  /* This should be large enough */
09302    size_t datalen;
09303 
09304    datalen = ast_redirecting_build_data(data, sizeof(data), redirecting, update);
09305    if (datalen == (size_t) -1) {
09306       return;
09307    }
09308 
09309    ast_queue_control_data(chan, AST_CONTROL_REDIRECTING, data, datalen);
09310 }
09311 
09312 int ast_channel_connected_line_macro(struct ast_channel *autoservice_chan, struct ast_channel *macro_chan, const void *connected_info, int is_caller, int is_frame)
09313 {
09314    const char *macro;
09315    const char *macro_args;
09316    int retval;
09317 
09318    ast_channel_lock(macro_chan);
09319    macro = pbx_builtin_getvar_helper(macro_chan, is_caller
09320       ? "CONNECTED_LINE_CALLER_SEND_MACRO" : "CONNECTED_LINE_CALLEE_SEND_MACRO");
09321    macro = ast_strdupa(S_OR(macro, ""));
09322    macro_args = pbx_builtin_getvar_helper(macro_chan, is_caller
09323       ? "CONNECTED_LINE_CALLER_SEND_MACRO_ARGS" : "CONNECTED_LINE_CALLEE_SEND_MACRO_ARGS");
09324    macro_args = ast_strdupa(S_OR(macro_args, ""));
09325 
09326    if (ast_strlen_zero(macro)) {
09327       ast_channel_unlock(macro_chan);
09328       return -1;
09329    }
09330 
09331    if (is_frame) {
09332       const struct ast_frame *frame = connected_info;
09333 
09334       ast_connected_line_parse_data(frame->data.ptr, frame->datalen, &macro_chan->connected);
09335    } else {
09336       const struct ast_party_connected_line *connected = connected_info;
09337 
09338       ast_party_connected_line_copy(&macro_chan->connected, connected);
09339    }
09340    ast_channel_unlock(macro_chan);
09341 
09342    if (!(retval = ast_app_run_macro(autoservice_chan, macro_chan, macro, macro_args))) {
09343       ast_channel_lock(macro_chan);
09344       ast_channel_update_connected_line(macro_chan, &macro_chan->connected, NULL);
09345       ast_channel_unlock(macro_chan);
09346    }
09347 
09348    return retval;
09349 }
09350 
09351 int ast_channel_redirecting_macro(struct ast_channel *autoservice_chan, struct ast_channel *macro_chan, const void *redirecting_info, int is_caller, int is_frame)
09352 {
09353    const char *macro;
09354    const char *macro_args;
09355    int retval;
09356 
09357    ast_channel_lock(macro_chan);
09358    macro = pbx_builtin_getvar_helper(macro_chan, is_caller
09359       ? "REDIRECTING_CALLER_SEND_MACRO" : "REDIRECTING_CALLEE_SEND_MACRO");
09360    macro = ast_strdupa(S_OR(macro, ""));
09361    macro_args = pbx_builtin_getvar_helper(macro_chan, is_caller
09362       ? "REDIRECTING_CALLER_SEND_MACRO_ARGS" : "REDIRECTING_CALLEE_SEND_MACRO_ARGS");
09363    macro_args = ast_strdupa(S_OR(macro_args, ""));
09364 
09365    if (ast_strlen_zero(macro)) {
09366       ast_channel_unlock(macro_chan);
09367       return -1;
09368    }
09369 
09370    if (is_frame) {
09371       const struct ast_frame *frame = redirecting_info;
09372 
09373       ast_redirecting_parse_data(frame->data.ptr, frame->datalen, &macro_chan->redirecting);
09374    } else {
09375       const struct ast_party_redirecting *redirecting = redirecting_info;
09376 
09377       ast_party_redirecting_copy(&macro_chan->redirecting, redirecting);
09378    }
09379    ast_channel_unlock(macro_chan);
09380 
09381    retval = ast_app_run_macro(autoservice_chan, macro_chan, macro, macro_args);
09382    if (!retval) {
09383       ast_channel_lock(macro_chan);
09384       ast_channel_update_redirecting(macro_chan, &macro_chan->redirecting, NULL);
09385       ast_channel_unlock(macro_chan);
09386    }
09387 
09388    return retval;
09389 }
09390 
09391 static void *channel_cc_params_copy(void *data)
09392 {
09393    const struct ast_cc_config_params *src = data;
09394    struct ast_cc_config_params *dest = ast_cc_config_params_init();
09395    if (!dest) {
09396       return NULL;
09397    }
09398    ast_cc_copy_config_params(dest, src);
09399    return dest;
09400 }
09401 
09402 static void channel_cc_params_destroy(void *data)
09403 {
09404    struct ast_cc_config_params *cc_params = data;
09405    ast_cc_config_params_destroy(cc_params);
09406 }
09407 
09408 static const struct ast_datastore_info cc_channel_datastore_info = {
09409    .type = "Call Completion",
09410    .duplicate = channel_cc_params_copy,
09411    .destroy = channel_cc_params_destroy,
09412 };
09413 
09414 int ast_channel_cc_params_init(struct ast_channel *chan,
09415       const struct ast_cc_config_params *base_params)
09416 {
09417    struct ast_cc_config_params *cc_params;
09418    struct ast_datastore *cc_datastore;
09419 
09420    if (!(cc_params = ast_cc_config_params_init())) {
09421       return -1;
09422    }
09423 
09424    if (!(cc_datastore = ast_datastore_alloc(&cc_channel_datastore_info, NULL))) {
09425       ast_cc_config_params_destroy(cc_params);
09426       return -1;
09427    }
09428 
09429    if (base_params) {
09430       ast_cc_copy_config_params(cc_params, base_params);
09431    }
09432    cc_datastore->data = cc_params;
09433    ast_channel_datastore_add(chan, cc_datastore);
09434    return 0;
09435 }
09436 
09437 struct ast_cc_config_params *ast_channel_get_cc_config_params(struct ast_channel *chan)
09438 {
09439    struct ast_datastore *cc_datastore;
09440 
09441    if (!(cc_datastore = ast_channel_datastore_find(chan, &cc_channel_datastore_info, NULL))) {
09442       /* If we can't find the datastore, it almost definitely means that the channel type being
09443        * used has not had its driver modified to parse CC config parameters. The best action
09444        * to take here is to create the parameters on the spot with the defaults set.
09445        */
09446       if (ast_channel_cc_params_init(chan, NULL)) {
09447          return NULL;
09448       }
09449       if (!(cc_datastore = ast_channel_datastore_find(chan, &cc_channel_datastore_info, NULL))) {
09450          /* Should be impossible */
09451          return NULL;
09452       }
09453    }
09454 
09455    ast_assert(cc_datastore->data != NULL);
09456    return cc_datastore->data;
09457 }
09458 
09459 int ast_channel_get_device_name(struct ast_channel *chan, char *device_name, size_t name_buffer_length)
09460 {
09461    int len = name_buffer_length;
09462    char *dash;
09463    if (!ast_channel_queryoption(chan, AST_OPTION_DEVICE_NAME, device_name, &len, 0)) {
09464       return 0;
09465    }
09466 
09467    /* Dang. Do it the old-fashioned way */
09468    ast_copy_string(device_name, chan->name, name_buffer_length);
09469    if ((dash = strrchr(device_name, '-'))) {
09470       *dash = '\0';
09471    }
09472 
09473    return 0;
09474 }
09475 
09476 int ast_channel_get_cc_agent_type(struct ast_channel *chan, char *agent_type, size_t size)
09477 {
09478    int len = size;
09479    char *slash;
09480 
09481    if (!ast_channel_queryoption(chan, AST_OPTION_CC_AGENT_TYPE, agent_type, &len, 0)) {
09482       return 0;
09483    }
09484 
09485    ast_copy_string(agent_type, chan->name, size);
09486    if ((slash = strchr(agent_type, '/'))) {
09487       *slash = '\0';
09488    }
09489    return 0;
09490 }
09491 
09492 /* DO NOT PUT ADDITIONAL FUNCTIONS BELOW THIS BOUNDARY
09493  *
09494  * ONLY FUNCTIONS FOR PROVIDING BACKWARDS ABI COMPATIBILITY BELONG HERE
09495  *
09496  */
09497 
09498 /* Provide binary compatibility for modules that call ast_channel_alloc() directly;
09499  * newly compiled modules will call __ast_channel_alloc() via the macros in channel.h
09500  */
09501 #undef ast_channel_alloc
09502 struct ast_channel __attribute__((format(printf, 10, 11)))
09503    *ast_channel_alloc(int needqueue, int state, const char *cid_num,
09504             const char *cid_name, const char *acctcode,
09505             const char *exten, const char *context,
09506             const char *linkedid, const int amaflag,
09507             const char *name_fmt, ...);
09508 struct ast_channel *ast_channel_alloc(int needqueue, int state, const char *cid_num,
09509                   const char *cid_name, const char *acctcode,
09510                   const char *exten, const char *context,
09511                   const char *linkedid, const int amaflag,
09512                   const char *name_fmt, ...)
09513 {
09514    va_list ap1, ap2;
09515    struct ast_channel *result;
09516 
09517 
09518    va_start(ap1, name_fmt);
09519    va_start(ap2, name_fmt);
09520    result = __ast_channel_alloc_ap(needqueue, state, cid_num, cid_name, acctcode, exten, context,
09521                linkedid, amaflag, __FILE__, __LINE__, __FUNCTION__, name_fmt, ap1, ap2);
09522    va_end(ap1);
09523    va_end(ap2);
09524 
09525    return result;
09526 }