/* * Core function to copy messages between mailboxes. */ static int ifcore_copy(lua_State *lua) { const char *s, *u, *p; int r; if (lua_gettop(lua) != 3) luaL_error(lua, "wrong number of arguments"); luaL_checktype(lua, 1, LUA_TTABLE); luaL_checktype(lua, 2, LUA_TSTRING); luaL_checktype(lua, 3, LUA_TSTRING); lua_pushvalue(lua, 1); if (!(s = get_table_string("server"))) luaL_error(lua, "no mail server specified"); if (!(u = get_table_string("username"))) luaL_error(lua, "no username specified"); p = DISCOVER_PORT(get_table_string("port"), get_table_string("ssl")); lua_pop(lua, 1); r = request_copy(s, p, u, lua_tostring(lua, 2), lua_tostring(lua, 3)); lua_pop(lua, 3); lua_pushboolean(lua, (r == STATUS_RESPONSE_OK)); return 1; }
static void invite_response(struct sip_ctrans *ct, const struct sip_msg *msg) { switch (ct->state) { case CALLING: tmr_cancel(&ct->tmr); tmr_cancel(&ct->tmre); /*@fallthrough@*/ case PROCEEDING: if (msg->scode < 200) { ct->state = PROCEEDING; ct->resph(0, msg, ct->arg); } else if (msg->scode < 300) { ct->resph(0, msg, ct->arg); mem_deref(ct); } else { ct->state = COMPLETED; (void)request_copy(&ct->mb_ack, ct, "ACK", msg); (void)sip_send(ct->sip, NULL, ct->tp, &ct->dst, ct->mb_ack); ct->resph(0, msg, ct->arg); if (sip_transp_reliable(ct->tp)) { mem_deref(ct); break; } tmr_start(&ct->tmr, COMPLETE_WAIT, tmr_handler, ct); } break; case COMPLETED: if (msg->scode < 300) break; (void)sip_send(ct->sip, NULL, ct->tp, &ct->dst, ct->mb_ack); break; default: break; } }
int sip_ctrans_cancel(struct sip_ctrans *ct) { struct mbuf *mb = NULL; char *cancel = NULL; int err; if (!ct) return EINVAL; if (!ct->invite) return 0; switch (ct->state) { case PROCEEDING: tmr_start(&ct->tmr, 64 * SIP_T1, tmr_handler, ct); break; default: return EPROTO; } err = str_dup(&cancel, "CANCEL"); if (err) goto out; err = request_copy(&mb, ct, cancel, NULL); if (err) goto out; err = sip_ctrans_request(NULL, ct->sip, ct->tp, &ct->dst, cancel, ct->branch, mb, NULL, NULL); if (err) goto out; out: mem_deref(cancel); mem_deref(mb); return err; }
/* * Core function to copy messages between mailboxes. */ static int ifcore_copy(lua_State *lua) { int r; if (lua_gettop(lua) != 3) luaL_error(lua, "wrong number of arguments"); luaL_checktype(lua, 1, LUA_TLIGHTUSERDATA); luaL_checktype(lua, 2, LUA_TSTRING); luaL_checktype(lua, 3, LUA_TSTRING); while ((r = request_copy((session *)(lua_topointer(lua, 1)), lua_tostring(lua, 2), lua_tostring(lua, 3))) == STATUS_NONE); lua_pop(lua, 3); if (r == -1) return 0; lua_pushboolean(lua, (r == STATUS_OK)); return 1; }