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