]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
merge up to branch 1.2 and re-enable automerge
authorKevin P. Fleming <kpfleming@digium.com>
Thu, 8 Feb 2007 22:48:47 +0000 (22:48 +0000)
committerKevin P. Fleming <kpfleming@digium.com>
Thu, 8 Feb 2007 22:48:47 +0000 (22:48 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2-netsec@53671 65c4cc65-6c06-0410-ace0-fbb531ad65f3

26 files changed:
apps/app_chanspy.c
apps/app_dial.c
apps/app_macro.c
apps/app_meetme.c
apps/app_page.c
apps/app_queue.c
apps/app_rpt.c
apps/app_voicemail.c
cdr.c
channels/chan_h323.c
channels/chan_iax2.c
channels/chan_mgcp.c
channels/chan_sip.c
channels/chan_skinny.c
channels/chan_zap.c
codecs/Makefile
codecs/codec_zap.c
config.c
configs/dnsmgr.conf.sample
funcs/func_strings.c
manager.c
pbx.c
pbx/pbx_dundi.c
pbx/pbx_spool.c
res/res_musiconhold.c
rtp.c

index fcb931d3281d5cad0e832d3739403e610f9027bc..6b30842b838c5a94f33de7d37f4b267318845c8e 100644 (file)
@@ -53,7 +53,7 @@ AST_MUTEX_DEFINE_STATIC(modlock);
 #define ALL_DONE(u, ret) LOCAL_USER_REMOVE(u); return ret;
 #define get_volfactor(x) x ? ((x > 0) ? (1 << x) : ((1 << abs(x)) * -1)) : 0
 
-static const char *synopsis = "Listen to the audio of an active channel\n";
+static const char *synopsis = "Listen to the audio of an active channel";
 static const char *app = "ChanSpy";
 static const char *desc = 
 "  ChanSpy([chanprefix][|options]): This application is used to listen to the\n"
index 522c47a3f0285e2912b196184a71c8193fcdbc11..69b5813d3cde311dcfad3d7bcd015e3f8a726ee9 100644 (file)
@@ -80,7 +80,7 @@ static char *descrip =
 "    ANSWEREDTIME - This is the amount of time for actual call.\n"
 "    DIALSTATUS   - This is the status of the call:\n"
 "                   CHANUNAVAIL | CONGESTION | NOANSWER | BUSY | ANSWER | CANCEL\n" 
-"                   DONTCALL | TORTURE\n"
+"                   DONTCALL | TORTURE | INVALIDARGS\n"
 "  For the Privacy and Screening Modes, the DIALSTATUS variable will be set to\n"
 "DONTCALL if the called party chooses to send the calling party to the 'Go Away'\n"
 "script. The DIALSTATUS variable will be set to TORTURE if the called party\n"
@@ -759,7 +759,7 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
        char *start_sound=NULL;
        char *dtmfcalled=NULL, *dtmfcalling=NULL;
        char *var;
-       char status[256];
+       char status[256] = "INVALIDARGS";
        int play_to_caller=0,play_to_callee=0;
        int sentringing=0, moh=0;
        char *outbound_group = NULL;
@@ -780,21 +780,19 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
 
        if (ast_strlen_zero(data)) {
                ast_log(LOG_WARNING, "Dial requires an argument (technology/number)\n");
+               pbx_builtin_setvar_helper(chan, "DIALSTATUS", status);
                return -1;
        }
 
        LOCAL_USER_ADD(u);
 
-       if (!(parse = ast_strdupa(data))) {
-               ast_log(LOG_WARNING, "Memory allocation failure\n");
-               LOCAL_USER_REMOVE(u);
-               return -1;
-       }
+       parse = ast_strdupa(data);
        
        AST_STANDARD_APP_ARGS(args, parse);
 
        if (!ast_strlen_zero(args.options)) {
                if (ast_app_parse_options(dial_exec_options, &opts, opt_args, args.options)) {
+                       pbx_builtin_setvar_helper(chan, "DIALSTATUS", status);
                        LOCAL_USER_REMOVE(u);
                        return -1;
                }
@@ -802,6 +800,7 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
 
        if (ast_strlen_zero(args.peers)) {
                ast_log(LOG_WARNING, "Dial requires an argument (technology/number)\n");
+               pbx_builtin_setvar_helper(chan, "DIALSTATUS", status);
                LOCAL_USER_REMOVE(u);
                return -1;
        }
index 44d3d06105e33946e59b36c0678c69284d7af911..425836278d6b6df29f8c9c938e0793aa103a4ffb 100644 (file)
@@ -107,10 +107,10 @@ static int macro_exec(struct ast_channel *chan, void *data)
        int oldpriority;
        char pc[80], depthc[12];
        char oldcontext[AST_MAX_CONTEXT] = "";
-       char *offsets, *s;
+       char *offsets, *s, *inhangupc;
        int offset, depth = 0, maxdepth = 7;
        int setmacrocontext=0;
-       int autoloopflag, dead = 0;
+       int autoloopflag, dead = 0, inhangup = 0;
   
        char *save_macro_exten;
        char *save_macro_context;
@@ -138,6 +138,13 @@ static int macro_exec(struct ast_channel *chan, void *data)
                depth = 0;
        }
 
+       /* Used for detecting whether to return when a Macro is called from another Macro after hangup */
+       if (strcmp(chan->exten, "h") == 0)
+               pbx_builtin_setvar_helper(chan, "MACRO_IN_HANGUP", "1");
+       inhangupc = pbx_builtin_getvar_helper(chan, "MACRO_IN_HANGUP");
+       if (!ast_strlen_zero(inhangupc))
+               sscanf(inhangupc, "%d", &inhangup);
+
        if (depth >= maxdepth) {
                ast_log(LOG_ERROR, "Macro():  possible infinite loop detected.  Returning early.\n");
                LOCAL_USER_REMOVE(u);
@@ -252,7 +259,7 @@ static int macro_exec(struct ast_channel *chan, void *data)
                        break;
                }
                /* don't stop executing extensions when we're in "h" */
-               if (chan->_softhangup && strcasecmp(oldexten,"h") && strcasecmp(chan->macroexten,"h")) {
+               if (chan->_softhangup && !inhangup) {
                        ast_log(LOG_DEBUG, "Extension %s, macroexten %s, priority %d returned normally even though call was hung up\n",
                                chan->exten, chan->macroexten, chan->priority);
                        goto out;
index a29289ed86561b58a14dc4a5fb8abfc9c11ec1d3..1efd4bbb4d346f20afcd98624870153780a523e5 100644 (file)
@@ -862,6 +862,7 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
                ast_verbose(VERBOSE_PREFIX_4 "Starting recording of MeetMe Conference %s into file %s.%s.\n",
                            conf->confno, conf->recordingfilename, conf->recordingformat);
                ast_pthread_create(&conf->recordthread, &conf->attr, recordthread, conf);
+               pthread_attr_destroy(&conf->attr);
        }
 
        time(&user->jointime);
index c1668cc7f00a7248e19a56fb0a3990a44fff5b6c..e57e5d0510ec5668bf367ae7b419cb43695ba0e9 100644 (file)
@@ -135,6 +135,7 @@ static void launch_page(struct ast_channel *chan, const char *meetmeopts, const
                        ast_log(LOG_WARNING, "Unable to create paging thread: %s\n", strerror(errno));
                        free(cd);
                }
+               pthread_attr_destroy(&attr);
        }
 }
 
