diff --git a/UPGRADE.txt b/UPGRADE.txt index df7e3a081..f486241dc 100644 --- a/UPGRADE.txt +++ b/UPGRADE.txt @@ -47,6 +47,7 @@ pbx_lua: (such as app.goto). Now when an application such as app.goto() is called, control is returned back to the pbx engine and the current extension function stops executing. + - autoservice_start() and autoservice_start() no longer return a value. =========================================================== =========================================================== diff --git a/pbx/pbx_lua.c b/pbx/pbx_lua.c index 61f93ab63..25acc4981 100644 --- a/pbx/pbx_lua.c +++ b/pbx/pbx_lua.c @@ -717,26 +717,28 @@ static int lua_func_read(lua_State *L) * This function will set a flag that will cause pbx_lua to maintain an * autoservice on this channel. The autoservice will automatically be stopped * and restarted before calling applications and functions. - * - * \return This function returns the result of the ast_autoservice_start() - * function as a boolean to its lua caller. */ static int lua_autoservice_start(lua_State *L) { struct ast_channel *chan; - int res; + + lua_getfield(L, LUA_REGISTRYINDEX, "autoservice"); + if (lua_toboolean(L, -1)) { + /* autservice already running */ + lua_pop(L, 1); + return 0; + } + lua_pop(L, 1); lua_getfield(L, LUA_REGISTRYINDEX, "channel"); chan = lua_touserdata(L, -1); lua_pop(L, 1); - res = ast_autoservice_start(chan); + ast_autoservice_start(chan); - lua_pushboolean(L, !res); + lua_pushboolean(L, 1); lua_setfield(L, LUA_REGISTRYINDEX, "autoservice"); - - lua_pushboolean(L, !res); - return 1; + return 0; } /*! @@ -748,26 +750,28 @@ static int lua_autoservice_start(lua_State *L) * This function will stop any autoservice running and turn off the autoservice * flag. If this function returns false, it's probably because no autoservice * was running to begin with. - * - * \return This function returns the result of the ast_autoservice_stop() - * function as a boolean to its lua caller. */ static int lua_autoservice_stop(lua_State *L) { struct ast_channel *chan; - int res; + + lua_getfield(L, LUA_REGISTRYINDEX, "autoservice"); + if (!lua_toboolean(L, -1)) { + /* no autservice running */ + lua_pop(L, 1); + return 0; + } + lua_pop(L, 1); lua_getfield(L, LUA_REGISTRYINDEX, "channel"); chan = lua_touserdata(L, -1); lua_pop(L, 1); - res = ast_autoservice_stop(chan); + ast_autoservice_stop(chan); lua_pushboolean(L, 0); lua_setfield(L, LUA_REGISTRYINDEX, "autoservice"); - - lua_pushboolean(L, !res); - return 1; + return 0; } /*! @@ -1429,7 +1433,13 @@ static int exec(struct ast_channel *chan, const char *context, const char *exten ast_module_user_remove(u); return -1; } - + + lua_getfield(L, LUA_REGISTRYINDEX, "autoservice"); + if (lua_toboolean(L, -1)) { + ast_autoservice_start(chan); + } + lua_pop(L, 1); + lua_update_registry(L, context, exten, priority); lua_pushstring(L, context); @@ -1459,6 +1469,13 @@ static int exec(struct ast_channel *chan, const char *context, const char *exten lua_pop(L, 1); } lua_remove(L, error_func); + + lua_getfield(L, LUA_REGISTRYINDEX, "autoservice"); + if (lua_toboolean(L, -1)) { + ast_autoservice_stop(chan); + } + lua_pop(L, 1); + if (!chan) lua_close(L); ast_module_user_remove(u); return res;