diff options
author | rizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-04-16 20:32:14 +0000 |
---|---|---|
committer | rizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-04-16 20:32:14 +0000 |
commit | 7604fe591bc55d7c0a7b7d42ef617b53967fc00d (patch) | |
tree | 8f66c78f228ba69018f17777fea4080162efdea7 /res/res_features.c | |
parent | 9d774b64948be8b1a3da537a8dc49128847fa99a (diff) |
localize several variables, and simplify the last part of park_exec()
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@20653 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res/res_features.c')
-rw-r--r-- | res/res_features.c | 104 |
1 files changed, 46 insertions, 58 deletions
diff --git a/res/res_features.c b/res/res_features.c index 6c58a98da..ae1c80707 100644 --- a/res/res_features.c +++ b/res/res_features.c @@ -1269,7 +1269,7 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast if (ast_answer(chan)) return -1; peer->appl = "Bridged Call"; - peer->data = (char *) chan->name; + peer->data = chan->name; /* copy the userfield from the B-leg to A-leg if applicable */ if (chan->cdr && peer->cdr && !ast_strlen_zero(peer->cdr->userfield)) { @@ -1365,7 +1365,7 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast else if (f->subclass == AST_CONTROL_OPTION) { aoh = f->data; /* Forward option Requests */ - if (aoh && (aoh->flag == AST_OPTION_FLAG_REQUEST)) + if (aoh && aoh->flag == AST_OPTION_FLAG_REQUEST) ast_channel_setoption(other, ntohs(aoh->option), aoh->data, f->datalen - sizeof(struct ast_option_header), 0); } } @@ -1435,7 +1435,7 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast /*! \brief Take care of parked calls and unpark them if needed */ static void *do_parking_thread(void *ignore) { - fd_set rfds, efds; + fd_set rfds, efds; /* results from previous select, to be preserved across loops. */ FD_ZERO(&rfds); FD_ZERO(&efds); @@ -1443,26 +1443,21 @@ static void *do_parking_thread(void *ignore) struct parkeduser *pu, *pl, *pt = NULL; int ms = -1; /* select timeout, uninitialized */ int max = -1; /* max fd, none there yet */ - fd_set nrfds, nefds; - - struct timeval tv; - char exten[AST_MAX_EXTENSION]; - char *peername,*cp; - + fd_set nrfds, nefds; /* args for the next select */ FD_ZERO(&nrfds); FD_ZERO(&nefds); ast_mutex_lock(&parking_lock); pl = NULL; pu = parkinglot; + /* navigate the list with prev-cur pointers to support removals */ while(pu) { struct ast_channel *chan = pu->chan; /* shorthand */ int tms; /* timeout for this item */ int x; /* fd index in channel */ struct ast_context *con; - if (pu->notquiteyet) { - /* Pretend this one isn't here yet */ + if (pu->notquiteyet) { /* Pretend this one isn't here yet */ pl = pu; pu = pu->next; continue; @@ -1474,8 +1469,8 @@ static void *do_parking_thread(void *ignore) ast_indicate(chan, AST_CONTROL_UNHOLD); /* Get chan, exten from derived kludge */ if (pu->peername[0]) { - peername = ast_strdupa(pu->peername); - cp = strrchr(peername, '-'); + char *peername = ast_strdupa(pu->peername); + char *cp = strrchr(peername, '-'); if (cp) *cp = 0; con = ast_context_find(parking_con_dial); @@ -1523,18 +1518,19 @@ static void *do_parking_thread(void *ignore) pu = pu->next; con = ast_context_find(parking_con); if (con) { + char exten[AST_MAX_EXTENSION]; snprintf(exten, sizeof(exten), "%d", pt->parkingnum); if (ast_context_remove_extension2(con, exten, 1, NULL)) ast_log(LOG_WARNING, "Whoa, failed to remove the extension!\n"); } else ast_log(LOG_WARNING, "Whoa, no parking context?\n"); free(pt); - } else { + } else { /* still within parking time, process descriptors */ for (x = 0; x < AST_MAX_FDS; x++) { struct ast_frame *f; - if (chan->fds[x] < 0 || (!FD_ISSET(chan->fds[x], &rfds) && !FD_ISSET(chan->fds[x], &efds))) - continue; + if (chan->fds[x] == -1 || (!FD_ISSET(chan->fds[x], &rfds) && !FD_ISSET(chan->fds[x], &efds))) + continue; /* nothing on this descriptor */ if (FD_ISSET(chan->fds[x], &efds)) ast_set_flag(chan, AST_FLAG_EXCEPTION); @@ -1543,7 +1539,7 @@ static void *do_parking_thread(void *ignore) chan->fdno = x; /* See if they need servicing */ f = ast_read(chan); - if (!f || ((f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_HANGUP))) { + if (!f || (f->frametype == AST_FRAME_CONTROL && f->subclass == AST_CONTROL_HANGUP)) { if (f) ast_frfree(f); manager_event(EVENT_FLAG_CALL, "ParkedCallGiveUp", @@ -1569,6 +1565,7 @@ static void *do_parking_thread(void *ignore) pu = pu->next; con = ast_context_find(parking_con); if (con) { + char exten[AST_MAX_EXTENSION]; snprintf(exten, sizeof(exten), "%d", pt->parkingnum); if (ast_context_remove_extension2(con, exten, 1, NULL)) ast_log(LOG_WARNING, "Whoa, failed to remove the extension!\n"); @@ -1589,8 +1586,7 @@ static void *do_parking_thread(void *ignore) } /* end for */ if (x >= AST_MAX_FDS) { -std: for (x=0; x<AST_MAX_FDS; x++) { - /* Keep this one for next one */ +std: for (x=0; x<AST_MAX_FDS; x++) { /* mark fds for next round */ if (chan->fds[x] > -1) { FD_SET(chan->fds[x], &nrfds); FD_SET(chan->fds[x], &nefds); @@ -1598,8 +1594,8 @@ std: for (x=0; x<AST_MAX_FDS; x++) { max = chan->fds[x]; } } - /* Keep track of our longest wait */ - if ((tms < ms) || (ms < 0)) + /* Keep track of our shortest wait */ + if (tms < ms || ms < 0) ms = tms; pl = pu; pu = pu->next; @@ -1609,9 +1605,11 @@ std: for (x=0; x<AST_MAX_FDS; x++) { ast_mutex_unlock(&parking_lock); rfds = nrfds; efds = nefds; - tv = ast_samp2tv(ms, 1000); - /* Wait for something to happen */ - ast_select(max + 1, &rfds, NULL, &efds, (ms > -1) ? &tv : NULL); + { + struct timeval tv = ast_samp2tv(ms, 1000); + /* Wait for something to happen */ + ast_select(max + 1, &rfds, NULL, &efds, (ms > -1) ? &tv : NULL); + } pthread_testcancel(); } return NULL; /* Never reached */ @@ -1646,7 +1644,6 @@ static int park_exec(struct ast_channel *chan, void *data) struct localuser *u; struct ast_channel *peer=NULL; struct parkeduser *pu, *pl=NULL; - char exten[AST_MAX_EXTENSION]; struct ast_context *con; int park; int dres; @@ -1676,6 +1673,7 @@ static int park_exec(struct ast_channel *chan, void *data) peer = pu->chan; con = ast_context_find(parking_con); if (con) { + char exten[AST_MAX_EXTENSION]; snprintf(exten, sizeof(exten), "%d", pu->parkingnum); if (ast_context_remove_extension2(con, exten, 1, NULL)) ast_log(LOG_WARNING, "Whoa, failed to remove the extension!\n"); @@ -1696,47 +1694,37 @@ static int park_exec(struct ast_channel *chan, void *data) free(pu); } /* JK02: it helps to answer the channel if not already up */ - if (chan->_state != AST_STATE_UP) { + if (chan->_state != AST_STATE_UP) ast_answer(chan); - } if (peer) { /* Play a courtesy to the source(s) configured to prefix the bridge connecting */ if (!ast_strlen_zero(courtesytone)) { + int error = 0; + ast_moh_stop(peer); + ast_indicate(peer, AST_CONTROL_UNHOLD); if (parkedplay == 0) { - if (!ast_streamfile(chan, courtesytone, chan->language)) { - if (ast_waitstream(chan, "") < 0) { - ast_log(LOG_WARNING, "Failed to play courtesy tone!\n"); - ast_hangup(peer); - return -1; - } - } - ast_moh_stop(peer); - ast_indicate(peer, AST_CONTROL_UNHOLD); - } else { - ast_moh_stop(peer); - ast_indicate(peer, AST_CONTROL_UNHOLD); - if (parkedplay == 2) { - if (!ast_streamfile(chan, courtesytone, chan->language) && !ast_streamfile(peer, courtesytone, chan->language)) { - res = ast_waitstream(chan, ""); - if (res >= 0) - res = ast_waitstream(peer, ""); - if (res < 0) { - ast_log(LOG_WARNING, "Failed to play courtesy tones!\n"); - ast_hangup(peer); - return -1; - } - } - } else if (parkedplay == 1) { - if (!ast_streamfile(peer, courtesytone, chan->language)) { - if (ast_waitstream(peer, "") < 0) { - ast_log(LOG_WARNING, "Failed to play courtesy tone!\n"); - ast_hangup(peer); - return -1; - } - } + if (stream_and_wait(chan, courtesytone, chan->language, "")) + error = 1; + } else if (parkedplay == 2) { + if (!ast_streamfile(chan, courtesytone, chan->language) && + !ast_streamfile(peer, courtesytone, chan->language)) { + /* XXX we would like to wait on both! */ + res = ast_waitstream(chan, ""); + if (res >= 0) + res = ast_waitstream(peer, ""); + if (res < 0) + error = 1; } + } else if (parkedplay == 1) { + if (stream_and_wait(peer, courtesytone, chan->language, "")) + error = 1; + } + if (error) { + ast_log(LOG_WARNING, "Failed to play courtesy tone!\n"); + ast_hangup(peer); + return -1; } } |