index 64117322f78c059550db4aeb8e4546d307f4d657..b6d809862f3a90354a0bbeaf2bea0c93d9dbb192 100644 (file)
@@ -562,6 +562,7 @@ static int statechange_queue(const char *dev, int state, void *ign)
                ast_log(LOG_WARNING, "Failed to create update thread!\n");
                free(sc);
        }
+       pthread_attr_destroy(&attr);
 
        return 0;
 }
index 913baaba8faa6549a474ea1cd404838f3934ae02..a3f86c8204b8a9b30a5a1ceca0f6e9afe3efbd17 100644 (file)
@@ -1521,6 +1521,7 @@ pthread_attr_t attr;
         pthread_attr_init(&attr);
         pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
        ast_pthread_create(&tele->threadid,&attr,rpt_tele_thread,(void *) tele);
+       pthread_attr_destroy(&attr);
        return;
 }
 
@@ -2153,6 +2154,7 @@ static int function_autopatchup(struct rpt *myrpt, char *param, char *digitbuf,
        pthread_attr_init(&attr);
        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
        ast_pthread_create(&myrpt->rpt_call_thread,&attr,rpt_call,(void *) myrpt);
+       pthread_attr_destroy(&attr);
        return DC_COMPLETE;
 }
 
@@ -5239,6 +5241,7 @@ char cmd[MAXDTMF+1] = "";
                                                pthread_attr_init(&attr);
                                                pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
                                                ast_pthread_create(&myrpt->rpt_call_thread,&attr,rpt_call,(void *)myrpt);
+                                               pthread_attr_destroy(&attr);
                                                continue;
                                        }
                                }
@@ -5781,6 +5784,7 @@ pthread_attr_t attr;
                pthread_attr_init(&attr);
                pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
                ast_pthread_create(&rpt_vars[i].rpt_thread,&attr,rpt,(void *) &rpt_vars[i]);
+               pthread_attr_destroy(&attr);
        }
        usleep(500000);
        for(;;)
@@ -5816,6 +5820,7 @@ pthread_attr_t attr;
                                pthread_attr_init(&attr);
                                pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
                                ast_pthread_create(&rpt_vars[i].rpt_thread,&attr,rpt,(void *) &rpt_vars[i]);
+                               pthread_attr_destroy(&attr);
                                ast_log(LOG_WARNING, "rpt_thread restarted on node %s\n", rpt_vars[i].name);
                        }
 
index 47896a0d618965af6170c137307cab4c93043a02..c857096ee7daadd3c609e8e897b90e4087d280d5 100644 (file)
@@ -1746,7 +1746,7 @@ static int sendmail(char *srcemail, struct ast_vm_user *vmu, int msgnum, char *c
                                        memset(passdata, 0, vmlen);
                                        prep_email_sub_vars(ast,vmu,msgnum + 1,context,mailbox,cidnum, cidname,dur,date,passdata, vmlen);
                                        pbx_substitute_variables_helper(ast,fromstring,passdata,vmlen);
-                                       len_passdata = strlen(passdata) * 2 + 1;
+                                       len_passdata = strlen(passdata) * 2 + 3;
                                        passdata2 = alloca(len_passdata);
                                        fprintf(p, "From: %s <%s>\n", quote(passdata, passdata2, len_passdata), who);
                                } else ast_log(LOG_WARNING, "Cannot allocate workspace for variable substitution\n");
@@ -1754,7 +1754,7 @@ static int sendmail(char *srcemail, struct ast_vm_user *vmu, int msgnum, char *c
                        } else ast_log(LOG_WARNING, "Cannot allocate the channel for variables substitution\n");
                } else
                        fprintf(p, "From: Asterisk PBX <%s>\n", who);
