@ -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 ;