📄 xjab_wlist.c
字号:
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 + -