-               len_passdata = strlen(vmu->fullname) * 2 + 1;
+               len_passdata = strlen(vmu->fullname) * 2 + 3;
                passdata2 = alloca(len_passdata);
                fprintf(p, "To: %s <%s>\n", quote(vmu->fullname, passdata2, len_passdata), vmu->email);
 
diff --git a/cdr.c b/cdr.c
index f09d1e131109a7bb2870651951c9a8bf2b249131..6838d619c93b0b03db50e1fbabebc06e98cb8749 100644 (file)
--- a/cdr.c
+++ b/cdr.c
@@ -956,6 +956,7 @@ void ast_cdr_submit_batch(int shutdown)
                        if (option_debug)
                                ast_log(LOG_DEBUG, "CDR multi-threaded batch processing begins now\n");
                }
+               pthread_attr_destroy(&attr);
        }
 }
 
index 1b4a616a5fae89f8f4a9115c551b43d85e897458..b2d4d8184fde79c4e445b70190ffb493a5fe2a46 100644 (file)
@@ -1642,9 +1642,11 @@ static int restart_monitor(void)
                 /* Start a new monitor */
                 if (ast_pthread_create(&monitor_thread, &attr, do_monitor, NULL) < 0) {
                         ast_mutex_unlock(&monlock);
+                                               pthread_attr_destroy(&attr);
                         ast_log(LOG_ERROR, "Unable to start monitor thread.\n");
                         return -1;
                 }
+               pthread_attr_destroy(&attr);
 
        }
        ast_mutex_unlock(&monlock);
index 76592002aa82129088ed5b1639f2b45edccd307c..db1ee8e6acc37083657413301e4324f367f6d8cb 100644 (file)
@@ -2634,8 +2634,10 @@ static struct iax2_peer *realtime_peer(const char *peername, struct sockaddr_in
 
        peer = build_peer(peername, var, ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS) ? 0 : 1);
        
-       if (!peer)
+       if (!peer) {
+               ast_variables_destroy(var);
                return NULL;
+       }
 
        tmp = var;
        while(tmp) {
@@ -2661,11 +2663,12 @@ static struct iax2_peer *realtime_peer(const char *peername, struct sockaddr_in
                }
                tmp = tmp->next;
        }
-       if (!peer)
-               return NULL;
 
        ast_variables_destroy(var);
 
+       if (!peer)
+               return NULL;
+
        if (ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS)) {
                ast_copy_flags(peer, &globalflags, IAX_RTAUTOCLEAR|IAX_RTCACHEFRIENDS);
                if (ast_test_flag(peer, IAX_RTAUTOCLEAR)) {
@@ -2725,11 +2728,12 @@ static struct iax2_user *realtime_user(const char *username)
        }
 
        user = build_user(username, var, !ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS));
-       if (!user)
-               return NULL;
 
        ast_variables_destroy(var);
 
+       if (!user)
+               return NULL;
+
        if (ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS)) {
                ast_set_flag(user, IAX_RTCACHEFRIENDS);
                ast_mutex_lock(&userl.lock);
@@ -4925,15 +4929,12 @@ static int check_access(int callno, struct sockaddr_in *sin, struct iax_ies *ies
                                        key++;
                                }
                        }
-                       if (!family || !key || ast_db_get(family, key, iaxs[callno]->secret, sizeof(iaxs[callno]->secret))) {
+                       if (!family || !key || ast_db_get(family, key, iaxs[callno]->secret, sizeof(iaxs[callno]->secret)))
                                ast_log(LOG_WARNING, "Unable to retrieve database password for family/key '%s'!\n", user->dbsecret);
-                               if (ast_test_flag(user, IAX_TEMPONLY)) {
-                                       destroy_user(user);
-                                       user = NULL;
-                               }
-                       }
                } else
                        ast_copy_string(iaxs[callno]->secret, user->secret, sizeof(iaxs[callno]->secret)); 
+               if (ast_test_flag(user, IAX_TEMPONLY))
+                       destroy_user(user);
                res = 0;
        }
        ast_set2_flag(iaxs[callno], iax2_getpeertrunk(*sin), IAX_TRUNK);        
@@ -6224,6 +6225,7 @@ static void spawn_dp_lookup(int callno, char *context, char *callednum, char *ca
                if (ast_pthread_create(&newthread, &attr, dp_lookup_thread, dpr)) {
                        ast_log(LOG_WARNING, "Unable to start lookup thread!\n");
                }
+               pthread_attr_destroy(&attr);
        } else
                ast_log(LOG_WARNING, "Out of memory!\n");
 }
@@ -6304,8 +6306,11 @@ static int iax_park(struct ast_channel *chan1, struct ast_channel *chan2)
                memset(d, 0, sizeof(*d));
                d->chan1 = chan1m;
                d->chan2 = chan2m;
-               if (!ast_pthread_create(&th, &attr, iax_park_thread, d))
+               if (!ast_pthread_create(&th, &attr, iax_park_thread, d)) {
+                       pthread_attr_destroy(&attr);
                        return 0;
+               }
+               pthread_attr_destroy(&attr);
                free(d);
        }
        return -1;
index 14b1874260562b97ebc8d8632275fa307a4b2192..de2d6a4008899a78abc6eb380e9e73f03835092d 100644 (file)
@@ -2963,6 +2963,7 @@ static void handle_hd_hf(struct mgcp_subchannel *sub, char *ev)
                        /*ast_queue_control(sub->owner, AST_CONTROL_ANSWER);*/
                }
        }
