aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
authorjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2008-06-12 23:08:37 +0000
committerjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2008-06-12 23:08:37 +0000
commit9b82566639752973ec27f66f81e447ace7977804 (patch)
tree64f1ddd83a9b115ed25af81aaa2c38ed2a93baff /main
parent93b3e048b86dadaea70a806901b5a536e0acab28 (diff)
(closes issue 0012193)
Reported by: davidw Patch by: Corydon76, modified by me to work properly with ParkAndAnnounce app git-svn-id: http://svn.digium.com/svn/asterisk/trunk@122433 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main')
-rw-r--r--main/features.c32
1 files changed, 25 insertions, 7 deletions
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;