When someone requests a specific parking space using the PARKINGEXTEN variable,

ensure that no other caller is already there.
(issue #9723, reported by mdu113, patch by me)


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@64353 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Russell Bryant
2007-05-14 21:16:39 +00:00
parent 1f2afa0ff1
commit 39ebbfe69d

View File

@@ -305,6 +305,23 @@ static int metermaidstate(const char *data)
return AST_DEVICE_INUSE; return AST_DEVICE_INUSE;
} }
/*!
* \brief Check to see if a parking space is in use
* \return non-zero if in use, zero if not in use
* \note Assumes parking_lock is locked
*/
static int check_parking_space_inuse(int space)
{
struct parkeduser *pu;
for (pu = parkinglot; pu; pu = pu->next) {
if (pu->parkingnum == space)
return 1;
}
return 0;
}
/*! \brief Park a call /*! \brief Park a call
\note We put the user in the parking list, then wake up the parking thread to be sure it looks \note We put the user in the parking list, then wake up the parking thread to be sure it looks
after these channels too */ after these channels too */
@@ -330,6 +347,12 @@ int ast_park_call(struct ast_channel *chan, struct ast_channel *peer, int timeou
} }
ast_copy_string(pu->parkingexten, parkingexten, sizeof(pu->parkingexten)); ast_copy_string(pu->parkingexten, parkingexten, sizeof(pu->parkingexten));
x = atoi(parkingexten); x = atoi(parkingexten);
if (check_parking_space_inuse(x)) {
ast_mutex_unlock(&parking_lock);
free(pu);
ast_log(LOG_WARNING, "Requested parking space %d via PARKINGEXTEN, but it is in use!\n", x);
return -1;
}
} else { } else {
/* Select parking space within range */ /* Select parking space within range */
parking_range = parking_stop - parking_start+1; parking_range = parking_stop - parking_start+1;