⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xjab_wlist.c

📁 性能优秀的SIP Proxy
💻 C
📖 第 1 页 / 共 2 页
字号:
	DBG("XJAB:xj_wlist_get: cannot create a new entry for <%.*s>\n",				jkey->id->len, jkey->id->s);	return -1;}/** * set the flag of the connection identified by 'jkey' * */int xj_wlist_set_flag(xj_wlist jwl, xj_jkey jkey, int fl){	int i;	xj_jkey p = NULL;	if(jwl==NULL || jkey==NULL || jkey->id==NULL || jkey->id->s==NULL)		return -1;	#ifdef XJ_EXTRA_DEBUG	DBG("XJAB:xj_wlist_set_flag: looking for <%.*s>"		" having id=%d\n", jkey->id->len, jkey->id->s, jkey->hash);#endif				i = 0;	while(i < jwl->len)	{		lock_set_get(jwl->sems, i);		if(jwl->workers[i].pid <= 0)		{			lock_set_release(jwl->sems, i);			i++;			continue;		}		if((p=find234(jwl->workers[i].sip_ids, (void*)jkey, NULL)) != NULL)		{			p->flag = fl;			lock_set_release(jwl->sems, i);#ifdef XJ_EXTRA_DEBUG			DBG("XJAB:xj_wlist_set_flag: the connection for <%.*s>"				" marked with flag=%d", jkey->id->len, jkey->id->s, fl);#endif			return jwl->workers[i].wpipe;		}		lock_set_release(jwl->sems, i);		i++;	}#ifdef XJ_EXTRA_DEBUG	DBG("XJAB:xj_wlist_set_flag: entry does not exist for <%.*s>\n",			jkey->id->len, jkey->id->s);#endif	return -1;}/** * set IM aliases, jdomain and outbound proxy * * #return 0 if OK */int  xj_wlist_set_aliases(xj_wlist jwl, char *als, char *jd, char *pa){	char *p, *p0, *p1;	int i, n;		if(jwl == NULL)		return -1;	if(!jd) // || !als || strlen(als)<2)		return 0;	#ifdef XJ_EXTRA_DEBUG	DBG("XJAB:xj_wlist_set_aliases\n");#endif		if((jwl->aliases = (xj_jalias)_M_SHM_MALLOC(sizeof(t_xj_jalias)))==NULL)	{		DBG("XJAB:xj_wlist_set_aliases: not enough SHMemory.\n");		return -1;	}		jwl->aliases->jdm = NULL;	jwl->aliases->proxy = NULL;	jwl->aliases->dlm = XJ_DEF_JDELIM; // default user part delimiter	jwl->aliases->size = 0;	jwl->aliases->a = NULL;	jwl->aliases->d = NULL;	// set the jdomain	if(jd != NULL && (n=strlen(jd))>2)	{		p = jd;		while(p < jd+n && *p!='=')			p++;		if(p<jd+n-1)		{			jwl->aliases->dlm = *(p+1);			n = p - jd;		}		if((jwl->aliases->jdm = (str*)_M_SHM_MALLOC(sizeof(str)))== NULL)		{			DBG("XJAB:xj_wlist_set_aliases: not enough SHMemory!?\n");			_M_SHM_FREE(jwl->aliases);			jwl->aliases = NULL;			return -1;				}		jwl->aliases->jdm->len = n;		if((jwl->aliases->jdm->s=(char*)_M_SHM_MALLOC(jwl->aliases->jdm->len))				== NULL)		{			DBG("XJAB:xj_wlist_set_aliases: not enough SHMemory!?!\n");			_M_SHM_FREE(jwl->aliases->jdm);			_M_SHM_FREE(jwl->aliases);			jwl->aliases = NULL;		}		strncpy(jwl->aliases->jdm->s, jd, jwl->aliases->jdm->len);#ifdef XJ_EXTRA_DEBUG		DBG("XJAB:xj_wlist_set_aliases: jdomain=%.*s delim=%c\n",			jwl->aliases->jdm->len, jwl->aliases->jdm->s, jwl->aliases->dlm);#endif	}		// set the proxy address	if(pa && strlen(pa)>0)	{		if((jwl->aliases->proxy = (str*)_M_SHM_MALLOC(sizeof(str)))==NULL)		{			DBG("XJAB:xj_wlist_set_aliases: not enough SHMemory!!\n");			goto clean3;				}		i = jwl->aliases->proxy->len = strlen(pa);		// check if proxy address has sip: prefix		if(i < 4 || pa[0]!='s' || pa[1]!='i' || pa[2]!='p' || pa[3]!=':')			jwl->aliases->proxy->len += 4;		if((jwl->aliases->proxy->s=					(char*)_M_SHM_MALLOC(jwl->aliases->proxy->len))				== NULL)		{			DBG("XJAB:xj_wlist_set_aliases: not enough SHMemory!!!\n");			_M_SHM_FREE(jwl->aliases->proxy);			goto clean3;		}		p0 = jwl->aliases->proxy->s;		if(jwl->aliases->proxy->len != i)		{			strncpy(p0, "sip:", 4);			p0 += 4;		}		strncpy(p0, pa, i);#ifdef XJ_EXTRA_DEBUG		DBG("XJAB:xj_wlist_set_aliases: outbound proxy=[%.*s]\n",			jwl->aliases->proxy->len, jwl->aliases->proxy->s);#endif	}		// set the IM aliases	if(!als || strlen(als)<2)		return 0;		if((p = strchr(als, ';')) == NULL)	{		DBG("XJAB:xj_wlist_set_aliases: bad parameter value\n");		return -1;	}		if((jwl->aliases->size = atoi(als)) <= 0)	{		DBG("XJAB:xj_wlist_set_aliases: wrong number of aliases\n");		return 0;	}		jwl->aliases->d = (char*)_M_SHM_MALLOC(jwl->aliases->size*sizeof(char));	if(jwl->aliases->d == NULL)	{		DBG("XJAB:xj_wlist_set_aliases: not enough SHMemory..\n");		goto clean2;	}	memset(jwl->aliases->d, 0, jwl->aliases->size);		jwl->aliases->a = (str*)_M_SHM_MALLOC(jwl->aliases->size*sizeof(str));	if(jwl->aliases->a == NULL)	{		DBG("XJAB:xj_wlist_set_aliases: not enough SHMemory..\n");		goto clean1;	}		p++;	for(i=0; i<jwl->aliases->size; i++)	{		if((p0 = strchr(p, ';'))==NULL)		{			DBG("XJAB:xj_wlist_set_aliases: bad parameter value format\n");			goto clean;		}		n = p0 - p;		p1 = strchr(p, '=');		if(p1 && p1<p0-1)		{			jwl->aliases->d[i] = *(p1+1);			n = p1 - p;		}		jwl->aliases->a[i].len = n;		if((jwl->aliases->a[i].s = (char*)_M_SHM_MALLOC(jwl->aliases->a[i].len))				== NULL)		{			DBG("XJAB:xj_wlist_set_aliases: not enough SHMemory!\n");			goto clean;		}					strncpy(jwl->aliases->a[i].s, p, jwl->aliases->a[i].len);#ifdef XJ_EXTRA_DEBUG		DBG("XJAB:xj_wlist_set_aliases: alias[%d/%d]=%.*s delim=%c\n", 			i+1, jwl->aliases->size, jwl->aliases->a[i].len, 			jwl->aliases->a[i].s, jwl->aliases->d[i]?jwl->aliases->d[i]:'X');#endif		p = p0 + 1;	}	return 0;clean:	while(i>0)	{		_M_SHM_FREE(jwl->aliases->a[i-1].s);		i--;	}	_M_SHM_FREE(jwl->aliases->a);clean1:	if(jwl->aliases->d)		_M_SHM_FREE(jwl->aliases->d);clean2:	if(jwl->aliases->proxy)	{		_M_SHM_FREE(jwl->aliases->proxy->s);		_M_SHM_FREE(jwl->aliases->proxy);	}clean3:	if(jwl->aliases->jdm)	{		_M_SHM_FREE(jwl->aliases->jdm->s);		_M_SHM_FREE(jwl->aliases->jdm);	}	_M_SHM_FREE(jwl->aliases);	jwl->aliases = NULL;	return -1;}/** * check if the addr contains jdomain or an alias * - jwl : pointer to the workers list * - addr: the address to check against jdomain and aliases * #returns 0 - if contains or !=0 if not */int  xj_wlist_check_aliases(xj_wlist jwl, str *addr){	char *p, *p0;	int ll, i;	if(!jwl || !jwl->aliases || !addr || !addr->s || addr->len<=0)		return -1;	// find '@'	p = addr->s;	while(p < addr->s + addr->len && *p != '@')		p++;	if(p >= addr->s + addr->len)		return -1;		p++;	ll = addr->s + addr->len - p;		// check parameters	p0 = p;	while(p0 < p + ll && *p0 != ';')		p0++;	if(p0 < p + ll)		ll = p0 - p;		ll = addr->s + addr->len - p;	if(jwl->aliases->jdm && jwl->aliases->jdm->len == ll && 			!strncasecmp(jwl->aliases->jdm->s, p, ll))		return 0;	if(jwl->aliases->size <= 0)		return 1;		for(i = 0; i < jwl->aliases->size; i++)		if(jwl->aliases->a[i].len == ll && 			!strncasecmp(p, jwl->aliases->a[i].s, ll))				return 0;	return 1;}/** * delete an entity from working list of a worker * - jwl : pointer to the workers list * - sid : id of the entity (connection to Jabber - usually SHOULD be FROM *   header of the incoming SIP message * - _pid : process id of the worker */void xj_wlist_del(xj_wlist jwl, xj_jkey jkey, int _pid){	int i;	void *p;	if(jwl==NULL || jkey==NULL || jkey->id==NULL || jkey->id->s==NULL)		return;	for(i=0; i < jwl->len; i++)		if(jwl->workers[i].pid == _pid)			break;	if(i >= jwl->len)	{		DBG("XJAB:xj_wlist_del:%d: key <%.*s> not found in [%d]...\n",			_pid, jkey->id->len, jkey->id->s, i);		return;	}#ifdef XJ_EXTRA_DEBUG	DBG("XJAB:xj_wlist_del:%d: trying to delete entry for <%.*s>...\n",		_pid, jkey->id->len, jkey->id->s);#endif	lock_set_get(jwl->sems, i);	p = del234(jwl->workers[i].sip_ids, (void*)jkey);	if(p != NULL)	{		jwl->workers[i].nr--;#ifdef XJ_EXTRA_DEBUG		DBG("XJAB:xj_wlist_del:%d: sip id <%.*s> deleted\n", _pid,			jkey->id->len, jkey->id->s);#endif		xj_jkey_free_p(p);	}	lock_set_release(jwl->sems, i);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -