Example #1
0
/*
 * 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;
}
Example #2
0
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;
	}
}
Example #3
0
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;
}
Example #4
0
/*
 * 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;
}