rem: if(xj_send_sip_msg(sid, &jcf->uri, sct, &ts, jbc->close) < 0)
add: if(xj_send_sip_msg(sid, &jcf->uri, sct, &ts, &jbc->jkey->flag)<0)
context: int xj_manage_jab(char *buf, int len, int *pos, str *sid, 		str *sct, xj_jalias als, xj_jcon jbc){	int i, err=0;	char *p, *to, *from, *msg, *type, *emsg, lbuf[4096], fbuf[128];	xj_jconf jcf = NULL;	str ts, tf;	xode x, y, z;		x = xode_from_strx(buf, len, &err, &i);	DBG("XJAB:xj_parse_jab: XODE ret:%d pos:%d\n", err, i);		if(err && pos != NULL)		*pos= i;	if(x == NULL)		return -1;		lbuf[0] = 0;		if(!strncasecmp(xode_get_name(x), "message", 7))	{		DBG("XJAB:xj_manage_jab: jabber [message] received\n");		if((to = xode_get_attrib(x, "to")) == NULL)		{			DBG("XJAB:xj_manage_jab: missing 'to' attribute\n");			err = -1;			goto ready;		}		if((from = xode_get_attrib(x, "from")) == NULL)		{			DBG("XJAB:xj_manage_jab: missing 'from' attribute\n");			err = -1;			goto ready;		}		if((y = xode_get_tag(x, "body")) == NULL				|| (msg = xode_get_data(y)) == NULL)		{			DBG("XJAB:xj_manage_jab: missing 'body' of message\n");			err = -1;			goto ready;		}		type = xode_get_attrib(x, "type");		if(type != NULL && !strncasecmp(type, "error", 5))		{			if((y = xode_get_tag(x, "error")) == NULL					|| (emsg = xode_get_data(y)) == NULL)			{				strcpy(lbuf, "{Error sending following message} - ");			}			else			{				if(xode_get_attrib(y, "code") != NULL)					sprintf(lbuf, 						"{Error (%s/%s) when trying to send following messge}",						xode_get_attrib(y, "code"), emsg);				else					sprintf(lbuf, 						"{Error (%s) when trying to send following messge}",						emsg);			}		}		// is from a conferece?!?!		if((jcf=xj_jcon_check_jconf(jbc, from))!=NULL)		{			if(lbuf[0] == 0)			{				p = from + strlen(from);				while(p>from && *p != '/')					p--;				if(*p == '/')				{					if(jcf->nick.len>0 						&& !strncasecmp(p+1, jcf->nick.s, jcf->nick.len))						goto ready;					sprintf(lbuf, "[%s] ", p+1);				}			}			strcat(lbuf, msg);			ts.s = lbuf;			ts.len = strlen(lbuf);				if(xj_send_sip_msg(sid, &jcf->uri, sct, &ts, jbc->close) < 0)				DBG("XJAB:xj_manage_jab: ERROR SIP MESSAGE was not sent!\n");			else				DBG("XJAB:xj_manage_jab: SIP MESSAGE was sent!\n");			goto ready;		}		strcat(lbuf, msg);		ts.s = from;		ts.len = strlen(from);		tf.s = fbuf;		tf.len = 0;		if(xj_address_translation(&ts, &tf, als, XJ_ADDRTR_B2A) == 0)		{			ts.s = lbuf;			ts.len = strlen(lbuf);				if(xj_send_sip_msg(sid, &tf, sct, &ts, jbc->close) < 0)				DBG("XJAB:xj_manage_jab: ERROR SIP MESSAGE was not sent ...\n");			else				DBG("XJAB:xj_manage_jab: SIP MESSAGE was sent.\n");		}		goto ready;	} // end MESSAGE		/*** PRESENCE HANDLING ***/	if(!strncasecmp(xode_get_name(x), "presence", 8))	{		DBG("XJAB:xj_manage_jab: jabber [presence] received\n");		if(!jbc)			goto ready;		type = xode_get_attrib(x, "type");		from = xode_get_attrib(x, "from");		if(from == NULL)			goto ready;		if(type!=NULL && !strncasecmp(type, "error", 5))		{			if((jcf=xj_jcon_check_jconf(jbc, from))!=NULL)			{				tf.s = from;				tf.len = strlen(from);				if((y = xode_get_tag(x, "error")) == NULL)					goto ready;				if ((p = xode_get_attrib(y, "code")) != NULL						&& atoi(p) == 409)				{					xj_send_sip_msgz(sid, &tf, sct, "ERROR: Your nickname"					" already exists in the room. Please choose a new one.",					jbc->close);					goto ready;				}				xj_send_sip_msgz(sid, &tf, sct, "ERROR: Your participation"					" to the conference room was refused.", jbc->close);			}			goto ready;		}		if(type!=NULL && !strncasecmp(type, "subscribe", 9))		{			xj_jcon_send_presence(jbc, from, "subscribed", NULL, NULL);			goto ready;		}		if(type == NULL || !strncasecmp(type, "online", 6))		{			if(strchr(from, '@') == NULL)			{				if(!strncasecmp(from, XJ_AIM_NAME, XJ_AIM_LEN))				{					jbc->ready |= XJ_NET_AIM;					DBG("XJAB:xj_manage_jab: AIM network ready\n");				}				else if(!strncasecmp(from, XJ_ICQ_NAME, XJ_ICQ_LEN))				{					jbc->ready |= XJ_NET_ICQ;					DBG("XJAB:xj_manage_jab: ICQ network ready\n");				}				else if(!strncasecmp(from, XJ_MSN_NAME, XJ_MSN_LEN))				{					jbc->ready |= XJ_NET_MSN;					DBG("XJAB:xj_manage_jab: MSN network ready\n");				}				else if(!strncasecmp(from, XJ_YAH_NAME, XJ_YAH_LEN))				{					jbc->ready |= XJ_NET_YAH;					DBG("XJAB:xj_manage_jab: YAHOO network ready\n");				}			}			else if((jcf=xj_jcon_check_jconf(jbc, from))!=NULL)			{				jcf->status = XJ_JCONF_READY;				DBG("XJAB:xj_manage_jab: %s conference ready\n", from);			}		}				goto ready;	} // end PRESENCE		if(!strncasecmp(xode_get_name(x), "iq", 2))	{		DBG("XJAB:xj_manage_jab: jabber [iq] received\n");		if(!jbc)			goto ready;		if(!strncasecmp(xode_get_attrib(x, "type"), "result", 6))		{			if((y = xode_get_tag(x, "query?xmlns=jabber:iq:roster")) == NULL)				goto ready;			z = xode_get_firstchild(y);			while(z)			{				if(!strncasecmp(xode_get_name(z), "item", 5)					&& (type = xode_get_attrib(z, "jid")) != NULL					&& strchr(type, '@') == NULL)				{					if(!strncasecmp(type, XJ_AIM_NAME, XJ_AIM_LEN))					{						jbc->allowed |= XJ_NET_AIM;						DBG("XJAB:xj_manage_jab: AIM network available\n");					}					else if(!strncasecmp(type, XJ_ICQ_NAME, XJ_ICQ_LEN))					{						jbc->allowed |= XJ_NET_ICQ;						DBG("XJAB:xj_manage_jab: ICQ network available\n");					}					else if(!strncasecmp(type, XJ_MSN_NAME, XJ_MSN_LEN))					{						jbc->allowed |= XJ_NET_MSN;						DBG("XJAB:xj_manage_jab: MSN network available\n");					}					else if(!strncasecmp(type, XJ_YAH_NAME, XJ_YAH_LEN))					{						jbc->allowed |= XJ_NET_YAH;						DBG("XJAB:xj_manage_jab: YAHOO network available\n");					} 				}				z = xode_get_nextsibling(z);			}		}				goto ready;	} // end IQready:	xode_free(x);	return err;}