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

📄 xl_lib.c

📁 用来作为linux中SIP SERVER,完成VOIP网络电话中服务器的功能
💻 C
📖 第 1 页 / 共 2 页
字号:
    res->len = strlen(res->s);       return 0;}static int xl_get_useragent(struct sip_msg *msg, str *res, str *hp, int hi){	if(msg==NULL || res==NULL) 		return -1;	if(msg->user_agent==NULL && ((parse_headers(msg, HDR_USERAGENT, 0)==-1)			 || (msg->user_agent==NULL)))	{		DBG("XLOG: xl_get_useragent: User-Agent header not found\n");		return xl_get_null(msg, res, hp, hi);	}		res->s = msg->user_agent->body.s;	res->len = msg->user_agent->body.len;	trim(res);		return 0;}static int xl_get_header(struct sip_msg *msg, str *res, str *hp, int hi){	struct hdr_field *hf, *hf0;		if(msg==NULL || res==NULL)		return -1;	if(hp==NULL || hp->len==0)		return xl_get_null(msg, res, hp, hi);		hf0 = NULL;	/* we need to be sure we have parsed all headers */	parse_headers(msg, HDR_EOH, 0);	for (hf=msg->headers; hf; hf=hf->next)	{		if(hp->s==NULL)		{			if (hp->len!=hf->type)				continue;		} else {			if (hf->name.len!=hp->len)				continue;			if (strncasecmp(hf->name.s, hp->s, hf->name.len)!=0)				continue;		}				hf0 = hf;		if(hi==0)			goto done;		if(hi>0)			hi--;	}	done:	if(hf0==NULL || hi>0)		return xl_get_null(msg, res, hp, hi);	res->s = hf0->body.s;	res->len = hf0->body.len;	trim(res);	return 0;}int xl_parse_format(char *s, xl_elog_p *el){	char *p, c;	int n = 0;	xl_elog_p e, e0;	struct hdr_field  hdr;		if(s==NULL || el==NULL)		return -1;	DBG("XLOG: xl_parse_format: parsing [%s]\n", s);		p = s;	*el = NULL;	e = e0 = NULL;	while(*p)	{		e0 = e;		e = pkg_malloc(sizeof(xl_elog_t));		if(!e)			goto error;		memset(e, 0, sizeof(xl_elog_t));		n++;		if(*el == NULL)			*el = e;		if(e0)			e0->next = e;			e->text.s = p;		while(*p && *p!='%')			p++;		e->text.len = p - e->text.s;		if(*p == '\0')			break;		p++;		switch(*p)		{			case 'c':				p++;				switch(*p)				{					case 'i':						e->itf = xl_get_callid;					break;					case 's':						e->itf = xl_get_cseq;					break;					case 't':						e->itf = xl_get_contact;					break;					default:						e->itf = xl_get_null;				}			break;			case 'f':				p++;				switch(*p)				{					case 'u':						e->itf = xl_get_from;					break;					case 't':						e->itf = xl_get_from_tag;					break;					default:						e->itf = xl_get_null;				}			break;			case 'i':				p++;				switch(*p)				{					case 's':						e->itf = xl_get_srcip;					break;					default:					e->itf = xl_get_null; 							}			break;			case 'm':				p++;				switch(*p)				{					case 'b':						e->itf = xl_get_msg_buf;					break;					case 'f':						e->itf = xl_get_flags;					break;					case 'i':						e->itf = xl_get_msgid;					break;					case 'l':						e->itf = xl_get_msg_len;					break;					default:						e->itf = xl_get_null;				}				break;			case 'p':				p++;				switch(*p)				{					case 'p':						e->itf = xl_get_pid;					break;					default:						e->itf = xl_get_null;				}			break;			case 'r':				p++;				switch(*p)				{					case 'm':						e->itf = xl_get_method;					break;					case 'u':						e->itf = xl_get_ruri;					break;					case 's':						e->itf = xl_get_status;					break;					case 'r':						e->itf = xl_get_reason;					break;					default:						e->itf = xl_get_null;				}			break;			case 't':				p++;				switch(*p)				{					case 'u':						e->itf = xl_get_to;					break;					case 't':						e->itf = xl_get_to_tag;					break;					default:						e->itf = xl_get_null;				}			break;			case 'T':				p++;				switch(*p)				{					case 's':						e->itf = xl_get_times;					break;					case 'f':						e->itf = xl_get_timef;					break;					default:						e->itf = xl_get_null;				}			break;			case 'u':				p++;				switch(*p)				{					case 'a':						e->itf = xl_get_useragent;					break;					default:						e->itf = xl_get_null;				}			break;			case '{':				p++;				/* we expect a letter */				if((*p < 'A' || *p > 'Z') && (*p < 'a' || *p > 'z'))				{					LOG(L_ERR, "xlog: xl_parse_format: error parsing format"						" [%s] pos [%d]\n", s, (int)(p-s));					goto error;				}				e->hparam.s = p;				while(*p && *p!='}' && *p!='[')					p++;				if(*p == '\0')				{					LOG(L_ERR, "xlog: xl_parse_format: error parsing format"						" [%s] expecting '}' after position [%d]\n", s,						(int)(e->hparam.s-s));					goto error;				}				e->hparam.len = p - e->hparam.s;				/* check if we have index */				if(*p == '[')				{					p++;					if(*p=='-')					{						p++;						if(*p!='1')						{							LOG(L_ERR, "xlog: xl_parse_format: error"								" parsing format [%s] -- only -1 is accepted"								" as a negative index\n", s);								goto error;						}						e->hindex = -1;						p++;					}					else					{						while(*p>='0' && *p<='9')						{							e->hindex = e->hindex * 10 + *p - '0';							p++;						}					}					if(*p != ']')					{						LOG(L_ERR, "xlog: xl_parse_format: error parsing format"							" [%s] expecting ']' after position [%d]\n", s,							(int)(e->hparam.s - s + e->hparam.len));						goto error;					}					p++;				}				if(*p != '}')				{					LOG(L_ERR, "xlog: xl_parse_format: error parsing format"						" [%s] expecting '}' after position [%d]!\n", s,						(int)(e->hparam.s-s));					goto error;				}								DBG("xlog: xl_parse_format: header name [%.*s] index [%d]\n",						e->hparam.len, e->hparam.s, e->hindex);								/* optimize for known headers -- fake header name */				c = e->hparam.s[e->hparam.len];				e->hparam.s[e->hparam.len] = ':';				e->hparam.len++;				/* ugly hack for compact header names -- !!fake length!!				 * -- parse_hname2 expects name buffer length >= 4				 */				if (parse_hname2(e->hparam.s,						e->hparam.s + ((e->hparam.len<4)?4:e->hparam.len),						&hdr)==0)				{					LOG(L_ERR,"xlog: xl_parse_format: strange error\n");					goto error;				}				e->hparam.len--;				e->hparam.s[e->hparam.len] = c;				if (hdr.type!=HDR_OTHER && hdr.type!=HDR_ERROR)				{					LOG(L_INFO,"INFO:xlog: xl_parse_format: using "						"hdr type (%d) instead of <%.*s>\n",						hdr.type, e->hparam.len, e->hparam.s);					e->hparam.len = hdr.type;					e->hparam.s = NULL;				}				e->itf = xl_get_header;			break;			case '%':				e->itf = xl_get_percent;			break;			default:				e->itf = xl_get_null;		}		if(*p == '\0')			break;		p++;	}	DBG("XLOG: xl_parse_format: format parsed OK: [%d] items\n", n);	return 0;error:	xl_elog_free_all(*el);	*el = NULL;	return -1;}int xl_print_log(struct sip_msg* msg, xl_elog_p log, char *buf, int *len){	int n;	str tok;	xl_elog_p it;	char *cur;		if(msg==NULL || log==NULL || buf==NULL || len==NULL)		return -1;	if(*len <= 0)		return -1;	*buf = '\0';	cur = buf;		n = 0;	for (it=log; it; it=it->next)	{		/* put the text */		if(it->text.s && it->text.len>0)		{			if(n+it->text.len < *len)			{				memcpy(cur, it->text.s, it->text.len);				n += it->text.len;				cur += it->text.len;			}			else				goto overflow;		}		/* put the value of the specifier */		if(it->itf && !((*it->itf)(msg, &tok, &(it->hparam), it->hindex)))		{			if(n+tok.len < *len)			{				memcpy(cur, tok.s, tok.len);				n += tok.len;				cur += tok.len;			}			else				goto overflow;		}	}	goto done;	overflow:	LOG(L_ERR,		"XLOG:xl_print_log: buffer overflow -- increase the buffer size...\n");	return -1;done:	DBG("XLOG: xl_print_log: final buffer length %d\n", n);	*cur = '\0';	*len = n;	return 0;}int xl_elog_free_all(xl_elog_p log){	xl_elog_p t;	while(log)	{		t = log;		log = log->next;		pkg_free(t);	}	return 0;}

⌨️ 快捷键说明

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