diff --git a/main/features.c b/main/features.c index 12de34f4f..b09543f66 100644 --- a/main/features.c +++ b/main/features.c @@ -258,7 +258,8 @@ struct parkeduser { char exten[AST_MAX_EXTENSION]; int priority; int parkingtime; /*!< Maximum length in parking lot before return */ - int notquiteyet; + unsigned int notquiteyet:1; + unsigned int options_specified:1; char peername[1024]; unsigned char moh_trys; struct ast_parkinglot *parkinglot; @@ -791,13 +792,20 @@ static int park_call_full(struct ast_channel *chan, struct ast_channel *peer, st /* Remember what had been dialed, so that if the parking expires, we try to come back to the same place */ + + pu->options_specified = (!ast_strlen_zero(args->return_con) || !ast_strlen_zero(args->return_ext) || args->return_pri); + + /* If extension has options specified, they override all other possibilities + such as the returntoorigin flag and transferred context. Information on + extension options is lost here, so we set a flag */ + ast_copy_string(pu->context, S_OR(args->return_con, S_OR(chan->macrocontext, chan->context)), sizeof(pu->context)); ast_copy_string(pu->exten, S_OR(args->return_ext, S_OR(chan->macroexten, chan->exten)), sizeof(pu->exten)); - pu->priority = pu->priority ? pu->priority : + pu->priority = args->return_pri ? args->return_pri : (chan->macropriority ? chan->macropriority : chan->priority); /* If parking a channel directly, don't quiet yet get parking running on it. @@ -3251,13 +3259,18 @@ int manage_parkinglot(struct ast_parkinglot *curlot, fd_set *rfds, fd_set *efds, ast_add_extension2(con, 1, peername_flat, 1, NULL, NULL, "Dial", ast_strdup(returnexten), ast_free_ptr, registrar); } - if (comebacktoorigin) { - set_c_e_p(chan, pu->parkinglot->parking_con_dial, peername_flat, 1); + if (pu->options_specified == 1) { + /* Park() was called with overriding return arguments, respect those arguments */ + set_c_e_p(chan, pu->context, pu->exten, pu->priority); } else { - ast_log(LOG_WARNING, "now going to parkedcallstimeout,s,1 | ps is %d\n",pu->parkingnum); - snprintf(parkingslot, sizeof(parkingslot), "%d", pu->parkingnum); - pbx_builtin_setvar_helper(chan, "PARKINGSLOT", parkingslot); - set_c_e_p(chan, "parkedcallstimeout", peername_flat, 1); + if (comebacktoorigin) { + set_c_e_p(chan, pu->parkinglot->parking_con_dial, peername_flat, 1); + } else { + ast_log(LOG_WARNING, "now going to parkedcallstimeout,s,1 | ps is %d\n",pu->parkingnum); + snprintf(parkingslot, sizeof(parkingslot), "%d", pu->parkingnum); + pbx_builtin_setvar_helper(chan, "PARKINGSLOT", parkingslot); + set_c_e_p(chan, "parkedcallstimeout", peername_flat, 1); + } } } else { /* They've been waiting too long, send them back to where they came. Theoretically they