+       pthread_attr_destroy(&attr);
 }
 
 static int handle_request(struct mgcp_subchannel *sub, struct mgcp_request *req, struct sockaddr_in *sin)
index e54178fbef096f97bd9beb292e9118c42b9aecb5..e3c8a3fcdb80a1802a2b61eaeccf47b920b96f68 100644 (file)
@@ -412,7 +412,6 @@ static int restart_monitor(void);
 
 /*! \brief Codecs that we support by default: */
 static int global_capability = AST_FORMAT_ULAW | AST_FORMAT_ALAW | AST_FORMAT_GSM | AST_FORMAT_H263;
-static int noncodeccapability = AST_RTP_DTMF;
 
 static struct in_addr __ourip;
 static struct sockaddr_in outboundproxyip;
@@ -571,8 +570,7 @@ struct sip_auth {
 #define SIP_CALL_LIMIT         (1 << 29)
 /* Remote Party-ID Support */
 #define SIP_SENDRPID           (1 << 30)
-/* Did this connection increment the counter of in-use calls? */
-#define SIP_INC_COUNT (1 << 31)
+#define SIP_INC_COUNT          (1 << 31)       /* Did this connection increment the counter of in-use calls? */
 
 #define SIP_FLAGS_TO_COPY \
        (SIP_PROMISCREDIR | SIP_TRUSTRPID | SIP_SENDRPID | SIP_DTMF | SIP_REINVITE | \
@@ -613,6 +611,7 @@ static struct sip_pvt {
        int peercapability;                     /*!< Supported peer capability */
        int prefcodec;                          /*!< Preferred codec (outbound only) */
        int noncodeccapability;
+       int jointnoncodeccapability;
        int callingpres;                        /*!< Calling presentation */
        int authtries;                          /*!< Times we've tried to authenticate */
        int expiry;                             /*!< How long we take to expire */
@@ -2111,6 +2110,7 @@ static int sip_call(struct ast_channel *ast, char *dest, int timeout)
        if ( res != -1 ) {
                p->callingpres = ast->cid.cid_pres;
                p->jointcapability = p->capability;
+               p->jointnoncodeccapability = p->noncodeccapability;
                transmit_invite(p, SIP_INVITE, 1, 2);
                if (p->maxtime) {
                        /* Initialize auto-congest time */
@@ -2155,6 +2155,12 @@ static void __sip_destroy(struct sip_pvt *p, int lockowner)
          m_cb->__sip_destroy_hook(p);
 #endif
 
+       if (ast_test_flag(p, SIP_INC_COUNT)) {
+               update_call_counter(p, DEC_CALL_LIMIT);
+               if (option_debug)
+                       ast_log(LOG_DEBUG, "Call did not properly clean up call counter. Call ID %s\n", p->callid);
+       }
+
        if (dumphistory)
                sip_dump_history(p);
 
@@ -2281,8 +2287,10 @@ static int update_call_counter(struct sip_pvt *fup, int event)
                /* incoming and outgoing affects the inUse counter */
                case DEC_CALL_LIMIT:
                        if ( *inuse > 0 ) {
-                                if (ast_test_flag(fup,SIP_INC_COUNT))
+                               if (ast_test_flag(fup, SIP_INC_COUNT)) {
                                         (*inuse)--;
+                                       ast_clear_flag(fup, SIP_INC_COUNT);
+                               }
                        } else {
                                *inuse = 0;
                        }
@@ -3760,11 +3768,11 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req)
                                &vpeercapability, &vpeernoncodeccapability);
        p->jointcapability = p->capability & (peercapability | vpeercapability);
        p->peercapability = (peercapability | vpeercapability);
-       p->noncodeccapability = noncodeccapability & peernoncodeccapability;
+       p->jointnoncodeccapability = p->noncodeccapability & peernoncodeccapability;
        
        if (ast_test_flag(p, SIP_DTMF) == SIP_DTMF_AUTO) {
                ast_clear_flag(p, SIP_DTMF);
-               if (p->noncodeccapability & AST_RTP_DTMF) {
+               if (p->jointnoncodeccapability & AST_RTP_DTMF) {
                        /* XXX Would it be reasonable to drop the DSP at this point? XXX */
                        ast_set_flag(p, SIP_DTMF_RFC2833);
                } else {
@@ -3784,9 +3792,9 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req)
                        ast_getformatname_multiple(s4, slen, p->jointcapability));
 
                ast_verbose("Non-codec capabilities: us - %s, peer - %s, combined - %s\n",
-                       ast_rtp_lookup_mime_multiple(s1, slen, noncodeccapability, 0),
+                       ast_rtp_lookup_mime_multiple(s1, slen, p->noncodeccapability, 0),
                        ast_rtp_lookup_mime_multiple(s2, slen, peernoncodeccapability, 0),
-                       ast_rtp_lookup_mime_multiple(s3, slen, p->noncodeccapability, 0));
+                       ast_rtp_lookup_mime_multiple(s3, slen, p->jointnoncodeccapability, 0));
        }
        if (!p->jointcapability) {
                ast_log(LOG_NOTICE, "No compatible codecs!\n");
@@ -4710,7 +4718,7 @@ static int add_sdp(struct sip_request *resp, struct sip_pvt *p)
        }
 
        for (x = 1; x <= AST_RTP_MAX; x <<= 1) {
-               if (!(p->noncodeccapability & x))
+               if (!(p->jointnoncodeccapability & x))
                        continue;
 
                add_noncodec_to_sdp(p, x, 8000,
@@ -10499,8 +10507,11 @@ static int sip_park(struct ast_channel *chan1, struct ast_channel *chan2, struct
                copy_request(&d->req, req);
                d->chan1 = chan1m;
                d->chan2 = chan2m;
-               if (!ast_pthread_create(&th, &attr, sip_park_thread, d))
+               if (!ast_pthread_create(&th, &attr, sip_park_thread, d)) {
+                       pthread_attr_destroy(&attr);
                        return 0;
+               }
+               pthread_attr_destroy(&attr);
                free(d);
        }
        return -1;
index ca55bfcad72b9d17cc7ee68a1ea90f3fe689030d..3cfd9d64687daf56d4ae74c882653327325a1a97 100644 (file)
@@ -2977,6 +2977,7 @@ static void *accept_thread(void *ignore)
                ast_verbose("killing accept thread\n");
        }
        close(as);
+       pthread_attr_destroy(&attr);
        return 0;
 }
 
index e8a88579156c9ec87d9dbba8fd499f72d2dd163a..45ebb0c786e555cb66a3ce3a6d5bc0696e75d282 100644 (file)
@@ -3668,9 +3668,6 @@ static struct ast_frame *zt_handle_event(struct ast_channel *ast)
        pthread_attr_t attr;
        struct ast_channel *chan;
 
-       pthread_attr_init(&attr);
-       pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-
        index = zt_get_index(ast, p, 0);
        p->subs[index].f.frametype = AST_FRAME_NULL;
        p->subs[index].f.datalen = 0;
@@ -4199,6 +4196,8 @@ static struct ast_frame *zt_handle_event(struct ast_channel *ast)
                                                if (res)
                                                        ast_log(LOG_WARNING, "Unable to start dial recall tone on channel %d\n", p->channel);
                                                p->owner = chan;
+                                               pthread_attr_init(&attr);
+                                               pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
                                                if (!chan) {
                                                        ast_log(LOG_WARNING, "Cannot allocate new structure on channel %d\n", p->channel);
                                                } else if (ast_pthread_create(&threadid, &attr, ss_thread, chan)) {
@@ -4212,7 +4211,8 @@ static struct ast_frame *zt_handle_event(struct ast_channel *ast)
                                                        /* Start music on hold if appropriate */
                                                        if (ast_bridged_channel(p->subs[SUB_THREEWAY].owner))
                                                                ast_moh_start(ast_bridged_channel(p->subs[SUB_THREEWAY].owner), NULL);
-                                               }               
+                                               }
+                                               pthread_attr_destroy(&attr);
                                        }
                                } else {
                                        /* Already have a 3 way call */
@@ -6579,6 +6579,7 @@ static int handle_init_event(struct zt_pvt *i, int event)
                                "interface %d\n", i->channel);
                }
        }
