mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-23 13:09:00 +00:00
Handle device state changes properly when formatting characters are present (bug #5450, new patch)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6806 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -939,7 +939,7 @@ void ast_channel_free(struct ast_channel *chan)
|
|||||||
free(chan);
|
free(chan);
|
||||||
ast_mutex_unlock(&chlock);
|
ast_mutex_unlock(&chlock);
|
||||||
|
|
||||||
ast_device_state_changed(name);
|
ast_device_state_changed_literal(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ast_spy_detach(struct ast_channel *chan)
|
static void ast_spy_detach(struct ast_channel *chan)
|
||||||
@@ -2883,7 +2883,7 @@ int ast_setstate(struct ast_channel *chan, int state)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
chan->_state = state;
|
chan->_state = state;
|
||||||
ast_device_state_changed(chan->name);
|
ast_device_state_changed_literal(chan->name);
|
||||||
manager_event(EVENT_FLAG_CALL,
|
manager_event(EVENT_FLAG_CALL,
|
||||||
(oldstate == AST_STATE_DOWN) ? "Newchannel" : "Newstate",
|
(oldstate == AST_STATE_DOWN) ? "Newchannel" : "Newstate",
|
||||||
"Channel: %s\r\n"
|
"Channel: %s\r\n"
|
||||||
|
@@ -193,22 +193,14 @@ static void do_state_change(const char *device)
|
|||||||
ast_hint_state_changed(device);
|
ast_hint_state_changed(device);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*--- ast_device_state_changed: Accept change notification, add it to change queue */
|
static int __ast_device_state_changed_literal(char *buf)
|
||||||
int ast_device_state_changed(const char *fmt, ...)
|
|
||||||
{
|
{
|
||||||
char buf[AST_MAX_EXTENSION];
|
|
||||||
char *device;
|
char *device;
|
||||||
char *parse;
|
char *parse;
|
||||||
struct state_change *change = NULL;
|
struct state_change *change = NULL;
|
||||||
va_list ap;
|
|
||||||
|
|
||||||
va_start(ap, fmt);
|
|
||||||
vsnprintf(buf, sizeof(buf), fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
parse = buf;
|
parse = buf;
|
||||||
device = strsep(&parse, "-");
|
device = strsep(&parse, "-");
|
||||||
|
|
||||||
if (change_thread != AST_PTHREADT_NULL)
|
if (change_thread != AST_PTHREADT_NULL)
|
||||||
change = calloc(1, sizeof(*change) + strlen(device));
|
change = calloc(1, sizeof(*change) + strlen(device));
|
||||||
|
|
||||||
@@ -230,6 +222,25 @@ int ast_device_state_changed(const char *fmt, ...)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ast_device_state_changed_literal(const char *dev)
|
||||||
|
{
|
||||||
|
char *buf;
|
||||||
|
buf = ast_strdupa(dev);
|
||||||
|
return __ast_device_state_changed_literal(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--- ast_device_state_changed: Accept change notification, add it to change queue */
|
||||||
|
int ast_device_state_changed(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
char buf[AST_MAX_EXTENSION];
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
vsnprintf(buf, sizeof(buf), fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
return __ast_device_state_changed_literal(buf);
|
||||||
|
}
|
||||||
|
|
||||||
/*--- do_devstate_changes: Go through the dev state change queue and update changes in the dev state thread */
|
/*--- do_devstate_changes: Go through the dev state change queue and update changes in the dev state thread */
|
||||||
static void *do_devstate_changes(void *data)
|
static void *do_devstate_changes(void *data)
|
||||||
{
|
{
|
||||||
|
@@ -79,6 +79,16 @@ int ast_device_state(const char *device);
|
|||||||
int ast_device_state_changed(const char *fmt, ...)
|
int ast_device_state_changed(const char *fmt, ...)
|
||||||
__attribute__ ((format (printf, 1, 2)));
|
__attribute__ ((format (printf, 1, 2)));
|
||||||
|
|
||||||
|
|
||||||
|
/*! Tells Asterisk the State for Device is changed */
|
||||||
|
/*!
|
||||||
|
* \param device devicename like a dialstrin
|
||||||
|
* Asterisk polls the new extensionstates and calls the registered
|
||||||
|
* callbacks for the changed extensions
|
||||||
|
* Returns 0 on success, -1 on failure
|
||||||
|
*/
|
||||||
|
int ast_device_state_changed_literal(const char *device);
|
||||||
|
|
||||||
/*! Registers a device state change callback */
|
/*! Registers a device state change callback */
|
||||||
/*!
|
/*!
|
||||||
* \param data to pass to callback
|
* \param data to pass to callback
|
||||||
|
Reference in New Issue
Block a user