Tue Aug 24 2010 19:41:30

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: 282467 $")
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/chanvars.h"
00050 #include "asterisk/linkedlists.h"
00051 #include "asterisk/indications.h"
00052 #include "asterisk/monitor.h"
00053 #include "asterisk/causes.h"
00054 #include "asterisk/callerid.h"
00055 #include "asterisk/utils.h"
00056 #include "asterisk/lock.h"
00057 #include "asterisk/app.h"
00058 #include "asterisk/transcap.h"
00059 #include "asterisk/devicestate.h"
00060 #include "asterisk/sha1.h"
00061 #include "asterisk/threadstorage.h"
00062 #include "asterisk/slinfactory.h"
00063 #include "asterisk/audiohook.h"
00064 #include "asterisk/timing.h"
00065 
00066 #ifdef HAVE_EPOLL
00067 #include <sys/epoll.h>
00068 #endif
00069 
00070 struct ast_epoll_data {
00071    struct ast_channel *chan;
00072    int which;
00073 };
00074 
00075 /* uncomment if you have problems with 'monitoring' synchronized files */
00076 #if 0
00077 #define MONITOR_CONSTANT_DELAY
00078 #define MONITOR_DELAY   150 * 8     /*!< 150 ms of MONITORING DELAY */
00079 #endif
00080 
00081 /*! \brief Prevent new channel allocation if shutting down. */
00082 static int shutting_down;
00083 
00084 static int uniqueint;
00085 
00086 unsigned long global_fin, global_fout;
00087 
00088 AST_THREADSTORAGE(state2str_threadbuf);
00089 #define STATE2STR_BUFSIZE   32
00090 
00091 /*! Default amount of time to use when emulating a digit as a begin and end 
00092  *  100ms */
00093 #define AST_DEFAULT_EMULATE_DTMF_DURATION 100
00094 
00095 /*! Minimum allowed digit length - 80ms */
00096 #define AST_MIN_DTMF_DURATION 80
00097 
00098 /*! Minimum amount of time between the end of the last digit and the beginning 
00099  *  of a new one - 45ms */
00100 #define AST_MIN_DTMF_GAP 45
00101 
00102 /*! \brief List of channel drivers */
00103 struct chanlist {
00104    const struct ast_channel_tech *tech;
00105    AST_LIST_ENTRY(chanlist) list;
00106 };
00107 
00108 #ifdef CHANNEL_TRACE
00109 /*! \brief Structure to hold channel context backtrace data */
00110 struct ast_chan_trace_data {
00111    int enabled;
00112    AST_LIST_HEAD_NOLOCK(, ast_chan_trace) trace;
00113 };
00114 
00115 /*! \brief Structure to save contexts where an ast_chan has been into */
00116 struct ast_chan_trace {
00117    char context[AST_MAX_CONTEXT];
00118    char exten[AST_MAX_EXTENSION];
00119    int priority;
00120    AST_LIST_ENTRY(ast_chan_trace) entry;
00121 };
00122 #endif
00123 
00124 /*! \brief the list of registered channel types */
00125 static AST_LIST_HEAD_NOLOCK_STATIC(backends, chanlist);
00126 
00127 /*! \brief the list of channels we have. Note that the lock for this list is used for
00128    both the channels list and the backends list.  */
00129 static AST_RWLIST_HEAD_STATIC(channels, ast_channel);
00130 
00131 /*! \brief map AST_CAUSE's to readable string representations 
00132  *
00133  * \ref causes.h
00134 */
00135 static const struct {
00136    int cause;
00137    const char *name;
00138    const char *desc;
00139 } causes[] = {
00140    { AST_CAUSE_UNALLOCATED, "UNALLOCATED", "Unallocated (unassigned) number" },
00141    { AST_CAUSE_NO_ROUTE_TRANSIT_NET, "NO_ROUTE_TRANSIT_NET", "No route to specified transmit network" },
00142    { AST_CAUSE_NO_ROUTE_DESTINATION, "NO_ROUTE_DESTINATION", "No route to destination" },
00143    { AST_CAUSE_CHANNEL_UNACCEPTABLE, "CHANNEL_UNACCEPTABLE", "Channel unacceptable" },
00144    { AST_CAUSE_CALL_AWARDED_DELIVERED, "CALL_AWARDED_DELIVERED", "Call awarded and being delivered in an established channel" },
00145    { AST_CAUSE_NORMAL_CLEARING, "NORMAL_CLEARING", "Normal Clearing" },
00146    { AST_CAUSE_USER_BUSY, "USER_BUSY", "User busy" },
00147    { AST_CAUSE_NO_USER_RESPONSE, "NO_USER_RESPONSE", "No user responding" },
00148    { AST_CAUSE_NO_ANSWER, "NO_ANSWER", "User alerting, no answer" },
00149    { AST_CAUSE_CALL_REJECTED, "CALL_REJECTED", "Call Rejected" },
00150    { AST_CAUSE_NUMBER_CHANGED, "NUMBER_CHANGED", "Number changed" },
00151    { AST_CAUSE_DESTINATION_OUT_OF_ORDER, "DESTINATION_OUT_OF_ORDER", "Destination out of order" },
00152    { AST_CAUSE_INVALID_NUMBER_FORMAT, "INVALID_NUMBER_FORMAT", "Invalid number format" },
00153    { AST_CAUSE_FACILITY_REJECTED, "FACILITY_REJECTED", "Facility rejected" },
00154    { AST_CAUSE_RESPONSE_TO_STATUS_ENQUIRY, "RESPONSE_TO_STATUS_ENQUIRY", "Response to STATus ENQuiry" },
00155    { AST_CAUSE_NORMAL_UNSPECIFIED, "NORMAL_UNSPECIFIED", "Normal, unspecified" },
00156    { AST_CAUSE_NORMAL_CIRCUIT_CONGESTION, "NORMAL_CIRCUIT_CONGESTION", "Circuit/channel congestion" },
00157    { AST_CAUSE_NETWORK_OUT_OF_ORDER, "NETWORK_OUT_OF_ORDER", "Network out of order" },
00158    { AST_CAUSE_NORMAL_TEMPORARY_FAILURE, "NORMAL_TEMPORARY_FAILURE", "Temporary failure" },
00159    { AST_CAUSE_SWITCH_CONGESTION, "SWITCH_CONGESTION", "Switching equipment congestion" },
00160    { AST_CAUSE_ACCESS_INFO_DISCARDED, "ACCESS_INFO_DISCARDED", "Access information discarded" },
00161    { AST_CAUSE_REQUESTED_CHAN_UNAVAIL, "REQUESTED_CHAN_UNAVAIL", "Requested channel not available" },
00162    { AST_CAUSE_PRE_EMPTED, "PRE_EMPTED", "Pre-empted" },
00163    { AST_CAUSE_FACILITY_NOT_SUBSCRIBED, "FACILITY_NOT_SUBSCRIBED", "Facility not subscribed" },
00164    { AST_CAUSE_OUTGOING_CALL_BARRED, "OUTGOING_CALL_BARRED", "Outgoing call barred" },
00165    { AST_CAUSE_INCOMING_CALL_BARRED, "INCOMING_CALL_BARRED", "Incoming call barred" },
00166    { AST_CAUSE_BEARERCAPABILITY_NOTAUTH, "BEARERCAPABILITY_NOTAUTH", "Bearer capability not authorized" },
00167    { AST_CAUSE_BEARERCAPABILITY_NOTAVAIL, "BEARERCAPABILITY_NOTAVAIL", "Bearer capability not available" },
00168    { AST_CAUSE_BEARERCAPABILITY_NOTIMPL, "BEARERCAPABILITY_NOTIMPL", "Bearer capability not implemented" },
00169    { AST_CAUSE_CHAN_NOT_IMPLEMENTED, "CHAN_NOT_IMPLEMENTED", "Channel not implemented" },
00170    { AST_CAUSE_FACILITY_NOT_IMPLEMENTED, "FACILITY_NOT_IMPLEMENTED", "Facility not implemented" },
00171    { AST_CAUSE_INVALID_CALL_REFERENCE, "INVALID_CALL_REFERENCE", "Invalid call reference value" },
00172    { AST_CAUSE_INCOMPATIBLE_DESTINATION, "INCOMPATIBLE_DESTINATION", "Incompatible destination" },
00173    { AST_CAUSE_INVALID_MSG_UNSPECIFIED, "INVALID_MSG_UNSPECIFIED", "Invalid message unspecified" },
00174    { AST_CAUSE_MANDATORY_IE_MISSING, "MANDATORY_IE_MISSING", "Mandatory information element is missing" },
00175    { AST_CAUSE_MESSAGE_TYPE_NONEXIST, "MESSAGE_TYPE_NONEXIST", "Message type nonexist." },
00176    { AST_CAUSE_WRONG_MESSAGE, "WRONG_MESSAGE", "Wrong message" },
00177    { AST_CAUSE_IE_NONEXIST, "IE_NONEXIST", "Info. element nonexist or not implemented" },
00178    { AST_CAUSE_INVALID_IE_CONTENTS, "INVALID_IE_CONTENTS", "Invalid information element contents" },
00179    { AST_CAUSE_WRONG_CALL_STATE, "WRONG_CALL_STATE", "Message not compatible with call state" },
00180    { AST_CAUSE_RECOVERY_ON_TIMER_EXPIRE, "RECOVERY_ON_TIMER_EXPIRE", "Recover on timer expiry" },
00181    { AST_CAUSE_MANDATORY_IE_LENGTH_ERROR, "MANDATORY_IE_LENGTH_ERROR", "Mandatory IE length error" },
00182    { AST_CAUSE_PROTOCOL_ERROR, "PROTOCOL_ERROR", "Protocol error, unspecified" },
00183    { AST_CAUSE_INTERWORKING, "INTERWORKING", "Interworking, unspecified" },
00184 };
00185 
00186 struct ast_variable *ast_channeltype_list(void)
00187 {
00188    struct chanlist *cl;
00189    struct ast_variable *var=NULL, *prev = NULL;
00190    AST_LIST_TRAVERSE(&backends, cl, list) {
00191       if (prev)  {
00192          if ((prev->next = ast_variable_new(cl->tech->type, cl->tech->description, "")))
00193             prev = prev->next;
00194       } else {
00195          var = ast_variable_new(cl->tech->type, cl->tech->description, "");
00196          prev = var;
00197       }
00198    }
00199    return var;
00200 }
00201 
00202 /*! \brief Show channel types - CLI command */
00203 static char *handle_cli_core_show_channeltypes(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
00204 {
00205 #define FORMAT  "%-10.10s  %-40.40s %-12.12s %-12.12s %-12.12s\n"
00206    struct chanlist *cl;
00207    int count_chan = 0;
00208 
00209    switch (cmd) {
00210    case CLI_INIT:
00211       e->command = "core show channeltypes";
00212       e->usage =
00213          "Usage: core show channeltypes\n"
00214          "       Lists available channel types registered in your\n"
00215          "       Asterisk server.\n";
00216       return NULL;
00217    case CLI_GENERATE:
00218       return NULL;
00219    }
00220 
00221    if (a->argc != 3)
00222       return CLI_SHOWUSAGE;
00223 
00224    ast_cli(a->fd, FORMAT, "Type", "Description",       "Devicestate", "Indications", "Transfer");
00225    ast_cli(a->fd, FORMAT, "----------", "-----------", "-----------", "-----------", "--------");
00226 
00227    AST_RWLIST_RDLOCK(&channels);
00228 
00229    AST_LIST_TRAVERSE(&backends, cl, list) {
00230       ast_cli(a->fd, FORMAT, cl->tech->type, cl->tech->description,
00231          (cl->tech->devicestate) ? "yes" : "no",
00232          (cl->tech->indicate) ? "yes" : "no",
00233          (cl->tech->transfer) ? "yes" : "no");
00234       count_chan++;
00235    }
00236 
00237    AST_RWLIST_UNLOCK(&channels);
00238 
00239    ast_cli(a->fd, "----------\n%d channel drivers registered.\n", count_chan);
00240 
00241    return CLI_SUCCESS;
00242 
00243 #undef FORMAT
00244 }
00245 
00246 static char *complete_channeltypes(struct ast_cli_args *a)
00247 {
00248    struct chanlist *cl;
00249    int which = 0;
00250    int wordlen;
00251    char *ret = NULL;
00252 
00253    if (a->pos != 3)
00254       return NULL;
00255 
00256    wordlen = strlen(a->word);
00257 
00258    AST_LIST_TRAVERSE(&backends, cl, list) {
00259       if (!strncasecmp(a->word, cl->tech->type, wordlen) && ++which > a->n) {
00260          ret = ast_strdup(cl->tech->type);
00261          break;
00262       }
00263    }
00264    
00265    return ret;
00266 }
00267 
00268 /*! \brief Show details about a channel driver - CLI command */
00269 static char *handle_cli_core_show_channeltype(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
00270 {
00271    struct chanlist *cl = NULL;
00272 
00273    switch (cmd) {
00274    case CLI_INIT:
00275       e->command = "core show channeltype";
00276       e->usage =
00277          "Usage: core show channeltype <name>\n"
00278          "  Show details about the specified channel type, <name>.\n";
00279       return NULL;
00280    case CLI_GENERATE:
00281       return complete_channeltypes(a);
00282    }
00283 
00284    if (a->argc != 4)
00285       return CLI_SHOWUSAGE;
00286    
00287    AST_RWLIST_RDLOCK(&channels);
00288 
00289    AST_LIST_TRAVERSE(&backends, cl, list) {
00290       if (!strncasecmp(cl->tech->type, a->argv[3], strlen(cl->tech->type)))
00291          break;
00292    }
00293 
00294 
00295    if (!cl) {
00296       ast_cli(a->fd, "\n%s is not a registered channel driver.\n", a->argv[3]);
00297       AST_RWLIST_UNLOCK(&channels);
00298       return CLI_FAILURE;
00299    }
00300 
00301    ast_cli(a->fd,
00302       "-- Info about channel driver: %s --\n"
00303       "  Device State: %s\n"
00304       "    Indication: %s\n"
00305       "     Transfer : %s\n"
00306       "  Capabilities: %d\n"
00307       "   Digit Begin: %s\n"
00308       "     Digit End: %s\n"
00309       "    Send HTML : %s\n"
00310       " Image Support: %s\n"
00311       "  Text Support: %s\n",
00312       cl->tech->type,
00313       (cl->tech->devicestate) ? "yes" : "no",
00314       (cl->tech->indicate) ? "yes" : "no",
00315       (cl->tech->transfer) ? "yes" : "no",
00316       (cl->tech->capabilities) ? cl->tech->capabilities : -1,
00317       (cl->tech->send_digit_begin) ? "yes" : "no",
00318       (cl->tech->send_digit_end) ? "yes" : "no",
00319       (cl->tech->send_html) ? "yes" : "no",
00320       (cl->tech->send_image) ? "yes" : "no",
00321       (cl->tech->send_text) ? "yes" : "no"
00322       
00323    );
00324 
00325    AST_RWLIST_UNLOCK(&channels);
00326    return CLI_SUCCESS;
00327 }
00328 
00329 static struct ast_cli_entry cli_channel[] = {
00330    AST_CLI_DEFINE(handle_cli_core_show_channeltypes, "List available channel types"),
00331    AST_CLI_DEFINE(handle_cli_core_show_channeltype,  "Give more details on that channel type")
00332 };
00333 
00334 #ifdef CHANNEL_TRACE
00335 /*! \brief Destructor for the channel trace datastore */
00336 static void ast_chan_trace_destroy_cb(void *data)
00337 {
00338    struct ast_chan_trace *trace;
00339    struct ast_chan_trace_data *traced = data;
00340    while ((trace = AST_LIST_REMOVE_HEAD(&traced->trace, entry))) {
00341       ast_free(trace);
00342    }
00343    ast_free(traced);
00344 }
00345 
00346 /*! \brief Datastore to put the linked list of ast_chan_trace and trace status */
00347 const struct ast_datastore_info ast_chan_trace_datastore_info = {
00348    .type = "ChanTrace",
00349    .destroy = ast_chan_trace_destroy_cb
00350 };
00351 
00352 /*! \brief Put the channel backtrace in a string */
00353 int ast_channel_trace_serialize(struct ast_channel *chan, struct ast_str **buf)
00354 {
00355    int total = 0;
00356    struct ast_chan_trace *trace;
00357    struct ast_chan_trace_data *traced;
00358    struct ast_datastore *store;
00359 
00360    ast_channel_lock(chan);
00361    store = ast_channel_datastore_find(chan, &ast_chan_trace_datastore_info, NULL);
00362    if (!store) {
00363       ast_channel_unlock(chan);
00364       return total;
00365    }
00366    traced = store->data;
00367    ast_str_reset(*buf);
00368    AST_LIST_TRAVERSE(&traced->trace, trace, entry) {
00369       if (ast_str_append(buf, 0, "[%d] => %s, %s, %d\n", total, trace->context, trace->exten, trace->priority) < 0) {
00370          ast_log(LOG_ERROR, "Data Buffer Size Exceeded!\n");
00371          total = -1;
00372          break;
00373       }
00374       total++;
00375    }
00376    ast_channel_unlock(chan);
00377    return total;
00378 }
00379 
00380 /* !\brief Whether or not context tracing is enabled */
00381 int ast_channel_trace_is_enabled(struct ast_channel *chan)
00382 {
00383    struct ast_datastore *store = ast_channel_datastore_find(chan, &ast_chan_trace_datastore_info, NULL);
00384    if (!store)
00385       return 0;
00386    return ((struct ast_chan_trace_data *)store->data)->enabled;
00387 }
00388 
00389 /*! \brief Update the context backtrace data if tracing is enabled */
00390 static int ast_channel_trace_data_update(struct ast_channel *chan, struct ast_chan_trace_data *traced)
00391 {
00392    struct ast_chan_trace *trace;
00393    if (!traced->enabled)
00394       return 0;
00395    /* If the last saved context does not match the current one
00396       OR we have not saved any context so far, then save the current context */
00397    if ((!AST_LIST_EMPTY(&traced->trace) && strcasecmp(AST_LIST_FIRST(&traced->trace)->context, chan->context)) || 
00398        (AST_LIST_EMPTY(&traced->trace))) {
00399       /* Just do some debug logging */
00400       if (AST_LIST_EMPTY(&traced->trace))
00401          ast_log(LOG_DEBUG, "Setting initial trace context to %s\n", chan->context);
00402       else
00403          ast_log(LOG_DEBUG, "Changing trace context from %s to %s\n", AST_LIST_FIRST(&traced->trace)->context, chan->context);
00404       /* alloc or bail out */
00405       trace = ast_malloc(sizeof(*trace));
00406       if (!trace) 
00407          return -1;
00408       /* save the current location and store it in the trace list */
00409       ast_copy_string(trace->context, chan->context, sizeof(trace->context));
00410       ast_copy_string(trace->exten, chan->exten, sizeof(trace->exten));
00411       trace->priority = chan->priority;
00412       AST_LIST_INSERT_HEAD(&traced->trace, trace, entry);
00413    }
00414    return 0;
00415 }
00416 
00417 /*! \brief Update the context backtrace if tracing is enabled */
00418 int ast_channel_trace_update(struct ast_channel *chan)
00419 {
00420    struct ast_datastore *store = ast_channel_datastore_find(chan, &ast_chan_trace_datastore_info, NULL);
00421    if (!store)
00422       return 0;
00423    return ast_channel_trace_data_update(chan, store->data);
00424 }
00425 
00426 /*! \brief Enable context tracing in the channel */
00427 int ast_channel_trace_enable(struct ast_channel *chan)
00428 {
00429    struct ast_datastore *store = ast_channel_datastore_find(chan, &ast_chan_trace_datastore_info, NULL);
00430    struct ast_chan_trace_data *traced;
00431    if (!store) {
00432       store = ast_datastore_alloc(&ast_chan_trace_datastore_info, "ChanTrace");
00433       if (!store) 
00434          return -1;
00435       traced = ast_calloc(1, sizeof(*traced));
00436       if (!traced) {
00437          ast_datastore_free(store);
00438          return -1;
00439       }  
00440       store->data = traced;
00441       AST_LIST_HEAD_INIT_NOLOCK(&traced->trace);
00442       ast_channel_datastore_add(chan, store);
00443    }  
00444    ((struct ast_chan_trace_data *)store->data)->enabled = 1;
00445    ast_channel_trace_data_update(chan, store->data);
00446    return 0;
00447 }
00448 
00449 /*! \brief Disable context tracing in the channel */
00450 int ast_channel_trace_disable(struct ast_channel *chan)
00451 {
00452    struct ast_datastore *store = ast_channel_datastore_find(chan, &ast_chan_trace_datastore_info, NULL);
00453    if (!store)
00454       return 0;
00455    ((struct ast_chan_trace_data *)store->data)->enabled = 0;
00456    return 0;
00457 }
00458 #endif /* CHANNEL_TRACE */
00459 
00460 /*! \brief Checks to see if a channel is needing hang up */
00461 int ast_check_hangup(struct ast_channel *chan)
00462 {
00463    if (chan->_softhangup)     /* yes if soft hangup flag set */
00464       return 1;
00465    if (ast_tvzero(chan->whentohangup)) /* no if no hangup scheduled */
00466       return 0;
00467    if (ast_tvdiff_ms(chan->whentohangup, ast_tvnow()) > 0)  /* no if hangup time has not come yet. */
00468       return 0;
00469    chan->_softhangup |= AST_SOFTHANGUP_TIMEOUT; /* record event */
00470    return 1;
00471 }
00472 
00473 static int ast_check_hangup_locked(struct ast_channel *chan)
00474 {
00475    int res;
00476    ast_channel_lock(chan);
00477    res = ast_check_hangup(chan);
00478    ast_channel_unlock(chan);
00479    return res;
00480 }
00481 
00482 /*! \brief Initiate system shutdown */
00483 void ast_begin_shutdown(int hangup)
00484 {
00485    struct ast_channel *c;
00486    shutting_down = 1;
00487    if (hangup) {
00488       AST_RWLIST_RDLOCK(&channels);
00489       AST_RWLIST_TRAVERSE(&channels, c, chan_list) {
00490          ast_softhangup(c, AST_SOFTHANGUP_SHUTDOWN);
00491       }
00492       AST_RWLIST_UNLOCK(&channels);
00493    }
00494 }
00495 
00496 /*! \brief returns number of active/allocated channels */
00497 int ast_active_channels(void)
00498 {
00499    struct ast_channel *c;
00500    int cnt = 0;
00501    AST_RWLIST_RDLOCK(&channels);
00502    AST_RWLIST_TRAVERSE(&channels, c, chan_list)
00503       cnt++;
00504    AST_RWLIST_UNLOCK(&channels);
00505    return cnt;
00506 }
00507 
00508 /*! \brief Cancel a shutdown in progress */
00509 void ast_cancel_shutdown(void)
00510 {
00511    shutting_down = 0;
00512 }
00513 
00514 /*! \brief Returns non-zero if Asterisk is being shut down */
00515 int ast_shutting_down(void)
00516 {
00517    return shutting_down;
00518 }
00519 
00520 /*! \brief Set when to hangup channel */
00521 void ast_channel_setwhentohangup_tv(struct ast_channel *chan, struct timeval offset)
00522 {
00523    chan->whentohangup = ast_tvzero(offset) ? offset : ast_tvadd(offset, ast_tvnow());
00524    ast_queue_frame(chan, &ast_null_frame);
00525    return;
00526 }
00527 
00528 void ast_channel_setwhentohangup(struct ast_channel *chan, time_t offset)
00529 {
00530    struct timeval when = { offset, };
00531    ast_channel_setwhentohangup_tv(chan, when);
00532 }
00533 
00534 /*! \brief Compare a offset with when to hangup channel */
00535 int ast_channel_cmpwhentohangup_tv(struct ast_channel *chan, struct timeval offset)
00536 {
00537    struct timeval whentohangup;
00538 
00539    if (ast_tvzero(chan->whentohangup))
00540       return ast_tvzero(offset) ? 0 : -1;
00541 
00542    if (ast_tvzero(offset))
00543       return 1;
00544 
00545    whentohangup = ast_tvadd(offset, ast_tvnow());
00546 
00547    return ast_tvdiff_ms(whentohangup, chan->whentohangup);
00548 }
00549 
00550 int ast_channel_cmpwhentohangup(struct ast_channel *chan, time_t offset)
00551 {
00552    struct timeval when = { offset, };
00553    return ast_channel_cmpwhentohangup_tv(chan, when);
00554 }
00555 
00556 /*! \brief Register a new telephony channel in Asterisk */
00557 int ast_channel_register(const struct ast_channel_tech *tech)
00558 {
00559    struct chanlist *chan;
00560 
00561    AST_RWLIST_WRLOCK(&channels);
00562 
00563    AST_LIST_TRAVERSE(&backends, chan, list) {
00564       if (!strcasecmp(tech->type, chan->tech->type)) {
00565          ast_log(LOG_WARNING, "Already have a handler for type '%s'\n", tech->type);
00566          AST_RWLIST_UNLOCK(&channels);
00567          return -1;
00568       }
00569    }
00570    
00571    if (!(chan = ast_calloc(1, sizeof(*chan)))) {
00572       AST_RWLIST_UNLOCK(&channels);
00573       return -1;
00574    }
00575    chan->tech = tech;
00576    AST_LIST_INSERT_HEAD(&backends, chan, list);
00577 
00578    ast_debug(1, "Registered handler for '%s' (%s)\n", chan->tech->type, chan->tech->description);
00579 
00580    ast_verb(2, "Registered channel type '%s' (%s)\n", chan->tech->type, chan->tech->description);
00581 
00582    AST_RWLIST_UNLOCK(&channels);
00583    return 0;
00584 }
00585 
00586 /*! \brief Unregister channel driver */
00587 void ast_channel_unregister(const struct ast_channel_tech *tech)
00588 {
00589    struct chanlist *chan;
00590 
00591    ast_debug(1, "Unregistering channel type '%s'\n", tech->type);
00592 
00593    AST_RWLIST_WRLOCK(&channels);
00594 
00595    AST_LIST_TRAVERSE_SAFE_BEGIN(&backends, chan, list) {
00596       if (chan->tech == tech) {
00597          AST_LIST_REMOVE_CURRENT(list);
00598          ast_free(chan);
00599          ast_verb(2, "Unregistered channel type '%s'\n", tech->type);
00600          break;   
00601       }
00602    }
00603    AST_LIST_TRAVERSE_SAFE_END;
00604 
00605    AST_RWLIST_UNLOCK(&channels);
00606 }
00607 
00608 /*! \brief Get handle to channel driver based on name */
00609 const struct ast_channel_tech *ast_get_channel_tech(const char *name)
00610 {
00611    struct chanlist *chanls;
00612    const struct ast_channel_tech *ret = NULL;
00613 
00614    AST_RWLIST_RDLOCK(&channels);
00615 
00616    AST_LIST_TRAVERSE(&backends, chanls, list) {
00617       if (!strcasecmp(name, chanls->tech->type)) {
00618          ret = chanls->tech;
00619          break;
00620       }
00621    }
00622 
00623    AST_RWLIST_UNLOCK(&channels);
00624    
00625    return ret;
00626 }
00627 
00628 /*! \brief Gives the string form of a given hangup cause */
00629 const char *ast_cause2str(int cause)
00630 {
00631    int x;
00632 
00633    for (x = 0; x < ARRAY_LEN(causes); x++) {
00634       if (causes[x].cause == cause)
00635          return causes[x].desc;
00636    }
00637 
00638    return "Unknown";
00639 }
00640 
00641 /*! \brief Convert a symbolic hangup cause to number */
00642 int ast_str2cause(const char *name)
00643 {
00644    int x;
00645 
00646    for (x = 0; x < ARRAY_LEN(causes); x++)
00647       if (!strncasecmp(causes[x].name, name, strlen(causes[x].name)))
00648          return causes[x].cause;
00649 
00650    return -1;
00651 }
00652 
00653 /*! \brief Gives the string form of a given channel state.
00654    \note This function is not reentrant.
00655  */
00656 const char *ast_state2str(enum ast_channel_state state)
00657 {
00658    char *buf;
00659 
00660    switch (state) {
00661    case AST_STATE_DOWN:
00662       return "Down";
00663    case AST_STATE_RESERVED:
00664       return "Rsrvd";
00665    case AST_STATE_OFFHOOK:
00666       return "OffHook";
00667    case AST_STATE_DIALING:
00668       return "Dialing";
00669    case AST_STATE_RING:
00670       return "Ring";
00671    case AST_STATE_RINGING:
00672       return "Ringing";
00673    case AST_STATE_UP:
00674       return "Up";
00675    case AST_STATE_BUSY:
00676       return "Busy";
00677    case AST_STATE_DIALING_OFFHOOK:
00678       return "Dialing Offhook";
00679    case AST_STATE_PRERING:
00680       return "Pre-ring";
00681    default:
00682       if (!(buf = ast_threadstorage_get(&state2str_threadbuf, STATE2STR_BUFSIZE)))
00683          return "Unknown";
00684       snprintf(buf, STATE2STR_BUFSIZE, "Unknown (%d)", state);
00685       return buf;
00686    }
00687 }
00688 
00689 /*! \brief Gives the string form of a given transfer capability */
00690 char *ast_transfercapability2str(int transfercapability)
00691 {
00692    switch (transfercapability) {
00693    case AST_TRANS_CAP_SPEECH:
00694       return "SPEECH";
00695    case AST_TRANS_CAP_DIGITAL:
00696       return "DIGITAL";
00697    case AST_TRANS_CAP_RESTRICTED_DIGITAL:
00698       return "RESTRICTED_DIGITAL";
00699    case AST_TRANS_CAP_3_1K_AUDIO:
00700       return "3K1AUDIO";
00701    case AST_TRANS_CAP_DIGITAL_W_TONES:
00702       return "DIGITAL_W_TONES";
00703    case AST_TRANS_CAP_VIDEO:
00704       return "VIDEO";
00705    default:
00706       return "UNKNOWN";
00707    }
00708 }
00709 
00710 /*! \brief Pick the best audio codec */
00711 int ast_best_codec(int fmts)
00712 {
00713    /* This just our opinion, expressed in code.  We are asked to choose
00714       the best codec to use, given no information */
00715    int x;
00716    static const int prefs[] =
00717    {
00718       /*! Okay, ulaw is used by all telephony equipment, so start with it */
00719       AST_FORMAT_ULAW,
00720       /*! Unless of course, you're a silly European, so then prefer ALAW */
00721       AST_FORMAT_ALAW,
00722       AST_FORMAT_SIREN14,
00723       AST_FORMAT_SIREN7,
00724       /*! G.722 is better then all below, but not as common as the above... so give ulaw and alaw priority */
00725       AST_FORMAT_G722,
00726       /*! Okay, well, signed linear is easy to translate into other stuff */
00727       AST_FORMAT_SLINEAR16,
00728       AST_FORMAT_SLINEAR,
00729       /*! G.726 is standard ADPCM, in RFC3551 packing order */
00730       AST_FORMAT_G726,
00731       /*! G.726 is standard ADPCM, in AAL2 packing order */
00732       AST_FORMAT_G726_AAL2,
00733       /*! ADPCM has great sound quality and is still pretty easy to translate */
00734       AST_FORMAT_ADPCM,
00735       /*! Okay, we're down to vocoders now, so pick GSM because it's small and easier to
00736           translate and sounds pretty good */
00737       AST_FORMAT_GSM,
00738       /*! iLBC is not too bad */
00739       AST_FORMAT_ILBC,
00740       /*! Speex is free, but computationally more expensive than GSM */
00741       AST_FORMAT_SPEEX,
00742       /*! Ick, LPC10 sounds terrible, but at least we have code for it, if you're tacky enough
00743           to use it */
00744       AST_FORMAT_LPC10,
00745       /*! G.729a is faster than 723 and slightly less expensive */
00746       AST_FORMAT_G729A,
00747       /*! Down to G.723.1 which is proprietary but at least designed for voice */
00748       AST_FORMAT_G723_1,
00749    };
00750 
00751    /* Strip out video */
00752    fmts &= AST_FORMAT_AUDIO_MASK;
00753    
00754    /* Find the first preferred codec in the format given */
00755    for (x = 0; x < ARRAY_LEN(prefs); x++) {
00756       if (fmts & prefs[x])
00757          return prefs[x];
00758    }
00759 
00760    ast_log(LOG_WARNING, "Don't know any of 0x%x formats\n", fmts);
00761 
00762    return 0;
00763 }
00764 
00765 static const struct ast_channel_tech null_tech = {
00766    .type = "NULL",
00767    .description = "Null channel (should not see this)",
00768 };
00769 
00770 /*! \brief Create a new channel structure */
00771 static struct ast_channel * attribute_malloc __attribute__((format(printf, 12, 0)))
00772 __ast_channel_alloc_ap(int needqueue, int state, const char *cid_num, const char *cid_name,
00773              const char *acctcode, const char *exten, const char *context,
00774              const int amaflag, const char *file, int line, const char *function,
00775              const char *name_fmt, va_list ap1, va_list ap2)
00776 {
00777    struct ast_channel *tmp;
00778    int x;
00779    int flags;
00780    struct varshead *headp;
00781    char *tech = "";
00782 
00783    /* If shutting down, don't allocate any new channels */
00784    if (shutting_down) {
00785       ast_log(LOG_WARNING, "Channel allocation failed: Refusing due to active shutdown\n");
00786       return NULL;
00787    }
00788 
00789 #if defined(__AST_DEBUG_MALLOC)
00790    if (!(tmp = __ast_calloc(1, sizeof(*tmp), file, line, function))) {
00791       return NULL;
00792    }
00793 #else
00794    if (!(tmp = ast_calloc(1, sizeof(*tmp)))) {
00795       return NULL;
00796    }
00797 #endif
00798 
00799    if (!(tmp->sched = sched_context_create())) {
00800       ast_log(LOG_WARNING, "Channel allocation failed: Unable to create schedule context\n");
00801       ast_free(tmp);
00802       return NULL;
00803    }
00804    
00805    if ((ast_string_field_init(tmp, 128))) {
00806       sched_context_destroy(tmp->sched);
00807       ast_free(tmp);
00808       return NULL;
00809    }
00810 
00811 #ifdef HAVE_EPOLL
00812    tmp->epfd = epoll_create(25);
00813 #endif
00814 
00815    for (x = 0; x < AST_MAX_FDS; x++) {
00816       tmp->fds[x] = -1;
00817 #ifdef HAVE_EPOLL
00818       tmp->epfd_data[x] = NULL;
00819 #endif
00820    }
00821 
00822    if ((tmp->timer = ast_timer_open())) {
00823       needqueue = 0;
00824       tmp->timingfd = ast_timer_fd(tmp->timer);
00825    } else {
00826       tmp->timingfd = -1;
00827    }
00828 
00829    if (needqueue) {
00830       if (pipe(tmp->alertpipe)) {
00831          ast_log(LOG_WARNING, "Channel allocation failed: Can't create alert pipe! Try increasing max file descriptors with ulimit -n\n");
00832 alertpipe_failed:
00833          if (tmp->timer) {
00834             ast_timer_close(tmp->timer);
00835          }
00836 
00837          sched_context_destroy(tmp->sched);
00838          ast_string_field_free_memory(tmp);
00839          ast_free(tmp);
00840          return NULL;
00841       } else {
00842          flags = fcntl(tmp->alertpipe[0], F_GETFL);
00843          if (fcntl(tmp->alertpipe[0], F_SETFL, flags | O_NONBLOCK) < 0) {
00844             ast_log(LOG_WARNING, "Channel allocation failed: Unable to set alertpipe nonblocking! (%d: %s)\n", errno, strerror(errno));
00845             close(tmp->alertpipe[0]);
00846             close(tmp->alertpipe[1]);
00847             goto alertpipe_failed;
00848          }
00849          flags = fcntl(tmp->alertpipe[1], F_GETFL);
00850          if (fcntl(tmp->alertpipe[1], F_SETFL, flags | O_NONBLOCK) < 0) {
00851             ast_log(LOG_WARNING, "Channel allocation failed: Unable to set alertpipe nonblocking! (%d: %s)\n", errno, strerror(errno));
00852             close(tmp->alertpipe[0]);
00853             close(tmp->alertpipe[1]);
00854             goto alertpipe_failed;
00855          }
00856       }
00857    } else   /* Make sure we've got it done right if they don't */
00858       tmp->alertpipe[0] = tmp->alertpipe[1] = -1;
00859 
00860    /* Always watch the alertpipe */
00861    ast_channel_set_fd(tmp, AST_ALERT_FD, tmp->alertpipe[0]);
00862    /* And timing pipe */
00863    ast_channel_set_fd(tmp, AST_TIMING_FD, tmp->timingfd);
00864    ast_string_field_set(tmp, name, "**Unknown**");
00865 
00866    /* Initial state */
00867    tmp->_state = state;
00868 
00869    tmp->streamid = -1;
00870    
00871    tmp->fin = global_fin;
00872    tmp->fout = global_fout;
00873 
00874    if (ast_strlen_zero(ast_config_AST_SYSTEM_NAME)) {
00875       ast_string_field_build(tmp, uniqueid, "%li.%d", (long) time(NULL), 
00876                    ast_atomic_fetchadd_int(&uniqueint, 1));
00877    } else {
00878       ast_string_field_build(tmp, uniqueid, "%s-%li.%d", ast_config_AST_SYSTEM_NAME, 
00879                    (long) time(NULL), ast_atomic_fetchadd_int(&uniqueint, 1));
00880    }
00881 
00882    tmp->cid.cid_name = ast_strdup(cid_name);
00883    tmp->cid.cid_num = ast_strdup(cid_num);
00884    
00885    if (!ast_strlen_zero(name_fmt)) {
00886       char *slash;
00887       /* Almost every channel is calling this function, and setting the name via the ast_string_field_build() call.
00888        * And they all use slightly different formats for their name string.
00889        * This means, to set the name here, we have to accept variable args, and call the string_field_build from here.
00890        * This means, that the stringfields must have a routine that takes the va_lists directly, and 
00891        * uses them to build the string, instead of forming the va_lists internally from the vararg ... list.
00892        * This new function was written so this can be accomplished.
00893        */
00894       ast_string_field_build_va(tmp, name, name_fmt, ap1, ap2);
00895       tech = ast_strdupa(tmp->name);
00896       if ((slash = strchr(tech, '/'))) {
00897          *slash = '\0';
00898       }
00899    }
00900 
00901    /* Reminder for the future: under what conditions do we NOT want to track cdrs on channels? */
00902 
00903    /* These 4 variables need to be set up for the cdr_init() to work right */
00904    if (amaflag)
00905       tmp->amaflags = amaflag;
00906    else
00907       tmp->amaflags = ast_default_amaflags;
00908    
00909    if (!ast_strlen_zero(acctcode))
00910       ast_string_field_set(tmp, accountcode, acctcode);
00911    else
00912       ast_string_field_set(tmp, accountcode, ast_default_accountcode);
00913       
00914    if (!ast_strlen_zero(context))
00915       ast_copy_string(tmp->context, context, sizeof(tmp->context));
00916    else
00917       strcpy(tmp->context, "default");
00918 
00919    if (!ast_strlen_zero(exten))
00920       ast_copy_string(tmp->exten, exten, sizeof(tmp->exten));
00921    else
00922       strcpy(tmp->exten, "s");
00923 
00924    tmp->priority = 1;
00925       
00926    tmp->cdr = ast_cdr_alloc();
00927    ast_cdr_init(tmp->cdr, tmp);
00928    ast_cdr_start(tmp->cdr);
00929    
00930    headp = &tmp->varshead;
00931    AST_LIST_HEAD_INIT_NOLOCK(headp);
00932    
00933    ast_mutex_init(&tmp->lock_dont_use);
00934    
00935    AST_LIST_HEAD_INIT_NOLOCK(&tmp->datastores);
00936    
00937    ast_string_field_set(tmp, language, defaultlanguage);
00938 
00939    tmp->tech = &null_tech;
00940 
00941    ast_set_flag(tmp, AST_FLAG_IN_CHANNEL_LIST);
00942 
00943    AST_RWLIST_WRLOCK(&channels);
00944    AST_RWLIST_INSERT_HEAD(&channels, tmp, chan_list);
00945    AST_RWLIST_UNLOCK(&channels);
00946 
00947    /*\!note
00948     * and now, since the channel structure is built, and has its name, let's
00949     * call the manager event generator with this Newchannel event. This is the
00950     * proper and correct place to make this call, but you sure do have to pass
00951     * a lot of data into this func to do it here!
00952     */
00953    if (ast_get_channel_tech(tech)) {
00954       manager_event(EVENT_FLAG_CALL, "Newchannel",
00955          "Channel: %s\r\n"
00956          "ChannelState: %d\r\n"
00957          "ChannelStateDesc: %s\r\n"
00958          "CallerIDNum: %s\r\n"
00959          "CallerIDName: %s\r\n"
00960          "AccountCode: %s\r\n"
00961          "Exten: %s\r\n"
00962          "Context: %s\r\n"
00963          "Uniqueid: %s\r\n",
00964          tmp->name, 
00965          state, 
00966          ast_state2str(state),
00967          S_OR(cid_num, ""),
00968          S_OR(cid_name, ""),
00969          tmp->accountcode,
00970          S_OR(exten, ""),
00971          S_OR(context, ""),
00972          tmp->uniqueid);
00973    }
00974 
00975    return tmp;
00976 }
00977 
00978 struct ast_channel *__ast_channel_alloc(int needqueue, int state, const char *cid_num,
00979                const char *cid_name, const char *acctcode,
00980                const char *exten, const char *context,
00981                const int amaflag, const char *file, int line,
00982                const char *function, const char *name_fmt, ...)
00983 {
00984    va_list ap1, ap2;
00985    struct ast_channel *result;
00986 
00987    va_start(ap1, name_fmt);
00988    va_start(ap2, name_fmt);
00989    result = __ast_channel_alloc_ap(needqueue, state, cid_num, cid_name, acctcode, exten, context,
00990                amaflag, file, line, function, name_fmt, ap1, ap2);
00991    va_end(ap1);
00992    va_end(ap2);
00993 
00994    return result;
00995 }
00996 
00997 static int __ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin, int head, struct ast_frame *after)
00998 {
00999    struct ast_frame *f;
01000    struct ast_frame *cur;
01001    int blah = 1;
01002    unsigned int new_frames = 0;
01003    unsigned int new_voice_frames = 0;
01004    unsigned int queued_frames = 0;
01005    unsigned int queued_voice_frames = 0;
01006    AST_LIST_HEAD_NOLOCK(, ast_frame) frames;
01007 
01008    ast_channel_lock(chan);
01009 
01010    /* See if the last frame on the queue is a hangup, if so don't queue anything */
01011    if ((cur = AST_LIST_LAST(&chan->readq)) &&
01012        (cur->frametype == AST_FRAME_CONTROL) &&
01013        (cur->subclass == AST_CONTROL_HANGUP)) {
01014       ast_channel_unlock(chan);
01015       return 0;
01016    }
01017 
01018    /* Build copies of all the frames and count them */
01019    AST_LIST_HEAD_INIT_NOLOCK(&frames);
01020    for (cur = fin; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
01021       if (!(f = ast_frdup(cur))) {
01022          ast_frfree(AST_LIST_FIRST(&frames));
01023          ast_channel_unlock(chan);
01024          return -1;
01025       }
01026 
01027       AST_LIST_INSERT_TAIL(&frames, f, frame_list);
01028       new_frames++;
01029       if (f->frametype == AST_FRAME_VOICE) {
01030          new_voice_frames++;
01031       }
01032    }
01033 
01034    /* Count how many frames exist on the queue */
01035    AST_LIST_TRAVERSE(&chan->readq, cur, frame_list) {
01036       queued_frames++;
01037       if (cur->frametype == AST_FRAME_VOICE) {
01038          queued_voice_frames++;
01039       }
01040    }
01041 
01042    if ((queued_frames + new_frames > 128 || queued_voice_frames + new_voice_frames > 96)) {
01043       int count = 0;
01044       ast_log(LOG_WARNING, "Exceptionally long %squeue length queuing to %s\n", queued_frames + new_frames > 128 ? "" : "voice ", chan->name);
01045       AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->readq, cur, frame_list) {
01046          /* Save the most recent frame */
01047          if (!AST_LIST_NEXT(cur, frame_list)) {
01048             break;
01049          } else if (cur->frametype == AST_FRAME_VOICE || cur->frametype == AST_FRAME_VIDEO || cur->frametype == AST_FRAME_NULL) {
01050             if (++count > 64) {
01051                break;
01052             }
01053             AST_LIST_REMOVE_CURRENT(frame_list);
01054             ast_frfree(cur);
01055          }
01056       }
01057       AST_LIST_TRAVERSE_SAFE_END;
01058    }
01059 
01060    if (after) {
01061       AST_LIST_INSERT_LIST_AFTER(&chan->readq, &frames, after, frame_list);
01062    } else {
01063       if (head) {
01064          AST_LIST_APPEND_LIST(&frames, &chan->readq, frame_list);
01065          AST_LIST_HEAD_INIT_NOLOCK(&chan->readq);
01066       }
01067       AST_LIST_APPEND_LIST(&chan->readq, &frames, frame_list);
01068    }
01069 
01070    if (chan->alertpipe[1] > -1) {
01071       if (write(chan->alertpipe[1], &blah, new_frames * sizeof(blah)) != (new_frames * sizeof(blah))) {
01072          ast_log(LOG_WARNING, "Unable to write to alert pipe on %s (qlen = %d): %s!\n",
01073             chan->name, queued_frames, strerror(errno));
01074       }
01075    } else if (chan->timingfd > -1) {
01076       ast_timer_enable_continuous(chan->timer);
01077    } else if (ast_test_flag(chan, AST_FLAG_BLOCKING)) {
01078       pthread_kill(chan->blocker, SIGURG);
01079    }
01080 
01081    ast_channel_unlock(chan);
01082 
01083    return 0;
01084 }
01085 
01086 int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
01087 {
01088    return __ast_queue_frame(chan, fin, 0, NULL);
01089 }
01090 
01091 int ast_queue_frame_head(struct ast_channel *chan, struct ast_frame *fin)
01092 {
01093    return __ast_queue_frame(chan, fin, 1, NULL);
01094 }
01095 
01096 /*! \brief Queue a hangup frame for channel */
01097 int ast_queue_hangup(struct ast_channel *chan)
01098 {
01099    struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_HANGUP };
01100    /* Yeah, let's not change a lock-critical value without locking */
01101    if (!ast_channel_trylock(chan)) {
01102       chan->_softhangup |= AST_SOFTHANGUP_DEV;
01103       ast_channel_unlock(chan);
01104    }
01105    return ast_queue_frame(chan, &f);
01106 }
01107 
01108 /*! \brief Queue a hangup frame for channel */
01109 int ast_queue_hangup_with_cause(struct ast_channel *chan, int cause)
01110 {
01111    struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_HANGUP };
01112 
01113    if (cause >= 0)
01114       f.data.uint32 = cause;
01115 
01116    /* Yeah, let's not change a lock-critical value without locking */
01117    if (!ast_channel_trylock(chan)) {
01118       chan->_softhangup |= AST_SOFTHANGUP_DEV;
01119       if (cause < 0)
01120          f.data.uint32 = chan->hangupcause;
01121 
01122       ast_channel_unlock(chan);
01123    }
01124 
01125    return ast_queue_frame(chan, &f);
01126 }
01127 
01128 /*! \brief Queue a control frame */
01129 int ast_queue_control(struct ast_channel *chan, enum ast_control_frame_type control)
01130 {
01131    struct ast_frame f = { AST_FRAME_CONTROL, };
01132 
01133    f.subclass = control;
01134 
01135    return ast_queue_frame(chan, &f);
01136 }
01137 
01138 /*! \brief Queue a control frame with payload */
01139 int ast_queue_control_data(struct ast_channel *chan, enum ast_control_frame_type control,
01140             const void *data, size_t datalen)
01141 {
01142    struct ast_frame f = { AST_FRAME_CONTROL, };
01143 
01144    f.subclass = control;
01145    f.data.ptr = (void *) data;
01146    f.datalen = datalen;
01147 
01148    return ast_queue_frame(chan, &f);
01149 }
01150 
01151 /*! \brief Set defer DTMF flag on channel */
01152 int ast_channel_defer_dtmf(struct ast_channel *chan)
01153 {
01154    int pre = 0;
01155 
01156    if (chan) {
01157       pre = ast_test_flag(chan, AST_FLAG_DEFER_DTMF);
01158       ast_set_flag(chan, AST_FLAG_DEFER_DTMF);
01159    }
01160    return pre;
01161 }
01162 
01163 /*! \brief Unset defer DTMF flag on channel */
01164 void ast_channel_undefer_dtmf(struct ast_channel *chan)
01165 {
01166    if (chan)
01167       ast_clear_flag(chan, AST_FLAG_DEFER_DTMF);
01168 }
01169 
01170 /*!
01171  * \brief Helper function to find channels.
01172  *
01173  * It supports these modes:
01174  *
01175  * prev != NULL : get channel next in list after prev
01176  * name != NULL : get channel with matching name
01177  * name != NULL && namelen != 0 : get channel whose name starts with prefix
01178  * exten != NULL : get channel whose exten or macroexten matches
01179  * context != NULL && exten != NULL : get channel whose context or macrocontext
01180  *
01181  * It returns with the channel's lock held. If getting the individual lock fails,
01182  * unlock and retry quickly up to 10 times, then give up.
01183  *
01184  * \note XXX Note that this code has cost O(N) because of the need to verify
01185  * that the object is still on the global list.
01186  *
01187  * \note XXX also note that accessing fields (e.g. c->name in ast_log())
01188  * can only be done with the lock held or someone could delete the
01189  * object while we work on it. This causes some ugliness in the code.
01190  * Note that removing the first ast_log() may be harmful, as it would
01191  * shorten the retry period and possibly cause failures.
01192  * We should definitely go for a better scheme that is deadlock-free.
01193  */
01194 static struct ast_channel *channel_find_locked(const struct ast_channel *prev,
01195                       const char *name, const int namelen,
01196                       const char *context, const char *exten)
01197 {
01198    const char *msg = prev ? "deadlock" : "initial deadlock";
01199    int retries;
01200    struct ast_channel *c;
01201    const struct ast_channel *_prev = prev;
01202 
01203    for (retries = 0; retries < 200; retries++) {
01204       int done;
01205       /* Reset prev on each retry.  See note below for the reason. */
01206       prev = _prev;
01207       AST_RWLIST_RDLOCK(&channels);
01208       AST_RWLIST_TRAVERSE(&channels, c, chan_list) {
01209          if (prev) { /* look for last item, first, before any evaluation */
01210             if (c != prev) /* not this one */
01211                continue;
01212             /* found, prepare to return c->next */
01213             if ((c = AST_RWLIST_NEXT(c, chan_list)) == NULL) break;
01214             /*!\note
01215              * We're done searching through the list for the previous item.
01216              * Any item after this point, we want to evaluate for a match.
01217              * If we didn't set prev to NULL here, then we would only
01218              * return matches for the first matching item (since the above
01219              * "if (c != prev)" would not permit any other potential
01220              * matches to reach the additional matching logic, below).
01221              * Instead, it would just iterate until it once again found the
01222              * original match, then iterate down to the end of the list and
01223              * quit.
01224              */
01225             prev = NULL;
01226          }
01227          if (name) { /* want match by name */
01228             if ((!namelen && strcasecmp(c->name, name) && strcmp(c->uniqueid, name)) ||
01229                 (namelen && strncasecmp(c->name, name, namelen)))
01230                continue;   /* name match failed */
01231          } else if (exten) {
01232             if (context && strcasecmp(c->context, context) &&
01233                 strcasecmp(c->macrocontext, context))
01234                continue;   /* context match failed */
01235             if (strcasecmp(c->exten, exten) &&
01236                 strcasecmp(c->macroexten, exten))
01237                continue;   /* exten match failed */
01238          }
01239          /* if we get here, c points to the desired record */
01240          break;
01241       }
01242       /* exit if chan not found or mutex acquired successfully */
01243       /* this is slightly unsafe, as we _should_ hold the lock to access c->name */
01244       done = c == NULL || ast_channel_trylock(c) == 0;
01245       if (!done) {
01246          ast_debug(1, "Avoiding %s for channel '%p'\n", msg, c);
01247          if (retries == 199) {
01248             /* We are about to fail due to a deadlock, so report this
01249              * while we still have the list lock.
01250              */
01251             ast_debug(1, "Failure, could not lock '%p' after %d retries!\n", c, retries);
01252             /* As we have deadlocked, we will skip this channel and
01253              * see if there is another match.
01254              * NOTE: No point doing this for a full-name match,
01255              * as there can be no more matches.
01256              */
01257             if (!(name && !namelen)) {
01258                _prev = c;
01259                retries = -1;
01260             }
01261          }
01262       }
01263       AST_RWLIST_UNLOCK(&channels);
01264       if (done)
01265          return c;
01266       /* If we reach this point we basically tried to lock a channel and failed. Instead of
01267        * starting from the beginning of the list we can restore our saved pointer to the previous
01268        * channel and start from there.
01269        */
01270       prev = _prev;
01271       usleep(1);  /* give other threads a chance before retrying */
01272    }
01273 
01274    return NULL;
01275 }
01276 
01277 /*! \brief Browse channels in use */
01278 struct ast_channel *ast_channel_walk_locked(const struct ast_channel *prev)
01279 {
01280    return channel_find_locked(prev, NULL, 0, NULL, NULL);
01281 }
01282 
01283 /*! \brief Get channel by name and lock it */
01284 struct ast_channel *ast_get_channel_by_name_locked(const char *name)
01285 {
01286    return channel_find_locked(NULL, name, 0, NULL, NULL);
01287 }
01288 
01289 /*! \brief Get channel by name prefix and lock it */
01290 struct ast_channel *ast_get_channel_by_name_prefix_locked(const char *name, const int namelen)
01291 {
01292    return channel_find_locked(NULL, name, namelen, NULL, NULL);
01293 }
01294 
01295 /*! \brief Get next channel by name prefix and lock it */
01296 struct ast_channel *ast_walk_channel_by_name_prefix_locked(const struct ast_channel *chan, const char *name,
01297                         const int namelen)
01298 {
01299    return channel_find_locked(chan, name, namelen, NULL, NULL);
01300 }
01301 
01302 /*! \brief Get channel by exten (and optionally context) and lock it */
01303 struct ast_channel *ast_get_channel_by_exten_locked(const char *exten, const char *context)
01304 {
01305    return channel_find_locked(NULL, NULL, 0, context, exten);
01306 }
01307 
01308 /*! \brief Get next channel by exten (and optionally context) and lock it */
01309 struct ast_channel *ast_walk_channel_by_exten_locked(const struct ast_channel *chan, const char *exten,
01310                        const char *context)
01311 {
01312    return channel_find_locked(chan, NULL, 0, context, exten);
01313 }
01314 
01315 /*! \brief Search for a channel based on the passed channel matching callback (first match) and return it, locked */
01316 struct ast_channel *ast_channel_search_locked(int (*is_match)(struct ast_channel *, void *), void *data)
01317 {
01318    struct ast_channel *c = NULL;
01319 
01320    AST_RWLIST_RDLOCK(&channels);
01321    AST_RWLIST_TRAVERSE(&channels, c, chan_list) {
01322       ast_channel_lock(c);
01323       if (is_match(c, data)) {
01324          break;
01325       }
01326       ast_channel_unlock(c);
01327    }
01328    AST_RWLIST_UNLOCK(&channels);
01329 
01330    return c;
01331 }
01332 
01333 int ast_is_deferrable_frame(const struct ast_frame *frame)
01334 {
01335    /* Do not add a default entry in this switch statement.  Each new
01336     * frame type should be addressed directly as to whether it should
01337     * be queued up or not.
01338     */
01339    switch (frame->frametype) {
01340    case AST_FRAME_DTMF_END:
01341    case AST_FRAME_CONTROL:
01342    case AST_FRAME_TEXT:
01343    case AST_FRAME_IMAGE:
01344    case AST_FRAME_HTML:
01345       return 1;
01346 
01347    case AST_FRAME_DTMF_BEGIN:
01348    case AST_FRAME_VOICE:
01349    case AST_FRAME_VIDEO:
01350    case AST_FRAME_NULL:
01351    case AST_FRAME_IAX:
01352    case AST_FRAME_CNG:
01353    case AST_FRAME_MODEM:
01354       return 0;
01355    }
01356    return 0;
01357 }
01358 
01359 /*! \brief Wait, look for hangups and condition arg */
01360 int ast_safe_sleep_conditional(struct ast_channel *chan, int ms, int (*cond)(void*), void *data)
01361 {
01362    struct ast_frame *f;
01363    struct ast_silence_generator *silgen = NULL;
01364    int res = 0;
01365    AST_LIST_HEAD_NOLOCK(, ast_frame) deferred_frames;
01366 
01367    AST_LIST_HEAD_INIT_NOLOCK(&deferred_frames);
01368 
01369    /* If no other generator is present, start silencegen while waiting */
01370    if (ast_opt_transmit_silence && !chan->generatordata) {
01371       silgen = ast_channel_start_silence_generator(chan);
01372    }
01373 
01374    while (ms > 0) {
01375       struct ast_frame *dup_f = NULL;
01376       if (cond && ((*cond)(data) == 0)) {
01377          break;
01378       }
01379       ms = ast_waitfor(chan, ms);
01380       if (ms < 0) {
01381          res = -1;
01382          break;
01383       }
01384       if (ms > 0) {
01385          f = ast_read(chan);
01386          if (!f) {
01387             res = -1;
01388             break;
01389          }
01390 
01391          if (!ast_is_deferrable_frame(f)) {
01392             ast_frfree(f);
01393             continue;
01394          }
01395          
01396          if ((dup_f = ast_frisolate(f))) {
01397             if (dup_f != f) {
01398                ast_frfree(f);
01399             }
01400             AST_LIST_INSERT_HEAD(&deferred_frames, dup_f, frame_list);
01401          }
01402       }
01403    }
01404 
01405    /* stop silgen if present */
01406    if (silgen) {
01407       ast_channel_stop_silence_generator(chan, silgen);
01408    }
01409 
01410    /* We need to free all the deferred frames, but we only need to
01411     * queue the deferred frames if there was no error and no
01412     * hangup was received
01413     */
01414    ast_channel_lock(chan);
01415    while ((f = AST_LIST_REMOVE_HEAD(&deferred_frames, frame_list))) {
01416       if (!res) {
01417          ast_queue_frame_head(chan, f);
01418       }
01419       ast_frfree(f);
01420    }
01421    ast_channel_unlock(chan);
01422 
01423    return res;
01424 }
01425 
01426 /*! \brief Wait, look for hangups */
01427 int ast_safe_sleep(struct ast_channel *chan, int ms)
01428 {
01429    return ast_safe_sleep_conditional(chan, ms, NULL, NULL);
01430 }
01431 
01432 static void free_cid(struct ast_callerid *cid)
01433 {
01434    if (cid->cid_dnid)
01435       ast_free(cid->cid_dnid);
01436    if (cid->cid_num)
01437       ast_free(cid->cid_num); 
01438    if (cid->cid_name)
01439       ast_free(cid->cid_name);   
01440    if (cid->cid_ani)
01441       ast_free(cid->cid_ani);
01442    if (cid->cid_rdnis)
01443       ast_free(cid->cid_rdnis);
01444    cid->cid_dnid = cid->cid_num = cid->cid_name = cid->cid_ani = cid->cid_rdnis = NULL;
01445 }
01446 
01447 /*! \brief Free a channel structure */
01448 void ast_channel_free(struct ast_channel *chan)
01449 {
01450    int fd;
01451 #ifdef HAVE_EPOLL
01452    int i;
01453 #endif
01454    struct ast_var_t *vardata;
01455    struct ast_frame *f;
01456    struct varshead *headp;
01457    struct ast_datastore *datastore = NULL;
01458    char name[AST_CHANNEL_NAME], *dashptr;
01459    int inlist;
01460    
01461    headp=&chan->varshead;
01462    
01463    inlist = ast_test_flag(chan, AST_FLAG_IN_CHANNEL_LIST);
01464    if (inlist) {
01465       AST_RWLIST_WRLOCK(&channels);
01466       if (!AST_RWLIST_REMOVE(&channels, chan, chan_list)) {
01467          ast_debug(1, "Unable to find channel in list to free. Assuming it has already been done.\n");
01468       }
01469       /* Lock and unlock the channel just to be sure nobody has it locked still
01470          due to a reference retrieved from the channel list. */
01471       ast_channel_lock(chan);
01472       ast_channel_unlock(chan);
01473    }
01474 
01475    /* Get rid of each of the data stores on the channel */
01476    ast_channel_lock(chan);
01477    while ((datastore = AST_LIST_REMOVE_HEAD(&chan->datastores, entry)))
01478       /* Free the data store */
01479       ast_datastore_free(datastore);
01480    ast_channel_unlock(chan);
01481 
01482    /* Lock and unlock the channel just to be sure nobody has it locked still
01483       due to a reference that was stored in a datastore. (i.e. app_chanspy) */
01484    ast_channel_lock(chan);
01485    ast_channel_unlock(chan);
01486 
01487    if (chan->tech_pvt) {
01488       ast_log(LOG_WARNING, "Channel '%s' may not have been hung up properly\n", chan->name);
01489       ast_free(chan->tech_pvt);
01490    }
01491 
01492    if (chan->sched)
01493       sched_context_destroy(chan->sched);
01494 
01495    ast_copy_string(name, chan->name, sizeof(name));
01496    if ((dashptr = strrchr(name, '-'))) {
01497       *dashptr = '\0';
01498    }
01499 
01500    /* Stop monitoring */
01501    if (chan->monitor)
01502       chan->monitor->stop( chan, 0 );
01503 
01504    /* If there is native format music-on-hold state, free it */
01505    if (chan->music_state)
01506       ast_moh_cleanup(chan);
01507 
01508    /* Free translators */
01509    if (chan->readtrans)
01510       ast_translator_free_path(chan->readtrans);
01511    if (chan->writetrans)
01512       ast_translator_free_path(chan->writetrans);
01513    if (chan->pbx)
01514       ast_log(LOG_WARNING, "PBX may not have been terminated properly on '%s'\n", chan->name);
01515    free_cid(&chan->cid);
01516    /* Close pipes if appropriate */
01517    if ((fd = chan->alertpipe[0]) > -1)
01518       close(fd);
01519    if ((fd = chan->alertpipe[1]) > -1)
01520       close(fd);
01521    if (chan->timer) {
01522       ast_timer_close(chan->timer);
01523    }
01524 #ifdef HAVE_EPOLL
01525    for (i = 0; i < AST_MAX_FDS; i++) {
01526       if (chan->epfd_data[i])
01527          free(chan->epfd_data[i]);
01528    }
01529    close(chan->epfd);
01530 #endif
01531    while ((f = AST_LIST_REMOVE_HEAD(&chan->readq, frame_list)))
01532       ast_frfree(f);
01533    
01534    /* loop over the variables list, freeing all data and deleting list items */
01535    /* no need to lock the list, as the channel is already locked */
01536    
01537    while ((vardata = AST_LIST_REMOVE_HEAD(headp, entries)))
01538       ast_var_delete(vardata);
01539 
01540    ast_app_group_discard(chan);
01541 
01542    /* Destroy the jitterbuffer */
01543    ast_jb_destroy(chan);
01544 
01545    if (chan->cdr) {
01546       ast_cdr_discard(chan->cdr);
01547       chan->cdr = NULL;
01548    }
01549 
01550    if (chan->zone) {
01551       chan->zone = ast_tone_zone_unref(chan->zone);
01552    }
01553 
01554    ast_mutex_destroy(&chan->lock_dont_use);
01555 
01556    ast_string_field_free_memory(chan);
01557    ast_free(chan);
01558    if (inlist)
01559       AST_RWLIST_UNLOCK(&channels);
01560 
01561    /* Queue an unknown state, because, while we know that this particular
01562     * instance is dead, we don't know the state of all other possible
01563     * instances. */
01564    ast_devstate_changed_literal(AST_DEVICE_UNKNOWN, name);
01565 }
01566 
01567 struct ast_datastore *ast_channel_datastore_alloc(const struct ast_datastore_info *info, const char *uid)
01568 {
01569    return ast_datastore_alloc(info, uid);
01570 }
01571 
01572 int ast_channel_datastore_free(struct ast_datastore *datastore)
01573 {
01574    return ast_datastore_free(datastore);
01575 }
01576 
01577 int ast_channel_datastore_inherit(struct ast_channel *from, struct ast_channel *to)
01578 {
01579    struct ast_datastore *datastore = NULL, *datastore2;
01580 
01581    AST_LIST_TRAVERSE(&from->datastores, datastore, entry) {
01582       if (datastore->inheritance > 0) {
01583          datastore2 = ast_datastore_alloc(datastore->info, datastore->uid);
01584          if (datastore2) {
01585             datastore2->data = datastore->info->duplicate ? datastore->info->duplicate(datastore->data) : NULL;
01586             datastore2->inheritance = datastore->inheritance == DATASTORE_INHERIT_FOREVER ? DATASTORE_INHERIT_FOREVER : datastore->inheritance - 1;
01587             AST_LIST_INSERT_TAIL(&to->datastores, datastore2, entry);
01588          }
01589       }
01590    }
01591    return 0;
01592 }
01593 
01594 int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
01595 {
01596    int res = 0;
01597 
01598    AST_LIST_INSERT_HEAD(&chan->datastores, datastore, entry);
01599 
01600    return res;
01601 }
01602 
01603 int ast_channel_datastore_remove(struct ast_channel *chan, struct ast_datastore *datastore)
01604 {
01605    return AST_LIST_REMOVE(&chan->datastores, datastore, entry) ? 0 : -1;
01606 }
01607 
01608 struct ast_datastore *ast_channel_datastore_find(struct ast_channel *chan, const struct ast_datastore_info *info, const char *uid)
01609 {
01610    struct ast_datastore *datastore = NULL;
01611    
01612    if (info == NULL)
01613       return NULL;
01614 
01615    AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore, entry) {
01616       if (datastore->info != info) {
01617          continue;
01618       }
01619 
01620       if (uid == NULL) {
01621          /* matched by type only */
01622          break;
01623       }
01624 
01625       if ((datastore->uid != NULL) && !strcasecmp(uid, datastore->uid)) {
01626          /* Matched by type AND uid */
01627          break;
01628       }
01629    }
01630    AST_LIST_TRAVERSE_SAFE_END;
01631 
01632    return datastore;
01633 }
01634 
01635 /*! Set the file descriptor on the channel */
01636 void ast_channel_set_fd(struct ast_channel *chan, int which, int fd)
01637 {
01638 #ifdef HAVE_EPOLL
01639    struct epoll_event ev;
01640    struct ast_epoll_data *aed = NULL;
01641 
01642    if (chan->fds[which] > -1) {
01643       epoll_ctl(chan->epfd, EPOLL_CTL_DEL, chan->fds[which], &ev);
01644       aed = chan->epfd_data[which];
01645    }
01646 
01647    /* If this new fd is valid, add it to the epoll */
01648    if (fd > -1) {
01649       if (!aed && (!(aed = ast_calloc(1, sizeof(*aed)))))
01650          return;
01651       
01652       chan->epfd_data[which] = aed;
01653       aed->chan = chan;
01654       aed->which = which;
01655       
01656       ev.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP;
01657       ev.data.ptr = aed;
01658       epoll_ctl(chan->epfd, EPOLL_CTL_ADD, fd, &ev);
01659    } else if (aed) {
01660       /* We don't have to keep around this epoll data structure now */
01661       free(aed);
01662       chan->epfd_data[which] = NULL;
01663    }
01664 #endif
01665    chan->fds[which] = fd;
01666    return;
01667 }
01668 
01669 /*! Add a channel to an optimized waitfor */
01670 void ast_poll_channel_add(struct ast_channel *chan0, struct ast_channel *chan1)
01671 {
01672 #ifdef HAVE_EPOLL
01673    struct epoll_event ev;
01674    int i = 0;
01675 
01676    if (chan0->epfd == -1)
01677       return;
01678 
01679    /* Iterate through the file descriptors on chan1, adding them to chan0 */
01680    for (i = 0; i < AST_MAX_FDS; i++) {
01681       if (chan1->fds[i] == -1)
01682          continue;
01683       ev.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP;
01684       ev.data.ptr = chan1->epfd_data[i];
01685       epoll_ctl(chan0->epfd, EPOLL_CTL_ADD, chan1->fds[i], &ev);
01686    }
01687 
01688 #endif
01689    return;
01690 }
01691 
01692 /*! Delete a channel from an optimized waitfor */
01693 void ast_poll_channel_del(struct ast_channel *chan0, struct ast_channel *chan1)
01694 {
01695 #ifdef HAVE_EPOLL
01696    struct epoll_event ev;
01697    int i = 0;
01698 
01699    if (chan0->epfd == -1)
01700       return;
01701 
01702    for (i = 0; i < AST_MAX_FDS; i++) {
01703       if (chan1->fds[i] == -1)
01704          continue;
01705       epoll_ctl(chan0->epfd, EPOLL_CTL_DEL, chan1->fds[i], &ev);
01706    }
01707 
01708 #endif
01709    return;
01710 }
01711 
01712 /*! \brief Softly hangup a channel, don't lock */
01713 int ast_softhangup_nolock(struct ast_channel *chan, int cause)
01714 {
01715    ast_debug(1, "Soft-Hanging up channel '%s'\n", chan->name);
01716    /* Inform channel driver that we need to be hung up, if it cares */
01717    chan->_softhangup |= cause;
01718    ast_queue_frame(chan, &ast_null_frame);
01719    /* Interrupt any poll call or such */
01720    if (ast_test_flag(chan, AST_FLAG_BLOCKING))
01721       pthread_kill(chan->blocker, SIGURG);
01722    return 0;
01723 }
01724 
01725 /*! \brief Softly hangup a channel, lock */
01726 int ast_softhangup(struct ast_channel *chan, int cause)
01727 {
01728    int res;
01729 
01730    ast_channel_lock(chan);
01731    res = ast_softhangup_nolock(chan, cause);
01732    ast_channel_unlock(chan);
01733 
01734    return res;
01735 }
01736 
01737 static void free_translation(struct ast_channel *clonechan)
01738 {
01739    if (clonechan->writetrans)
01740       ast_translator_free_path(clonechan->writetrans);
01741    if (clonechan->readtrans)
01742       ast_translator_free_path(clonechan->readtrans);
01743    clonechan->writetrans = NULL;
01744    clonechan->readtrans = NULL;
01745    clonechan->rawwriteformat = clonechan->nativeformats;
01746    clonechan->rawreadformat = clonechan->nativeformats;
01747 }
01748 
01749 /*! \brief Hangup a channel */
01750 int ast_hangup(struct ast_channel *chan)
01751 {
01752    int res = 0;
01753 
01754    /* Don't actually hang up a channel that will masquerade as someone else, or
01755       if someone is going to masquerade as us */
01756    ast_channel_lock(chan);
01757 
01758    if (chan->audiohooks) {
01759       ast_audiohook_detach_list(chan->audiohooks);
01760       chan->audiohooks = NULL;
01761    }
01762 
01763    ast_autoservice_stop(chan);
01764 
01765    if (chan->masq) {
01766       if (ast_do_masquerade(chan))
01767          ast_log(LOG_WARNING, "Failed to perform masquerade\n");
01768    }
01769 
01770    if (chan->masq) {
01771       ast_log(LOG_WARNING, "%s getting hung up, but someone is trying to masq into us?!?\n", chan->name);
01772       ast_channel_unlock(chan);
01773       return 0;
01774    }
01775    /* If this channel is one which will be masqueraded into something,
01776       mark it as a zombie already, so we know to free it later */
01777    if (chan->masqr) {
01778       ast_set_flag(chan, AST_FLAG_ZOMBIE);
01779       ast_channel_unlock(chan);
01780       return 0;
01781    }
01782    ast_channel_unlock(chan);
01783 
01784    AST_RWLIST_WRLOCK(&channels);
01785    if (!AST_RWLIST_REMOVE(&channels, chan, chan_list)) {
01786       ast_log(LOG_ERROR, "Unable to find channel in list to free. Assuming it has already been done.\n");
01787    }
01788    ast_clear_flag(chan, AST_FLAG_IN_CHANNEL_LIST);
01789    AST_RWLIST_UNLOCK(&channels);
01790 
01791    ast_channel_lock(chan);
01792    free_translation(chan);
01793    /* Close audio stream */
01794    if (chan->stream) {
01795       ast_closestream(chan->stream);
01796       chan->stream = NULL;
01797    }
01798    /* Close video stream */
01799    if (chan->vstream) {
01800       ast_closestream(chan->vstream);
01801       chan->vstream = NULL;
01802    }
01803    if (chan->sched) {
01804       sched_context_destroy(chan->sched);
01805       chan->sched = NULL;
01806    }
01807    
01808    if (chan->generatordata)   /* Clear any tone stuff remaining */
01809       if (chan->generator && chan->generator->release)
01810          chan->generator->release(chan, chan->generatordata);
01811    chan->generatordata = NULL;
01812    chan->generator = NULL;
01813    if (ast_test_flag(chan, AST_FLAG_BLOCKING)) {
01814       ast_log(LOG_WARNING, "Hard hangup called by thread %ld on %s, while fd "
01815                "is blocked by thread %ld in procedure %s!  Expect a failure\n",
01816                (long)pthread_self(), chan->name, (long)chan->blocker, chan->blockproc);
01817       ast_assert(ast_test_flag(chan, AST_FLAG_BLOCKING) == 0);
01818    }
01819    if (!ast_test_flag(chan, AST_FLAG_ZOMBIE)) {
01820       ast_debug(1, "Hanging up channel '%s'\n", chan->name);
01821       if (chan->tech->hangup)
01822          res = chan->tech->hangup(chan);
01823    } else {
01824       ast_debug(1, "Hanging up zombie '%s'\n", chan->name);
01825    }
01826          
01827    ast_channel_unlock(chan);
01828    manager_event(EVENT_FLAG_CALL, "Hangup",
01829          "Channel: %s\r\n"
01830          "Uniqueid: %s\r\n"
01831          "CallerIDNum: %s\r\n"
01832          "CallerIDName: %s\r\n"
01833          "Cause: %d\r\n"
01834          "Cause-txt: %s\r\n",
01835          chan->name,
01836          chan->uniqueid,
01837          S_OR(chan->cid.cid_num, "<unknown>"),
01838          S_OR(chan->cid.cid_name, "<unknown>"),
01839          chan->hangupcause,
01840          ast_cause2str(chan->hangupcause)
01841          );
01842 
01843    if (chan->cdr && !ast_test_flag(chan->cdr, AST_CDR_FLAG_BRIDGED) && 
01844       !ast_test_flag(chan->cdr, AST_CDR_FLAG_POST_DISABLED) && 
01845        (chan->cdr->disposition != AST_CDR_NULL || ast_test_flag(chan->cdr, AST_CDR_FLAG_DIALED))) {
01846       ast_channel_lock(chan);
01847          
01848       ast_cdr_end(chan->cdr);
01849       ast_cdr_detach(chan->cdr);
01850       chan->cdr = NULL;
01851       ast_channel_unlock(chan);
01852    }
01853    
01854    ast_channel_free(chan);
01855 
01856    return res;
01857 }
01858 
01859 int ast_raw_answer(struct ast_channel *chan, int cdr_answer)
01860 {
01861    int res = 0;
01862 
01863    ast_channel_lock(chan);
01864 
01865    /* You can't answer an outbound call */
01866    if (ast_test_flag(chan, AST_FLAG_OUTGOING)) {
01867       ast_channel_unlock(chan);
01868       return 0;
01869    }
01870 
01871    /* Stop if we're a zombie or need a soft hangup */
01872    if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
01873       ast_channel_unlock(chan);
01874       return -1;
01875    }
01876 
01877    ast_channel_unlock(chan);
01878 
01879    switch (chan->_state) {
01880    case AST_STATE_RINGING:
01881    case AST_STATE_RING:
01882       ast_channel_lock(chan);
01883       if (chan->tech->answer) {
01884          res = chan->tech->answer(chan);
01885       }
01886       ast_setstate(chan, AST_STATE_UP);
01887       if (cdr_answer) {
01888          ast_cdr_answer(chan->cdr);
01889       }
01890       ast_channel_unlock(chan);
01891       break;
01892    case AST_STATE_UP:
01893       /* Calling ast_cdr_answer when it it has previously been called
01894        * is essentially a no-op, so it is safe.
01895        */
01896       if (cdr_answer) {
01897          ast_cdr_answer(chan->cdr);
01898       }
01899       break;
01900    default:
01901       break;
01902    }
01903 
01904    ast_indicate(chan, -1);
01905    chan->visible_indication = 0;
01906 
01907    return res;
01908 }
01909 
01910 int __ast_answer(struct ast_channel *chan, unsigned int delay, int cdr_answer)
01911 {
01912    int res = 0;
01913    enum ast_channel_state old_state;
01914 
01915    old_state = chan->_state;
01916    if ((res = ast_raw_answer(chan, cdr_answer))) {
01917       return res;
01918    }
01919 
01920    switch (old_state) {
01921    case AST_STATE_RINGING:
01922    case AST_STATE_RING:
01923       /* wait for media to start flowing, but don't wait any longer
01924        * than 'delay' or 500 milliseconds, whichever is longer
01925        */
01926       do {
01927          AST_LIST_HEAD_NOLOCK(, ast_frame) frames;
01928          struct ast_frame *cur, *new;
01929          int ms = MAX(delay, 500);
01930          unsigned int done = 0;
01931 
01932          AST_LIST_HEAD_INIT_NOLOCK(&frames);
01933 
01934          for (;;) {
01935             ms = ast_waitfor(chan, ms);
01936             if (ms < 0) {
01937                ast_log(LOG_WARNING, "Error condition occurred when polling channel %s for a voice frame: %s\n", chan->name, strerror(errno));
01938                res = -1;
01939                break;
01940             }
01941             if (ms == 0) {
01942                ast_debug(2, "Didn't receive a media frame from %s within %d ms of answering. Continuing anyway\n", chan->name, MAX(delay, 500));
01943                break;
01944             }
01945             cur = ast_read(chan);
01946             if (!cur || ((cur->frametype == AST_FRAME_CONTROL) &&
01947                     (cur->subclass == AST_CONTROL_HANGUP))) {
01948                if (cur) {
01949                   ast_frfree(cur);
01950                }
01951                res = -1;
01952                ast_debug(2, "Hangup of channel %s detected in answer routine\n", chan->name);
01953                break;
01954             }
01955 
01956             if ((new = ast_frisolate(cur)) != cur) {
01957                ast_frfree(cur);
01958             }
01959 
01960             AST_LIST_INSERT_HEAD(&frames, new, frame_list);
01961 
01962             /* if a specific delay period was requested, continue
01963              * until that delay has passed. don't stop just because
01964              * incoming media has arrived.
01965              */
01966             if (delay) {
01967                continue;
01968             }
01969 
01970             switch (new->frametype) {
01971                /* all of these frametypes qualify as 'media' */
01972             case AST_FRAME_VOICE:
01973             case AST_FRAME_VIDEO:
01974             case AST_FRAME_TEXT:
01975             case AST_FRAME_DTMF_BEGIN:
01976             case AST_FRAME_DTMF_END:
01977             case AST_FRAME_IMAGE:
01978             case AST_FRAME_HTML:
01979             case AST_FRAME_MODEM:
01980                done = 1;
01981                break;
01982             case AST_FRAME_CONTROL:
01983             case AST_FRAME_IAX:
01984             case AST_FRAME_NULL:
01985             case AST_FRAME_CNG:
01986                break;
01987             }
01988 
01989             if (done) {
01990                break;
01991             }
01992          }
01993 
01994          if (res == 0) {
01995             ast_channel_lock(chan);
01996             while ((cur = AST_LIST_REMOVE_HEAD(&frames, frame_list))) {
01997                ast_queue_frame_head(chan, cur);
01998                ast_frfree(cur);
01999             }
02000             ast_channel_unlock(chan);
02001          }
02002       } while (0);
02003       break;
02004    default:
02005       break;
02006    }
02007 
02008    return res;
02009 }
02010 
02011 int ast_answer(struct ast_channel *chan)
02012 {
02013    return __ast_answer(chan, 0, 1);
02014 }
02015 
02016 void ast_deactivate_generator(struct ast_channel *chan)
02017 {
02018    ast_channel_lock(chan);
02019    if (chan->generatordata) {
02020       if (chan->generator && chan->generator->release)
02021          chan->generator->release(chan, chan->generatordata);
02022       chan->generatordata = NULL;
02023       chan->generator = NULL;
02024       ast_channel_set_fd(chan, AST_GENERATOR_FD, -1);
02025       ast_clear_flag(chan, AST_FLAG_WRITE_INT);
02026       ast_settimeout(chan, 0, NULL, NULL);
02027    }
02028    ast_channel_unlock(chan);
02029 }
02030 
02031 static int generator_force(const void *data)
02032 {
02033    /* Called if generator doesn't have data */
02034    void *tmp;
02035    int res;
02036    int (*generate)(struct ast_channel *chan, void *tmp, int datalen, int samples) = NULL;
02037    struct ast_channel *chan = (struct ast_channel *)data;
02038 
02039    ast_channel_lock(chan);
02040    tmp = chan->generatordata;
02041    chan->generatordata = NULL;
02042    if (chan->generator)
02043       generate = chan->generator->generate;
02044    ast_channel_unlock(chan);
02045 
02046    if (!tmp || !generate)
02047       return 0;
02048 
02049    res = generate(chan, tmp, 0, ast_format_rate(chan->writeformat & AST_FORMAT_AUDIO_MASK) / 50);
02050 
02051    chan->generatordata = tmp;
02052 
02053    if (res) {
02054       ast_debug(1, "Auto-deactivating generator\n");
02055       ast_deactivate_generator(chan);
02056    }
02057 
02058    return 0;
02059 }
02060 
02061 int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen, void *params)
02062 {
02063    int res = 0;
02064 
02065    ast_channel_lock(chan);
02066    if (chan->generatordata) {
02067       if (chan->generator && chan->generator->release)
02068          chan->generator->release(chan, chan->generatordata);
02069       chan->generatordata = NULL;
02070    }
02071    if (gen->alloc && !(chan->generatordata = gen->alloc(chan, params))) {
02072       res = -1;
02073    }
02074    if (!res) {
02075       ast_settimeout(chan, 50, generator_force, chan);
02076       chan->generator = gen;
02077    }
02078    ast_channel_unlock(chan);
02079 
02080    ast_prod(chan);
02081 
02082    return res;
02083 }
02084 
02085 /*! \brief Wait for x amount of time on a file descriptor to have input.  */
02086 int ast_waitfor_n_fd(int *fds, int n, int *ms, int *exception)
02087 {
02088    int winner = -1;
02089    ast_waitfor_nandfds(NULL, 0, fds, n, exception, &winner, ms);
02090    return winner;
02091 }
02092 
02093 /*! \brief Wait for x amount of time on a file descriptor to have input.  */
02094 #ifdef HAVE_EPOLL
02095 static struct ast_channel *ast_waitfor_nandfds_classic(struct ast_channel **c, int n, int *fds, int nfds,
02096                int *exception, int *outfd, int *ms)
02097 #else
02098 struct ast_channel *ast_waitfor_nandfds(struct ast_channel **c, int n, int *fds, int nfds,
02099                int *exception, int *outfd, int *ms)
02100 #endif
02101 {
02102    struct timeval start = { 0 , 0 };
02103    struct pollfd *pfds = NULL;
02104    int res;
02105    long rms;
02106    int x, y, max;
02107    int sz;
02108    struct timeval now = { 0, 0 };
02109    struct timeval whentohangup = { 0, 0 }, diff;
02110    struct ast_channel *winner = NULL;
02111    struct fdmap {
02112       int chan;
02113       int fdno;
02114    } *fdmap = NULL;
02115 
02116    if ((sz = n * AST_MAX_FDS + nfds)) {
02117       pfds = alloca(sizeof(*pfds) * sz);
02118       fdmap = alloca(sizeof(*fdmap) * sz);
02119    }
02120 
02121    if (outfd)
02122       *outfd = -99999;
02123    if (exception)
02124       *exception = 0;
02125    
02126    /* Perform any pending masquerades */
02127    for (x = 0; x < n; x++) {
02128       ast_channel_lock(c[x]);
02129       if (c[x]->masq && ast_do_masquerade(c[x])) {
02130          ast_log(LOG_WARNING, "Masquerade failed\n");
02131          *ms = -1;
02132          ast_channel_unlock(c[x]);
02133          return NULL;
02134       }
02135       if (!ast_tvzero(c[x]->whentohangup)) {
02136          if (ast_tvzero(whentohangup))
02137             now = ast_tvnow();
02138          diff = ast_tvsub(c[x]->whentohangup, now);
02139          if (diff.tv_sec < 0 || ast_tvzero(diff)) {
02140             /* Should already be hungup */
02141             c[x]->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
02142             ast_channel_unlock(c[x]);
02143             return c[x];
02144          }
02145          if (ast_tvzero(whentohangup) || ast_tvcmp(diff, whentohangup) < 0)
02146             whentohangup = diff;
02147       }
02148       ast_channel_unlock(c[x]);
02149    }
02150    /* Wait full interval */
02151    rms = *ms;
02152    /* INT_MAX, not LONG_MAX, because it matters on 64-bit */
02153    if (!ast_tvzero(whentohangup) && whentohangup.tv_sec < INT_MAX / 1000) {
02154       rms = whentohangup.tv_sec * 1000 + whentohangup.tv_usec / 1000;              /* timeout in milliseconds */
02155       if (*ms >= 0 && *ms < rms) {                                                 /* original *ms still smaller */
02156          rms =  *ms;
02157       }
02158    } else if (!ast_tvzero(whentohangup) && rms < 0) {
02159       /* Tiny corner case... call would need to last >24 days */
02160       rms = INT_MAX;
02161    }
02162    /*
02163     * Build the pollfd array, putting the channels' fds first,
02164     * followed by individual fds. Order is important because
02165     * individual fd's must have priority over channel fds.
02166     */
02167    max = 0;
02168    for (x = 0; x < n; x++) {
02169       for (y = 0; y < AST_MAX_FDS; y++) {
02170          fdmap[max].fdno = y;  /* fd y is linked to this pfds */
02171          fdmap[max].chan = x;  /* channel x is linked to this pfds */
02172          max += ast_add_fd(&pfds[max], c[x]->fds[y]);
02173       }
02174       CHECK_BLOCKING(c[x]);
02175    }
02176    /* Add the individual fds */
02177    for (x = 0; x < nfds; x++) {
02178       fdmap[max].chan = -1;
02179       max += ast_add_fd(&pfds[max], fds[x]);
02180    }
02181 
02182    if (*ms > 0)
02183       start = ast_tvnow();
02184    
02185    if (sizeof(int) == 4) { /* XXX fix timeout > 600000 on linux x86-32 */
02186       do {
02187          int kbrms = rms;
02188          if (kbrms > 600000)
02189             kbrms = 600000;
02190          res = ast_poll(pfds, max, kbrms);
02191          if (!res)
02192             rms -= kbrms;
02193       } while (!res && (rms > 0));
02194    } else {
02195       res = ast_poll(pfds, max, rms);
02196    }
02197    for (x = 0; x < n; x++)
02198       ast_clear_flag(c[x], AST_FLAG_BLOCKING);
02199    if (res < 0) { /* Simulate a timeout if we were interrupted */
02200       if (errno != EINTR)
02201          *ms = -1;
02202       return NULL;
02203    }
02204    if (!ast_tvzero(whentohangup)) {   /* if we have a timeout, check who expired */
02205       now = ast_tvnow();
02206       for (x = 0; x < n; x++) {
02207          if (!ast_tvzero(c[x]->whentohangup) && ast_tvcmp(c[x]->whentohangup, now) <= 0) {
02208             c[x]->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
02209             if (winner == NULL)
02210                winner = c[x];
02211          }
02212       }
02213    }
02214    if (res == 0) { /* no fd ready, reset timeout and done */
02215       *ms = 0; /* XXX use 0 since we may not have an exact timeout. */
02216       return winner;
02217    }
02218    /*
02219     * Then check if any channel or fd has a pending event.
02220     * Remember to check channels first and fds last, as they
02221     * must have priority on setting 'winner'
02222     */
02223    for (x = 0; x < max; x++) {
02224       res = pfds[x].revents;
02225       if (res == 0)
02226          continue;
02227       if (fdmap[x].chan >= 0) {  /* this is a channel */
02228          winner = c[fdmap[x].chan]; /* override previous winners */
02229          if (res & POLLPRI)
02230             ast_set_flag(winner, AST_FLAG_EXCEPTION);
02231          else
02232             ast_clear_flag(winner, AST_FLAG_EXCEPTION);
02233          winner->fdno = fdmap[x].fdno;
02234       } else {       /* this is an fd */
02235          if (outfd)
02236             *outfd = pfds[x].fd;
02237          if (exception)
02238             *exception = (res & POLLPRI) ? -1 : 0;
02239          winner = NULL;
02240       }
02241    }
02242    if (*ms > 0) {
02243       *ms -= ast_tvdiff_ms(ast_tvnow(), start);
02244       if (*ms < 0)
02245          *ms = 0;
02246    }
02247    return winner;
02248 }
02249 
02250 #ifdef HAVE_EPOLL
02251 static struct ast_channel *ast_waitfor_nandfds_simple(struct ast_channel *chan, int *ms)
02252 {
02253    struct timeval start = { 0 , 0 };
02254    int res = 0;
02255    struct epoll_event ev[1];
02256    long diff, rms = *ms;
02257    struct ast_channel *winner = NULL;
02258    struct ast_epoll_data *aed = NULL;
02259 
02260    ast_channel_lock(chan);
02261 
02262    /* See if this channel needs to be masqueraded */
02263    if (chan->masq && ast_do_masquerade(chan)) {
02264       ast_log(LOG_WARNING, "Failed to perform masquerade on %s\n", chan->name);
02265       *ms = -1;
02266       ast_channel_unlock(chan);
02267       return NULL;
02268    }
02269 
02270    /* Figure out their timeout */
02271    if (!ast_tvzero(chan->whentohangup)) {
02272       if ((diff = ast_tvdiff_ms(chan->whentohangup, ast_tvnow())) < 0) {
02273          /* They should already be hungup! */
02274          chan->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
02275          ast_channel_unlock(chan);
02276          return NULL;
02277       }
02278       /* If this value is smaller then the current one... make it priority */
02279       if (rms > diff)
02280          rms = diff;
02281    }
02282 
02283    ast_channel_unlock(chan);
02284 
02285    /* Time to make this channel block... */
02286    CHECK_BLOCKING(chan);
02287 
02288    if (*ms > 0)
02289       start = ast_tvnow();
02290 
02291    /* We don't have to add any file descriptors... they are already added, we just have to wait! */
02292    res = epoll_wait(chan->epfd, ev, 1, rms);
02293 
02294    /* Stop blocking */
02295    ast_clear_flag(chan, AST_FLAG_BLOCKING);
02296 
02297    /* Simulate a timeout if we were interrupted */
02298    if (res < 0) {
02299       if (errno != EINTR)
02300          *ms = -1;
02301       return NULL;
02302    }
02303 
02304    /* If this channel has a timeout see if it expired */
02305    if (!ast_tvzero(chan->whentohangup)) {
02306       if (ast_tvdiff_ms(ast_tvnow(), chan->whentohangup) >= 0) {
02307          chan->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
02308          winner = chan;
02309       }
02310    }
02311 
02312    /* No fd ready, reset timeout and be done for now */
02313    if (!res) {
02314       *ms = 0;
02315       return winner;
02316    }
02317 
02318    /* See what events are pending */
02319    aed = ev[0].data.ptr;
02320    chan->fdno = aed->which;
02321    if (ev[0].events & EPOLLPRI)
02322       ast_set_flag(chan, AST_FLAG_EXCEPTION);
02323    else
02324       ast_clear_flag(chan, AST_FLAG_EXCEPTION);
02325 
02326    if (*ms > 0) {
02327       *ms -= ast_tvdiff_ms(ast_tvnow(), start);
02328       if (*ms < 0)
02329          *ms = 0;
02330    }
02331 
02332    return chan;
02333 }
02334 
02335 static struct ast_channel *ast_waitfor_nandfds_complex(struct ast_channel **c, int n, int *ms)
02336 {
02337    struct timeval start = { 0 , 0 };
02338    int res = 0, i;
02339    struct epoll_event ev[25] = { { 0, } };
02340    struct timeval now = { 0, 0 };
02341    long whentohangup = 0, diff = 0, rms = *ms;
02342    struct ast_channel *winner = NULL;
02343 
02344    for (i = 0; i < n; i++) {
02345       ast_channel_lock(c[i]);
02346       if (c[i]->masq && ast_do_masquerade(c[i])) {
02347          ast_log(LOG_WARNING, "Masquerade failed\n");
02348          *ms = -1;
02349          ast_channel_unlock(c[i]);
02350          return NULL;
02351       }
02352       if (!ast_tvzero(c[i]->whentohangup)) {
02353          if (whentohangup == 0)
02354             now = ast_tvnow();
02355          if ((diff = ast_tvdiff_ms(c[i]->whentohangup, now)) < 0) {
02356             c[i]->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
02357             ast_channel_unlock(c[i]);
02358             return c[i];
02359          }
02360          if (!whentohangup || whentohangup > diff)
02361             whentohangup = diff;
02362       }
02363       ast_channel_unlock(c[i]);
02364       CHECK_BLOCKING(c[i]);
02365    }
02366 
02367    rms = *ms;
02368    if (whentohangup) {
02369       rms = whentohangup;
02370       if (*ms >= 0 && *ms < rms)
02371          rms = *ms;
02372    }
02373 
02374    if (*ms > 0)
02375       start = ast_tvnow();
02376 
02377    res = epoll_wait(c[0]->epfd, ev, 25, rms);
02378 
02379    for (i = 0; i < n; i++)
02380       ast_clear_flag(c[i], AST_FLAG_BLOCKING);
02381 
02382    if (res < 0) {
02383       if (errno != EINTR)
02384          *ms = -1;
02385       return NULL;
02386    }
02387 
02388    if (whentohangup) {
02389       now = ast_tvnow();
02390       for (i = 0; i < n; i++) {
02391          if (!ast_tvzero(c[i]->whentohangup) && ast_tvdiff_ms(now, c[i]->whentohangup) >= 0) {
02392             c[i]->_softhangup |= AST_SOFTHANGUP_TIMEOUT;
02393             if (!winner)
02394                winner = c[i];
02395          }
02396       }
02397    }
02398 
02399    if (!res) {
02400       *ms = 0;
02401       return winner;
02402    }
02403 
02404    for (i = 0; i < res; i++) {
02405       struct ast_epoll_data *aed = ev[i].data.ptr;
02406 
02407       if (!ev[i].events || !aed)
02408          continue;
02409 
02410       winner = aed->chan;
02411       if (ev[i].events & EPOLLPRI)
02412          ast_set_flag(winner, AST_FLAG_EXCEPTION);
02413       else
02414          ast_clear_flag(winner, AST_FLAG_EXCEPTION);
02415       winner->fdno = aed->which;
02416    }
02417 
02418    if (*ms > 0) {
02419       *ms -= ast_tvdiff_ms(ast_tvnow(), start);
02420       if (*ms < 0)
02421          *ms = 0;
02422    }
02423 
02424    return winner;
02425 }
02426 
02427 struct ast_channel *ast_waitfor_nandfds(struct ast_channel **c, int n, int *fds, int nfds,
02428                int *exception, int *outfd, int *ms)
02429 {
02430    /* Clear all provided values in one place. */
02431    if (outfd)
02432       *outfd = -99999;
02433    if (exception)
02434       *exception = 0;
02435 
02436    /* If no epoll file descriptor is available resort to classic nandfds */
02437    if (!n || nfds || c[0]->epfd == -1)
02438       return ast_waitfor_nandfds_classic(c, n, fds, nfds, exception, outfd, ms);
02439    else if (!nfds && n == 1)
02440       return ast_waitfor_nandfds_simple(c[0], ms);
02441    else
02442       return ast_waitfor_nandfds_complex(c, n, ms);
02443 }
02444 #endif
02445 
02446 struct ast_channel *ast_waitfor_n(struct ast_channel **c, int n, int *ms)
02447 {
02448    return ast_waitfor_nandfds(c, n, NULL, 0, NULL, NULL, ms);
02449 }
02450 
02451 int ast_waitfor(struct ast_channel *c, int ms)
02452 {
02453    int oldms = ms;   /* -1 if no timeout */
02454 
02455    ast_waitfor_nandfds(&c, 1, NULL, 0, NULL, NULL, &ms);
02456    if ((ms < 0) && (oldms < 0))
02457       ms = 0;
02458    return ms;
02459 }
02460 
02461 /* XXX never to be called with ms = -1 */
02462 int ast_waitfordigit(struct ast_channel *c, int ms)
02463 {
02464    return ast_waitfordigit_full(c, ms, -1, -1);
02465 }
02466 
02467 int ast_settimeout(struct ast_channel *c, unsigned int rate, int (*func)(const void *data), void *data)
02468 {
02469    int res;
02470    unsigned int real_rate = rate, max_rate;
02471 
02472    ast_channel_lock(c);
02473 
02474    if (c->timingfd == -1) {
02475       ast_channel_unlock(c);
02476       return -1;
02477    }
02478 
02479    if (!func) {
02480       rate = 0;
02481       data = NULL;
02482    }
02483 
02484    if (rate && rate > (max_rate = ast_timer_get_max_rate(c->timer))) {
02485       real_rate = max_rate;
02486    }
02487 
02488    ast_debug(1, "Scheduling timer at (%u requested / %u actual) timer ticks per second\n", rate, real_rate);
02489 
02490    res = ast_timer_set_rate(c->timer, real_rate);
02491 
02492    c->timingfunc = func;
02493    c->timingdata = data;
02494 
02495    ast_channel_unlock(c);
02496 
02497    return res;
02498 }
02499 
02500 int ast_waitfordigit_full(struct ast_channel *c, int ms, int audiofd, int cmdfd)
02501 {
02502    /* Stop if we're a zombie or need a soft hangup */
02503    if (ast_test_flag(c, AST_FLAG_ZOMBIE) || ast_check_hangup(c))
02504       return -1;
02505 
02506    /* Only look for the end of DTMF, don't bother with the beginning and don't emulate things */
02507    ast_set_flag(c, AST_FLAG_END_DTMF_ONLY);
02508 
02509    /* Wait for a digit, no more than ms milliseconds total. */
02510    
02511    while (ms) {
02512       struct ast_channel *rchan;
02513       int outfd=-1;
02514 
02515       errno = 0;
02516       rchan = ast_waitfor_nandfds(&c, 1, &cmdfd, (cmdfd > -1) ? 1 : 0, NULL, &outfd, &ms);
02517       
02518       if (!rchan && outfd < 0 && ms) {
02519          if (errno == 0 || errno == EINTR)
02520             continue;
02521          ast_log(LOG_WARNING, "Wait failed (%s)\n", strerror(errno));
02522          ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY);
02523          return -1;
02524       } else if (outfd > -1) {
02525          /* The FD we were watching has something waiting */
02526          ast_log(LOG_WARNING, "The FD we were waiting for has something waiting. Waitfordigit returning numeric 1\n");
02527          ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY);
02528          return 1;
02529       } else if (rchan) {
02530          int res;
02531          struct ast_frame *f = ast_read(c);
02532          if (!f)
02533             return -1;
02534 
02535          switch (f->frametype) {
02536          case AST_FRAME_DTMF_BEGIN:
02537             break;
02538          case AST_FRAME_DTMF_END:
02539             res = f->subclass;
02540             ast_frfree(f);
02541             ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY);
02542             return res;
02543          case AST_FRAME_CONTROL:
02544             switch (f->subclass) {
02545             case AST_CONTROL_HANGUP:
02546                ast_frfree(f);
02547                ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY);
02548                return -1;
02549             case AST_CONTROL_RINGING:
02550             case AST_CONTROL_ANSWER:
02551             case AST_CONTROL_SRCUPDATE:
02552             case AST_CONTROL_SRCCHANGE:
02553                /* Unimportant */
02554                break;
02555             default:
02556                ast_log(LOG_WARNING, "Unexpected control subclass '%d'\n", f->subclass);
02557                break;
02558             }
02559             break;
02560          case AST_FRAME_VOICE:
02561             /* Write audio if appropriate */
02562             if (audiofd > -1) {
02563                if (write(audiofd, f->data.ptr, f->datalen) < 0) {
02564                   ast_log(LOG_WARNING, "write() failed: %s\n", strerror(errno));
02565                }
02566             }
02567          default:
02568             /* Ignore */
02569             break;
02570          }
02571          ast_frfree(f);
02572       }
02573    }
02574 
02575    ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY);
02576 
02577    return 0; /* Time is up */
02578 }
02579 
02580 static void send_dtmf_event(const struct ast_channel *chan, const char *direction, const char digit, const char *begin, const char *end)
02581 {
02582    manager_event(EVENT_FLAG_DTMF,
02583          "DTMF",
02584          "Channel: %s\r\n"
02585          "Uniqueid: %s\r\n"
02586          "Digit: %c\r\n"
02587          "Direction: %s\r\n"
02588          "Begin: %s\r\n"
02589          "End: %s\r\n",
02590          chan->name, chan->uniqueid, digit, direction, begin, end);
02591 }
02592 
02593 static void ast_read_generator_actions(struct ast_channel *chan, struct ast_frame *f)
02594 {
02595    if (chan->generator && chan->generator->generate && chan->generatordata &&  !ast_internal_timing_enabled(chan)) {
02596       void *tmp = chan->generatordata;
02597       int (*generate)(struct ast_channel *chan, void *tmp, int datalen, int samples) = chan->generator->generate;
02598       int res;
02599       int samples;
02600 
02601       if (chan->timingfunc) {
02602          ast_debug(1, "Generator got voice, switching to phase locked mode\n");
02603          ast_settimeout(chan, 0, NULL, NULL);
02604       }
02605 
02606       chan->generatordata = NULL;     /* reset, to let writes go through */
02607 
02608       if (f->subclass != chan->writeformat) {
02609          float factor;
02610          factor = ((float) ast_format_rate(chan->writeformat)) / ((float) ast_format_rate(f->subclass));
02611          samples = (int) ( ((float) f->samples) * factor );
02612       } else {
02613          samples = f->samples;
02614       }
02615       
02616       /* This unlock is here based on two assumptions that hold true at this point in the
02617        * code. 1) this function is only called from within __ast_read() and 2) all generators
02618        * call ast_write() in their generate callback.
02619        *
02620        * The reason this is added is so that when ast_write is called, the lock that occurs 
02621        * there will not recursively lock the channel. Doing this will cause intended deadlock 
02622        * avoidance not to work in deeper functions
02623        */
02624       ast_channel_unlock(chan);
02625       res = generate(chan, tmp, f->datalen, samples);
02626       ast_channel_lock(chan);
02627       chan->generatordata = tmp;
02628       if (res) {
02629          ast_debug(1, "Auto-deactivating generator\n");
02630          ast_deactivate_generator(chan);
02631       }
02632 
02633    } else if (f->frametype == AST_FRAME_CNG) {
02634       if (chan->generator && !chan->timingfunc && (chan->timingfd > -1)) {
02635          ast_debug(1, "Generator got CNG, switching to timed mode\n");
02636          ast_settimeout(chan, 50, generator_force, chan);
02637       }
02638    }
02639 }
02640 
02641 static inline void queue_dtmf_readq(struct ast_channel *chan, struct ast_frame *f)
02642 {
02643    struct ast_frame *fr = &chan->dtmff;
02644 
02645    fr->frametype = AST_FRAME_DTMF_END;
02646    fr->subclass = f->subclass;
02647    fr->len = f->len;
02648 
02649    /* The only time this function will be called is for a frame that just came
02650     * out of the channel driver.  So, we want to stick it on the tail of the
02651     * readq. */
02652 
02653    ast_queue_frame(chan, fr);
02654 }
02655 
02656 /*!
02657  * \brief Determine whether or not we should ignore DTMF in the readq
02658  */
02659 static inline int should_skip_dtmf(struct ast_channel *chan)
02660 {
02661    if (ast_test_flag(chan, AST_FLAG_DEFER_DTMF | AST_FLAG_EMULATE_DTMF)) {
02662       /* We're in the middle of emulating a digit, or DTMF has been
02663        * explicitly deferred.  Skip this digit, then. */
02664       return 1;
02665    }
02666          
02667    if (!ast_tvzero(chan->dtmf_tv) && 
02668          ast_tvdiff_ms(ast_tvnow(), chan->dtmf_tv) < AST_MIN_DTMF_GAP) {
02669       /* We're not in the middle of a digit, but it hasn't been long enough
02670        * since the last digit, so we'll have to skip DTMF for now. */
02671       return 1;
02672    }
02673 
02674    return 0;
02675 }
02676 
02677 /*!
02678  * \brief calculates the number of samples to jump forward with in a monitor stream.
02679  
02680  * \note When using ast_seekstream() with the read and write streams of a monitor,
02681  * the number of samples to seek forward must be of the same sample rate as the stream
02682  * or else the jump will not be calculated correctly.
02683  *
02684  * \retval number of samples to seek forward after rate conversion.
02685  */
02686 static inline int calc_monitor_jump(int samples, int sample_rate, int seek_rate)
02687 {
02688    int diff = sample_rate - seek_rate;
02689 
02690    if (diff > 0) {
02691       samples = samples / (float) (sample_rate / seek_rate);
02692    } else if (diff < 0) {
02693       samples = samples * (float) (seek_rate / sample_rate);
02694    }
02695 
02696    return samples;
02697 }
02698 
02699 static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio)
02700 {
02701    struct ast_frame *f = NULL;   /* the return value */
02702    int blah;
02703    int prestate;
02704    int count = 0, cause = 0;
02705 
02706    /* this function is very long so make sure there is only one return
02707     * point at the end (there are only two exceptions to this).
02708     */
02709    while(ast_channel_trylock(chan)) {
02710       if(count++ > 10) 
02711          /*cannot goto done since the channel is not locked*/
02712          return &ast_null_frame;
02713       usleep(1);
02714    }
02715 
02716    if (chan->masq) {
02717       if (ast_do_masquerade(chan))
02718          ast_log(LOG_WARNING, "Failed to perform masquerade\n");
02719       else
02720          f =  &ast_null_frame;
02721       goto done;
02722    }
02723 
02724    /* Stop if we're a zombie or need a soft hangup */
02725    if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
02726       if (chan->generator)
02727          ast_deactivate_generator(chan);
02728       goto done;
02729    }
02730 
02731 #ifdef AST_DEVMODE
02732    /* 
02733     * The ast_waitfor() code records which of the channel's file descriptors reported that
02734     * data is available.  In theory, ast_read() should only be called after ast_waitfor()
02735     * reports that a channel has data available for reading.  However, there still may be
02736     * some edge cases throughout the code where ast_read() is called improperly.  This can
02737     * potentially cause problems, so if this is a developer build, make a lot of noise if
02738     * this happens so that it can be addressed. 
02739     */
02740    if (chan->fdno == -1) {
02741       ast_log(LOG_ERROR, "ast_read() called with no recorded file descriptor.\n");
02742    }
02743 #endif
02744 
02745    prestate = chan->_state;
02746 
02747    /* Read and ignore anything on the alertpipe, but read only
02748       one sizeof(blah) per frame that we send from it */
02749    if (chan->alertpipe[0] > -1) {
02750       int flags = fcntl(chan->alertpipe[0], F_GETFL);
02751       /* For some odd reason, the alertpipe occasionally loses nonblocking status,
02752        * which immediately causes a deadlock scenario.  Detect and prevent this. */
02753       if ((flags & O_NONBLOCK) == 0) {
02754          ast_log(LOG_ERROR, "Alertpipe on channel %s lost O_NONBLOCK?!!\n", chan->name);
02755          if (fcntl(chan->alertpipe[0], F_SETFL, flags | O_NONBLOCK) < 0) {
02756             ast_log(LOG_WARNING, "Unable to set alertpipe nonblocking! (%d: %s)\n", errno, strerror(errno));
02757             f = &ast_null_frame;
02758             goto done;
02759          }
02760       }
02761       if (read(chan->alertpipe[0], &blah, sizeof(blah)) < 0) {
02762          if (errno != EINTR && errno != EAGAIN)
02763             ast_log(LOG_WARNING, "read() failed: %s\n", strerror(errno));
02764       }
02765    }
02766 
02767    if (chan->timingfd > -1 && chan->fdno == AST_TIMING_FD) {
02768       enum ast_timer_event res;
02769 
02770       ast_clear_flag(chan, AST_FLAG_EXCEPTION);
02771 
02772       res = ast_timer_get_event(chan->timer);
02773 
02774       switch (res) {
02775       case AST_TIMING_EVENT_EXPIRED:
02776          ast_timer_ack(chan->timer, 1);
02777 
02778          if (chan->timingfunc) {
02779             /* save a copy of func/data before unlocking the channel */
02780             int (*func)(const void *) = chan->timingfunc;
02781             void *data = chan->timingdata;
02782             chan->fdno = -1;
02783             ast_channel_unlock(chan);
02784             func(data);
02785          } else {
02786             ast_timer_set_rate(chan->timer, 0);
02787             chan->fdno = -1;
02788             ast_channel_unlock(chan);
02789          }
02790 
02791          /* cannot 'goto done' because the channel is already unlocked */
02792          return &ast_null_frame;
02793 
02794       case AST_TIMING_EVENT_CONTINUOUS:
02795          if (AST_LIST_EMPTY(&chan->readq) || 
02796             !AST_LIST_NEXT(AST_LIST_FIRST(&chan->readq), frame_list)) {
02797             ast_timer_disable_continuous(chan->timer);
02798          }
02799          break;
02800       }
02801 
02802    } else if (chan->fds[AST_GENERATOR_FD] > -1 && chan->fdno == AST_GENERATOR_FD) {
02803       /* if the AST_GENERATOR_FD is set, call the generator with args
02804        * set to -1 so it can do whatever it needs to.
02805        */
02806       void *tmp = chan->generatordata;
02807       chan->generatordata = NULL;     /* reset to let ast_write get through */
02808       chan->generator->generate(chan, tmp, -1, -1);
02809       chan->generatordata = tmp;
02810       f = &ast_null_frame;
02811       chan->fdno = -1;
02812       goto done;
02813    }
02814 
02815    /* Check for pending read queue */
02816    if (!AST_LIST_EMPTY(&chan->readq)) {
02817       int skip_dtmf = should_skip_dtmf(chan);
02818 
02819       AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->readq, f, frame_list) {
02820          /* We have to be picky about which frame we pull off of the readq because
02821           * there are cases where we want to leave DTMF frames on the queue until
02822           * some later time. */
02823 
02824          if ( (f->frametype == AST_FRAME_DTMF_BEGIN || f->frametype == AST_FRAME_DTMF_END) && skip_dtmf) {
02825             continue;
02826          }
02827 
02828          AST_LIST_REMOVE_CURRENT(frame_list);
02829          break;
02830       }
02831       AST_LIST_TRAVERSE_SAFE_END;
02832       
02833       if (!f) {
02834          /* There were no acceptable frames on the readq. */
02835          f = &ast_null_frame;
02836          if (chan->alertpipe[0] > -1) {
02837             int poke = 0;
02838             /* Restore the state of the alertpipe since we aren't ready for any
02839              * of the frames in the readq. */
02840             if (write(chan->alertpipe[1], &poke, sizeof(poke)) != sizeof(poke)) {
02841                ast_log(LOG_ERROR, "Failed to write to alertpipe: %s\n", strerror(errno));
02842             }
02843          }
02844       }
02845 
02846       /* Interpret hangup and return NULL */
02847       /* XXX why not the same for frames from the channel ? */
02848       if (f->frametype == AST_FRAME_CONTROL && f->subclass == AST_CONTROL_HANGUP) {
02849          cause = f->data.uint32;
02850          ast_frfree(f);
02851          f = NULL;
02852       }
02853    } else {
02854       chan->blocker = pthread_self();
02855       if (ast_test_flag(chan, AST_FLAG_EXCEPTION)) {
02856          if (chan->tech->exception)
02857             f = chan->tech->exception(chan);
02858          else {
02859             ast_log(LOG_WARNING, "Exception flag set on '%s', but no exception handler\n", chan->name);
02860             f = &ast_null_frame;
02861          }
02862          /* Clear the exception flag */
02863          ast_clear_flag(chan, AST_FLAG_EXCEPTION);
02864       } else if (chan->tech->read)
02865          f = chan->tech->read(chan);
02866       else
02867          ast_log(LOG_WARNING, "No read routine on channel %s\n", chan->name);
02868    }
02869 
02870    /*
02871     * Reset the recorded file descriptor that triggered this read so that we can
02872     * easily detect when ast_read() is called without properly using ast_waitfor().
02873     */
02874    chan->fdno = -1;
02875 
02876    if (f) {
02877       struct ast_frame *readq_tail = AST_LIST_LAST(&chan->readq);
02878 
02879       /* if the channel driver returned more than one frame, stuff the excess
02880          into the readq for the next ast_read call
02881       */
02882       if (AST_LIST_NEXT(f, frame_list)) {
02883          ast_queue_frame(chan, AST_LIST_NEXT(f, frame_list));
02884          ast_frfree(AST_LIST_NEXT(f, frame_list));
02885          AST_LIST_NEXT(f, frame_list) = NULL;
02886       }
02887 
02888       switch (f->frametype) {
02889       case AST_FRAME_CONTROL:
02890          if (f->subclass == AST_CONTROL_ANSWER) {
02891             if (!ast_test_flag(chan, AST_FLAG_OUTGOING)) {
02892                ast_debug(1, "Ignoring answer on an inbound call!\n");
02893                ast_frfree(f);
02894                f = &ast_null_frame;
02895             } else if (prestate == AST_STATE_UP) {
02896                ast_debug(1, "Dropping duplicate answer!\n");
02897                ast_frfree(f);
02898                f = &ast_null_frame;
02899             } else {
02900                /* Answer the CDR */
02901                ast_setstate(chan, AST_STATE_UP);
02902                /* removed a call to ast_cdr_answer(chan->cdr) from here. */
02903             }
02904          }
02905          break;
02906       case AST_FRAME_DTMF_END:
02907          send_dtmf_event(chan, "Received", f->subclass, "No", "Yes");
02908          ast_log(LOG_DTMF, "DTMF end '%c' received on %s, duration %ld ms\n", f->subclass, chan->name, f->len);
02909          /* Queue it up if DTMF is deferred, or if DTMF emulation is forced. */
02910          if (ast_test_flag(chan, AST_FLAG_DEFER_DTMF) || ast_test_flag(chan, AST_FLAG_EMULATE_DTMF)) {
02911             queue_dtmf_readq(chan, f);
02912             ast_frfree(f);
02913             f = &ast_null_frame;
02914          } else if (!ast_test_flag(chan, AST_FLAG_IN_DTMF | AST_FLAG_END_DTMF_ONLY)) {
02915             if (!ast_tvzero(chan->dtmf_tv) && 
02916                 ast_tvdiff_ms(ast_tvnow(), chan->dtmf_tv) < AST_MIN_DTMF_GAP) {
02917                /* If it hasn't been long enough, defer this digit */
02918                queue_dtmf_readq(chan, f);
02919                ast_frfree(f);
02920                f = &ast_null_frame;
02921             } else {
02922                /* There was no begin, turn this into a begin and send the end later */
02923                f->frametype = AST_FRAME_DTMF_BEGIN;
02924                ast_set_flag(chan, AST_FLAG_EMULATE_DTMF);
02925                chan->emulate_dtmf_digit = f->subclass;
02926                chan->dtmf_tv = ast_tvnow();
02927                if (f->len) {
02928                   if (f->len > AST_MIN_DTMF_DURATION)
02929                      chan->emulate_dtmf_duration = f->len;
02930                   else 
02931                      chan->emulate_dtmf_duration = AST_MIN_DTMF_DURATION;
02932                } else
02933                   chan->emulate_dtmf_duration = AST_DEFAULT_EMULATE_DTMF_DURATION;
02934                ast_log(LOG_DTMF, "DTMF begin emulation of '%c' with duration %u queued on %s\n", f->subclass, chan->emulate_dtmf_duration, chan->name);
02935             }
02936             if (chan->audiohooks) {
02937                struct ast_frame *old_frame = f;
02938                /*!
02939                 * \todo XXX It is possible to write a digit to the audiohook twice
02940                 * if the digit was originally read while the channel was in autoservice. */
02941                f = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_READ, f);
02942                if (old_frame != f)
02943                   ast_frfree(old_frame);
02944             }
02945          } else {
02946             struct timeval now = ast_tvnow();
02947             if (ast_test_flag(chan, AST_FLAG_IN_DTMF)) {
02948                ast_log(LOG_DTMF, "DTMF end accepted with begin '%c' on %s\n", f->subclass, chan->name);
02949                ast_clear_flag(chan, AST_FLAG_IN_DTMF);
02950                if (!f->len)
02951                   f->len = ast_tvdiff_ms(now, chan->dtmf_tv);
02952 
02953                /* detect tones that were received on
02954                 * the wire with durations shorter than
02955                 * AST_MIN_DTMF_DURATION and set f->len
02956                 * to the actual duration of the DTMF
02957                 * frames on the wire.  This will cause
02958                 * dtmf emulation to be triggered later
02959                 * on.
02960                 */
02961                if (ast_tvdiff_ms(now, chan->dtmf_tv) < AST_MIN_DTMF_DURATION) {
02962                   f->len = ast_tvdiff_ms(now, chan->dtmf_tv);
02963                   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, f->len, chan->name);
02964                }
02965             } else if (!f->len) {
02966                ast_log(LOG_DTMF, "DTMF end accepted without begin '%c' on %s\n", f->subclass, chan->name);
02967                f->len = AST_MIN_DTMF_DURATION;
02968             }
02969             if (f->len < AST_MIN_DTMF_DURATION && !ast_test_flag(chan, AST_FLAG_END_DTMF_ONLY)) {
02970                ast_log(LOG_DTMF, "DTMF end '%c' has duration %ld but want minimum %d, emulating on %s\n", f->subclass, f->len, AST_MIN_DTMF_DURATION, chan->name);
02971                ast_set_flag(chan, AST_FLAG_EMULATE_DTMF);
02972                chan->emulate_dtmf_digit = f->subclass;
02973                chan->emulate_dtmf_duration = AST_MIN_DTMF_DURATION - f->len;
02974                ast_frfree(f);
02975                f = &ast_null_frame;
02976             } else {
02977                ast_log(LOG_DTMF, "DTMF end passthrough '%c' on %s\n", f->subclass, chan->name);
02978                if (f->len < AST_MIN_DTMF_DURATION) {
02979                   f->len = AST_MIN_DTMF_DURATION;
02980                }
02981                chan->dtmf_tv = now;
02982             }
02983             if (chan->audiohooks) {
02984                struct ast_frame *old_frame = f;
02985                f = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_READ, f);
02986                if (old_frame != f)
02987                   ast_frfree(old_frame);
02988             }
02989          }
02990          break;
02991       case AST_FRAME_DTMF_BEGIN:
02992          send_dtmf_event(chan, "Received", f->subclass, "Yes", "No");
02993          ast_log(LOG_DTMF, "DTMF begin '%c' received on %s\n", f->subclass, chan->name);
02994          if ( ast_test_flag(chan, AST_FLAG_DEFER_DTMF | AST_FLAG_END_DTMF_ONLY | AST_FLAG_EMULATE_DTMF) || 
02995              (!ast_tvzero(chan->dtmf_tv) && 
02996                ast_tvdiff_ms(ast_tvnow(), chan->dtmf_tv) < AST_MIN_DTMF_GAP) ) {
02997             ast_log(LOG_DTMF, "DTMF begin ignored '%c' on %s\n", f->subclass, chan->name);
02998             ast_frfree(f);
02999             f = &ast_null_frame;
03000          } else {
03001             ast_set_flag(chan, AST_FLAG_IN_DTMF);
03002             chan->dtmf_tv = ast_tvnow();
03003             ast_log(LOG_DTMF, "DTMF begin passthrough '%c' on %s\n", f->subclass, chan->name);
03004          }
03005          break;
03006       case AST_FRAME_NULL:
03007          /* The EMULATE_DTMF flag must be cleared here as opposed to when the duration
03008           * is reached , because we want to make sure we pass at least one
03009           * voice frame through before starting the next digit, to ensure a gap
03010           * between DTMF digits. */
03011          if (ast_test_flag(chan, AST_FLAG_EMULATE_DTMF)) {
03012             struct timeval now = ast_tvnow();
03013             if (!chan->emulate_dtmf_duration) {
03014                ast_clear_flag(chan, AST_FLAG_EMULATE_DTMF);
03015                chan->emulate_dtmf_digit = 0;
03016             } else if (ast_tvdiff_ms(now, chan->dtmf_tv) >= chan->emulate_dtmf_duration) {
03017                chan->emulate_dtmf_duration = 0;
03018                ast_frfree(f);
03019                f = &chan->dtmff;
03020                f->frametype = AST_FRAME_DTMF_END;
03021                f->subclass = chan->emulate_dtmf_digit;
03022                f->len = ast_tvdiff_ms(now, chan->dtmf_tv);
03023                chan->dtmf_tv = now;
03024                ast_clear_flag(chan, AST_FLAG_EMULATE_DTMF);
03025                chan->emulate_dtmf_digit = 0;
03026                ast_log(LOG_DTMF, "DTMF end emulation of '%c' queued on %s\n", f->subclass, chan->name);
03027                if (chan->audiohooks) {
03028                   struct ast_frame *old_frame = f;
03029                   f = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_READ, f);
03030                   if (old_frame != f) {
03031                      ast_frfree(old_frame);
03032                   }
03033                }
03034             }
03035          }
03036          break;
03037       case AST_FRAME_VOICE:
03038          /* The EMULATE_DTMF flag must be cleared here as opposed to when the duration
03039           * is reached , because we want to make sure we pass at least one
03040           * voice frame through before starting the next digit, to ensure a gap
03041           * between DTMF digits. */
03042          if (ast_test_flag(chan, AST_FLAG_EMULATE_DTMF) && !chan->emulate_dtmf_duration) {
03043             ast_clear_flag(chan, AST_FLAG_EMULATE_DTMF);
03044             chan->emulate_dtmf_digit = 0;
03045          }
03046 
03047          if (dropaudio || ast_test_flag(chan, AST_FLAG_IN_DTMF)) {
03048             if (dropaudio)
03049                ast_read_generator_actions(chan, f);
03050             ast_frfree(f);
03051             f = &ast_null_frame;
03052          }
03053 
03054          if (ast_test_flag(chan, AST_FLAG_EMULATE_DTMF) && !ast_test_flag(chan, AST_FLAG_IN_DTMF)) {
03055             struct timeval now = ast_tvnow();
03056             if (ast_tvdiff_ms(now, chan->dtmf_tv) >= chan->emulate_dtmf_duration) {
03057                chan->emulate_dtmf_duration = 0;
03058                ast_frfree(f);
03059                f = &chan->dtmff;
03060                f->frametype = AST_FRAME_DTMF_END;
03061                f->subclass = chan->emulate_dtmf_digit;
03062                f->len = ast_tvdiff_ms(now, chan->dtmf_tv);
03063                chan->dtmf_tv = now;
03064                if (chan->audiohooks) {
03065                   struct ast_frame *old_frame = f;
03066                   f = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_READ, f);
03067                   if (old_frame != f)
03068                      ast_frfree(old_frame);
03069                }
03070                ast_log(LOG_DTMF, "DTMF end emulation of '%c' queued on %s\n", f->subclass, chan->name);
03071             } else {
03072                /* Drop voice frames while we're still in the middle of the digit */
03073                ast_frfree(f);
03074                f = &ast_null_frame;
03075             }
03076          } else if ((f->frametype == AST_FRAME_VOICE) && !(f->subclass & chan->nativeformats)) {
03077             /* This frame is not one of the current native formats -- drop it on the floor */
03078             char to[200];
03079             ast_log(LOG_NOTICE, "Dropping incompatible voice frame on %s of format %s since our native format has changed to %s\n",
03080                chan->name, ast_getformatname(f->subclass), ast_getformatname_multiple(to, sizeof(to), chan->nativeformats));
03081             ast_frfree(f);
03082             f = &ast_null_frame;
03083          } else if ((f->frametype == AST_FRAME_VOICE)) {
03084             /* Send frame to audiohooks if present */
03085             if (chan->audiohooks) {
03086                struct ast_frame *old_frame = f;
03087                f = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_READ, f);
03088                if (old_frame != f)
03089                   ast_frfree(old_frame);
03090             }
03091             if (chan->monitor && chan->monitor->read_stream ) {
03092                /* XXX what does this do ? */
03093 #ifndef MONITOR_CONSTANT_DELAY
03094                int jump = chan->outsmpl - chan->insmpl - 4 * f->samples;
03095                if (jump >= 0) {
03096                   jump = calc_monitor_jump((chan->outsmpl - chan->insmpl), ast_format_rate(f->subclass), ast_format_rate(chan->monitor->read_stream->fmt->format));
03097                   if (ast_seekstream(chan->monitor->read_stream, jump, SEEK_FORCECUR) == -1)
03098                      ast_log(LOG_WARNING, "Failed to perform seek in monitoring read stream, synchronization between the files may be broken\n");
03099                   chan->insmpl += (chan->outsmpl - chan->insmpl) + f->samples;
03100                } else
03101                   chan->insmpl+= f->samples;
03102 #else
03103                int jump = calc_monitor_jump((chan->outsmpl - chan->insmpl), ast_format_rate(f->subclass), ast_format_rate(chan->monitor->read_stream->fmt->format));
03104                if (jump - MONITOR_DELAY >= 0) {
03105                   if (ast_seekstream(chan->monitor->read_stream, jump - f->samples, SEEK_FORCECUR) == -1)
03106                      ast_log(LOG_WARNING, "Failed to perform seek in monitoring read stream, synchronization between the files may be broken\n");
03107                   chan->insmpl += chan->outsmpl - chan->insmpl;
03108                } else
03109                   chan->insmpl += f->samples;
03110 #endif
03111                if (chan->monitor->state == AST_MONITOR_RUNNING) {
03112                   if (ast_writestream(chan->monitor->read_stream, f) < 0)
03113                      ast_log(LOG_WARNING, "Failed to write data to channel monitor read stream\n");
03114                }
03115             }
03116 
03117             if (chan->readtrans && (f = ast_translate(chan->readtrans, f, 1)) == NULL) {
03118                f = &ast_null_frame;
03119             }
03120 
03121             /* it is possible for the translation process on chan->readtrans to have
03122                produced multiple frames from the single input frame we passed it; if
03123                this happens, queue the additional frames *before* the frames we may
03124                have queued earlier. if the readq was empty, put them at the head of
03125                the queue, and if it was not, put them just after the frame that was
03126                at the end of the queue.
03127             */
03128             if (AST_LIST_NEXT(f, frame_list)) {
03129                if (!readq_tail) {
03130                   ast_queue_frame_head(chan, AST_LIST_NEXT(f, frame_list));
03131                } else {
03132                   __ast_queue_frame(chan, AST_LIST_NEXT(f, frame_list), 0, readq_tail);
03133                }
03134                ast_frfree(AST_LIST_NEXT(f, frame_list));
03135                AST_LIST_NEXT(f, frame_list) = NULL;
03136             }
03137 
03138             /* Run generator sitting on the line if timing device not available
03139             * and synchronous generation of outgoing frames is necessary       */
03140             ast_read_generator_actions(chan, f);
03141          }
03142       default:
03143          /* Just pass it on! */
03144          break;
03145       }
03146    } else {
03147       /* Make sure we always return NULL in the future */
03148       chan->_softhangup |= AST_SOFTHANGUP_DEV;
03149       if (cause)
03150          chan->hangupcause = cause;
03151       if (chan->generator)
03152          ast_deactivate_generator(chan);
03153       /* We no longer End the CDR here */
03154    }
03155 
03156    /* High bit prints debugging */
03157    if (chan->fin & DEBUGCHAN_FLAG)
03158       ast_frame_dump(chan->name, f, "<<");
03159    chan->fin = FRAMECOUNT_INC(chan->fin);
03160 
03161 done:
03162    if (chan->music_state && chan->generator && chan->generator->digit && f && f->frametype == AST_FRAME_DTMF_END)
03163       chan->generator->digit(chan, f->subclass);
03164 
03165    if (chan->audiohooks && ast_audiohook_write_list_empty(chan->audiohooks)) {
03166       /* The list gets recreated if audiohooks are added again later */
03167       ast_audiohook_detach_list(chan->audiohooks);
03168       chan->audiohooks = NULL;
03169    }
03170    ast_channel_unlock(chan);
03171    return f;
03172 }
03173 
03174 int ast_internal_timing_enabled(struct ast_channel *chan)
03175 {
03176    return (ast_opt_internal_timing && chan->timingfd > -1);
03177 }
03178 
03179 struct ast_frame *ast_read(struct ast_channel *chan)
03180 {
03181    return __ast_read(chan, 0);
03182 }
03183 
03184 struct ast_frame *ast_read_noaudio(struct ast_channel *chan)
03185 {
03186    return __ast_read(chan, 1);
03187 }
03188 
03189 int ast_indicate(struct ast_channel *chan, int condition)
03190 {
03191    return ast_indicate_data(chan, condition, NULL, 0);
03192 }
03193 
03194 static int attribute_const is_visible_indication(enum ast_control_frame_type condition)
03195 {
03196    /* Don't include a default case here so that we get compiler warnings
03197     * when a new type is added. */
03198 
03199    switch (condition) {
03200    case AST_CONTROL_PROGRESS:
03201    case AST_CONTROL_PROCEEDING:
03202    case AST_CONTROL_VIDUPDATE:
03203    case AST_CONTROL_SRCUPDATE:
03204    case AST_CONTROL_SRCCHANGE:
03205    case AST_CONTROL_RADIO_KEY:
03206    case AST_CONTROL_RADIO_UNKEY:
03207    case AST_CONTROL_OPTION:
03208    case AST_CONTROL_WINK:
03209    case AST_CONTROL_FLASH:
03210    case AST_CONTROL_OFFHOOK:
03211    case AST_CONTROL_TAKEOFFHOOK:
03212    case AST_CONTROL_ANSWER:
03213    case AST_CONTROL_HANGUP:
03214    case AST_CONTROL_T38_PARAMETERS:
03215    case _XXX_AST_CONTROL_T38:
03216       break;
03217 
03218    case AST_CONTROL_CONGESTION:
03219    case AST_CONTROL_BUSY:
03220    case AST_CONTROL_RINGING:
03221    case AST_CONTROL_RING:
03222    case AST_CONTROL_HOLD:
03223    case AST_CONTROL_UNHOLD:
03224       return 1;
03225    }
03226 
03227    return 0;
03228 }
03229 
03230 int ast_indicate_data(struct ast_channel *chan, int _condition,
03231       const void *data, size_t datalen)
03232 {
03233    /* By using an enum, we'll get compiler warnings for values not handled 
03234     * in switch statements. */
03235    enum ast_control_frame_type condition = _condition;
03236    struct ast_tone_zone_sound *ts = NULL;
03237    int res = -1;
03238 
03239    ast_channel_lock(chan);
03240 
03241    /* Don't bother if the channel is about to go away, anyway. */
03242    if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
03243       ast_channel_unlock(chan);
03244       return -1;
03245    }
03246 
03247    if (chan->tech->indicate) {
03248       /* See if the channel driver can handle this condition. */
03249       res = chan->tech->indicate(chan, condition, data, datalen);
03250    }
03251 
03252    ast_channel_unlock(chan);
03253 
03254    if (!res) {
03255       /* The channel driver successfully handled this indication */
03256       if (is_visible_indication(condition)) {
03257          chan->visible_indication = condition;
03258       }
03259       return 0;
03260    }
03261 
03262    /* The channel driver does not support this indication, let's fake
03263     * it by doing our own tone generation if applicable. */
03264 
03265    /*!\note If we compare the enumeration type, which does not have any
03266     * negative constants, the compiler may optimize this code away.
03267     * Therefore, we must perform an integer comparison here. */
03268    if (_condition < 0) {
03269       /* Stop any tones that are playing */
03270       ast_playtones_stop(chan);
03271       return 0;
03272    }
03273 
03274    /* Handle conditions that we have tones for. */
03275    switch (condition) {
03276    case _XXX_AST_CONTROL_T38:
03277       /* deprecated T.38 control frame */
03278       return -1;
03279    case AST_CONTROL_T38_PARAMETERS:
03280       /* there is no way to provide 'default' behavior for these
03281        * control frames, so we need to return failure, but there
03282        * is also no value in the log message below being emitted
03283        * since failure to handle these frames is not an 'error'
03284        * so just return right now. in addition, we want to return
03285        * whatever value the channel driver returned, in case it
03286        * has some meaning.*/
03287       return res;
03288    case AST_CONTROL_RINGING:
03289       ts = ast_get_indication_tone(chan->zone, "ring");
03290       /* It is common practice for channel drivers to return -1 if trying
03291        * to indicate ringing on a channel which is up. The idea is to let the
03292        * core generate the ringing inband. However, we don't want the
03293        * warning message about not being able to handle the specific indication
03294        * to print nor do we want ast_indicate_data to return an "error" for this
03295        * condition
03296        */
03297       if (chan->_state == AST_STATE_UP) {
03298          res = 0;
03299       }
03300       break;
03301    case AST_CONTROL_BUSY:
03302       ts = ast_get_indication_tone(chan->zone, "busy");
03303       break;
03304    case AST_CONTROL_CONGESTION:
03305       ts = ast_get_indication_tone(chan->zone, "congestion");
03306       break;
03307    case AST_CONTROL_PROGRESS:
03308    case AST_CONTROL_PROCEEDING:
03309    case AST_CONTROL_VIDUPDATE:
03310    case AST_CONTROL_SRCUPDATE:
03311    case AST_CONTROL_SRCCHANGE:
03312    case AST_CONTROL_RADIO_KEY:
03313    case AST_CONTROL_RADIO_UNKEY:
03314    case AST_CONTROL_OPTION:
03315    case AST_CONTROL_WINK:
03316    case AST_CONTROL_FLASH:
03317    case AST_CONTROL_OFFHOOK:
03318    case AST_CONTROL_TAKEOFFHOOK:
03319    case AST_CONTROL_ANSWER:
03320    case AST_CONTROL_HANGUP:
03321    case AST_CONTROL_RING:
03322    case AST_CONTROL_HOLD:
03323    case AST_CONTROL_UNHOLD:
03324       /* Nothing left to do for these. */
03325       res = 0;
03326       break;
03327    }
03328 
03329    if (ts) {
03330       /* We have a tone to play, yay. */
03331       ast_debug(1, "Driver for channel '%s' does not support indication %d, emulating it\n", chan->name, condition);
03332       ast_playtones_start(chan, 0, ts->data, 1);
03333       ts = ast_tone_zone_sound_unref(ts);
03334       res = 0;
03335       chan->visible_indication = condition;
03336    }
03337 
03338    if (res) {
03339       /* not handled */
03340       ast_log(LOG_WARNING, "Unable to handle indication %d for '%s'\n", condition, chan->name);
03341    }
03342 
03343    return res;
03344 }
03345 
03346 int ast_recvchar(struct ast_channel *chan, int timeout)
03347 {
03348    int c;
03349    char *buf = ast_recvtext(chan, timeout);
03350    if (buf == NULL)
03351       return -1;  /* error or timeout */
03352    c = *(unsigned char *)buf;
03353    ast_free(buf);
03354    return c;
03355 }
03356 
03357 char *ast_recvtext(struct ast_channel *chan, int timeout)
03358 {
03359    int res, done = 0;
03360    char *buf = NULL;
03361    
03362    while (!done) {
03363       struct ast_frame *f;
03364       if (ast_check_hangup(chan))
03365          break;
03366       res = ast_waitfor(chan, timeout);
03367       if (res <= 0) /* timeout or error */
03368          break;
03369       timeout = res; /* update timeout */
03370       f = ast_read(chan);
03371       if (f == NULL)
03372          break; /* no frame */
03373       if (f->frametype == AST_FRAME_CONTROL && f->subclass == AST_CONTROL_HANGUP)
03374          done = 1;   /* force a break */
03375       else if (f->frametype == AST_FRAME_TEXT) {      /* what we want */
03376          buf = ast_strndup((char *) f->data.ptr, f->datalen);  /* dup and break */
03377          done = 1;
03378       }
03379       ast_frfree(f);
03380    }
03381    return buf;
03382 }
03383 
03384 int ast_sendtext(struct ast_channel *chan, const char *text)
03385 {
03386    int res = 0;
03387    /* Stop if we're a zombie or need a soft hangup */
03388    if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan))
03389       return -1;
03390    CHECK_BLOCKING(chan);
03391    if (chan->tech->send_text)
03392       res = chan->tech->send_text(chan, text);
03393    ast_clear_flag(chan, AST_FLAG_BLOCKING);
03394    return res;
03395 }
03396 
03397 int ast_senddigit_begin(struct ast_channel *chan, char digit)
03398 {
03399    /* Device does not support DTMF tones, lets fake
03400     * it by doing our own generation. */
03401    static const char* dtmf_tones[] = {
03402       "941+1336", /* 0 */
03403       "697+1209", /* 1 */
03404       "697+1336", /* 2 */
03405       "697+1477", /* 3 */
03406       "770+1209", /* 4 */
03407       "770+1336", /* 5 */
03408       "770+1477", /* 6 */
03409       "852+1209", /* 7 */
03410       "852+1336", /* 8 */
03411       "852+1477", /* 9 */
03412       "697+1633", /* A */
03413       "770+1633", /* B */
03414       "852+1633", /* C */
03415       "941+1633", /* D */
03416       "941+1209", /* * */
03417       "941+1477"  /* # */
03418    };
03419 
03420    if (!chan->tech->send_digit_begin)
03421       return 0;
03422 
03423    if (!chan->tech->send_digit_begin(chan, digit))
03424       return 0;
03425 
03426    if (digit >= '0' && digit <='9')
03427       ast_playtones_start(chan, 0, dtmf_tones[digit-'0'], 0);
03428    else if (digit >= 'A' && digit <= 'D')
03429       ast_playtones_start(chan, 0, dtmf_tones[digit-'A'+10], 0);
03430    else if (digit == '*')
03431       ast_playtones_start(chan, 0, dtmf_tones[14], 0);
03432    else if (digit == '#')
03433       ast_playtones_start(chan, 0, dtmf_tones[15], 0);
03434    else {
03435       /* not handled */
03436       ast_debug(1, "Unable to generate DTMF tone '%c' for '%s'\n", digit, chan->name);
03437    }
03438 
03439    return 0;
03440 }
03441 
03442 int ast_senddigit_end(struct ast_channel *chan, char digit, unsigned int duration)
03443 {
03444    int res = -1;
03445 
03446    if (chan->tech->send_digit_end)
03447       res = chan->tech->send_digit_end(chan, digit, duration);
03448 
03449    if (res && chan->generator)
03450       ast_playtones_stop(chan);
03451    
03452    return 0;
03453 }
03454 
03455 int ast_senddigit(struct ast_channel *chan, char digit, unsigned int duration)
03456 {
03457    if (chan->tech->send_digit_begin) {
03458       ast_senddigit_begin(chan, digit);
03459       ast_safe_sleep(chan, (duration >= AST_DEFAULT_EMULATE_DTMF_DURATION ? duration : AST_DEFAULT_EMULATE_DTMF_DURATION));
03460    }
03461    
03462    return ast_senddigit_end(chan, digit, (duration >= AST_DEFAULT_EMULATE_DTMF_DURATION ? duration : AST_DEFAULT_EMULATE_DTMF_DURATION));
03463 }
03464 
03465 int ast_prod(struct ast_channel *chan)
03466 {
03467    struct ast_frame a = { AST_FRAME_VOICE };
03468    char nothing[128];
03469 
03470    /* Send an empty audio frame to get things moving */
03471    if (chan->_state != AST_STATE_UP) {
03472       ast_debug(1, "Prodding channel '%s'\n", chan->name);
03473       a.subclass = chan->rawwriteformat;
03474       a.data.ptr = nothing + AST_FRIENDLY_OFFSET;
03475       a.src = "ast_prod"; /* this better match check in ast_write */
03476       if (ast_write(chan, &a))
03477          ast_log(LOG_WARNING, "Prodding channel '%s' failed\n", chan->name);
03478    }
03479    return 0;
03480 }
03481 
03482 int ast_write_video(struct ast_channel *chan, struct ast_frame *fr)
03483 {
03484    int res;
03485    if (!chan->tech->write_video)
03486       return 0;
03487    res = ast_write(chan, fr);
03488    if (!res)
03489       res = 1;
03490    return res;
03491 }
03492 
03493 struct plc_ds {
03494    /* A buffer in which to store SLIN PLC
03495     * samples generated by the generic PLC
03496     * functionality in plc.c
03497     */
03498    int16_t *samples_buf;
03499    /* The current number of samples in the
03500     * samples_buf
03501     */
03502    size_t num_samples;
03503    plc_state_t plc_state;
03504 };
03505 
03506 static void plc_ds_destroy(void *data)
03507 {
03508    struct plc_ds *plc = data;
03509    ast_free(plc->samples_buf);
03510    ast_free(plc);
03511 }
03512 
03513 static struct ast_datastore_info plc_ds_info = {
03514    .type = "plc",
03515    .destroy = plc_ds_destroy,
03516 };
03517 
03518 static void adjust_frame_for_plc(struct ast_channel *chan, struct ast_frame *frame, struct ast_datastore *datastore)
03519 {
03520    int num_new_samples = frame->samples;
03521    struct plc_ds *plc = datastore->data;
03522 
03523    /* As a general note, let me explain the somewhat odd calculations used when taking
03524     * the frame offset into account here. According to documentation in frame.h, the frame's
03525     * offset field indicates the number of bytes that the audio is offset. The plc->samples_buf
03526     * is not an array of bytes, but rather an array of 16-bit integers since it holds SLIN
03527     * samples. So I had two choices to make here with the offset.
03528     * 
03529     * 1. Make the offset AST_FRIENDLY_OFFSET bytes. The main downside for this is that
03530     *    I can't just add AST_FRIENDLY_OFFSET to the plc->samples_buf and have the pointer
03531     *    arithmetic come out right. I would have to do some odd casting or division for this to
03532     *    work as I wanted.
03533     * 2. Make the offset AST_FRIENDLY_OFFSET * 2 bytes. This allows the pointer arithmetic
03534     *    to work out better with the plc->samples_buf. The downside here is that the buffer's
03535     *    allocation contains an extra 64 bytes of unused space.
03536     * 
03537     * I decided to go with option 2. This is why in the calloc statement and the statement that
03538     * sets the frame's offset, AST_FRIENDLY_OFFSET is multiplied by 2.
03539     */
03540 
03541    /* If this audio frame has no samples to fill in, ignore it */
03542    if (!num_new_samples) {
03543       return;
03544    }
03545 
03546    /* First, we need to be sure that our buffer is large enough to accomodate
03547     * the samples we need to fill in. This will likely only occur on the first
03548     * frame we write.
03549     */
03550    if (plc->num_samples < num_new_samples) {
03551       ast_free(plc->samples_buf);
03552       plc->samples_buf = ast_calloc(1, (num_new_samples * sizeof(*plc->samples_buf)) + (AST_FRIENDLY_OFFSET * 2));
03553       if (!plc->samples_buf) {
03554          ast_channel_datastore_remove(chan, datastore);
03555          ast_datastore_free(datastore);
03556          return;
03557       }
03558       plc->num_samples = num_new_samples;
03559    }
03560 
03561    if (frame->datalen == 0) {
03562       plc_fillin(&plc->plc_state, plc->samples_buf + AST_FRIENDLY_OFFSET, frame->samples);
03563       frame->data.ptr = plc->samples_buf + AST_FRIENDLY_OFFSET;
03564       frame->datalen = num_new_samples * 2;
03565       frame->offset = AST_FRIENDLY_OFFSET * 2;
03566    } else {
03567       plc_rx(&plc->plc_state, frame->data.ptr, frame->samples);
03568    }
03569 }
03570 
03571 static void apply_plc(struct ast_channel *chan, struct ast_frame *frame)
03572 {
03573    struct ast_datastore *datastore;
03574    struct plc_ds *plc;
03575 
03576    datastore = ast_channel_datastore_find(chan, &plc_ds_info, NULL);
03577    if (datastore) {
03578       plc = datastore->data;
03579       adjust_frame_for_plc(chan, frame, datastore);
03580       return;
03581    }
03582 
03583    datastore = ast_datastore_alloc(&plc_ds_info, NULL);
03584    if (!datastore) {
03585       return;
03586    }
03587    plc = ast_calloc(1, sizeof(*plc));
03588    if (!plc) {
03589       ast_datastore_free(datastore);
03590       return;
03591    }
03592    datastore->data = plc;
03593    ast_channel_datastore_add(chan, datastore);
03594    adjust_frame_for_plc(chan, frame, datastore);
03595 }
03596 
03597 int ast_write(struct ast_channel *chan, struct ast_frame *fr)
03598 {
03599    int res = -1;
03600    struct ast_frame *f = NULL;
03601    int count = 0;
03602 
03603    /*Deadlock avoidance*/
03604    while(ast_channel_trylock(chan)) {
03605       /*cannot goto done since the channel is not locked*/
03606       if(count++ > 10) {
03607          ast_debug(1, "Deadlock avoided for write to channel '%s'\n", chan->name);
03608          return 0;
03609       }
03610       usleep(1);
03611    }
03612    /* Stop if we're a zombie or need a soft hangup */
03613    if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan))
03614       goto done;
03615 
03616    /* Handle any pending masquerades */
03617    if (chan->masq && ast_do_masquerade(chan)) {
03618       ast_log(LOG_WARNING, "Failed to perform masquerade\n");
03619       goto done;
03620    }
03621    if (chan->masqr) {
03622       res = 0; /* XXX explain, why 0 ? */
03623       goto done;
03624    }
03625    if (chan->generatordata && (!fr->src || strcasecmp(fr->src, "ast_prod"))) {
03626       if (ast_test_flag(chan, AST_FLAG_WRITE_INT)) {
03627             ast_deactivate_generator(chan);
03628       } else {
03629          if (fr->frametype == AST_FRAME_DTMF_END) {
03630             /* There is a generator running while we're in the middle of a digit.
03631              * It's probably inband DTMF, so go ahead and pass it so it can
03632              * stop the generator */
03633             ast_clear_flag(chan, AST_FLAG_BLOCKING);
03634             ast_channel_unlock(chan);
03635             res = ast_senddigit_end(chan, fr->subclass, fr->len);
03636             ast_channel_lock(chan);
03637             CHECK_BLOCKING(chan);
03638          } else if (fr->frametype == AST_FRAME_CONTROL && fr->subclass == AST_CONTROL_UNHOLD) {
03639             /* This is a side case where Echo is basically being called and the person put themselves on hold and took themselves off hold */
03640             res = (chan->tech->indicate == NULL) ? 0 :
03641                chan->tech->indicate(chan, fr->subclass, fr->data.ptr, fr->datalen);
03642          }
03643          res = 0; /* XXX explain, why 0 ? */
03644          goto done;
03645       }
03646    }
03647    /* High bit prints debugging */
03648    if (chan->fout & DEBUGCHAN_FLAG)
03649       ast_frame_dump(chan->name, fr, ">>");
03650    CHECK_BLOCKING(chan);
03651    switch (fr->frametype) {
03652    case AST_FRAME_CONTROL:
03653       res = (chan->tech->indicate == NULL) ? 0 :
03654          chan->tech->indicate(chan, fr->subclass, fr->data.ptr, fr->datalen);
03655       break;
03656    case AST_FRAME_DTMF_BEGIN:
03657       if (chan->audiohooks) {
03658          struct ast_frame *old_frame = fr;
03659          fr = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_WRITE, fr);
03660          if (old_frame != fr)
03661             f = fr;
03662       }
03663       send_dtmf_event(chan, "Sent", fr->subclass, "Yes", "No");
03664       ast_clear_flag(chan, AST_FLAG_BLOCKING);
03665       ast_channel_unlock(chan);
03666       res = ast_senddigit_begin(chan, fr->subclass);
03667       ast_channel_lock(chan);
03668       CHECK_BLOCKING(chan);
03669       break;
03670    case AST_FRAME_DTMF_END:
03671       if (chan->audiohooks) {
03672          struct ast_frame *new_frame = fr;
03673 
03674          new_frame = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_WRITE, fr);
03675          if (new_frame != fr) {
03676             ast_frfree(new_frame);
03677          }
03678       }
03679       send_dtmf_event(chan, "Sent", fr->subclass, "No", "Yes");
03680       ast_clear_flag(chan, AST_FLAG_BLOCKING);
03681       ast_channel_unlock(chan);
03682       res = ast_senddigit_end(chan, fr->subclass, fr->len);
03683       ast_channel_lock(chan);
03684       CHECK_BLOCKING(chan);
03685       break;
03686    case AST_FRAME_TEXT:
03687       if (fr->subclass == AST_FORMAT_T140) {
03688          res = (chan->tech->write_text == NULL) ? 0 :
03689             chan->tech->write_text(chan, fr);
03690       } else {
03691          res = (chan->tech->send_text == NULL) ? 0 :
03692             chan->tech->send_text(chan, (char *) fr->data.ptr);
03693       }
03694       break;
03695    case AST_FRAME_HTML:
03696       res = (chan->tech->send_html == NULL) ? 0 :
03697          chan->tech->send_html(chan, fr->subclass, (char *) fr->data.ptr, fr->datalen);
03698       break;
03699    case AST_FRAME_VIDEO:
03700       /* XXX Handle translation of video codecs one day XXX */
03701       res = (chan->tech->write_video == NULL) ? 0 :
03702          chan->tech->write_video(chan, fr);
03703       break;
03704    case AST_FRAME_MODEM:
03705       res = (chan->tech->write == NULL) ? 0 :
03706          chan->tech->write(chan, fr);
03707       break;
03708    case AST_FRAME_VOICE:
03709       if (chan->tech->write == NULL)
03710          break;   /*! \todo XXX should return 0 maybe ? */
03711 
03712       if (ast_opt_generic_plc && fr->subclass == AST_FORMAT_SLINEAR) {
03713          apply_plc(chan, fr);
03714       }
03715 
03716       /* If the frame is in the raw write format, then it's easy... just use the frame - otherwise we will have to translate */
03717       if (fr->subclass == chan->rawwriteformat)
03718          f = fr;
03719       else
03720          f = (chan->writetrans) ? ast_translate(chan->writetrans, fr, 0) : fr;
03721 
03722       if (!f) {
03723          res = 0;
03724          break;
03725       }
03726 
03727       if (chan->audiohooks) {
03728          struct ast_frame *prev = NULL, *new_frame, *cur, *dup;
03729          int freeoldlist = 0;
03730 
03731          if (f != fr) {
03732             freeoldlist = 1;
03733          }
03734 
03735          /* Since ast_audiohook_write may return a new frame, and the cur frame is
03736           * an item in a list of frames, create a new list adding each cur frame back to it
03737           * regardless if the cur frame changes or not. */
03738          for (cur = f; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
03739             new_frame = ast_audiohook_write_list(chan, chan->audiohooks, AST_AUDIOHOOK_DIRECTION_WRITE, cur);
03740 
03741             /* if this frame is different than cur, preserve the end of the list,
03742              * free the old frames, and set cur to be the new frame */
03743             if (new_frame != cur) {
03744 
03745                /* doing an ast_frisolate here seems silly, but we are not guaranteed the new_frame
03746                 * isn't part of local storage, meaning if ast_audiohook_write is called multiple
03747                 * times it may override the previous frame we got from it unless we dup it */
03748                if ((dup = ast_frisolate(new_frame))) {
03749                   AST_LIST_NEXT(dup, frame_list) = AST_LIST_NEXT(cur, frame_list);
03750                   if (freeoldlist) {
03751                      AST_LIST_NEXT(cur, frame_list) = NULL;
03752                      ast_frfree(cur);
03753                   }
03754                   if (new_frame != dup) {
03755                      ast_frfree(new_frame);
03756                   }
03757                   cur = dup;
03758                }
03759             }
03760 
03761             /* now, regardless if cur is new or not, add it to the new list,
03762              * if the new list has not started, cur will become the first item. */
03763             if (prev) {
03764                AST_LIST_NEXT(prev, frame_list) = cur;
03765             } else {
03766                f = cur; /* set f to be the beginning of our new list */
03767             }
03768             prev = cur;
03769          }
03770       }
03771       
03772       /* If Monitor is running on this channel, then we have to write frames out there too */
03773       /* the translator on chan->writetrans may have returned multiple frames
03774          from the single frame we passed in; if so, feed each one of them to the
03775          monitor */
03776       if (chan->monitor && chan->monitor->write_stream) {
03777          struct ast_frame *cur;
03778 
03779          for (cur = f; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
03780          /* XXX must explain this code */
03781 #ifndef MONITOR_CONSTANT_DELAY
03782             int jump = chan->insmpl - chan->outsmpl - 4 * cur->samples;
03783             if (jump >= 0) {
03784                jump = calc_monitor_jump((chan->insmpl - chan->outsmpl), ast_format_rate(f->subclass), ast_format_rate(chan->monitor->read_stream->fmt->format));
03785                if (ast_seekstream(chan->monitor->write_stream, jump, SEEK_FORCECUR) == -1)
03786                   ast_log(LOG_WARNING, "Failed to perform seek in monitoring write stream, synchronization between the files may be broken\n");
03787                chan->outsmpl += (chan->insmpl - chan->outsmpl) + cur->samples;
03788             } else {
03789                chan->outsmpl += cur->samples;
03790             }
03791 #else
03792             int jump = calc_monitor_jump((chan->insmpl - chan->outsmpl), ast_format_rate(f->subclass), ast_format_rate(chan->monitor->read_stream->fmt->format));
03793             if (jump - MONITOR_DELAY >= 0) {
03794                if (ast_seekstream(chan->monitor->write_stream, jump - cur->samples, SEEK_FORCECUR) == -1)
03795                   ast_log(LOG_WARNING, "Failed to perform seek in monitoring write stream, synchronization between the files may be broken\n");
03796                chan->outsmpl += chan->insmpl - chan->outsmpl;
03797             } else {
03798                chan->outsmpl += cur->samples;
03799             }
03800 #endif
03801             if (chan->monitor->state == AST_MONITOR_RUNNING) {
03802                if (ast_writestream(chan->monitor->write_stream, cur) < 0)
03803                   ast_log(LOG_WARNING, "Failed to write data to channel monitor write stream\n");
03804             }
03805          }
03806       }
03807 
03808       /* the translator on chan->writetrans may have returned multiple frames
03809          from the single frame we passed in; if so, feed each one of them to the
03810          channel, freeing each one after it has been written */
03811       if ((f != fr) && AST_LIST_NEXT(f, frame_list)) {
03812          struct ast_frame *cur, *next;
03813          unsigned int skip = 0;
03814 
03815          for (cur = f, next = AST_LIST_NEXT(cur, frame_list);
03816               cur;
03817               cur = next, next = cur ? AST_LIST_NEXT(cur, frame_list) : NULL) {
03818             if (!skip) {
03819                if ((res = chan->tech->write(chan, cur)) < 0) {
03820                   chan->_softhangup |= AST_SOFTHANGUP_DEV;
03821                   skip = 1;
03822                } else if (next) {
03823                   /* don't do this for the last frame in the list,
03824                      as the code outside the loop will do it once
03825                   */
03826                   chan->fout = FRAMECOUNT_INC(chan->fout);
03827                }
03828             }
03829             ast_frfree(cur);
03830          }
03831 
03832          /* reset f so the code below doesn't attempt to free it */
03833          f = NULL;
03834       } else {
03835          res = chan->tech->write(chan, f);
03836       }
03837       break;
03838    case AST_FRAME_NULL:
03839    case AST_FRAME_IAX:
03840       /* Ignore these */
03841       res = 0;
03842       break;
03843    default:
03844       /* At this point, fr is the incoming frame and f is NULL.  Channels do
03845        * not expect to get NULL as a frame pointer and will segfault.  Hence,
03846        * we output the original frame passed in. */
03847       res = chan->tech->write(chan, fr);
03848       break;
03849    }
03850 
03851    if (f && f != fr)
03852       ast_frfree(f);
03853    ast_clear_flag(chan, AST_FLAG_BLOCKING);
03854 
03855    /* Consider a write failure to force a soft hangup */
03856    if (res < 0) {
03857       chan->_softhangup |= AST_SOFTHANGUP_DEV;
03858    } else {
03859       chan->fout = FRAMECOUNT_INC(chan->fout);
03860    }
03861 done:
03862    if (chan->audiohooks && ast_audiohook_write_list_empty(chan->audiohooks)) {
03863       /* The list gets recreated if audiohooks are added again later */
03864       ast_audiohook_detach_list(chan->audiohooks);
03865       chan->audiohooks = NULL;
03866    }
03867    ast_channel_unlock(chan);
03868    return res;
03869 }
03870 
03871 static int set_format(struct ast_channel *chan, int fmt, int *rawformat, int *format,
03872             struct ast_trans_pvt **trans, const int direction)
03873 {
03874    int native;
03875    int res;
03876    char from[200], to[200];
03877    
03878    /* Make sure we only consider audio */
03879    fmt &= AST_FORMAT_AUDIO_MASK;
03880    
03881    native = chan->nativeformats;
03882 
03883    if (!fmt || !native) /* No audio requested */
03884       return 0;   /* Let's try a call without any sounds (video, text) */
03885    
03886    /* Find a translation path from the native format to one of the desired formats */
03887    if (!direction)
03888       /* reading */
03889       res = ast_translator_best_choice(&fmt, &native);
03890    else
03891       /* writing */
03892       res = ast_translator_best_choice(&native, &fmt);
03893 
03894    if (res < 0) {
03895       ast_log(LOG_WARNING, "Unable to find a codec translation path from %s to %s\n",
03896          ast_getformatname_multiple(from, sizeof(from), native),
03897          ast_getformatname_multiple(to, sizeof(to), fmt));
03898       return -1;
03899    }
03900    
03901    /* Now we have a good choice for both. */
03902    ast_channel_lock(chan);
03903 
03904    if ((*rawformat == native) && (*format == fmt) && ((*rawformat == *format) || (*trans))) {
03905       /* the channel is already in these formats, so nothing to do */
03906       ast_channel_unlock(chan);
03907       return 0;
03908    }
03909 
03910    *rawformat = native;
03911    /* User perspective is fmt */
03912    *format = fmt;
03913    /* Free any read translation we have right now */
03914    if (*trans)
03915       ast_translator_free_path(*trans);
03916    /* Build a translation path from the raw format to the desired format */
03917    if (!direction)
03918       /* reading */
03919       *trans = ast_translator_build_path(*format, *rawformat);
03920    else
03921       /* writing */
03922       *trans = ast_translator_build_path(*rawformat, *format);
03923    ast_channel_unlock(chan);
03924    ast_debug(1, "Set channel %s to %s format %s\n", chan->name,
03925       direction ? "write" : "read", ast_getformatname(fmt));
03926    return 0;
03927 }
03928 
03929 int ast_set_read_format(struct ast_channel *chan, int fmt)
03930 {
03931    return set_format(chan, fmt, &chan->rawreadformat, &chan->readformat,
03932            &chan->readtrans, 0);
03933 }
03934 
03935 int ast_set_write_format(struct ast_channel *chan, int fmt)
03936 {
03937    return set_format(chan, fmt, &chan->rawwriteformat, &chan->writeformat,
03938            &chan->writetrans, 1);
03939 }
03940 
03941 const char *ast_channel_reason2str(int reason)
03942 {
03943    switch (reason) /* the following appear to be the only ones actually returned by request_and_dial */
03944    {
03945    case 0:
03946       return "Call Failure (not BUSY, and not NO_ANSWER, maybe Circuit busy or down?)";
03947    case AST_CONTROL_HANGUP:
03948       return "Hangup";
03949    case AST_CONTROL_RING:
03950       return "Local Ring";
03951    case AST_CONTROL_RINGING:
03952       return "Remote end Ringing";
03953    case AST_CONTROL_ANSWER:
03954       return "Remote end has Answered";
03955    case AST_CONTROL_BUSY:
03956       return "Remote end is Busy";
03957    case AST_CONTROL_CONGESTION:
03958       return "Congestion (circuits busy)";
03959    default:
03960       return "Unknown Reason!!";
03961    }
03962 }
03963 
03964 static void handle_cause(int cause, int *outstate)
03965 {
03966    if (outstate) {
03967       /* compute error and return */
03968       if (cause == AST_CAUSE_BUSY)
03969          *outstate = AST_CONTROL_BUSY;
03970       else if (cause == AST_CAUSE_CONGESTION)
03971          *outstate = AST_CONTROL_CONGESTION;
03972       else
03973          *outstate = 0;
03974    }
03975 }
03976 
03977 struct ast_channel *ast_call_forward(struct ast_channel *caller, struct ast_channel *orig, int *timeout, int format, struct outgoing_helper *oh, int *outstate)
03978 {
03979    char tmpchan[256];
03980    struct ast_channel *new = NULL;
03981    char *data, *type;
03982    int cause = 0;
03983 
03984    /* gather data and request the new forward channel */
03985    ast_copy_string(tmpchan, orig->call_forward, sizeof(tmpchan));
03986    if ((data = strchr(tmpchan, '/'))) {
03987       *data++ = '\0';
03988       type = tmpchan;
03989    } else {
03990       const char *forward_context;
03991       ast_channel_lock(orig);
03992       forward_context = pbx_builtin_getvar_helper(orig, "FORWARD_CONTEXT");
03993       snprintf(tmpchan, sizeof(tmpchan), "%s@%s", orig->call_forward, S_OR(forward_context, orig->context));
03994       ast_channel_unlock(orig);
03995       data = tmpchan;
03996       type = "Local";
03997    }
03998    if (!(new = ast_request(type, format, data, &cause))) {
03999       ast_log(LOG_NOTICE, "Unable to create channel for call forward to '%s/%s' (cause = %d)\n", type, data, cause);
04000       handle_cause(cause, outstate);
04001       ast_hangup(orig);
04002       return NULL;
04003    }
04004 
04005    /* Copy/inherit important information into new channel */
04006    if (oh) {
04007       if (oh->vars) {
04008          ast_set_variables(new, oh->vars);
04009       }
04010       if (!ast_strlen_zero(oh->cid_num) && !ast_strlen_zero(oh->cid_name)) {
04011          ast_set_callerid(new, oh->cid_num, oh->cid_name, oh->cid_num);
04012       }
04013       if (oh->parent_channel) {
04014          ast_channel_inherit_variables(oh->parent_channel, new);
04015          ast_channel_datastore_inherit(oh->parent_channel, new);
04016       }
04017       if (oh->account) {
04018          ast_cdr_setaccount(new, oh->account);
04019       }
04020    } else if (caller) { /* no outgoing helper so use caller if avaliable */
04021       ast_channel_inherit_variables(caller, new);
04022       ast_channel_datastore_inherit(caller, new);
04023    }
04024 
04025    ast_channel_lock(orig);
04026    while (ast_channel_trylock(new)) {
04027       CHANNEL_DEADLOCK_AVOIDANCE(orig);
04028    }
04029    ast_copy_flags(new->cdr, orig->cdr, AST_CDR_FLAG_ORIGINATED);
04030    ast_string_field_set(new, accountcode, orig->accountcode);
04031    if (!ast_strlen_zero(orig->cid.cid_num) && !ast_strlen_zero(new->cid.cid_name)) {
04032       ast_set_callerid(new, orig->cid.cid_num, orig->cid.cid_name, orig->cid.cid_num);
04033    }
04034    ast_channel_unlock(new);
04035    ast_channel_unlock(orig);
04036 
04037    /* call new channel */
04038    if ((*timeout = ast_call(new, data, 0))) {
04039       ast_log(LOG_NOTICE, "Unable to call forward to channel %s/%s\n", type, (char *)data);
04040       ast_hangup(orig);
04041       ast_hangup(new);
04042       return NULL;
04043    }
04044    ast_hangup(orig);
04045 
04046    return new;
04047 }
04048 
04049 struct ast_channel *__ast_request_and_dial(const char *type, int format, void *data, int timeout, int *outstate, const char *cid_num, const char *cid_name, struct outgoing_helper *oh)
04050 {
04051    int dummy_outstate;
04052    int cause = 0;
04053    struct ast_channel *chan;
04054    int res = 0;
04055    int last_subclass = 0;
04056    
04057    if (outstate)
04058       *outstate = 0;
04059    else
04060       outstate = &dummy_outstate;   /* make outstate always a valid pointer */
04061 
04062    chan = ast_request(type, format, data, &cause);
04063    if (!chan) {
04064       ast_log(LOG_NOTICE, "Unable to request channel %s/%s\n", type, (char *)data);
04065       handle_cause(cause, outstate);
04066       return NULL;
04067    }
04068 
04069    if (oh) {
04070       if (oh->vars)  
04071          ast_set_variables(chan, oh->vars);
04072       /* XXX why is this necessary, for the parent_channel perhaps ? */
04073       if (!ast_strlen_zero(oh->cid_num) && !ast_strlen_zero(oh->cid_name))
04074          ast_set_callerid(chan, oh->cid_num, oh->cid_name, oh->cid_num);
04075       if (oh->parent_channel) {
04076          ast_channel_inherit_variables(oh->parent_channel, chan);
04077          ast_channel_datastore_inherit(oh->parent_channel, chan);
04078       }
04079       if (oh->account)
04080          ast_cdr_setaccount(chan, oh->account); 
04081    }
04082    ast_set_callerid(chan, cid_num, cid_name, cid_num);
04083    ast_set_flag(chan->cdr, AST_CDR_FLAG_ORIGINATED);
04084 
04085    if (ast_call(chan, data, 0)) {   /* ast_call failed... */
04086       ast_log(LOG_NOTICE, "Unable to call channel %s/%s\n", type, (char *)data);
04087    } else {
04088       res = 1; /* mark success in case chan->_state is already AST_STATE_UP */
04089       while (timeout && chan->_state != AST_STATE_UP) {
04090          struct ast_frame *f;
04091          res = ast_waitfor(chan, timeout);
04092          if (res == 0) { /* timeout, treat it like ringing */
04093             *outstate = AST_CONTROL_RINGING;
04094             break;
04095          }
04096          if (res < 0) /* error or done */
04097             break;
04098          if (timeout > -1)
04099             timeout = res;
04100          if (!ast_strlen_zero(chan->call_forward)) {
04101             if (!(chan = ast_call_forward(NULL, chan, &timeout, format, oh, outstate))) {
04102                return NULL;
04103             }
04104             continue;
04105          }
04106 
04107          f = ast_read(chan);
04108          if (!f) {
04109             *outstate = AST_CONTROL_HANGUP;
04110             res = 0;
04111             break;
04112          }
04113          if (f->frametype == AST_FRAME_CONTROL) {
04114             switch (f->subclass) {
04115             case AST_CONTROL_RINGING:  /* record but keep going */
04116                *outstate = f->subclass;
04117                break;
04118 
04119             case AST_CONTROL_BUSY:
04120                ast_cdr_busy(chan->cdr);
04121                *outstate = f->subclass;
04122                timeout = 0;
04123                break;
04124 
04125             case AST_CONTROL_CONGESTION:
04126                ast_cdr_failed(chan->cdr);
04127                *outstate = f->subclass;
04128                timeout = 0;
04129                break;
04130 
04131             case AST_CONTROL_ANSWER:
04132                ast_cdr_answer(chan->cdr);
04133                *outstate = f->subclass;
04134                timeout = 0;      /* trick to force exit from the while() */
04135                break;
04136 
04137             /* Ignore these */
04138             case AST_CONTROL_PROGRESS:
04139             case AST_CONTROL_PROCEEDING:
04140             case AST_CONTROL_HOLD:
04141             case AST_CONTROL_UNHOLD:
04142             case AST_CONTROL_VIDUPDATE:
04143             case AST_CONTROL_SRCUPDATE:
04144             case AST_CONTROL_SRCCHANGE:
04145             case -1:       /* Ignore -- just stopping indications */
04146                break;
04147 
04148             default:
04149                ast_log(LOG_NOTICE, "Don't know what to do with control frame %d\n", f->subclass);
04150             }
04151             last_subclass = f->subclass;
04152          }
04153          ast_frfree(f);
04154       }
04155    }
04156 
04157    /* Final fixups */
04158    if (oh) {
04159       if (!ast_strlen_zero(oh->context))
04160          ast_copy_string(chan->context, oh->context, sizeof(chan->context));
04161       if (!ast_strlen_zero(oh->exten))
04162          ast_copy_string(chan->exten, oh->exten, sizeof(chan->exten));
04163       if (oh->priority) 
04164          chan->priority = oh->priority;
04165    }
04166    if (chan->_state == AST_STATE_UP)
04167       *outstate = AST_CONTROL_ANSWER;
04168 
04169    if (res <= 0) {
04170       if ( AST_CONTROL_RINGING == last_subclass ) 
04171          chan->hangupcause = AST_CAUSE_NO_ANSWER;
04172       if (!chan->cdr && (chan->cdr = ast_cdr_alloc()))
04173          ast_cdr_init(chan->cdr, chan);
04174       if (chan->cdr) {
04175          char tmp[256];
04176          snprintf(tmp, sizeof(tmp), "%s/%s", type, (char *)data);
04177          ast_cdr_setapp(chan->cdr,"Dial",tmp);
04178          ast_cdr_update(chan);
04179          ast_cdr_start(chan->cdr);
04180          ast_cdr_end(chan->cdr);
04181          /* If the cause wasn't handled properly */
04182          if (ast_cdr_disposition(chan->cdr,chan->hangupcause))
04183             ast_cdr_failed(chan->cdr);
04184       }
04185       ast_hangup(chan);
04186       chan = NULL;
04187    }
04188    return chan;
04189 }
04190 
04191 struct ast_channel *ast_request_and_dial(const char *type, int format, void *data, int timeout, int *outstate, const char *cidnum, const char *cidname)
04192 {
04193    return __ast_request_and_dial(type, format, data, timeout, outstate, cidnum, cidname, NULL);
04194 }
04195 
04196 struct ast_channel *ast_request(const char *type, int format, void *data, int *cause)
04197 {
04198    struct chanlist *chan;
04199    struct ast_channel *c;
04200    int capabilities;
04201    int fmt;
04202    int res;
04203    int foo;
04204    int videoformat = format & AST_FORMAT_VIDEO_MASK;
04205    int textformat = format & AST_FORMAT_TEXT_MASK;
04206 
04207    if (!cause)
04208       cause = &foo;
04209    *cause = AST_CAUSE_NOTDEFINED;
04210 
04211    if (AST_RWLIST_RDLOCK(&channels)) {
04212       ast_log(LOG_WARNING, "Unable to lock channel list\n");
04213       return NULL;
04214    }
04215 
04216    AST_LIST_TRAVERSE(&backends, chan, list) {
04217       if (strcasecmp(type, chan->tech->type))
04218          continue;
04219 
04220       capabilities = chan->tech->capabilities;
04221       fmt = format & AST_FORMAT_AUDIO_MASK;
04222       if (fmt) {
04223          /* We have audio - is it possible to connect the various calls to each other? 
04224             (Avoid this check for calls without audio, like text+video calls)
04225          */
04226          res = ast_translator_best_choice(&fmt, &capabilities);
04227          if (res < 0) {
04228             ast_log(LOG_WARNING, "No translator path exists for channel type %s (native 0x%x) to 0x%x\n", type, chan->tech->capabilities, format);
04229             *cause = AST_CAUSE_BEARERCAPABILITY_NOTAVAIL;
04230             AST_RWLIST_UNLOCK(&channels);
04231             return NULL;
04232          }
04233       }
04234       AST_RWLIST_UNLOCK(&channels);
04235       if (!chan->tech->requester)
04236          return NULL;
04237       
04238       if (!(c = chan->tech->requester(type, capabilities | videoformat | textformat, data, cause)))
04239          return NULL;
04240       
04241       /* no need to generate a Newchannel event here; it is done in the channel_alloc call */
04242       return c;
04243    }
04244 
04245    ast_log(LOG_WARNING, "No channel type registered for '%s'\n", type);
04246    *cause = AST_CAUSE_NOSUCHDRIVER;
04247    AST_RWLIST_UNLOCK(&channels);
04248 
04249    return NULL;
04250 }
04251 
04252 int ast_call(struct ast_channel *chan, char *addr, int timeout)
04253 {
04254    /* Place an outgoing call, but don't wait any longer than timeout ms before returning.
04255       If the remote end does not answer within the timeout, then do NOT hang up, but
04256       return anyway.  */
04257    int res = -1;
04258    /* Stop if we're a zombie or need a soft hangup */
04259    ast_channel_lock(chan);
04260    if (!ast_test_flag(chan, AST_FLAG_ZOMBIE) && !ast_check_hangup(chan)) {
04261       if (chan->cdr) {
04262          ast_set_flag(chan->cdr, AST_CDR_FLAG_DIALED);
04263       }
04264       if (chan->tech->call)
04265          res = chan->tech->call(chan, addr, timeout);
04266       ast_set_flag(chan, AST_FLAG_OUTGOING);
04267    }
04268    ast_channel_unlock(chan);
04269    return res;
04270 }
04271 
04272 /*!
04273   \brief Transfer a call to dest, if the channel supports transfer
04274 
04275   Called by:
04276    \arg app_transfer
04277    \arg the manager interface
04278 */
04279 int ast_transfer(struct ast_channel *chan, char *dest)
04280 {
04281    int res = -1;
04282 
04283    /* Stop if we're a zombie or need a soft hangup */
04284    ast_channel_lock(chan);
04285    if (!ast_test_flag(chan, AST_FLAG_ZOMBIE) && !ast_check_hangup(chan)) {
04286       if (chan->tech->transfer) {
04287          res = chan->tech->transfer(chan, dest);
04288          if (!res)
04289             res = 1;
04290       } else
04291          res = 0;
04292    }
04293    ast_channel_unlock(chan);
04294    return res;
04295 }
04296 
04297 int ast_readstring(struct ast_channel *c, char *s, int len, int timeout, int ftimeout, char *enders)
04298 {
04299    return ast_readstring_full(c, s, len, timeout, ftimeout, enders, -1, -1);
04300 }
04301 
04302 int ast_readstring_full(struct ast_channel *c, char *s, int len, int timeout, int ftimeout, char *enders, int audiofd, int ctrlfd)
04303 {
04304    int pos = 0;   /* index in the buffer where we accumulate digits */
04305    int to = ftimeout;
04306 
04307    /* Stop if we're a zombie or need a soft hangup */
04308    if (ast_test_flag(c, AST_FLAG_ZOMBIE) || ast_check_hangup(c))
04309       return -1;
04310    if (!len)
04311       return -1;
04312    for (;;) {
04313       int d;
04314       if (c->stream) {
04315          d = ast_waitstream_full(c, AST_DIGIT_ANY, audiofd, ctrlfd);
04316          ast_stopstream(c);
04317          usleep(1000);
04318          if (!d)
04319             d = ast_waitfordigit_full(c, to, audiofd, ctrlfd);
04320       } else {
04321          d = ast_waitfordigit_full(c, to, audiofd, ctrlfd);
04322       }
04323       if (d < 0)
04324          return AST_GETDATA_FAILED;
04325       if (d == 0) {
04326          s[pos] = '\0';
04327          return AST_GETDATA_TIMEOUT;
04328       }
04329       if (d == 1) {
04330          s[pos] = '\0';
04331          return AST_GETDATA_INTERRUPTED;
04332       }
04333       if (strchr(enders, d) && (pos == 0)) {
04334          s[pos] = '\0';
04335          return AST_GETDATA_EMPTY_END_TERMINATED;
04336       }
04337       if (!strchr(enders, d)) {
04338          s[pos++] = d;
04339       }
04340       if (strchr(enders, d) || (pos >= len)) {
04341          s[pos] = '\0';
04342          return AST_GETDATA_COMPLETE;
04343       }
04344       to = timeout;
04345    }
04346    /* Never reached */
04347    return 0;
04348 }
04349 
04350 int ast_channel_supports_html(struct ast_channel *chan)
04351 {
04352    return (chan->tech->send_html) ? 1 : 0;
04353 }
04354 
04355 int ast_channel_sendhtml(struct ast_channel *chan, int subclass, const char *data, int datalen)
04356 {
04357    if (chan->tech->send_html)
04358       return chan->tech->send_html(chan, subclass, data, datalen);
04359    return -1;
04360 }
04361 
04362 int ast_channel_sendurl(struct ast_channel *chan, const char *url)
04363 {
04364    return ast_channel_sendhtml(chan, AST_HTML_URL, url, strlen(url) + 1);
04365 }
04366 
04367 /*! \brief Set up translation from one channel to another */
04368 static int ast_channel_make_compatible_helper(struct ast_channel *from, struct ast_channel *to)
04369 {
04370    int src;
04371    int dst;
04372    int use_slin;
04373 
04374    if (from->readformat == to->writeformat && from->writeformat == to->readformat) {
04375       /* Already compatible!  Moving on ... */
04376       return 0;
04377    }
04378 
04379    /* Set up translation from the 'from' channel to the 'to' channel */
04380    src = from->nativeformats;
04381    dst = to->nativeformats;
04382 
04383    /* If there's no audio in this call, don't bother with trying to find a translation path */
04384    if ((src & AST_FORMAT_AUDIO_MASK) == 0 || (dst & AST_FORMAT_AUDIO_MASK) == 0)
04385       return 0;
04386 
04387    if (ast_translator_best_choice(&dst, &src) < 0) {
04388       ast_log(LOG_WARNING, "No path to translate from %s(%d) to %s(%d)\n", from->name, src, to->name, dst);
04389       return -1;
04390    }
04391 
04392    /* if the best path is not 'pass through', then
04393     * transcoding is needed; if desired, force transcode path
04394     * to use SLINEAR between channels, but only if there is
04395     * no direct conversion available. If generic PLC is
04396     * desired, then transcoding via SLINEAR is a requirement
04397     */
04398    use_slin = (src == AST_FORMAT_SLINEAR || dst == AST_FORMAT_SLINEAR);
04399    if ((src != dst) && (ast_opt_generic_plc || ast_opt_transcode_via_slin) &&
04400        (ast_translate_path_steps(dst, src) != 1 || use_slin))
04401       dst = AST_FORMAT_SLINEAR;
04402    if (ast_set_read_format(from, dst) < 0) {
04403       ast_log(LOG_WARNING, "Unable to set read format on channel %s to %d\n", from->name, dst);
04404       return -1;
04405    }
04406    if (ast_set_write_format(to, dst) < 0) {
04407       ast_log(LOG_WARNING, "Unable to set write format on channel %s to %d\n", to->name, dst);
04408       return -1;
04409    }
04410    return 0;
04411 }
04412 
04413 int ast_channel_make_compatible(struct ast_channel *chan, struct ast_channel *peer)
04414 {
04415    /* Some callers do not check return code, and we must try to set all call legs correctly */
04416    int rc = 0;
04417 
04418    /* Set up translation from the chan to the peer */
04419    rc = ast_channel_make_compatible_helper(chan, peer);
04420 
04421    if (rc < 0)
04422       return rc;
04423 
04424    /* Set up translation from the peer to the chan */
04425    rc = ast_channel_make_compatible_helper(peer, chan);
04426 
04427    return rc;
04428 }
04429 
04430 int ast_channel_masquerade(struct ast_channel *original, struct ast_channel *clonechan)
04431 {
04432    int res = -1;
04433    struct ast_channel *final_orig, *final_clone, *base;
04434 
04435 retrymasq:
04436    final_orig = original;
04437    final_clone = clonechan;
04438 
04439    ast_channel_lock(original);
04440    while (ast_channel_trylock(clonechan)) {
04441       ast_channel_unlock(original);
04442       usleep(1);
04443       ast_channel_lock(original);
04444    }
04445 
04446    /* each of these channels may be sitting behind a channel proxy (i.e. chan_agent)
04447       and if so, we don't really want to masquerade it, but its proxy */
04448    if (original->_bridge && (original->_bridge != ast_bridged_channel(original)) && (original->_bridge->_bridge != original))
04449       final_orig = original->_bridge;
04450 
04451    if (clonechan->_bridge && (clonechan->_bridge != ast_bridged_channel(clonechan)) && (clonechan->_bridge->_bridge != clonechan))
04452       final_clone = clonechan->_bridge;
04453    
04454    if (final_clone->tech->get_base_channel && (base = final_clone->tech->get_base_channel(final_clone))) {
04455       final_clone = base;
04456    }
04457 
04458    if ((final_orig != original) || (final_clone != clonechan)) {
04459       /* Lots and lots of deadlock avoidance.  The main one we're competing with
04460        * is ast_write(), which locks channels recursively, when working with a
04461        * proxy channel. */
04462       if (ast_channel_trylock(final_orig)) {
04463          ast_channel_unlock(clonechan);
04464          ast_channel_unlock(original);
04465          goto retrymasq;
04466       }
04467       if (ast_channel_trylock(final_clone)) {
04468          ast_channel_unlock(final_orig);
04469          ast_channel_unlock(clonechan);
04470          ast_channel_unlock(original);
04471          goto retrymasq;
04472       }
04473       ast_channel_unlock(clonechan);
04474       ast_channel_unlock(original);
04475       original = final_orig;
04476       clonechan = final_clone;
04477    }
04478 
04479    if (original == clonechan) {
04480       ast_log(LOG_WARNING, "Can't masquerade channel '%s' into itself!\n", original->name);
04481       ast_channel_unlock(clonechan);
04482       ast_channel_unlock(original);
04483       return -1;
04484    }
04485 
04486    ast_debug(1, "Planning to masquerade channel %s into the structure of %s\n",
04487       clonechan->name, original->name);
04488    if (original->masq) {
04489       ast_log(LOG_WARNING, "%s is already going to masquerade as %s\n",
04490          original->masq->name, original->name);
04491    } else if (clonechan->masqr) {
04492       ast_log(LOG_WARNING, "%s is already going to masquerade as %s\n",
04493          clonechan->name, clonechan->masqr->name);
04494    } else {
04495       original->masq = clonechan;
04496       clonechan->masqr = original;
04497       ast_queue_frame(original, &ast_null_frame);
04498       ast_queue_frame(clonechan, &ast_null_frame);
04499       ast_debug(1, "Done planning to masquerade channel %s into the structure of %s\n", clonechan->name, original->name);
04500       res = 0;
04501    }
04502 
04503    ast_channel_unlock(clonechan);
04504    ast_channel_unlock(original);
04505 
04506    return res;
04507 }
04508 
04509 void ast_change_name(struct ast_channel *chan, char *newname)
04510 {
04511    manager_event(EVENT_FLAG_CALL, "Rename", "Channel: %s\r\nNewname: %s\r\nUniqueid: %s\r\n", chan->name, newname, chan->uniqueid);
04512    ast_string_field_set(chan, name, newname);
04513 }
04514 
04515 void ast_channel_inherit_variables(const struct ast_channel *parent, struct ast_channel *child)
04516 {
04517    struct ast_var_t *current, *newvar;
04518    const char *varname;
04519 
04520    AST_LIST_TRAVERSE(&parent->varshead, current, entries) {
04521       int vartype = 0;
04522 
04523       varname = ast_var_full_name(current);
04524       if (!varname)
04525          continue;
04526 
04527       if (varname[0] == '_') {
04528          vartype = 1;
04529          if (varname[1] == '_')
04530             vartype = 2;
04531       }
04532 
04533       switch (vartype) {
04534       case 1:
04535          newvar = ast_var_assign(&varname[1], ast_var_value(current));
04536          if (newvar) {
04537             AST_LIST_INSERT_TAIL(&child->varshead, newvar, entries);
04538             ast_debug(1, "Copying soft-transferable variable %s.\n", ast_var_name(newvar));
04539          }
04540          break;
04541       case 2:
04542          newvar = ast_var_assign(varname, ast_var_value(current));
04543          if (newvar) {
04544             AST_LIST_INSERT_TAIL(&child->varshead, newvar, entries);
04545             ast_debug(1, "Copying hard-transferable variable %s.\n", ast_var_name(newvar));
04546          }
04547          break;
04548       default:
04549          ast_debug(1, "Not copying variable %s.\n", ast_var_name(current));
04550          break;
04551       }
04552    }
04553 }
04554 
04555 /*!
04556   \brief Clone channel variables from 'clone' channel into 'original' channel
04557 
04558   All variables except those related to app_groupcount are cloned.
04559   Variables are actually _removed_ from 'clone' channel, presumably
04560   because it will subsequently be destroyed.
04561 
04562   \note Assumes locks will be in place on both channels when called.
04563 */
04564 static void clone_variables(struct ast_channel *original, struct ast_channel *clonechan)
04565 {
04566    struct ast_var_t *current, *newvar;
04567    /* Append variables from clone channel into original channel */
04568    /* XXX Is this always correct?  We have to in order to keep MACROS working XXX */
04569    if (AST_LIST_FIRST(&clonechan->varshead))
04570       AST_LIST_APPEND_LIST(&original->varshead, &clonechan->varshead, entries);
04571 
04572    /* then, dup the varshead list into the clone */
04573    
04574    AST_LIST_TRAVERSE(&original->varshead, current, entries) {
04575       newvar = ast_var_assign(current->name, current->value);
04576       if (newvar)
04577          AST_LIST_INSERT_TAIL(&clonechan->varshead, newvar, entries);
04578    }
04579 }
04580 
04581 /*!
04582  * \pre chan is locked
04583  */
04584 static void report_new_callerid(const struct ast_channel *chan)
04585 {
04586    manager_event(EVENT_FLAG_CALL, "NewCallerid",
04587             "Channel: %s\r\n"
04588             "CallerIDNum: %s\r\n"
04589             "CallerIDName: %s\r\n"
04590             "Uniqueid: %s\r\n"
04591             "CID-CallingPres: %d (%s)\r\n",
04592             chan->name,
04593             S_OR(chan->cid.cid_num, ""),
04594             S_OR(chan->cid.cid_name, ""),
04595             chan->uniqueid,
04596             chan->cid.cid_pres,
04597             ast_describe_caller_presentation(chan->cid.cid_pres)
04598             );
04599 }
04600 
04601 /*!
04602   \brief Masquerade a channel
04603 
04604   \note Assumes channel will be locked when called
04605 */
04606 int ast_do_masquerade(struct ast_channel *original)
04607 {
04608    int x,i;
04609    int res=0;
04610    int origstate;
04611    struct ast_frame *current;
04612    const struct ast_channel_tech *t;
04613    void *t_pvt;
04614    struct ast_callerid tmpcid;
04615    struct ast_channel *clonechan = original->masq;
04616    struct ast_channel *bridged;
04617    struct ast_cdr *cdr;
04618    int rformat = original->readformat;
04619    int wformat = original->writeformat;
04620    char newn[AST_CHANNEL_NAME];
04621    char orig[AST_CHANNEL_NAME];
04622    char masqn[AST_CHANNEL_NAME];
04623    char zombn[AST_CHANNEL_NAME];
04624 
04625    ast_debug(4, "Actually Masquerading %s(%d) into the structure of %s(%d)\n",
04626       clonechan->name, clonechan->_state, original->name, original->_state);
04627 
04628    manager_event(EVENT_FLAG_CALL, "Masquerade", "Clone: %s\r\nCloneState: %s\r\nOriginal: %s\r\nOriginalState: %s\r\n",
04629             clonechan->name, ast_state2str(clonechan->_state), original->name, ast_state2str(original->_state));
04630 
04631    /* XXX This operation is a bit odd.  We're essentially putting the guts of
04632     * the clone channel into the original channel.  Start by killing off the
04633     * original channel's backend.  While the features are nice, which is the
04634     * reason we're keeping it, it's still awesomely weird. XXX */
04635 
04636    /* We need the clone's lock, too */
04637    ast_channel_lock(clonechan);
04638 
04639    ast_debug(2, "Got clone lock for masquerade on '%s' at %p\n", clonechan->name, &clonechan->lock_dont_use);
04640 
04641    /* Having remembered the original read/write formats, we turn off any translation on either
04642       one */
04643    free_translation(clonechan);
04644    free_translation(original);
04645 
04646 
04647    /* Unlink the masquerade */
04648    original->masq = NULL;
04649    clonechan->masqr = NULL;
04650    
04651    /* Save the original name */
04652    ast_copy_string(orig, original->name, sizeof(orig));
04653    /* Save the new name */
04654    ast_copy_string(newn, clonechan->name, sizeof(newn));
04655    /* Create the masq name */
04656    snprintf(masqn, sizeof(masqn), "%s<MASQ>", newn);
04657       
04658    /* Copy the name from the clone channel */
04659    ast_string_field_set(original, name, newn);
04660 
04661    /* Mangle the name of the clone channel */
04662    ast_string_field_set(clonechan, name, masqn);
04663    
04664    /* Notify any managers of the change, first the masq then the other */
04665    manager_event(EVENT_FLAG_CALL, "Rename", "Channel: %s\r\nNewname: %s\r\nUniqueid: %s\r\n", newn, masqn, clonechan->uniqueid);
04666    manager_event(EVENT_FLAG_CALL, "Rename", "Channel: %s\r\nNewname: %s\r\nUniqueid: %s\r\n", orig, newn, original->uniqueid);
04667 
04668    /* Swap the technologies */   
04669    t = original->tech;
04670    original->tech = clonechan->tech;
04671    clonechan->tech = t;
04672 
04673    /* Swap the cdrs */
04674    cdr = original->cdr;
04675    original->cdr = clonechan->cdr;
04676    clonechan->cdr = cdr;
04677 
04678    t_pvt = original->tech_pvt;
04679    original->tech_pvt = clonechan->tech_pvt;
04680    clonechan->tech_pvt = t_pvt;
04681 
04682    /* Swap the alertpipes */
04683    for (i = 0; i < 2; i++) {
04684       x = original->alertpipe[i];
04685       original->alertpipe[i] = clonechan->alertpipe[i];
04686       clonechan->alertpipe[i] = x;
04687    }
04688 
04689    /* 
04690     * Swap the readq's.  The end result should be this:
04691     *
04692     *  1) All frames should be on the new (original) channel.
04693     *  2) Any frames that were already on the new channel before this
04694     *     masquerade need to be at the end of the readq, after all of the
04695     *     frames on the old (clone) channel.
04696     *  3) The alertpipe needs to get poked for every frame that was already
04697     *     on the new channel, since we are now using the alert pipe from the
04698     *     old (clone) channel.
04699     */
04700    {
04701       AST_LIST_HEAD_NOLOCK(, ast_frame) tmp_readq;
04702       AST_LIST_HEAD_SET_NOLOCK(&tmp_readq, NULL);
04703 
04704       AST_LIST_APPEND_LIST(&tmp_readq, &original->readq, frame_list);
04705       AST_LIST_APPEND_LIST(&original->readq, &clonechan->readq, frame_list);
04706 
04707       while ((current = AST_LIST_REMOVE_HEAD(&tmp_readq, frame_list))) {
04708          AST_LIST_INSERT_TAIL(&original->readq, current, frame_list);
04709          if (original->alertpipe[1] > -1) {
04710             int poke = 0;
04711 
04712             if (write(original->alertpipe[1], &poke, sizeof(poke)) < 0) {
04713                ast_log(LOG_WARNING, "write() failed: %s\n", strerror(errno));
04714             }
04715          }
04716       }
04717    }
04718 
04719    /* Swap the raw formats */
04720    x = original->rawreadformat;
04721    original->rawreadformat = clonechan->rawreadformat;
04722    clonechan->rawreadformat = x;
04723    x = original->rawwriteformat;
04724    original->rawwriteformat = clonechan->rawwriteformat;
04725    clonechan->rawwriteformat = x;
04726 
04727    clonechan->_softhangup = AST_SOFTHANGUP_DEV;
04728 
04729    /* And of course, so does our current state.  Note we need not
04730       call ast_setstate since the event manager doesn't really consider
04731       these separate.  We do this early so that the clone has the proper
04732       state of the original channel. */
04733    origstate = original->_state;
04734    original->_state = clonechan->_state;
04735    clonechan->_state = origstate;
04736 
04737    if (clonechan->tech->fixup){
04738       res = clonechan->tech->fixup(original, clonechan);
04739       if (res)
04740          ast_log(LOG_WARNING, "Fixup failed on channel %s, strange things may happen.\n", clonechan->name);
04741    }
04742 
04743    /* Start by disconnecting the original's physical side */
04744    if (clonechan->tech->hangup)
04745       res = clonechan->tech->hangup(clonechan);
04746    if (res) {
04747       ast_log(LOG_WARNING, "Hangup failed!  Strange things may happen!\n");
04748       ast_channel_unlock(clonechan);
04749       return -1;
04750    }
04751 
04752    snprintf(zombn, sizeof(zombn), "%s<ZOMBIE>", orig);
04753    /* Mangle the name of the clone channel */
04754    ast_string_field_set(clonechan, name, zombn);
04755    manager_event(EVENT_FLAG_CALL, "Rename", "Channel: %s\r\nNewname: %s\r\nUniqueid: %s\r\n", masqn, zombn, clonechan->uniqueid);
04756 
04757    /* Update the type. */
04758    t_pvt = original->monitor;
04759    original->monitor = clonechan->monitor;
04760    clonechan->monitor = t_pvt;
04761 
04762    /* Keep the same language.  */
04763    ast_string_field_set(original, language, clonechan->language);
04764    /* Copy the FD's other than the generator fd */
04765    for (x = 0; x < AST_MAX_FDS; x++) {
04766       if (x != AST_GENERATOR_FD)
04767          ast_channel_set_fd(original, x, clonechan->fds[x]);
04768    }
04769 
04770    ast_app_group_update(clonechan, original);
04771 
04772    /* Move data stores over */
04773    if (AST_LIST_FIRST(&clonechan->datastores)) {
04774       struct ast_datastore *ds;
04775       /* We use a safe traversal here because some fixup routines actually
04776        * remove the datastore from the list and free them.
04777        */
04778       AST_LIST_TRAVERSE_SAFE_BEGIN(&clonechan->datastores, ds, entry) {
04779          if (ds->info->chan_fixup)
04780             ds->info->chan_fixup(ds->data, clonechan, original);
04781       }
04782       AST_LIST_TRAVERSE_SAFE_END;
04783       AST_LIST_APPEND_LIST(&original->datastores, &clonechan->datastores, entry);
04784    }
04785 
04786    clone_variables(original, clonechan);
04787    /* Presense of ADSI capable CPE follows clone */
04788    original->adsicpe = clonechan->adsicpe;
04789    /* Bridge remains the same */
04790    /* CDR fields remain the same */
04791    /* XXX What about blocking, softhangup, blocker, and lock and blockproc? XXX */
04792    /* Application and data remain the same */
04793    /* Clone exception  becomes real one, as with fdno */
04794    ast_set_flag(original, ast_test_flag(clonechan, AST_FLAG_OUTGOING | AST_FLAG_EXCEPTION));
04795    original->fdno = clonechan->fdno;
04796    /* Schedule context remains the same */
04797    /* Stream stuff stays the same */
04798    /* Keep the original state.  The fixup code will need to work with it most likely */
04799 
04800    /* Just swap the whole structures, nevermind the allocations, they'll work themselves
04801       out. */
04802    tmpcid = original->cid;
04803    original->cid = clonechan->cid;
04804    clonechan->cid = tmpcid;
04805    report_new_callerid(original);
04806 
04807    /* Restore original timing file descriptor */
04808    ast_channel_set_fd(original, AST_TIMING_FD, original->timingfd);
04809 
04810    /* Our native formats are different now */
04811    original->nativeformats = clonechan->nativeformats;
04812 
04813    /* Context, extension, priority, app data, jump table,  remain the same */
04814    /* pvt switches.  pbx stays the same, as does next */
04815 
04816    /* Set the write format */
04817    ast_set_write_format(original, wformat);
04818 
04819    /* Set the read format */
04820    ast_set_read_format(original, rformat);
04821 
04822    /* Copy the music class */
04823    ast_string_field_set(original, musicclass, clonechan->musicclass);
04824 
04825    ast_debug(1, "Putting channel %s in %d/%d formats\n", original->name, wformat, rformat);
04826 
04827    /* Okay.  Last thing is to let the channel driver know about all this mess, so he
04828       can fix up everything as best as possible */
04829    if (original->tech->fixup) {
04830       res = original->tech->fixup(clonechan, original);
04831       if (res) {
04832          ast_log(LOG_WARNING, "Channel for type '%s' could not fixup channel %s\n",
04833             original->tech->type, original->name);
04834          ast_channel_unlock(clonechan);
04835          return -1;
04836       }
04837    } else
04838       ast_log(LOG_WARNING, "Channel type '%s' does not have a fixup routine (for %s)!  Bad things may happen.\n",
04839          original->tech->type, original->name);
04840 
04841    /* 
04842     * If an indication is currently playing, maintain it on the channel 
04843     * that is taking the place of original 
04844     *
04845     * This is needed because the masquerade is swapping out in the internals
04846     * of this channel, and the new channel private data needs to be made
04847     * aware of the current visible indication (RINGING, CONGESTION, etc.)
04848     */
04849    if (original->visible_indication) {
04850       ast_indicate(original, original->visible_indication);
04851    }
04852    
04853    /* Now, at this point, the "clone" channel is totally F'd up.  We mark it as
04854       a zombie so nothing tries to touch it.  If it's already been marked as a
04855       zombie, then free it now (since it already is considered invalid). */
04856    if (ast_test_flag(clonechan, AST_FLAG_ZOMBIE)) {
04857       ast_debug(1, "Destroying channel clone '%s'\n", clonechan->name);
04858       ast_channel_unlock(clonechan);
04859       manager_event(EVENT_FLAG_CALL, "Hangup",
04860          "Channel: %s\r\n"
04861          "Uniqueid: %s\r\n"
04862          "Cause: %d\r\n"
04863          "Cause-txt: %s\r\n",
04864          clonechan->name,
04865          clonechan->uniqueid,
04866          clonechan->hangupcause,
04867          ast_cause2str(clonechan->hangupcause)
04868          );
04869       ast_channel_free(clonechan);
04870    } else {
04871       ast_debug(1, "Released clone lock on '%s'\n", clonechan->name);
04872       ast_set_flag(clonechan, AST_FLAG_ZOMBIE);
04873       ast_queue_frame(clonechan, &ast_null_frame);
04874       ast_channel_unlock(clonechan);
04875    }
04876 
04877    /* Signal any blocker */
04878    if (ast_test_flag(original, AST_FLAG_BLOCKING))
04879       pthread_kill(original->blocker, SIGURG);
04880    ast_debug(1, "Done Masquerading %s (%d)\n", original->name, original->_state);
04881 
04882    if ((bridged = ast_bridged_channel(original))) {
04883       ast_channel_lock(bridged);
04884       ast_indicate(bridged, AST_CONTROL_SRCCHANGE);
04885       ast_channel_unlock(bridged);
04886    }
04887 
04888    ast_indicate(original, AST_CONTROL_SRCCHANGE);
04889 
04890    return 0;
04891 }
04892 
04893 void ast_set_callerid(struct ast_channel *chan, const char *cid_num, const char *cid_name, const char *cid_ani)
04894 {
04895    ast_channel_lock(chan);
04896 
04897    if (cid_num) {
04898       if (chan->cid.cid_num)
04899          ast_free(chan->cid.cid_num);
04900       chan->cid.cid_num = ast_strdup(cid_num);
04901    }
04902    if (cid_name) {
04903       if (chan->cid.cid_name)
04904          ast_free(chan->cid.cid_name);
04905       chan->cid.cid_name = ast_strdup(cid_name);
04906    }
04907    if (cid_ani) {
04908       if (chan->cid.cid_ani)
04909          ast_free(chan->cid.cid_ani);
04910       chan->cid.cid_ani = ast_strdup(cid_ani);
04911    }
04912 
04913    report_new_callerid(chan);
04914 
04915    ast_channel_unlock(chan);
04916 }
04917 
04918 int ast_setstate(struct ast_channel *chan, enum ast_channel_state state)
04919 {
04920    int oldstate = chan->_state;
04921    char name[AST_CHANNEL_NAME], *dashptr;
04922 
04923    if (oldstate == state)
04924       return 0;
04925 
04926    ast_copy_string(name, chan->name, sizeof(name));
04927    if ((dashptr = strrchr(name, '-'))) {
04928       *dashptr = '\0';
04929    }
04930 
04931    chan->_state = state;
04932 
04933    /* We have to pass AST_DEVICE_UNKNOWN here because it is entirely possible that the channel driver
04934     * for this channel is using the callback method for device state. If we pass in an actual state here
04935     * we override what they are saying the state is and things go amuck. */
04936    ast_devstate_changed_literal(AST_DEVICE_UNKNOWN, name);
04937 
04938    /* setstate used to conditionally report Newchannel; this is no more */
04939    manager_event(EVENT_FLAG_CALL,
04940             "Newstate",
04941             "Channel: %s\r\n"
04942             "ChannelState: %d\r\n"
04943             "ChannelStateDesc: %s\r\n"
04944             "CallerIDNum: %s\r\n"
04945             "CallerIDName: %s\r\n"
04946             "Uniqueid: %s\r\n",
04947             chan->name, chan->_state, ast_state2str(chan->_state),
04948             S_OR(chan->cid.cid_num, ""),
04949             S_OR(chan->cid.cid_name, ""),
04950             chan->uniqueid);
04951 
04952    return 0;
04953 }
04954 
04955 /*! \brief Find bridged channel */
04956 struct ast_channel *ast_bridged_channel(struct ast_channel *chan)
04957 {
04958    struct ast_channel *bridged;
04959    bridged = chan->_bridge;
04960    if (bridged && bridged->tech->bridged_channel)
04961       bridged = bridged->tech->bridged_channel(chan, bridged);
04962    return bridged;
04963 }
04964 
04965 static void bridge_playfile(struct ast_channel *chan, struct ast_channel *peer, const char *sound, int remain)
04966 {
04967    int min = 0, sec = 0, check;
04968 
04969    check = ast_autoservice_start(peer);
04970    if (check)
04971       return;
04972 
04973    if (remain > 0) {
04974       if (remain / 60 > 1) {
04975          min = remain / 60;
04976          sec = remain % 60;
04977       } else {
04978          sec = remain;
04979       }
04980    }
04981    
04982    if (!strcmp(sound,"timeleft")) { /* Queue support */
04983       ast_stream_and_wait(chan, "vm-youhave", "");
04984       if (min) {
04985          ast_say_number(chan, min, AST_DIGIT_ANY, chan->language, NULL);
04986          ast_stream_and_wait(chan, "queue-minutes", "");
04987       }
04988       if (sec) {
04989          ast_say_number(chan, sec, AST_DIGIT_ANY, chan->language, NULL);
04990          ast_stream_and_wait(chan, "queue-seconds", "");
04991       }
04992    } else {
04993       ast_stream_and_wait(chan, sound, "");
04994    }
04995 
04996    ast_autoservice_stop(peer);
04997 }
04998 
04999 static enum ast_bridge_result ast_generic_bridge(struct ast_channel *c0, struct ast_channel *c1,
05000                    struct ast_bridge_config *config, struct ast_frame **fo,
05001                    struct ast_channel **rc, struct timeval bridge_end)
05002 {
05003    /* Copy voice back and forth between the two channels. */
05004    struct ast_channel *cs[3];
05005    struct ast_frame *f;
05006    enum ast_bridge_result res = AST_BRIDGE_COMPLETE;
05007    int o0nativeformats;
05008    int o1nativeformats;
05009    int watch_c0_dtmf;
05010    int watch_c1_dtmf;
05011    void *pvt0, *pvt1;
05012    /* Indicates whether a frame was queued into a jitterbuffer */
05013    int frame_put_in_jb = 0;
05014    int jb_in_use;
05015    int to;
05016    
05017    cs[0] = c0;
05018    cs[1] = c1;
05019    pvt0 = c0->tech_pvt;
05020    pvt1 = c1->tech_pvt;
05021    o0nativeformats = c0->nativeformats;
05022    o1nativeformats = c1->nativeformats;
05023    watch_c0_dtmf = config->flags & AST_BRIDGE_DTMF_CHANNEL_0;
05024    watch_c1_dtmf = config->flags & AST_BRIDGE_DTMF_CHANNEL_1;
05025 
05026    /* Check the need of a jitterbuffer for each channel */
05027    jb_in_use = ast_jb_do_usecheck(c0, c1);
05028    if (jb_in_use)
05029       ast_jb_empty_and_reset(c0, c1);
05030 
05031    ast_poll_channel_add(c0, c1);
05032 
05033    if (config->feature_timer > 0 && ast_tvzero(config->nexteventts)) {
05034       /* calculate when the bridge should possibly break
05035        * if a partial feature match timed out */
05036       config->partialfeature_timer = ast_tvadd(ast_tvnow(), ast_samp2tv(config->feature_timer, 1000));
05037    } else {
05038       memset(&config->partialfeature_timer, 0, sizeof(config->partialfeature_timer));
05039    }
05040 
05041    for (;;) {
05042       struct ast_channel *who, *other;
05043 
05044       if ((c0->tech_pvt != pvt0) || (c1->tech_pvt != pvt1) ||
05045           (o0nativeformats != c0->nativeformats) ||
05046           (o1nativeformats != c1->nativeformats)) {
05047          /* Check for Masquerade, codec changes, etc */
05048          res = AST_BRIDGE_RETRY;
05049          break;
05050       }
05051       if (bridge_end.tv_sec) {
05052          to = ast_tvdiff_ms(bridge_end, ast_tvnow());
05053          if (to <= 0) {
05054             if (config->timelimit) {
05055                res = AST_BRIDGE_RETRY;
05056                /* generic bridge ending to play warning */
05057                ast_set_flag(config, AST_FEATURE_WARNING_ACTIVE);
05058             } else {
05059                res = AST_BRIDGE_COMPLETE;
05060             }
05061             break;
05062          }
05063       } else {
05064          /* If a feature has been started and the bridge is configured to 
05065           * to not break, leave the channel bridge when the feature timer
05066           * time has elapsed so the DTMF will be sent to the other side. 
05067           */
05068          if (!ast_tvzero(config->partialfeature_timer)) {
05069             int diff = ast_tvdiff_ms(config->partialfeature_timer, ast_tvnow());
05070             if (diff <= 0) {
05071                res = AST_BRIDGE_RETRY;
05072                break;
05073             }
05074          }
05075          to = -1;
05076       }
05077       /* Calculate the appropriate max sleep interval - in general, this is the time,
05078          left to the closest jb delivery moment */
05079       if (jb_in_use)
05080          to = ast_jb_get_when_to_wakeup(c0, c1, to);
05081       who = ast_waitfor_n(cs, 2, &to);
05082       if (!who) {
05083          /* No frame received within the specified timeout - check if we have to deliver now */
05084          if (jb_in_use)
05085             ast_jb_get_and_deliver(c0, c1);
05086          if (c0->_softhangup == AST_SOFTHANGUP_UNBRIDGE || c1->_softhangup == AST_SOFTHANGUP_UNBRIDGE) {
05087             if (c0->_softhangup == AST_SOFTHANGUP_UNBRIDGE)
05088                c0->_softhangup = 0;
05089             if (c1->_softhangup == AST_SOFTHANGUP_UNBRIDGE)
05090                c1->_softhangup = 0;
05091             c0->_bridge = c1;
05092             c1->_bridge = c0;
05093          }
05094          continue;
05095       }
05096       f = ast_read(who);
05097       if (!f) {
05098          *fo = NULL;
05099          *rc = who;
05100          ast_debug(1, "Didn't get a frame from channel: %s\n",who->name);
05101          break;
05102       }
05103 
05104       other = (who == c0) ? c1 : c0; /* the 'other' channel */
05105       /* Try add the frame info the who's bridged channel jitterbuff */
05106       if (jb_in_use)
05107          frame_put_in_jb = !ast_jb_put(other, f);
05108 
05109       if ((f->frametype == AST_FRAME_CONTROL) && !(config->flags & AST_BRIDGE_IGNORE_SIGS)) {
05110          int bridge_exit = 0;
05111 
05112          switch (f->subclass) {
05113          case AST_CONTROL_HOLD:
05114          case AST_CONTROL_UNHOLD:
05115          case AST_CONTROL_VIDUPDATE:
05116          case AST_CONTROL_SRCUPDATE:
05117          case AST_CONTROL_SRCCHANGE:
05118          case AST_CONTROL_T38_PARAMETERS:
05119             ast_indicate_data(other, f->subclass, f->data.ptr, f->datalen);
05120             if (jb_in_use) {
05121                ast_jb_empty_and_reset(c0, c1);
05122             }
05123             break;
05124          default:
05125             *fo = f;
05126             *rc = who;
05127             bridge_exit = 1;
05128             ast_debug(1, "Got a FRAME_CONTROL (%d) frame on channel %s\n", f->subclass, who->name);
05129             break;
05130          }
05131          if (bridge_exit)
05132             break;
05133       }
05134       if ((f->frametype == AST_FRAME_VOICE) ||
05135           (f->frametype == AST_FRAME_DTMF_BEGIN) ||
05136           (f->frametype == AST_FRAME_DTMF) ||
05137           (f->frametype == AST_FRAME_VIDEO) ||
05138           (f->frametype == AST_FRAME_IMAGE) ||
05139           (f->frametype == AST_FRAME_HTML) ||
05140           (f->frametype == AST_FRAME_MODEM) ||
05141           (f->frametype == AST_FRAME_TEXT)) {
05142          /* monitored dtmf causes exit from bridge */
05143          int monitored_source = (who == c0) ? watch_c0_dtmf : watch_c1_dtmf;
05144 
05145          if (monitored_source && 
05146             (f->frametype == AST_FRAME_DTMF_END || 
05147             f->frametype == AST_FRAME_DTMF_BEGIN)) {
05148             *fo = f;
05149             *rc = who;
05150             ast_debug(1, "Got DTMF %s on channel (%s)\n", 
05151                f->frametype == AST_FRAME_DTMF_END ? "end" : "begin",
05152                who->name);
05153 
05154             break;
05155          }
05156          /* Write immediately frames, not passed through jb */
05157          if (!frame_put_in_jb)
05158             ast_write(other, f);
05159             
05160          /* Check if we have to deliver now */
05161          if (jb_in_use)
05162             ast_jb_get_and_deliver(c0, c1);
05163       }
05164       /* XXX do we want to pass on also frames not matched above ? */
05165       ast_frfree(f);
05166 
05167 #ifndef HAVE_EPOLL
05168       /* Swap who gets priority */
05169       cs[2] = cs[0];
05170       cs[0] = cs[1];
05171       cs[1] = cs[2];
05172 #endif
05173    }
05174 
05175    ast_poll_channel_del(c0, c1);
05176 
05177    return res;
05178 }
05179 
05180 /*! \brief Bridge two channels together (early) */
05181 int ast_channel_early_bridge(struct ast_channel *c0, struct ast_channel *c1)
05182 {
05183    /* Make sure we can early bridge, if not error out */
05184    if (!c0->tech->early_bridge || (c1 && (!c1->tech->early_bridge || c0->tech->early_bridge != c1->tech->early_bridge)))
05185       return -1;
05186 
05187    return c0->tech->early_bridge(c0, c1);
05188 }
05189 
05190 /*! \brief Send manager event for bridge link and unlink events.
05191  * \param onoff Link/Unlinked 
05192  * \param type 1 for core, 2 for native
05193  * \param c0 first channel in bridge
05194  * \param c1 second channel in bridge
05195 */
05196 static void manager_bridge_event(int onoff, int type, struct ast_channel *c0, struct ast_channel *c1)
05197 {
05198    manager_event(EVENT_FLAG_CALL, "Bridge",
05199          "Bridgestate: %s\r\n"
05200            "Bridgetype: %s\r\n"
05201             "Channel1: %s\r\n"
05202             "Channel2: %s\r\n"
05203             "Uniqueid1: %s\r\n"
05204             "Uniqueid2: %s\r\n"
05205             "CallerID1: %s\r\n"
05206             "CallerID2: %s\r\n",
05207          onoff ? "Link" : "Unlink",
05208          type == 1 ? "core" : "native",
05209          c0->name, c1->name, c0->uniqueid, c1->uniqueid, 
05210          S_OR(c0->cid.cid_num, ""), 
05211          S_OR(c1->cid.cid_num, ""));
05212 }
05213 
05214 static void update_bridge_vars(struct ast_channel *c0, struct ast_channel *c1)
05215 {
05216    const char *c0_name;
05217    const char *c1_name;
05218    const char *c0_pvtid = NULL;
05219    const char *c1_pvtid = NULL;
05220 
05221    ast_channel_lock(c1);
05222    c1_name = ast_strdupa(c1->name);
05223    if (c1->tech->get_pvt_uniqueid) {
05224       c1_pvtid = ast_strdupa(c1->tech->get_pvt_uniqueid(c1));
05225    }
05226    ast_channel_unlock(c1);
05227 
05228    ast_channel_lock(c0);
05229    if (!ast_strlen_zero(pbx_builtin_getvar_helper(c0, "BRIDGEPEER"))) {
05230       pbx_builtin_setvar_helper(c0, "BRIDGEPEER", c1_name);
05231    }
05232    if (c1_pvtid) {
05233       pbx_builtin_setvar_helper(c0, "BRIDGEPVTCALLID", c1_pvtid);
05234    }
05235    c0_name = ast_strdupa(c0->name);
05236    if (c0->tech->get_pvt_uniqueid) {
05237       c0_pvtid = ast_strdupa(c0->tech->get_pvt_uniqueid(c0));
05238    }
05239    ast_channel_unlock(c0);
05240 
05241    ast_channel_lock(c1);
05242    if (!ast_strlen_zero(pbx_builtin_getvar_helper(c1, "BRIDGEPEER"))) {
05243       pbx_builtin_setvar_helper(c1, "BRIDGEPEER", c0_name);
05244    }
05245    if (c0_pvtid) {
05246       pbx_builtin_setvar_helper(c1, "BRIDGEPVTCALLID", c0_pvtid);
05247    }
05248    ast_channel_unlock(c1);
05249 }
05250 
05251 static void bridge_play_sounds(struct ast_channel *c0, struct ast_channel *c1)
05252 {
05253    const char *s, *sound;
05254 
05255    /* See if we need to play an audio file to any side of the bridge */
05256 
05257    ast_channel_lock(c0);
05258    if ((s = pbx_builtin_getvar_helper(c0, "BRIDGE_PLAY_SOUND"))) {
05259       sound = ast_strdupa(s);
05260       ast_channel_unlock(c0);
05261       bridge_playfile(c0, c1, sound, 0);
05262       pbx_builtin_setvar_helper(c0, "BRIDGE_PLAY_SOUND", NULL);
05263    } else {
05264       ast_channel_unlock(c0);
05265    }
05266 
05267    ast_channel_lock(c1);
05268    if ((s = pbx_builtin_getvar_helper(c1, "BRIDGE_PLAY_SOUND"))) {
05269       sound = ast_strdupa(s);
05270       ast_channel_unlock(c1);
05271       bridge_playfile(c1, c0, sound, 0);
05272       pbx_builtin_setvar_helper(c1, "BRIDGE_PLAY_SOUND", NULL);
05273    } else {
05274       ast_channel_unlock(c1);
05275    }
05276 }
05277 
05278 /*! \brief Bridge two channels together */
05279 enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_channel *c1,
05280                  struct ast_bridge_config *config, struct ast_frame **fo, struct ast_channel **rc)
05281 {
05282    struct ast_channel *who = NULL;
05283    enum ast_bridge_result res = AST_BRIDGE_COMPLETE;
05284    int nativefailed=0;
05285    int firstpass;
05286    int o0nativeformats;
05287    int o1nativeformats;
05288    long time_left_ms=0;
05289    char caller_warning = 0;
05290    char callee_warning = 0;
05291 
05292    if (c0->_bridge) {
05293       ast_log(LOG_WARNING, "%s is already in a bridge with %s\n",
05294          c0->name, c0->_bridge->name);
05295       return -1;
05296    }
05297    if (c1->_bridge) {
05298       ast_log(LOG_WARNING, "%s is already in a bridge with %s\n",
05299          c1->name, c1->_bridge->name);
05300       return -1;
05301    }
05302    
05303    /* Stop if we're a zombie or need a soft hangup */
05304    if (ast_test_flag(c0, AST_FLAG_ZOMBIE) || ast_check_hangup_locked(c0) ||
05305        ast_test_flag(c1, AST_FLAG_ZOMBIE) || ast_check_hangup_locked(c1))
05306       return -1;
05307 
05308    *fo = NULL;
05309    firstpass = config->firstpass;
05310    config->firstpass = 0;
05311 
05312    if (ast_tvzero(config->start_time))
05313       config->start_time = ast_tvnow();
05314    time_left_ms = config->timelimit;
05315 
05316    caller_warning = ast_test_flag(&config->features_caller, AST_FEATURE_PLAY_WARNING);
05317    callee_warning = ast_test_flag(&config->features_callee, AST_FEATURE_PLAY_WARNING);
05318 
05319    if (config->start_sound && firstpass) {
05320       if (caller_warning)
05321          bridge_playfile(c0, c1, config->start_sound, time_left_ms / 1000);
05322       if (callee_warning)
05323          bridge_playfile(c1, c0, config->start_sound, time_left_ms / 1000);
05324    }
05325 
05326    /* Keep track of bridge */
05327    c0->_bridge = c1;
05328    c1->_bridge = c0;
05329 
05330 
05331    o0nativeformats = c0->nativeformats;
05332    o1nativeformats = c1->nativeformats;
05333 
05334    if (config->feature_timer && !ast_tvzero(config->nexteventts)) {
05335       config->nexteventts = ast_tvadd(config->start_time, ast_samp2tv(config->feature_timer, 1000));
05336    } else if (config->timelimit && firstpass) {
05337       config->nexteventts = ast_tvadd(config->start_time, ast_samp2tv(config->timelimit, 1000));
05338       if (caller_warning || callee_warning)
05339          config->nexteventts = ast_tvsub(config->nexteventts, ast_samp2tv(config->play_warning, 1000));
05340    }
05341 
05342    if (!c0->tech->send_digit_begin)
05343       ast_set_flag(c1, AST_FLAG_END_DTMF_ONLY);
05344    if (!c1->tech->send_digit_begin)
05345       ast_set_flag(c0, AST_FLAG_END_DTMF_ONLY);
05346    manager_bridge_event(1, 1, c0, c1);
05347 
05348    /* Before we enter in and bridge these two together tell them both the source of audio has changed */
05349    ast_indicate(c0, AST_CONTROL_SRCCHANGE);
05350    ast_indicate(c1, AST_CONTROL_SRCCHANGE);
05351 
05352    for (/* ever */;;) {
05353       struct timeval now = { 0, };
05354       int to;
05355 
05356       to = -1;
05357 
05358       if (!ast_tvzero(config->nexteventts)) {
05359          now = ast_tvnow();
05360          to = ast_tvdiff_ms(config->nexteventts, now);
05361          if (to <= 0) {
05362             if (!config->timelimit) {
05363                res = AST_BRIDGE_COMPLETE;
05364                break;
05365             }
05366             to = 0;
05367          }
05368       }
05369 
05370       if (config->timelimit) {
05371          time_left_ms = config->timelimit - ast_tvdiff_ms(now, config->start_time);
05372          if (time_left_ms < to)
05373             to = time_left_ms;
05374 
05375          if (time_left_ms <= 0) {
05376             if (caller_warning && config->end_sound)
05377                bridge_playfile(c0, c1, config->end_sound, 0);
05378             if (callee_warning && config->end_sound)
05379                bridge_playfile(c1, c0, config->end_sound, 0);
05380             *fo = NULL;
05381             if (who)
05382                *rc = who;
05383             res = 0;
05384             break;
05385          }
05386 
05387          if (!to) {
05388             if (time_left_ms >= 5000 && config->warning_sound && config->play_warning && ast_test_flag(config, AST_FEATURE_WARNING_ACTIVE)) {
05389                int t = (time_left_ms + 500) / 1000; /* round to nearest second */
05390                if (caller_warning)
05391                   bridge_playfile(c0, c1, config->warning_sound, t);
05392                if (callee_warning)
05393                   bridge_playfile(c1, c0, config->warning_sound, t);
05394             }
05395             if (config->warning_freq && (time_left_ms > (config->warning_freq + 5000)))
05396                config->nexteventts = ast_tvadd(config->nexteventts, ast_samp2tv(config->warning_freq, 1000));
05397             else
05398                config->nexteventts = ast_tvadd(config->start_time, ast_samp2tv(config->timelimit, 1000));
05399          }
05400          ast_clear_flag(config, AST_FEATURE_WARNING_ACTIVE);
05401       }
05402 
05403       if (c0->_softhangup == AST_SOFTHANGUP_UNBRIDGE || c1->_softhangup == AST_SOFTHANGUP_UNBRIDGE) {
05404          if (c0->_softhangup == AST_SOFTHANGUP_UNBRIDGE)
05405             c0->_softhangup = 0;
05406          if (c1->_softhangup == AST_SOFTHANGUP_UNBRIDGE)
05407             c1->_softhangup = 0;
05408          c0->_bridge = c1;
05409          c1->_bridge = c0;
05410          ast_debug(1, "Unbridge signal received. Ending native bridge.\n");
05411          continue;
05412       }
05413 
05414       /* Stop if we're a zombie or need a soft hangup */
05415       if (ast_test_flag(c0, AST_FLAG_ZOMBIE) || ast_check_hangup_locked(c0) ||
05416           ast_test_flag(c1, AST_FLAG_ZOMBIE) || ast_check_hangup_locked(c1)) {
05417          *fo = NULL;
05418          if (who)
05419             *rc = who;
05420          res = 0;
05421          ast_debug(1, "Bridge stops because we're zombie or need a soft hangup: c0=%s, c1=%s, flags: %s,%s,%s,%s\n",
05422             c0->name, c1->name,
05423             ast_test_flag(c0, AST_FLAG_ZOMBIE) ? "Yes" : "No",
05424             ast_check_hangup(c0) ? "Yes" : "No",
05425             ast_test_flag(c1, AST_FLAG_ZOMBIE) ? "Yes" : "No",
05426             ast_check_hangup(c1) ? "Yes" : "No");
05427          break;
05428       }
05429 
05430       update_bridge_vars(c0, c1);
05431 
05432       bridge_play_sounds(c0, c1);
05433 
05434       if (c0->tech->bridge &&
05435          /* if < 1 ms remains use generic bridging for accurate timing */
05436          (!config->timelimit || to > 1000 || to == 0) &&
05437           (c0->tech->bridge == c1->tech->bridge) &&
05438           !nativefailed && !c0->monitor && !c1->monitor &&
05439           !c0->audiohooks && !c1->audiohooks &&
05440           !c0->masq && !c0->masqr && !c1->masq && !c1->masqr) {
05441          int timeoutms = to - 1000 > 0 ? to - 1000 : to;
05442          /* Looks like they share a bridge method and nothing else is in the way */
05443          ast_set_flag(c0, AST_FLAG_NBRIDGE);
05444          ast_set_flag(c1, AST_FLAG_NBRIDGE);
05445          if ((res = c0->tech->bridge(c0, c1, config->flags, fo, rc, timeoutms)) == AST_BRIDGE_COMPLETE) {
05446             /* \todo  XXX here should check that cid_num is not NULL */
05447             manager_event(EVENT_FLAG_CALL, "Unlink",
05448                      "Channel1: %s\r\n"
05449                      "Channel2: %s\r\n"
05450                      "Uniqueid1: %s\r\n"
05451                      "Uniqueid2: %s\r\n"
05452                      "CallerID1: %s\r\n"
05453                      "CallerID2: %s\r\n",
05454                      c0->name, c1->name, c0->uniqueid, c1->uniqueid, c0->cid.cid_num, c1->cid.cid_num);
05455             ast_debug(1, "Returning from native bridge, channels: %s, %s\n", c0->name, c1->name);
05456 
05457             ast_clear_flag(c0, AST_FLAG_NBRIDGE);
05458             ast_clear_flag(c1, AST_FLAG_NBRIDGE);
05459 
05460             if (c0->_softhangup == AST_SOFTHANGUP_UNBRIDGE || c1->_softhangup == AST_SOFTHANGUP_UNBRIDGE)
05461                continue;
05462 
05463             c0->_bridge = NULL;
05464             c1->_bridge = NULL;
05465 
05466             return res;
05467          } else {
05468             ast_clear_flag(c0, AST_FLAG_NBRIDGE);
05469             ast_clear_flag(c1, AST_FLAG_NBRIDGE);
05470          }
05471          switch (res) {
05472          case AST_BRIDGE_RETRY:
05473             if (config->play_warning) {
05474                ast_set_flag(config, AST_FEATURE_WARNING_ACTIVE);
05475             }
05476             continue;
05477          default:
05478             ast_verb(3, "Native bridging %s and %s ended\n", c0->name, c1->name);
05479             /* fallthrough */
05480          case AST_BRIDGE_FAILED_NOWARN:
05481             nativefailed++;
05482             break;
05483          }
05484       }
05485 
05486       if (((c0->writeformat != c1->readformat) || (c0->readformat != c1->writeformat) ||
05487           (c0->nativeformats != o0nativeformats) || (c1->nativeformats != o1nativeformats)) &&
05488           !(c0->generator || c1->generator)) {
05489          if (ast_channel_make_compatible(c0, c1)) {
05490             ast_log(LOG_WARNING, "Can't make %s and %s compatible\n", c0->name, c1->name);
05491             manager_bridge_event(0, 1, c0, c1);
05492             return AST_BRIDGE_FAILED;
05493          }
05494          o0nativeformats = c0->nativeformats;
05495          o1nativeformats = c1->nativeformats;
05496       }
05497 
05498       update_bridge_vars(c0, c1);
05499 
05500       res = ast_generic_bridge(c0, c1, config, fo, rc, config->nexteventts);
05501       if (res != AST_BRIDGE_RETRY) {
05502          break;
05503       } else if (config->feature_timer) {
05504          /* feature timer expired but has not been updated, sending to ast_bridge_call to do so */
05505          break;
05506       }
05507    }
05508 
05509    ast_clear_flag(c0, AST_FLAG_END_DTMF_ONLY);
05510    ast_clear_flag(c1, AST_FLAG_END_DTMF_ONLY);
05511 
05512    /* Now that we have broken the bridge the source will change yet again */
05513    ast_indicate(c0, AST_CONTROL_SRCUPDATE);
05514    ast_indicate(c1, AST_CONTROL_SRCUPDATE);
05515 
05516    c0->_bridge = NULL;
05517    c1->_bridge = NULL;
05518 
05519    /* \todo  XXX here should check that cid_num is not NULL */
05520    manager_event(EVENT_FLAG_CALL, "Unlink",
05521             "Channel1: %s\r\n"
05522             "Channel2: %s\r\n"
05523             "Uniqueid1: %s\r\n"
05524             "Uniqueid2: %s\r\n"
05525             "CallerID1: %s\r\n"
05526             "CallerID2: %s\r\n",
05527             c0->name, c1->name, c0->uniqueid, c1->uniqueid, c0->cid.cid_num, c1->cid.cid_num);
05528    ast_debug(1, "Bridge stops bridging channels %s and %s\n", c0->name, c1->name);
05529 
05530    return res;
05531 }
05532 
05533 /*! \brief Sets an option on a channel */
05534 int ast_channel_setoption(struct ast_channel *chan, int option, void *data, int datalen, int block)
05535 {
05536    if (!chan->tech->setoption) {
05537       errno = ENOSYS;
05538       return -1;
05539    }
05540 
05541    if (block)
05542       ast_log(LOG_ERROR, "XXX Blocking not implemented yet XXX\n");
05543 
05544    return chan->tech->setoption(chan, option, data, datalen);
05545 }
05546 
05547 int ast_channel_queryoption(struct ast_channel *chan, int option, void *data, int *datalen, int block)
05548 {
05549    if (!chan->tech->queryoption) {
05550       errno = ENOSYS;
05551       return -1;
05552    }
05553 
05554    if (block)
05555       ast_log(LOG_ERROR, "XXX Blocking not implemented yet XXX\n");
05556 
05557    return chan->tech->queryoption(chan, option, data, datalen);
05558 }
05559 
05560 struct tonepair_def {
05561    int freq1;
05562    int freq2;
05563    int duration;
05564    int vol;
05565 };
05566 
05567 struct tonepair_state {
05568    int fac1;
05569    int fac2;
05570    int v1_1;
05571    int v2_1;
05572    int v3_1;
05573    int v1_2;
05574    int v2_2;
05575    int v3_2;
05576    int origwfmt;
05577    int pos;
05578    int duration;
05579    int modulate;
05580    struct ast_frame f;
05581    unsigned char offset[AST_FRIENDLY_OFFSET];
05582    short data[4000];
05583 };
05584 
05585 static void tonepair_release(struct ast_channel *chan, void *params)
05586 {
05587    struct tonepair_state *ts = params;
05588 
05589    if (chan)
05590       ast_set_write_format(chan, ts->origwfmt);
05591    ast_free(ts);
05592 }
05593 
05594 static void *tonepair_alloc(struct ast_channel *chan, void *params)
05595 {
05596    struct tonepair_state *ts;
05597    struct tonepair_def *td = params;
05598 
05599    if (!(ts = ast_calloc(1, sizeof(*ts))))
05600       return NULL;
05601    ts->origwfmt = chan->writeformat;
05602    if (ast_set_write_format(chan, AST_FORMAT_SLINEAR)) {
05603       ast_log(LOG_WARNING, "Unable to set '%s' to signed linear format (write)\n", chan->name);
05604       tonepair_release(NULL, ts);
05605       ts = NULL;
05606    } else {
05607       ts->fac1 = 2.0 * cos(2.0 * M_PI * (td->freq1 / 8000.0)) * 32768.0;
05608       ts->v1_1 = 0;
05609       ts->v2_1 = sin(-4.0 * M_PI * (td->freq1 / 8000.0)) * td->vol;
05610       ts->v3_1 = sin(-2.0 * M_PI * (td->freq1 / 8000.0)) * td->vol;
05611       ts->v2_1 = 0;
05612       ts->fac2 = 2.0 * cos(2.0 * M_PI * (td->freq2 / 8000.0)) * 32768.0;
05613       ts->v2_2 = sin(-4.0 * M_PI * (td->freq2 / 8000.0)) * td->vol;
05614       ts->v3_2 = sin(-2.0 * M_PI * (td->freq2 / 8000.0)) * td->vol;
05615       ts->duration = td->duration;
05616       ts->modulate = 0;
05617    }
05618    /* Let interrupts interrupt :) */
05619    ast_set_flag(chan, AST_FLAG_WRITE_INT);
05620    return ts;
05621 }
05622 
05623 static int tonepair_generator(struct ast_channel *chan, void *data, int len, int samples)
05624 {
05625    struct tonepair_state *ts = data;
05626    int x;
05627 
05628    /* we need to prepare a frame with 16 * timelen samples as we're
05629     * generating SLIN audio
05630     */
05631    len = samples * 2;
05632 
05633    if (len > sizeof(ts->data) / 2 - 1) {
05634       ast_log(LOG_WARNING, "Can't generate that much data!\n");
05635       return -1;
05636    }
05637    memset(&ts->f, 0, sizeof(ts->f));
05638    for (x=0;x<len/2;x++) {
05639       ts->v1_1 = ts->v2_1;
05640       ts->v2_1 = ts->v3_1;
05641       ts->v3_1 = (ts->fac1 * ts->v2_1 >> 15) - ts->v1_1;
05642       
05643       ts->v1_2 = ts->v2_2;
05644       ts->v2_2 = ts->v3_2;
05645       ts->v3_2 = (ts->fac2 * ts->v2_2 >> 15) - ts->v1_2;
05646       if (ts->modulate) {
05647          int p;
05648          p = ts->v3_2 - 32768;
05649          if (p < 0) p = -p;
05650          p = ((p * 9) / 10) + 1;
05651          ts->data[x] = (ts->v3_1 * p) >> 15;
05652       } else
05653          ts->data[x] = ts->v3_1 + ts->v3_2; 
05654    }
05655    ts->f.frametype = AST_FRAME_VOICE;
05656    ts->f.subclass = AST_FORMAT_SLINEAR;
05657    ts->f.datalen = len;
05658    ts->f.samples = samples;
05659    ts->f.offset = AST_FRIENDLY_OFFSET;
05660    ts->f.data.ptr = ts->data;
05661    ast_write(chan, &ts->f);
05662    ts->pos += x;
05663    if (ts->duration > 0) {
05664       if (ts->pos >= ts->duration * 8)
05665          return -1;
05666    }
05667    return 0;
05668 }
05669 
05670 static struct ast_generator tonepair = {
05671    alloc: tonepair_alloc,
05672    release: tonepair_release,
05673    generate: tonepair_generator,
05674 };
05675 
05676 int ast_tonepair_start(struct ast_channel *chan, int freq1, int freq2, int duration, int vol)
05677 {
05678    struct tonepair_def d = { 0, };
05679 
05680    d.freq1 = freq1;
05681    d.freq2 = freq2;
05682    d.duration = duration;
05683    d.vol = (vol < 1) ? 8192 : vol; /* force invalid to 8192 */
05684    if (ast_activate_generator(chan, &tonepair, &d))
05685       return -1;
05686    return 0;
05687 }
05688 
05689 void ast_tonepair_stop(struct ast_channel *chan)
05690 {
05691    ast_deactivate_generator(chan);
05692 }
05693 
05694 int ast_tonepair(struct ast_channel *chan, int freq1, int freq2, int duration, int vol)
05695 {
05696    int res;
05697 
05698    if ((res = ast_tonepair_start(chan, freq1, freq2, duration, vol)))
05699       return res;
05700 
05701    /* Give us some wiggle room */
05702    while (chan->generatordata && ast_waitfor(chan, 100) >= 0) {
05703       struct ast_frame *f = ast_read(chan);
05704       if (f)
05705          ast_frfree(f);
05706       else
05707          return -1;
05708    }
05709    return 0;
05710 }
05711 
05712 ast_group_t ast_get_group(const char *s)
05713 {
05714    char *piece;
05715    char *c;
05716    int start=0, finish=0, x;
05717    ast_group_t group = 0;
05718 
05719    if (ast_strlen_zero(s))
05720       return 0;
05721 
05722    c = ast_strdupa(s);
05723    
05724    while ((piece = strsep(&c, ","))) {
05725       if (sscanf(piece, "%30d-%30d", &start, &finish) == 2) {
05726          /* Range */
05727       } else if (sscanf(piece, "%30d", &start)) {
05728          /* Just one */
05729          finish = start;
05730       } else {
05731          ast_log(LOG_ERROR, "Syntax error parsing group configuration '%s' at '%s'. Ignoring.\n", s, piece);
05732          continue;
05733       }
05734       for (x = start; x <= finish; x++) {
05735          if ((x > 63) || (x < 0)) {
05736             ast_log(LOG_WARNING, "Ignoring invalid group %d (maximum group is 63)\n", x);
05737          } else
05738             group |= ((ast_group_t) 1 << x);
05739       }
05740    }
05741    return group;
05742 }
05743 
05744 static int (*ast_moh_start_ptr)(struct ast_channel *, const char *, const char *) = NULL;
05745 static void (*ast_moh_stop_ptr)(struct ast_channel *) = NULL;
05746 static void (*ast_moh_cleanup_ptr)(struct ast_channel *) = NULL;
05747 
05748 void ast_install_music_functions(int (*start_ptr)(struct ast_channel *, const char *, const char *),
05749              void (*stop_ptr)(struct ast_channel *),
05750              void (*cleanup_ptr)(struct ast_channel *))
05751 {
05752    ast_moh_start_ptr = start_ptr;
05753    ast_moh_stop_ptr = stop_ptr;
05754    ast_moh_cleanup_ptr = cleanup_ptr;
05755 }
05756 
05757 void ast_uninstall_music_functions(void)
05758 {
05759    ast_moh_start_ptr = NULL;
05760    ast_moh_stop_ptr = NULL;
05761    ast_moh_cleanup_ptr = NULL;
05762 }
05763 
05764 /*! \brief Turn on music on hold on a given channel */
05765 int ast_moh_start(struct ast_channel *chan, const char *mclass, const char *interpclass)
05766 {
05767    if (ast_moh_start_ptr)
05768       return ast_moh_start_ptr(chan, mclass, interpclass);
05769 
05770    ast_verb(3, "Music class %s requested but no musiconhold loaded.\n", mclass ? mclass : (interpclass ? interpclass : "default"));
05771 
05772    return 0;
05773 }
05774 
05775 /*! \brief Turn off music on hold on a given channel */
05776 void ast_moh_stop(struct ast_channel *chan)
05777 {
05778    if (ast_moh_stop_ptr)
05779       ast_moh_stop_ptr(chan);
05780 }
05781 
05782 void ast_moh_cleanup(struct ast_channel *chan)
05783 {
05784    if (ast_moh_cleanup_ptr)
05785       ast_moh_cleanup_ptr(chan);
05786 }
05787 
05788 int ast_plc_reload(void)
05789 {
05790    struct ast_variable *var;
05791    struct ast_flags config_flags = { 0 };
05792    struct ast_config *cfg = ast_config_load2("codecs.conf", "channel", config_flags);
05793    if (cfg == CONFIG_STATUS_FILEMISSING || cfg == CONFIG_STATUS_FILEUNCHANGED || cfg == CONFIG_STATUS_FILEINVALID)
05794       return 0;
05795    for (var = ast_variable_browse(cfg, "plc"); var; var = var->next) {
05796       if (!strcasecmp(var->name, "genericplc")) {
05797          ast_set2_flag(&ast_options, ast_true(var->value), AST_OPT_FLAG_GENERIC_PLC);
05798       }
05799    }
05800    ast_config_destroy(cfg);
05801    return 0;
05802 }
05803 
05804 void ast_channels_init(void)
05805 {
05806    ast_cli_register_multiple(cli_channel, ARRAY_LEN(cli_channel));
05807 
05808    ast_plc_reload();
05809 }
05810 
05811 /*! \brief Print call group and pickup group ---*/
05812 char *ast_print_group(char *buf, int buflen, ast_group_t group)
05813 {
05814    unsigned int i;
05815    int first = 1;
05816    char num[3];
05817 
05818    buf[0] = '\0';
05819    
05820    if (!group) /* Return empty string if no group */
05821       return buf;
05822 
05823    for (i = 0; i <= 63; i++) {   /* Max group is 63 */
05824       if (group & ((ast_group_t) 1 << i)) {
05825             if (!first) {
05826             strncat(buf, ", ", buflen - strlen(buf) - 1);
05827          } else {
05828             first = 0;
05829          }
05830          snprintf(num, sizeof(num), "%u", i);
05831          strncat(buf, num, buflen - strlen(buf) - 1);
05832       }
05833    }
05834    return buf;
05835 }
05836 
05837 void ast_set_variables(struct ast_channel *chan, struct ast_variable *vars)
05838 {
05839    struct ast_variable *cur;
05840 
05841    for (cur = vars; cur; cur = cur->next)
05842       pbx_builtin_setvar_helper(chan, cur->name, cur->value);  
05843 }
05844 
05845 static void *silence_generator_alloc(struct ast_channel *chan, void *data)
05846 {
05847    /* just store the data pointer in the channel structure */
05848    return data;
05849 }
05850 
05851 static void silence_generator_release(struct ast_channel *chan, void *data)
05852 {
05853    /* nothing to do */
05854 }
05855 
05856 static int silence_generator_generate(struct ast_channel *chan, void *data, int len, int samples)
05857 {
05858    short buf[samples];
05859    struct ast_frame frame = {
05860       .frametype = AST_FRAME_VOICE,
05861       .subclass = AST_FORMAT_SLINEAR,
05862       .data.ptr = buf,
05863       .samples = samples,
05864       .datalen = sizeof(buf),
05865    };
05866 
05867    memset(buf, 0, sizeof(buf));
05868 
05869    if (ast_write(chan, &frame))
05870       return -1;
05871 
05872    return 0;
05873 }
05874 
05875 static struct ast_generator silence_generator = {
05876    .alloc = silence_generator_alloc,
05877    .release = silence_generator_release,
05878    .generate = silence_generator_generate,
05879 };
05880 
05881 struct ast_silence_generator {
05882    int old_write_format;
05883 };
05884 
05885 struct ast_silence_generator *ast_channel_start_silence_generator(struct ast_channel *chan)
05886 {
05887    struct ast_silence_generator *state;
05888 
05889    if (!(state = ast_calloc(1, sizeof(*state)))) {
05890       return NULL;
05891    }
05892 
05893    state->old_write_format = chan->writeformat;
05894 
05895    if (ast_set_write_format(chan, AST_FORMAT_SLINEAR) < 0) {
05896       ast_log(LOG_ERROR, "Could not set write format to SLINEAR\n");
05897       ast_free(state);
05898       return NULL;
05899    }
05900 
05901    ast_activate_generator(chan, &silence_generator, state);
05902 
05903    ast_debug(1, "Started silence generator on '%s'\n", chan->name);
05904 
05905    return state;
05906 }
05907 
05908 void ast_channel_stop_silence_generator(struct ast_channel *chan, struct ast_silence_generator *state)
05909 {
05910    if (!state)
05911       return;
05912 
05913    ast_deactivate_generator(chan);
05914 
05915    ast_debug(1, "Stopped silence generator on '%s'\n", chan->name);
05916 
05917    if (ast_set_write_format(chan, state->old_write_format) < 0)
05918       ast_log(LOG_ERROR, "Could not return write format to its original state\n");
05919 
05920    ast_free(state);
05921 }
05922 
05923 
05924 /*! \ brief Convert channel reloadreason (ENUM) to text string for manager event */
05925 const char *channelreloadreason2txt(enum channelreloadreason reason)
05926 {
05927    switch (reason) {
05928    case CHANNEL_MODULE_LOAD:
05929       return "LOAD (Channel module load)";
05930 
05931    case CHANNEL_MODULE_RELOAD:
05932       return "RELOAD (Channel module reload)";
05933 
05934    case CHANNEL_CLI_RELOAD:
05935       return "CLIRELOAD (Channel module reload by CLI command)";
05936 
05937    default:
05938       return "MANAGERRELOAD (Channel module reload by manager)";
05939    }
05940 };
05941 
05942 #ifdef DEBUG_CHANNEL_LOCKS
05943 
05944 /*! \brief Unlock AST channel (and print debugging output) 
05945 \note You need to enable DEBUG_CHANNEL_LOCKS for this function
05946 */
05947 int __ast_channel_unlock(struct ast_channel *chan, const char *filename, int lineno, const char *func)
05948 {
05949    int res = 0;
05950    ast_debug(3, "::::==== Unlocking AST channel %s\n", chan->name);
05951    
05952    if (!chan) {
05953       ast_debug(1, "::::==== Unlocking non-existing channel \n");
05954       return 0;
05955    }
05956 #ifdef DEBUG_THREADS
05957    res = __ast_pthread_mutex_unlock(filename, lineno, func, "(channel lock)", &chan->lock_dont_use);
05958 #else
05959    res = ast_mutex_unlock(&chan->lock_dont_use);
05960 #endif
05961 
05962    if (option_debug > 2) {
05963 #ifdef DEBUG_THREADS
05964       int count = 0;
05965       if ((count = chan->lock_dont_use.track.reentrancy))
05966          ast_debug(3, ":::=== Still have %d locks (recursive)\n", count);
05967 #endif
05968       if (!res)
05969          ast_debug(3, "::::==== Channel %s was unlocked\n", chan->name);
05970       if (res == EINVAL) {
05971          ast_debug(3, "::::==== Channel %s had no lock by this thread. Failed unlocking\n", chan->name);
05972       }
05973    }
05974    if (res == EPERM) {
05975       /* We had no lock, so okay any way*/
05976       ast_debug(4, "::::==== Channel %s was not locked at all \n", chan->name);
05977       res = 0;
05978    }
05979    return res;
05980 }
05981 
05982 /*! \brief Lock AST channel (and print debugging output)
05983 \note You need to enable DEBUG_CHANNEL_LOCKS for this function */
05984 int __ast_channel_lock(struct ast_channel *chan, const char *filename, int lineno, const char *func)
05985 {
05986    int res;
05987 
05988    ast_debug(4, "====:::: Locking AST channel %s\n", chan->name);
05989 
05990 #ifdef DEBUG_THREADS
05991    res = __ast_pthread_mutex_lock(filename, lineno, func, "(channel lock)", &chan->lock_dont_use);
05992 #else
05993    res = ast_mutex_lock(&chan->lock_dont_use);
05994 #endif
05995 
05996    if (option_debug > 3) {
05997 #ifdef DEBUG_THREADS
05998       int count = 0;
05999       if ((count = chan->lock_dont_use.track.reentrancy))
06000          ast_debug(4, ":::=== Now have %d locks (recursive)\n", count);
06001 #endif
06002       if (!res)
06003          ast_debug(4, "::::==== Channel %s was locked\n", chan->name);
06004       if (res == EDEADLK) {
06005          /* We had no lock, so okey any way */
06006          ast_debug(4, "::::==== Channel %s was not locked by us. Lock would cause deadlock.\n", chan->name);
06007       }
06008       if (res == EINVAL) {
06009          ast_debug(4, "::::==== Channel %s lock failed. No mutex.\n", chan->name);
06010       }
06011    }
06012    return res;
06013 }
06014 
06015 /*! \brief Lock AST channel (and print debugging output)
06016 \note You need to enable DEBUG_CHANNEL_LOCKS for this function */
06017 int __ast_channel_trylock(struct ast_channel *chan, const char *filename, int lineno, const char *func)
06018 {
06019    int res;
06020 
06021    ast_debug(3, "====:::: Trying to lock AST channel %s\n", chan->name);
06022 #ifdef DEBUG_THREADS
06023    res = __ast_pthread_mutex_trylock(filename, lineno, func, "(channel lock)", &chan->lock_dont_use);
06024 #else
06025    res = ast_mutex_trylock(&chan->lock_dont_use);
06026 #endif
06027 
06028    if (option_debug > 2) {
06029 #ifdef DEBUG_THREADS
06030       int count = 0;
06031       if ((count = chan->lock_dont_use.track.reentrancy))
06032          ast_debug(3, ":::=== Now have %d locks (recursive)\n", count);
06033 #endif
06034       if (!res)
06035          ast_debug(3, "::::==== Channel %s was locked\n", chan->name);
06036       if (res == EBUSY) {
06037          /* We failed to lock */
06038          ast_debug(3, "::::==== Channel %s failed to lock. Not waiting around...\n", chan->name);
06039       }
06040       if (res == EDEADLK) {
06041          /* We had no lock, so okey any way*/
06042          ast_debug(3, "::::==== Channel %s was not locked. Lock would cause deadlock.\n", chan->name);
06043       }
06044       if (res == EINVAL)
06045          ast_debug(3, "::::==== Channel %s lock failed. No mutex.\n", chan->name);
06046    }
06047    return res;
06048 }
06049 
06050 #endif
06051 
06052 /*
06053  * Wrappers for various ast_say_*() functions that call the full version
06054  * of the same functions.
06055  * The proper place would be say.c, but that file is optional and one
06056  * must be able to build asterisk even without it (using a loadable 'say'
06057  * implementation that only supplies the 'full' version of the functions.
06058  */
06059 
06060 int ast_say_number(struct ast_channel *chan, int num,
06061    const char *ints, const char *language, const char *options)
06062 {
06063    return ast_say_number_full(chan, num, ints, language, options, -1, -1);
06064 }
06065 
06066 int ast_say_enumeration(struct ast_channel *chan, int num,
06067    const char *ints, const char *language, const char *options)
06068 {
06069    return ast_say_enumeration_full(chan, num, ints, language, options, -1, -1);
06070 }
06071 
06072 int ast_say_digits(struct ast_channel *chan, int num,
06073    const char *ints, const char *lang)
06074 {
06075    return ast_say_digits_full(chan, num, ints, lang, -1, -1);
06076 }
06077 
06078 int ast_say_digit_str(struct ast_channel *chan, const char *str,
06079    const char *ints, const char *lang)
06080 {
06081    return ast_say_digit_str_full(chan, str, ints, lang, -1, -1);
06082 }
06083 
06084 int ast_say_character_str(struct ast_channel *chan, const char *str,
06085    const char *ints, const char *lang)
06086 {
06087    return ast_say_character_str_full(chan, str, ints, lang, -1, -1);
06088 }
06089 
06090 int ast_say_phonetic_str(struct ast_channel *chan, const char *str,
06091    const char *ints, const char *lang)
06092 {
06093    return ast_say_phonetic_str_full(chan, str, ints, lang, -1, -1);
06094 }
06095 
06096 int ast_say_digits_full(struct ast_channel *chan, int num,
06097    const char *ints, const char *lang, int audiofd, int ctrlfd)
06098 {
06099    char buf[256];
06100 
06101    snprintf(buf, sizeof(buf), "%d", num);
06102 
06103    return ast_say_digit_str_full(chan, buf, ints, lang, audiofd, ctrlfd);
06104 }
06105 
06106 /* DO NOT PUT ADDITIONAL FUNCTIONS BELOW THIS BOUNDARY
06107  *
06108  * ONLY FUNCTIONS FOR PROVIDING BACKWARDS ABI COMPATIBILITY BELONG HERE
06109  *
06110  */
06111 
06112 /* Provide binary compatibility for modules that call ast_channel_alloc() directly;
06113  * newly compiled modules will call __ast_channel_alloc() via the macros in channel.h
06114  */
06115 #undef ast_channel_alloc
06116 struct ast_channel __attribute__((format(printf, 9, 10)))
06117    *ast_channel_alloc(int needqueue, int state, const char *cid_num,
06118             const char *cid_name, const char *acctcode,
06119             const char *exten, const char *context,
06120             const int amaflag, const char *name_fmt, ...);
06121 struct ast_channel *ast_channel_alloc(int needqueue, int state, const char *cid_num,
06122                   const char *cid_name, const char *acctcode,
06123                   const char *exten, const char *context,
06124                   const int amaflag, const char *name_fmt, ...)
06125 {
06126    va_list ap1, ap2;
06127    struct ast_channel *result;
06128 
06129 
06130    va_start(ap1, name_fmt);
06131    va_start(ap2, name_fmt);
06132    result = __ast_channel_alloc_ap(needqueue, state, cid_num, cid_name, acctcode, exten, context,
06133                amaflag, __FILE__, __LINE__, __FUNCTION__, name_fmt, ap1, ap2);
06134    va_end(ap1);
06135    va_end(ap2);
06136 
06137    return result;
06138 }