+       pthread_attr_destroy(&attr);
        return 0;
 }
 
@@ -6838,10 +6839,12 @@ static int restart_monitor(void)
                if (ast_pthread_create(&monitor_thread, &attr, do_monitor, NULL) < 0) {
                        ast_mutex_unlock(&monlock);
                        ast_log(LOG_ERROR, "Unable to start monitor thread.\n");
+                       pthread_attr_destroy(&attr);
                        return -1;
                }
        }
        ast_mutex_unlock(&monlock);
+       pthread_attr_destroy(&attr);
        return 0;
 }
 
@@ -8193,9 +8196,6 @@ static void *pri_dchannel(void *vpri)
        char plancallingani[256];
        char calledtonstr[10];
        
-       pthread_attr_init(&attr);
-       pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-
        gettimeofday(&lastidle, NULL);
        if (!ast_strlen_zero(pri->idledial) && !ast_strlen_zero(pri->idleext)) {
                /* Need to do idle dialing, check to be sure though */
@@ -8683,6 +8683,8 @@ static void *pri_dchannel(void *vpri)
                                                                pbx_builtin_setvar_helper(c, "PRIREDIRECTREASON", redirectingreason2str(e->ring.redirectingreason));
                                                        
                                                        ast_mutex_lock(&pri->lock);
+                                                       pthread_attr_init(&attr);
+                                                       pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
                                                        if (c && !ast_pthread_create(&threadid, &attr, ss_thread, c)) {
                                                                if (option_verbose > 2)
                                                                        ast_verbose(VERBOSE_PREFIX_3 "Accepting overlap call from '%s' to '%s' on channel %d/%d, span %d\n",
@@ -8698,6 +8700,7 @@ static void *pri_dchannel(void *vpri)
                                                                        pri->pvts[chanpos]->call = NULL;
                                                                }
                                                        }
+                                                       pthread_attr_destroy(&attr);
                                                } else  {
                                                        ast_mutex_unlock(&pri->lock);
                                                        /* Release PRI lock while we create the channel */
index 915a048e93e7f5e0e008acd0320ec7024ecbef2f..8fa45410953801741da299da611fe28da64aa066 100644 (file)
@@ -28,18 +28,18 @@ ifneq ($(wildcard g723.1b/coder2.c),)
   LIBG723B=g723.1b/libg723b.a
 endif
 
-# XXX Uncomment this when transcoder support is merged into zaptel 1.2 !
-#ifndef WITHOUT_ZAPTEL
-#ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/linux/zaptel.h)$(wildcard $(CROSS_COMPILE_TARGET)/usr/local/include/zaptel.h)$(wildcard $(CROSS_COMPILE_TARGET)/usr/pkg/include/zaptel.h),)
-#  ifeq (${OSARCH},NetBSD)
-#    SOLINK+=-L$(CROSS_COMPILE_TARGET)/usr/pkg/lib
-#  endif
-#  ifeq (${OSARCH},FreeBSD)
-#    SOLINK+=-L$(CROSS_COMPILE_TARGET)/usr/local/lib
-#  endif
-#  CODECS+=codec_zap.so
-#endif
-#endif # WITHOUT_ZAPTEL
+ifndef WITHOUT_ZAPTEL
+ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/linux/zaptel.h)$(wildcard $(CROSS_COMPILE_TARGET)/usr/local/include/zaptel.h)$(wildcard $(CROSS_COMPILE_TARGET)/usr/pkg/include/zaptel.h),)
+  ifeq (${OSARCH},NetBSD)
+    SOLINK+=-L$(CROSS_COMPILE_TARGET)/usr/pkg/lib
+  endif
+  ifeq (${OSARCH},FreeBSD)
+    SOLINK+=-L$(CROSS_COMPILE_TARGET)/usr/local/lib
+  endif
+  CODECS+=codec_zap.so
+endif
+endif # WITHOUT_ZAPTEL
+
 
 UI_SPEEX=$(wildcard $(CROSS_COMPILE_TARGET)/usr/include/speex.h)
 UIS_SPEEX=$(wildcard $(CROSS_COMPILE_TARGET)/usr/include/speex/speex.h)
