diff options
-rwxr-xr-x | channel.c | 4 | ||||
-rwxr-xr-x | devicestate.c | 29 | ||||
-rwxr-xr-x | include/asterisk/devicestate.h | 10 |
3 files changed, 32 insertions, 11 deletions
@@ -939,7 +939,7 @@ void ast_channel_free(struct ast_channel *chan) free(chan); ast_mutex_unlock(&chlock); - ast_device_state_changed(name); + ast_device_state_changed_literal(name); } static void ast_spy_detach(struct ast_channel *chan) @@ -2883,7 +2883,7 @@ int ast_setstate(struct ast_channel *chan, int state) return 0; chan->_state = state; - ast_device_state_changed(chan->name); + ast_device_state_changed_literal(chan->name); manager_event(EVENT_FLAG_CALL, (oldstate == AST_STATE_DOWN) ? "Newchannel" : "Newstate", "Channel: %s\r\n" diff --git a/devicestate.c b/devicestate.c index 3b5c581f4..c85f9a8fe 100755 --- a/devicestate.c +++ b/devicestate.c @@ -193,22 +193,14 @@ static void do_state_change(const char *device) ast_hint_state_changed(device); } -/*--- ast_device_state_changed: Accept change notification, add it to change queue */ -int ast_device_state_changed(const char *fmt, ...) +static int __ast_device_state_changed_literal(char *buf) { - char buf[AST_MAX_EXTENSION]; char *device; char *parse; struct state_change *change = NULL; - va_list ap; - - va_start(ap, fmt); - vsnprintf(buf, sizeof(buf), fmt, ap); - va_end(ap); parse = buf; device = strsep(&parse, "-"); - if (change_thread != AST_PTHREADT_NULL) change = calloc(1, sizeof(*change) + strlen(device)); @@ -230,6 +222,25 @@ int ast_device_state_changed(const char *fmt, ...) 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 */ static void *do_devstate_changes(void *data) { diff --git a/include/asterisk/devicestate.h b/include/asterisk/devicestate.h index 687e6819f..ec8c6620b 100755 --- a/include/asterisk/devicestate.h +++ b/include/asterisk/devicestate.h @@ -79,6 +79,16 @@ int ast_device_state(const char *device); int ast_device_state_changed(const char *fmt, ...) __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 */ /*! * \param data to pass to callback |