summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Peeler <jpeeler@digium.com>2008-06-12 23:08:37 +0000
committerJeff Peeler <jpeeler@digium.com>2008-06-12 23:08:37 +0000
commit84d0404ed5424a8b21b8b456579b7641e8ba8911 (patch)
tree64f1ddd83a9b115ed25af81aaa2c38ed2a93baff
parent54c92d9a63867b90ec0033e3b370b720a0e097c7 (diff)
(closes issue 0012193)
Reported by: davidw Patch by: Corydon76, modified by me to work properly with ParkAndAnnounce app git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@122433 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--apps/app_parkandannounce.c4
-rw-r--r--main/features.c32
2 files changed, 28 insertions, 8 deletions
diff --git a/apps/app_parkandannounce.c b/apps/app_parkandannounce.c
index 45740d901..ccd3b36e8 100644
--- a/apps/app_parkandannounce.c
+++ b/apps/app_parkandannounce.c
@@ -113,7 +113,9 @@ static int parkandannounce_exec(struct ast_channel *chan, void *data)
/* we are using masq_park here to protect * from touching the channel once we park it. If the channel comes out of timeout
before we are done announcing and the channel is messed with, Kablooeee. So we use Masq to prevent this. */
- ast_masq_park_call(chan, NULL, timeout, &lot);
+ res = ast_masq_park_call(chan, NULL, timeout, &lot);
+ if (res == -1)
+ return res;
ast_verb(3, "Call Parking Called, lot: %d, timeout: %d, context: %s\n", lot, timeout, args.return_context);
diff --git a/main/features.c b/main/features.c
index 1855ca47b..06b0a3ca6 100644
--- a/main/features.c
+++ b/main/features.c
@@ -494,15 +494,28 @@ static int ast_park_call_full(struct ast_channel *chan, struct ast_channel *peer
/* Check for channel variable PARKINGEXTEN */
parkingexten = pbx_builtin_getvar_helper(chan, "PARKINGEXTEN");
if (!ast_strlen_zero(parkingexten)) {
- if (ast_exists_extension(NULL, parkinglot->parking_con, parkingexten, 1, NULL)) {
+ /*!\note The API forces us to specify a numeric parking slot, even
+ * though the architecture would tend to support non-numeric extensions
+ * (as are possible with SIP, for example). Hence, we enforce that
+ * limitation here. If extout was not numeric, we could permit
+ * arbitrary non-numeric extensions.
+ */
+ if (sscanf(parkingexten, "%d", &x) != 1 || x < 0) {
+ AST_LIST_UNLOCK(&parkinglot->parkings);
+ parkinglot_unref(parkinglot);
+ free(pu);
+ ast_log(LOG_WARNING, "PARKINGEXTEN does not indicate a valid parking slot: '%s'.\n", parkingexten);
+ return 1; /* Continue execution if possible */
+ }
+ snprintf(pu->parkingexten, sizeof(pu->parkingexten), "%d", x);
+
+ if (ast_exists_extension(NULL, parkinglot->parking_con, pu->parkingexten, 1, NULL)) {
AST_LIST_UNLOCK(&parkinglot->parkings);
parkinglot_unref(parkinglot);
ast_free(pu);
ast_log(LOG_WARNING, "Requested parking extension already exists: %s@%s\n", parkingexten, parkinglot->parking_con);
return 1; /* Continue execution if possible */
}
- ast_copy_string(pu->parkingexten, parkingexten, sizeof(pu->parkingexten));
- x = atoi(parkingexten);
} else {
int start;
struct parkeduser *cur = NULL;
@@ -544,6 +557,7 @@ static int ast_park_call_full(struct ast_channel *chan, struct ast_channel *peer
/* Set pointer for next parking */
if (parkinglot->parkfindnext)
parkinglot->parking_offset = x - parkinglot->parking_start + 1;
+ snprintf(pu->parkingexten, sizeof(pu->parkingexten), "%d", x);
}
chan->appl = "Parked Call";
@@ -595,8 +609,6 @@ static int ast_park_call_full(struct ast_channel *chan, struct ast_channel *peer
pthread_kill(parking_thread, SIGURG);
ast_verb(2, "Parked %s on %d (lot %s). Will timeout back to extension [%s] %s, %d in %d seconds\n", pu->chan->name, pu->parkingnum, parkinglot->name, pu->context, pu->exten, pu->priority, (pu->parkingtime/1000));
- if (pu->parkingnum != -1)
- snprintf(pu->parkingexten, sizeof(pu->parkingexten), "%d", x);
manager_event(EVENT_FLAG_CALL, "ParkedCall",
"Exten: %s\r\n"
"Channel: %s\r\n"
@@ -620,7 +632,7 @@ static int ast_park_call_full(struct ast_channel *chan, struct ast_channel *peer
if (!con) /* Still no context? Bad */
ast_log(LOG_ERROR, "Parking context '%s' does not exist and unable to create\n", parkinglot->parking_con);
/* Tell the peer channel the number of the parking space */
- if (peer && ((pu->parkingnum != -1 && ast_strlen_zero(args->orig_chan_name)) || !strcasecmp(peer->name, args->orig_chan_name))) { /* Only say number if it's a number and the channel hasn't been masqueraded away */
+ if (peer && (ast_strlen_zero(args->orig_chan_name) || !strcasecmp(peer->name, args->orig_chan_name))) { /* Only say number if it's a number and the channel hasn't been masqueraded away */
/* If a channel is masqueraded into peer while playing back the parking slot number do not continue playing it back. This is the case if an attended transfer occurs. */
ast_set_flag(peer, AST_FLAG_MASQ_NOSTREAM);
ast_say_digits(peer, pu->parkingnum, "", peer->language);
@@ -658,6 +670,7 @@ int ast_masq_park_call(struct ast_channel *rchan, struct ast_channel *peer, int
struct ast_channel *chan;
struct ast_frame *f;
char *orig_chan_name = NULL;
+ int park_status;
/* Make a new, fake channel that we'll use to masquerade in the real one */
if (!(chan = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, rchan->accountcode, rchan->exten, rchan->context, rchan->amaflags, "Parked/%s",rchan->name))) {
@@ -686,7 +699,12 @@ int ast_masq_park_call(struct ast_channel *rchan, struct ast_channel *peer, int
.orig_chan_name = orig_chan_name,
};
- ast_park_call_full(chan, peer, &args);
+ park_status = ast_park_call_full(chan, peer, &args);
+ if (park_status == 1) {
+ /* would be nice to play "invalid parking extension" */
+ ast_hangup(chan);
+ return -1;
+ }
}
return 0;