index 40c7d4cb2b8c6db8346b07275d7bd9c013070811..a4d9de6d8892c1824e525f97f53a4d46d78b97ba 100644 (file)
@@ -241,7 +241,7 @@ static struct ast_translator_pvt *zap_new_alawtog723(void)
 {
        /* Request translation through zap if possible */
        int fd;
-       unsigned int x = ZT_TCOP_RESET;
+       unsigned int x = ZT_TCOP_ALLOCATE;
        struct ast_translator_pvt *ztp;
        struct zt_transcode_header *hdr;
        int flags;
@@ -298,7 +298,7 @@ static struct ast_translator_pvt *zap_new_ulawtog723(void)
 {
        /* Request translation through zap if possible */
        int fd;
-       unsigned int x = ZT_TCOP_RESET;
+       unsigned int x = ZT_TCOP_ALLOCATE;
        struct ast_translator_pvt *ztp;
        struct zt_transcode_header *hdr;
        int flags;
@@ -355,7 +355,7 @@ static struct ast_translator_pvt *zap_new_g723toalaw(void)
 {
        /* Request translation through zap if possible */
        int fd;
-       unsigned int x = ZT_TCOP_RESET;
+       unsigned int x = ZT_TCOP_ALLOCATE;
        struct ast_translator_pvt *ztp;
        struct zt_transcode_header *hdr;
        int flags;
@@ -412,7 +412,7 @@ static struct ast_translator_pvt *zap_new_g723toulaw(void)
 {
        /* Request translation through zap if possible */
        int fd;
-       unsigned int x = ZT_TCOP_RESET;
+       unsigned int x = ZT_TCOP_ALLOCATE;
        struct ast_translator_pvt *ztp;
        struct zt_transcode_header *hdr;
        int flags;
@@ -469,7 +469,7 @@ static struct ast_translator_pvt *zap_new_alawtog729(void)
 {
        /* Request translation through zap if possible */
        int fd;
-       unsigned int x = ZT_TCOP_RESET;
+       unsigned int x = ZT_TCOP_ALLOCATE;
        struct ast_translator_pvt *ztp;
        struct zt_transcode_header *hdr;
        int flags;
@@ -526,7 +526,7 @@ static struct ast_translator_pvt *zap_new_ulawtog729(void)
 {
        /* Request translation through zap if possible */
        int fd;
-       unsigned int x = ZT_TCOP_RESET;
+       unsigned int x = ZT_TCOP_ALLOCATE;
        struct ast_translator_pvt *ztp;
        struct zt_transcode_header *hdr;
        int flags;
@@ -583,7 +583,7 @@ static struct ast_translator_pvt *zap_new_g729toalaw(void)
 {
        /* Request translation through zap if possible */
        int fd;
-       unsigned int x = ZT_TCOP_RESET;
+       unsigned int x = ZT_TCOP_ALLOCATE;
        struct ast_translator_pvt *ztp;
        struct zt_transcode_header *hdr;
        int flags;
@@ -640,7 +640,7 @@ static struct ast_translator_pvt *zap_new_g729toulaw(void)
 {
        /* Request translation through zap if possible */
        int fd;
-       unsigned int x = ZT_TCOP_RESET;
+       unsigned int x = ZT_TCOP_ALLOCATE;
        struct ast_translator_pvt *ztp;
        struct zt_transcode_header *hdr;
        int flags;
@@ -856,6 +856,11 @@ static int find_transcoders(void)
                ast_log(LOG_NOTICE, "No Zaptel transcoder support!\n");
                return 0;
        }
+
+       ast_mutex_lock(&channelcount);
+       totalchannels = 0;
+       ast_mutex_unlock(&channelcount);
+
        for (info.tcnum = 0; !(res = ioctl(fd, ZT_TRANSCODE_OP, &info)); info.tcnum++) {
                if (option_verbose > 1)
                        ast_verbose(VERBOSE_PREFIX_2 "Found transcoder '%s'.\n", info.name);
index 989cd0b15b692fab559f4294f29e1469802f42fc..75b3f6ee7106806624d569d541ba21c73df6b5f8 100644 (file)
--- a/config.c
+++ b/config.c
@@ -651,7 +651,7 @@ static struct ast_config *config_text_file_load(const char *database, const char
                                if (process_buf) {
                                        char *buf = ast_strip(process_buf);
                                        if (!ast_strlen_zero(buf)) {
-                                               if (process_text_line(cfg, &cat, buf, lineno, filename)) {
+                                               if (process_text_line(cfg, &cat, buf, lineno, fn)) {
                                                        cfg = NULL;
                                                        break;
                                                }
index e34dbcf0a8e91fb67dd11abf42048c0d9cd0f149..03a376c3e688592a09eeadd95de22b269c307b4a 100644 (file)
@@ -2,4 +2,4 @@
 ;enable=yes            ; enable creation of managed DNS lookups
                        ;   default is 'no'
 ;refreshinterval=1200  ; refresh managed DNS lookups every <n> seconds
-                       ;   default is 300 (5 minutes)
\ No newline at end of file
+                       ;   default is 300 (5 minutes)
index 27c457dd43daa75c1e8934862b1620dd8cce6bf4..00b6dd1720fc7c9b7a08f50fba97eff3b82e45da 100644 (file)
 
 static char *function_fieldqty(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
 {
-       char *varname, *varval, workspace[256];
+       char *varname, *varsubst, varval[8192] = "", *varval2 = varval;
        char *delim = ast_strdupa(data);
        int fieldcount = 0;
 
        if (delim) {
                varname = strsep(&delim, "|");
-               pbx_retrieve_variable(chan, varname, &varval, workspace, sizeof(workspace), NULL);
+               varsubst = alloca(strlen(varname) + 4);
+
+               sprintf(varsubst, "${%s}", varname);
+               pbx_substitute_variables_helper(chan, varsubst, varval, sizeof(varval) - 1);
                if (delim) {
-                       while (strsep(&varval, delim))
+                       while (strsep(&varval2, delim))
                                fieldcount++;
                } else if (!ast_strlen_zero(varval)) {
                        fieldcount = 1;
index 5254f77496ab17920423682df840c9324e6f4d7c..d3488db7f74b0ae068dfa6e9442cfc19d1139e1b 100644 (file)
--- a/manager.c
+++ b/manager.c
@@ -773,7 +773,6 @@ static int action_status(struct mansession *s, struct message *m)
        long elapsed_seconds=0;
        int all = ast_strlen_zero(name); /* set if we want all channels */
 
-       astman_send_ack(s, m, "Channel status will follow");
         if (!ast_strlen_zero(id))
                 snprintf(idText,256,"ActionID: %s\r\n",id);
        if (all)
@@ -785,6 +784,7 @@ static int action_status(struct mansession *s, struct message *m)
                        return 0;
                }
        }
+       astman_send_ack(s, m, "Channel status will follow");
        /* if we look by name, we break after the first iteration */
        while(c) {
                if (c->_bridge)
@@ -1077,6 +1077,7 @@ static int action_originate(struct mansession *s, struct message *m)
                        } else {
                                res = 0;
                        }
+                       pthread_attr_destroy(&attr);
                }
        } else if (!ast_strlen_zero(app)) {
                res = ast_pbx_outgoing_app(tech, AST_FORMAT_SLINEAR, data, to, app, appdata, &reason, 1, l, n, vars, account, NULL);
diff --git a/pbx.c b/pbx.c
index 5fae072cafc061ce9a42fb3e119ec9aee41a26a5..7a8f9979d29d35531b468be5ded1345b90c40e55 100644 (file)
--- a/pbx.c
+++ b/pbx.c
@@ -974,8 +974,7 @@ static char *substring(const char *value, int offset, int length, char *workspac
        return ret;
 }
 
-/*! \brief  pbx_retrieve_variable: Support for Asterisk built-in variables and
-      functions in the dialplan
+/*! \brief  pbx_retrieve_variable: Support for Asterisk built-in variables
   ---*/
 void pbx_retrieve_variable(struct ast_channel *c, const char *var, char **ret, char *workspace, int workspacelen, struct varshead *headp)
 {
@@ -2541,8 +2540,10 @@ enum ast_pbx_result ast_pbx_start(struct ast_channel *c)
        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
        if (ast_pthread_create(&t, &attr, pbx_thread, c)) {
                ast_log(LOG_WARNING, "Failed to create new channel thread\n");
+               pthread_attr_destroy(&attr);
                return AST_PBX_FAILED;
        }
+       pthread_attr_destroy(&attr);
 
        return AST_PBX_SUCCESS;
 }
@@ -5125,8 +5126,10 @@ int ast_pbx_outgoing_exten(const char *type, int format, void *data, int timeout
                        }
                        ast_hangup(chan);
                        res = -1;
+                       pthread_attr_destroy(&attr);
                        goto outgoing_exten_cleanup;
                }
+               pthread_attr_destroy(&attr);
                res = 0;
        }
 outgoing_exten_cleanup:
@@ -5228,6 +5231,7 @@ int ast_pbx_outgoing_app(const char *type, int format, void *data, int timeout,
                                                        if (locked_channel) 
                                                                *locked_channel = chan;
                                                }
+                                               pthread_attr_destroy(&attr);
                                        }
                                } else {
                                        ast_log(LOG_ERROR, "Out of memory :(\n");
@@ -5290,11 +5294,13 @@ int ast_pbx_outgoing_app(const char *type, int format, void *data, int timeout,
                                ast_mutex_unlock(&chan->lock);
                        ast_hangup(chan);
                        res = -1;
+                       pthread_attr_destroy(&attr);
                        goto outgoing_app_cleanup;
                } else {
                        if (locked_channel)
                                *locked_channel = chan;
                }
+               pthread_attr_destroy(&attr);
                res = 0;
        }
 outgoing_app_cleanup:
index 8f0457296dd36d164d42dd92467a78bd9992add6..8b87c8ec92d18d828ff0e153ee086991fb3b4674 100644 (file)
@@ -799,8 +799,10 @@ static int dundi_answer_entity(struct dundi_transaction *trans, struct dundi_ies
                        memset(&ied, 0, sizeof(ied));
                        dundi_ie_append_cause(&ied, DUNDI_IE_CAUSE, DUNDI_CAUSE_GENERAL, "Out of threads");
                        dundi_send(trans, DUNDI_COMMAND_EIDRESPONSE, 0, 1, &ied);
+                       pthread_attr_destroy(&attr);
                        return -1;
                }
+               pthread_attr_destroy(&attr);
        } else {
                ast_log(LOG_WARNING, "Out of memory!\n");
                memset(&ied, 0, sizeof(ied));
@@ -1030,8 +1032,10 @@ static int dundi_prop_precache(struct dundi_transaction *trans, struct dundi_ies
                        memset(&ied, 0, sizeof(ied));
                        dundi_ie_append_cause(&ied, DUNDI_IE_CAUSE, DUNDI_CAUSE_GENERAL, "Out of threads");
                        dundi_send(trans, DUNDI_COMMAND_PRECACHERP, 0, 1, &ied);
+                       pthread_attr_destroy(&attr);
                        return -1;
                }
+               pthread_attr_destroy(&attr);
        } else {
                ast_log(LOG_WARNING, "Out of memory!\n");
                memset(&ied, 0, sizeof(ied));
@@ -1122,8 +1126,10 @@ static int dundi_answer_query(struct dundi_transaction *trans, struct dundi_ies
                        memset(&ied, 0, sizeof(ied));
                        dundi_ie_append_cause(&ied, DUNDI_IE_CAUSE, DUNDI_CAUSE_GENERAL, "Out of threads");
                        dundi_send(trans, DUNDI_COMMAND_DPRESPONSE, 0, 1, &ied);
+                       pthread_attr_destroy(&attr);
                        return -1;
                }
+               pthread_attr_destroy(&attr);
        } else {
                ast_log(LOG_WARNING, "Out of memory!\n");
                memset(&ied, 0, sizeof(ied));
index 187beda1c3c6286df707eaaf3207ea34baa27745..0fac2b1a9bda57897309cc5e54126714c864cd4d 100644 (file)
@@ -295,6 +295,7 @@ static void launch_service(struct outgoing *o)
                ast_log(LOG_WARNING, "Unable to create thread :( (returned error: %d)\n", ret);
                free_outgoing(o);
        }
+       pthread_attr_destroy(&attr);
 }
 
 static int scan_service(char *fn, time_t now, time_t atime)
@@ -426,6 +427,7 @@ int load_module(void)
                ast_log(LOG_WARNING, "Unable to create thread :( (returned error: %d)\n", ret);
                return -1;
        }
+       pthread_attr_destroy(&attr);
        return 0;
 }
 
index 04e4a39eebc10643a6ebd84bc6405df75e88aece..7649d6f5b537ce5e18a98c265dec45a65cde122b 100644 (file)
@@ -203,28 +203,29 @@ static int ast_moh_files_next(struct ast_channel *chan)
        struct moh_files_state *state = chan->music_state;
        int tries;
 
-       if (state->save_pos) {
-               state->pos = state->save_pos;
-               state->save_pos = 0;
-       }
-
-       state->samples = 0;
+       /* Discontinue a stream if it is running already */
        if (chan->stream) {
                ast_closestream(chan->stream);
                chan->stream = NULL;
-               state->pos++;
-               state->pos %= state->class->total_files;
        }
 
-       if (ast_test_flag(state->class, MOH_RANDOMIZE)) {
-               /* Try 20 times to find something good */
+       /* If a specific file has been saved, use it */
+       if (state->save_pos) {
+               state->pos = state->save_pos;
+               state->save_pos = 0;
+       } else if (ast_test_flag(state->class, MOH_RANDOMIZE)) {
+               /* Get a random file and ensure we can open it */
                for (tries = 0; tries < 20; tries++) {
                        state->pos = rand() % state->class->total_files;
-
-                       /* check to see if this file's format can be opened */
                        if (ast_fileexists(state->class->filearray[state->pos], NULL, NULL) > 0)
                                break;
                }
+               state->samples = 0;
+       } else {
+               /* This is easy, just increment our position and make sure we don't exceed the total file count */
+               state->pos++;
+               state->pos %= state->class->total_files;
+               state->samples = 0;
        }
 
        if (!ast_openstream_full(chan, state->class->filearray[state->pos], chan->language, 1)) {
diff --git a/rtp.c b/rtp.c
index 6d2f5049ccec2671692a1e157d0cb9da03a96a4d..5e034200eae35961581f21aa11340d1fc3efc32b 100644 (file)
--- a/rtp.c
+++ b/rtp.c
@@ -526,7 +526,7 @@ struct ast_frame *ast_rtp_read(struct ast_rtp *rtp)
        }
 
        if(rtp_debug_test_addr(&sin))
-               ast_verbose("Got RTP packet from %s:%d (type %d, seq %d, ts %d, len %d)\n"
+               ast_verbose("Got RTP packet from %s:%u (type %d, seq %u, ts %u, len %d)\n"
                        , ast_inet_ntoa(iabuf, sizeof(iabuf), sin.sin_addr), ntohs(sin.sin_port), payloadtype, seqno, timestamp,res - hdrlen);
 
    rtpPT = ast_rtp_lookup_pt(rtp, payloadtype);