diff options
Diffstat (limited to 'res/res_features.c')
-rw-r--r-- | res/res_features.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/res/res_features.c b/res/res_features.c index 8de1c1fea..44f413cd8 100644 --- a/res/res_features.c +++ b/res/res_features.c @@ -401,7 +401,7 @@ static int park_call_full(struct ast_channel *chan, struct ast_channel *peer, in AST_LIST_UNLOCK(&parkinglot); ast_free(pu); ast_log(LOG_WARNING, "Requested parking extension already exists: %s@%s\n", parkingexten, parking_con); - return 0; /* Continue execution if possible */ + return 1; /* Continue execution if possible */ } ast_copy_string(pu->parkingexten, parkingexten, sizeof(pu->parkingexten)); x = atoi(parkingexten); @@ -2352,10 +2352,15 @@ static int park_call_exec(struct ast_channel *chan, void *data) * of a park--it is still theoretically possible for a transfer to happen before * we get here, but it is _really_ unlikely */ char *orig_chan_name = ast_strdupa(chan->name); + char orig_exten[AST_MAX_EXTENSION]; + int orig_priority = chan->priority; + /* Data is unused at the moment but could contain a parking lot context eventually */ int res = 0; + ast_copy_string(orig_exten, chan->exten, sizeof(orig_exten)); + /* Setup the exten/priority to be s/1 since we don't know where this call should return */ strcpy(chan->exten, "s"); @@ -2367,10 +2372,18 @@ static int park_call_exec(struct ast_channel *chan, void *data) if (!res) res = ast_safe_sleep(chan, 1000); /* Park the call */ - if (!res) + if (!res) { res = park_call_full(chan, NULL, 0, NULL, orig_chan_name); + /* Continue on in the dialplan */ + if (res == 1) { + ast_copy_string(chan->exten, orig_exten, sizeof(chan->exten)); + chan->priority = orig_priority; + res = 0; + } else if (!res) + res = AST_PBX_KEEPALIVE; + } - return !res ? AST_PBX_KEEPALIVE : res; + return res; } /*! \brief Pickup parked call */ |