本文整理汇总了C++中LM_ERR函数的典型用法代码示例。如果您正苦于以下问题:C++ LM_ERR函数的具体用法?C++ LM_ERR怎么用?C++ LM_ERR使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了LM_ERR函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: encode_msg
//.........这里部分代码省略.........
h=htons(h);
/*first goes the message code type*/
memcpy(payload,&h,2);
h=htons((unsigned short int)msg->len);
/*then goes the message start idx, but we'll put it later*/
/*then goes the message length (we hope it to be less than 65535 bytes...)*/
memcpy(&payload[MSG_LEN_IDX],&h,2);
/*then goes the content start index (starting from SIP MSG START)*/
if (get_body(msg,&body) < 0) {
myerror="body parsing failed";
goto error;
}
if(0>(diff=(body.s-msg->buf))){
myerror="body starts before the message (uh ?)";
goto error;
}else
h=htons((unsigned short int)diff);
memcpy(payload+CONTENT_IDX,&h,2);
payload[METHOD_CODE_IDX]=(unsigned char)(request?
(ms->u.request.method.s-msg->buf):
(ms->u.reply.status.s-msg->buf));
payload[METHOD_CODE_IDX+1]=(unsigned char)(request?
(ms->u.request.method.len):
(ms->u.reply.status.len));
payload[URI_REASON_IDX]=(unsigned char)(request?
(ms->u.request.uri.s-msg->buf):
(ms->u.reply.reason.s-msg->buf));
payload[URI_REASON_IDX+1]=(unsigned char)(request?
(ms->u.request.uri.len):
(ms->u.reply.reason.len));
payload[VERSION_IDX]=(unsigned char)(request?
(ms->u.request.version.s-msg->buf):
(ms->u.reply.version.s-msg->buf));
if(request){
if (parse_uri(ms->u.request.uri.s,ms->u.request.uri.len, &miuri)<0){
LM_ERR("<%.*s>\n",ms->u.request.uri.len,ms->u.request.uri.s);
myerror="while parsing the R-URI";
goto error;
}
if(0>(j=encode_uri2(msg->buf,
ms->u.request.method.s-msg->buf+ms->len,
ms->u.request.uri,&miuri,
(unsigned char*)&payload[REQUEST_URI_IDX+1])))
{
myerror="ENCODE_MSG: ERROR while encoding the R-URI";
goto error;
}
payload[REQUEST_URI_IDX]=(unsigned char)j;
k=REQUEST_URI_IDX+1+j;
}else
k=REQUEST_URI_IDX;
u=k;
k++;
for(i=0,hf=msg->headers;hf;hf=hf->next,i++);
i++;/*we do as if there was an extra header, that marks the end of
the previous header in the headers hashtable(read below)*/
j=k+3*i;
for(i=0,hf=msg->headers;hf;hf=hf->next,k+=3){
payload[k]=(unsigned char)(hf->type & 0xFF);
h=htons(j);
/*now goes a payload-based-ptr to where the header-code starts*/
memcpy(&payload[k+1],&h,2);
/*TODO fix this... fixed with k-=3?*/
if(0>(i=encode_header(msg,hf,(unsigned char*)(payload+j),MAX_ENCODED_MSG+MAX_MESSAGE_LEN-j))){
LM_ERR("encoding header %.*s\n",hf->name.len,hf->name.s);
goto error;
/* XXX: not sure if this should be considered or not, but the code is
* not executed anyway; commenting it for now.
k-=3;
continue;
*/
}
j+=(unsigned short int)i;
}
/*now goes the number of headers that have been found, right after the meta-msg-section*/
payload[u]=(unsigned char)((k-u-1)/3);
j=htons(j);
/*now copy the number of bytes that the headers-meta-section has occupied,right afther
* headers-meta-section(the array with ['v',[2:where],'r',[2:where],'R',[2:where],...]
* this is to know where the LAST header ends, since the length of each header-struct
* is calculated substracting the nextHeaderStart - presentHeaderStart
* the k+1 is because payload[k] is usually the letter*/
memcpy(&payload[k+1],&j,2);
k+=3;
j=ntohs(j);
/*now we copy the headers-meta-section after the msg-headers-meta-section*/
/*memcpy(&payload[k],payload2,j);*/
/*j+=k;*/
/*pkg_free(payload2);*/
/*now we copy the actual message after the headers-meta-section*/
memcpy(&payload[j],msg->buf,msg->len);
LM_DBG("msglen = %d,msg starts at %d\n",msg->len,j);
j=htons(j);
/*now we copy at the beginning, the index to where the actual message starts*/
memcpy(&payload[MSG_START_IDX],&j,2);
return GET_PAY_SIZE( payload );
error:
LM_ERR("%s\n",myerror);
return -1;
}
开发者ID:andrey-vorobiev,项目名称:opensips,代码行数:101,代码来源:encode_msg.c
示例2: child_init
/**
* @brief Initialize async module children
*/
static int child_init(int rank)
{
int pid;
int i;
LM_DBG("child initializing async http\n");
if(num_workers<=0)
return 0;
/* initialize query counter and id */
q_idx = 0;
q_id[0] = '\0';
if (rank==PROC_INIT) {
for(i=0; i<num_workers; i++) {
LM_DBG("initializing worker notification socket: %d\n", i);
if(async_http_init_sockets(&workers[i])<0) {
LM_ERR("failed to initialize tasks sockets\n");
return -1;
}
}
return 0;
}
if(rank>0) {
for(i=0; i<num_workers; i++) {
close(workers[i].notication_socket[0]);
}
return 0;
}
if (rank!=PROC_MAIN)
return 0;
for(i=0; i<num_workers; i++) {
if(async_http_init_worker(i+1, &workers[i])<0) {
LM_ERR("failed to initialize worker process: %d\n", i);
return -1;
}
pid=fork_process(PROC_RPC, "Http Async Worker", 1);
if (pid<0)
return -1; /* error */
if(pid==0) {
/* child */
/* enforce http_reply_parse=yes */
http_reply_parse = 1;
/* initialize the config framework */
if (cfg_child_init())
return -1;
/* init msg structure for http reply parsing */
ah_reply = pkg_malloc(sizeof(struct sip_msg));
if(!ah_reply) {
LM_ERR("failed to allocate pkg memory\n");
return -1;
}
memset(ah_reply, 0, sizeof(struct sip_msg));
/* main function for workers */
async_http_run_worker(&workers[i]);
}
}
return 0;
}
开发者ID:btriller,项目名称:kamailio,代码行数:67,代码来源:http_async_client_mod.c
示例3: ah_set_req
static int ah_set_req(struct sip_msg* msg, pv_param_t *param,
int op, pv_value_t *val)
{
pv_value_t *tval;
if(param==NULL || tmb.t_request==NULL)
return -1;
tval = val;
if((tval!=NULL) && (tval->flags&PV_VAL_NULL)) {
tval = NULL;
}
switch((enum http_req_name_t) param->pvn.u.isname.name.n) {
case E_HRN_ALL:
if (tval == NULL)
set_query_params(&ah_params);
break;
case E_HRN_HDR:
if (tval) {
if (!(tval->flags & PV_VAL_STR)) {
LM_ERR("invalid value type for $http_req(hdr)\n");
return -1;
}
header_list_add(&ah_params.headers, &tval->rs);
}
break;
case E_HRN_METHOD:
if (tval) {
if (!(tval->flags & PV_VAL_STR)) {
LM_ERR("invalid value type for $http_req(method)\n");
return -1;
}
query_params_set_method(&ah_params, &tval->rs);
} else {
ah_params.method = AH_METH_DEFAULT;
}
break;
case E_HRN_TIMEOUT:
if (tval) {
if (!(tval->flags & PV_VAL_INT)) {
LM_ERR("invalid value type for $http_req(timeout)\n");
return -1;
}
ah_params.timeout = tval->ri;
} else {
ah_params.timeout = http_timeout;
}
break;
case E_HRN_TLS_CA_PATH:
if (tval) {
if (!(tval->flags & PV_VAL_STR)) {
LM_ERR("invalid value type for $http_req(tls_ca_path)\n");
return -1;
}
set_query_cparam(&ah_params.tls_ca_path, tval->rs);
}
break;
case E_HRN_TLS_CLIENT_KEY:
if (tval) {
if (!(tval->flags & PV_VAL_STR)) {
LM_ERR("invalid value type for $http_req(tls_client_key)\n");
return -1;
}
set_query_cparam(&ah_params.tls_client_key, tval->rs);
}
break;
case E_HRN_TLS_CLIENT_CERT:
if (tval) {
if (!(tval->flags & PV_VAL_STR)) {
LM_ERR("invalid value type for $http_req(tls_client_cert)\n");
return -1;
}
set_query_cparam(&ah_params.tls_client_cert, tval->rs);
}
break;
case E_HRN_SUSPEND:
if (tval) {
if (!(tval->flags & PV_VAL_INT)) {
LM_ERR("invalid value type for $http_req(suspend)\n");
return -1;
}
ah_params.suspend_transaction = tval->ri?1:0;
} else {
ah_params.suspend_transaction = 1;
}
break;
case E_HRN_BODY:
if (tval) {
if (!(tval->flags & PV_VAL_STR)) {
LM_ERR("invalid value type for $http_req(body)\n");
return -1;
}
set_query_param(&ah_params.body, tval->rs);
}
break;
case E_HRN_AUTHMETHOD:
if (tval) {
if (!(tval->flags & PV_VAL_INT)) {
LM_ERR("invalid value type for $http_req(authmethod)\n");
//.........这里部分代码省略.........
开发者ID:btriller,项目名称:kamailio,代码行数:101,代码来源:http_async_client_mod.c
示例4: buffer
//.........这里部分代码省略.........
LM_INFO("failed to parse the method\n");
goto error1;
}
fl->u.request.method.len=tmp-buffer;
}
/* identifying type of message over now;
tmp points at space after; go ahead */
fl->u.request.method.s=buffer; /* store ptr to first token */
second=tmp+1; /* jump to second token */
offset=second-buffer;
/* EoJku */
/* next element */
tmp=eat_token_end(second, second+len-offset);
if (tmp>=end){
goto error;
}
offset+=tmp-second;
third=eat_space_end(tmp, tmp+len-offset);
offset+=third-tmp;
if ((third==tmp)||(tmp>=end)){
goto error;
}
fl->u.request.uri.s=second;
fl->u.request.uri.len=tmp-second;
/* jku: parse status code */
if (fl->type==SIP_REPLY) {
if (fl->u.request.uri.len!=3) {
LM_INFO("len(status code)!=3: %.*s\n",
fl->u.request.uri.len, ZSW(second) );
goto error;
}
s1=*second; s2=*(second+1);s3=*(second+2);
if (s1>='0' && s1<='9' &&
s2>='0' && s2<='9' &&
s3>='0' && s3<='9' ) {
fl->u.reply.statuscode=(s1-'0')*100+10*(s2-'0')+(s3-'0');
} else {
LM_INFO("status_code non-numerical: %.*s\n",
fl->u.request.uri.len, ZSW(second) );
goto error;
}
}
/* EoJku */
/* last part: for a request it must be the version, for a reply
* it can contain almost anything, including spaces, so we don't care
* about it*/
if (fl->type==SIP_REQUEST){
tmp=eat_token_end(third,third+len-offset);
offset+=tmp-third;
if ((tmp==third)||(tmp>=end)){
goto error;
}
if (! is_empty_end(tmp, tmp+len-offset)){
goto error;
}
}else{
tmp=eat_token2_end(third,third+len-offset,'\r'); /* find end of line
('\n' or '\r') */
if (tmp>=end){ /* no crlf in packet => invalid */
goto error;
}
offset+=tmp-third;
}
nl=eat_line(tmp,len-offset);
if (nl>=end){ /* no crlf in packet or only 1 line > invalid */
goto error;
}
fl->u.request.version.s=third;
fl->u.request.version.len=tmp-third;
fl->len=nl-buffer;
return nl;
error:
LM_ERR("bad %s first line\n",
(fl->type==SIP_REPLY)?"reply(status)":"request");
LM_ERR("at line 0 char %d: \n", offset );
prn=pkg_malloc( offset );
if (prn) {
for (t=0; t<offset; t++)
if (*(buffer+t)) *(prn+t)=*(buffer+t);
else *(prn+t)='°';
LM_ERR("parsed so far: %.*s\n", offset, ZSW(prn) );
pkg_free( prn );
};
error1:
fl->type=SIP_INVALID;
LM_INFO("bad message\n");
/* skip line */
nl=eat_line(buffer,len);
return nl;
}
开发者ID:WuKongQC,项目名称:opensips,代码行数:101,代码来源:parse_fline.c
示例5: async_cdp_callback
void async_cdp_callback(int is_timeout, void *param, AAAMessage *saa, long elapsed_msecs) {
struct cell *t = 0;
int rc = -1, experimental_rc = -1;
int result = CSCF_RETURN_TRUE;
saved_transaction_t* data = 0;
str xml_data = {0, 0}, ccf1 = {0, 0}, ccf2 = {0, 0}, ecf1 = {0, 0}, ecf2 = {0, 0};
ims_subscription* s = 0;
rerrno = R_FINE;
if (!param) {
LM_DBG("No transaction data this must have been called from usrloc cb impu deleted - just log result code and then exit");
cxdx_get_result_code(saa, &rc);
cxdx_get_experimental_result_code(saa, &experimental_rc);
if (saa) cdpb.AAAFreeMessage(&saa);
if (!rc && !experimental_rc) {
LM_ERR("bad SAA result code\n");
return;
}
switch (rc) {
case -1:
LM_DBG("Received Diameter error\n");
return;
case AAA_UNABLE_TO_COMPLY:
LM_DBG("Unable to comply\n");
return;
case AAA_SUCCESS:
LM_DBG("received AAA success\n");
return;
default:
LM_ERR("Unknown error\n");
return;
}
} else {
LM_DBG("There is transaction data this must have been called from save or assign server unreg");
data = (saved_transaction_t*) param;
if (tmb.t_lookup_ident(&t, data->tindex, data->tlabel) < 0) {
LM_ERR("t_continue: transaction not found\n");
rerrno = R_SAR_FAILED;
goto error_no_send;
}
get_act_time();
if (is_timeout) {
update_stat(stat_sar_timeouts, 1);
LM_ERR("Transaction timeout - did not get SAA\n");
rerrno = R_SAR_FAILED;
goto error;
}
if (!saa) {
LM_ERR("Error sending message via CDP\n");
rerrno = R_SAR_FAILED;
goto error;
}
update_stat(sar_replies_received, 1);
update_stat(sar_replies_response_time, elapsed_msecs);
/* check and see that all the required headers are available and can be parsed */
if (parse_message_for_register(t->uas.request) < 0) {
LM_ERR("Unable to parse register message correctly\n");
rerrno = R_SAR_FAILED;
goto error;
}
cxdx_get_result_code(saa, &rc);
cxdx_get_experimental_result_code(saa, &experimental_rc);
cxdx_get_charging_info(saa, &ccf1, &ccf2, &ecf1, &ecf2);
if (!rc && !experimental_rc) {
LM_ERR("bad SAA result code\n");
rerrno = R_SAR_FAILED;
goto error;
}
switch (rc) {
case -1:
LM_DBG("Received Diameter error\n");
rerrno = R_SAR_FAILED;
goto error;
case AAA_UNABLE_TO_COMPLY:
LM_DBG("Unable to comply\n");
rerrno = R_SAR_FAILED;
goto error;
case AAA_SUCCESS:
LM_DBG("received AAA success\n");
break;
default:
LM_ERR("Unknown error\n");
rerrno = R_SAR_FAILED;
//.........这里部分代码省略.........
开发者ID:aallamaa,项目名称:kamailio,代码行数:101,代码来源:cxdx_sar.c
示例6: receive_fd
/**
* Receive a file descriptor from another process
* @param pipe_fd - pipe to read from
* @param fd - file descriptor to fill
* @param p - optional pipe to fill
* @returns 1 on success or 0 on failure
*/
static int receive_fd(int pipe_fd, int* fd,peer **p)
{
struct msghdr msg;
struct iovec iov[1];
int new_fd;
int ret;
#ifdef HAVE_MSGHDR_MSG_CONTROL
struct cmsghdr* cmsg;
union{
struct cmsghdr cm;
char control[CMSG_SPACE(sizeof(new_fd))];
}control_un;
msg.msg_control=control_un.control;
msg.msg_controllen=sizeof(control_un.control);
#else
msg.msg_accrights=(caddr_t) &new_fd;
msg.msg_accrightslen=sizeof(int);
#endif
msg.msg_name=0;
msg.msg_namelen=0;
iov[0].iov_base=p;
iov[0].iov_len=sizeof(peer*);
msg.msg_iov=iov;
msg.msg_iovlen=1;
again:
ret=recvmsg(pipe_fd, &msg, MSG_DONTWAIT|MSG_WAITALL);
if (ret<0){
if (errno==EINTR) goto again;
if ((errno==EAGAIN)||(errno==EWOULDBLOCK)) goto error;
LM_CRIT( "receive_fd: recvmsg on %d failed: %s\n",
pipe_fd, strerror(errno));
goto error;
}
if (ret==0){
/* EOF */
LM_CRIT( "receive_fd: EOF on %d\n", pipe_fd);
goto error;
}
if (ret!=sizeof(peer *)){
LM_WARN("receive_fd: different number of bytes received than expected (%d from %ld)"
"trying to fix...\n", ret, (long int)sizeof(peer*));
goto error;
}
#ifdef HAVE_MSGHDR_MSG_CONTROL
cmsg=CMSG_FIRSTHDR(&msg);
if ((cmsg!=0) && (cmsg->cmsg_len==CMSG_LEN(sizeof(new_fd)))){
if (cmsg->cmsg_type!= SCM_RIGHTS){
LM_ERR("receive_fd: msg control type != SCM_RIGHTS\n");
goto error;
}
if (cmsg->cmsg_level!= SOL_SOCKET){
LM_ERR("receive_fd: msg level != SOL_SOCKET\n");
goto error;
}
*fd=*((int*) CMSG_DATA(cmsg));
}else{
if(!cmsg)
LM_ERR("receive_fd: no descriptor passed, empty control message");
else
LM_ERR("receive_fd: no descriptor passed, cmsg=%p,"
"len=%d\n", cmsg, (unsigned)cmsg->cmsg_len);
*fd=-1;
*p=0;
/* it's not really an error */
}
#else
if (msg.msg_accrightslen==sizeof(int)){
*fd=new_fd;
}else{
LM_ERR("receive_fd: no descriptor passed,"
" accrightslen=%d\n", msg.msg_accrightslen);
*fd=-1;
}
#endif
return 1;
error:
return 0;
}
开发者ID:AndyJRobinson,项目名称:kamailio,代码行数:92,代码来源:receiver.c
示例7: receive_loop
/**
* Selects once on sockets for receiving and sending stuff.
* Monitors:
* - the fd exchange pipe, for receiving descriptors to be handled here
* - the tcp sockets of all serviced peers, triggering the incoming messages do_receive()
* - the send pipes of all serviced peers, triggering the sending of outgoing messages
* @returns 0 on normal exit or -1 on error
*/
int receive_loop(peer *original_peer)
{
fd_set rfds,efds;
struct timeval tv;
int n,max=0,cnt=0;
AAAMessage *msg=0;
serviced_peer_t *sp,*sp2;
peer *p;
int fd=-1;
int fd_exchange_pipe_local=0;
if (original_peer) fd_exchange_pipe_local = original_peer->fd_exchange_pipe_local;
else fd_exchange_pipe_local = fd_exchange_pipe_unknown_local;
// if (shutdownx) return -1;
while(shutdownx&&!*shutdownx){
n = 0;
while(!n){
if (shutdownx&&*shutdownx) break;
cfg_update();
log_serviced_peers();
max =-1;
FD_ZERO(&rfds);
FD_ZERO(&efds);
FD_SET(fd_exchange_pipe_local,&rfds);
if (fd_exchange_pipe_local>max) max = fd_exchange_pipe_local;
for(sp=serviced_peers;sp;sp=sp->next){
if (sp->tcp_socket>=0){
FD_SET(sp->tcp_socket,&rfds);
FD_SET(sp->tcp_socket,&efds);
if (sp->tcp_socket>max) max = sp->tcp_socket;
}
if (sp->send_pipe_fd>=0) {
FD_SET(sp->send_pipe_fd,&rfds);
if (sp->send_pipe_fd>max) max = sp->send_pipe_fd;
}
}
tv.tv_sec=1;
tv.tv_usec=0;
n = select(max+1,&rfds,0,&efds,&tv);
if (n==-1){
if (shutdownx&&*shutdownx) return 0;
LM_ERR("select_recv(): %s\n",strerror(errno));
for(sp=serviced_peers;sp;sp=sp2){
sp2 = sp->next;
disconnect_serviced_peer(sp,0);
if (sp->p && sp->p->is_dynamic)
drop_serviced_peer(sp,0);
}
sleep(1);
break;
}else
if (n){
if (FD_ISSET(fd_exchange_pipe_local,&rfds)){
/* fd exchange */
LM_DBG("select_recv(): There is something on the fd exchange pipe\n");
p = 0;
fd = -1;
if (!receive_fd(fd_exchange_pipe_local,&fd,&p)){
LM_ERR("select_recv(): Error reading from fd exchange pipe\n");
}else{
LM_DBG("select_recv(): fd exchange pipe says fd [%d] for peer %p:[%.*s]\n",fd,
p,
p?p->fqdn.len:0,
p?p->fqdn.s:0);
if (p){
sp2=0;
for(sp=serviced_peers;sp;sp=sp->next)
if (sp->p==p){
sp2 = sp;
break;
}
if (!sp2)
sp2 = add_serviced_peer(p);
else
make_send_pipe(sp2);
if (!sp2) {
LM_ERR("Error on add_serviced_peer()\n");
continue;
}
sp2->tcp_socket = fd;
//.........这里部分代码省略.........
开发者ID:AndyJRobinson,项目名称:kamailio,代码行数:101,代码来源:receiver.c
示例8: LM_ERR
static struct mi_root *mi_cachefetch(struct mi_root *cmd, void *param)
{
str mc_system;
str attr;
str value;
struct mi_node* node= NULL;
struct mi_root *rpl_tree= NULL;
int ret;
if(cmd == NULL)
{
LM_ERR("NULL command\n");
return init_mi_tree(404, MI_SSTR("NULL command"));
}
node = cmd->node.kids;
if(node == NULL)
return init_mi_tree(404, MI_SSTR("Too few arguments"));
mc_system = node->value;
if(mc_system.s == NULL || mc_system.len== 0)
{
LM_ERR( "empty memory cache system parameter\n");
return init_mi_tree(404, MI_SSTR("Empty memory cache id"));
}
node = node->next;
if(node == NULL)
return init_mi_tree(404, MI_SSTR("Too few arguments"));
attr = node->value;
if(attr.s == NULL || attr.len== 0)
{
LM_ERR( "empty attribute name parameter\n");
return init_mi_tree(404,MI_SSTR( "Empty attribute name"));
}
node = node->next;
if(node != NULL)
return init_mi_tree(404, MI_SSTR("Too many arguments"));
ret = cachedb_fetch(&mc_system, &attr, &value);
if(ret== -1)
{
LM_ERR("cachedb_fetch command failed\n");
return init_mi_tree(500, MI_SSTR("Cache fetch command failed"));
}
rpl_tree = init_mi_tree( 200, MI_SSTR(MI_OK));
if (rpl_tree==0)
{
if(value.s)
pkg_free(value.s);
return 0;
}
if(ret == -2 || value.s == 0 || value.len == 0)
{
add_mi_node_child( &rpl_tree->node, 0, 0, 0,
MI_SSTR("Value not found") );
goto done;
}
addf_mi_node_child( &rpl_tree->node, 0, 0, 0, "%.*s = [%.*s]", attr.len,
attr.s, value.len, value.s);
pkg_free(value.s);
done:
return rpl_tree;
}
开发者ID:andrey-vorobiev,项目名称:opensips,代码行数:71,代码来源:mi_core.c
示例9: xlog_log_colors_param
static int xlog_log_colors_param(modparam_t type, void *val)
{
param_t* params_list = NULL;
param_hooks_t phooks;
param_t *pit=NULL;
str s;
int level;
if(val==NULL)
goto error;
s.s = (char*)val;
s.len = strlen(s.s);
if(s.len<=0)
goto error;
if(s.s[s.len-1]==';')
s.len--;
if (parse_params(&s, CLASS_ANY, &phooks, ¶ms_list)<0)
goto error;
for (pit = params_list; pit; pit=pit->next)
{
if (pit->name.len==7
&& strncasecmp(pit->name.s, "l_alert", 7)==0) {
level = L_ALERT;
} else if (pit->name.len==5
&& strncasecmp(pit->name.s, "l_bug", 5)==0) {
level = L_BUG;
} else if (pit->name.len==7
&& strncasecmp(pit->name.s, "l_crit2", 7)==0) {
level = L_CRIT2;
} else if (pit->name.len==6
&& strncasecmp(pit->name.s, "l_crit", 6)==0) {
level = L_CRIT;
} else if (pit->name.len==5
&& strncasecmp(pit->name.s, "l_err", 5)==0) {
level = L_ERR;
} else if (pit->name.len==6
&& strncasecmp(pit->name.s, "l_warn", 6)==0) {
level = L_WARN;
} else if (pit->name.len==8
&& strncasecmp(pit->name.s, "l_notice", 8)==0) {
level = L_NOTICE;
} else if (pit->name.len==6
&& strncasecmp(pit->name.s, "l_info", 6)==0) {
level = L_INFO;
} else if (pit->name.len==5
&& strncasecmp(pit->name.s, "l_dbg", 5)==0) {
level = L_DBG;
} else {
LM_ERR("invalid level name %.*s\n",
pit->name.len, pit->name.s);
goto error;
}
if(pit->body.len!=2) {
LM_ERR("invalid color spec for level %.*s (%.*s)\n",
pit->name.len, pit->name.s,
pit->body.len, pit->body.s);
goto error;
}
dprint_color_update(level, pit->body.s[0], pit->body.s[1]);
}
if(params_list!=NULL)
free_params(params_list);
return 0;
error:
if(params_list!=NULL)
free_params(params_list);
return -1;
}
开发者ID:AlessioCasco,项目名称:kamailio,代码行数:76,代码来源:xlog.c
示例10: db_mysql_get_columns
/**
* Get and convert columns from a result
*/
int db_mysql_get_columns(const db_con_t* _h, db_res_t* _r)
{
int col;
MYSQL_FIELD* fields;
if ((!_h) || (!_r)) {
LM_ERR("invalid parameter\n");
return -1;
}
if (CON_HAS_PS(_h)) {
RES_COL_N(_r) = CON_MYSQL_PS(_h)->cols_out;
} else {
RES_COL_N(_r) = mysql_field_count(CON_CONNECTION(_h));
}
if (!RES_COL_N(_r)) {
LM_ERR("no columns returned from the query\n");
return -2;
} else {
LM_DBG("%d columns returned from the query\n", RES_COL_N(_r));
}
if (db_allocate_columns(_r, RES_COL_N(_r)) != 0) {
LM_ERR("could not allocate columns\n");
return -3;
}
fields = mysql_fetch_fields(CON_RESULT(_h));
for(col = 0; col < RES_COL_N(_r); col++) {
/* The pointer that is here returned is part of the result structure */
RES_NAMES(_r)[col]->s = fields[col].name;
RES_NAMES(_r)[col]->len = strlen(fields[col].name);
LM_DBG("RES_NAMES(%p)[%d]=[%.*s]\n", RES_NAMES(_r)[col], col,
RES_NAMES(_r)[col]->len, RES_NAMES(_r)[col]->s);
switch(fields[col].type) {
case MYSQL_TYPE_TINY:
case MYSQL_TYPE_SHORT:
case MYSQL_TYPE_LONG:
case MYSQL_TYPE_INT24:
case MYSQL_TYPE_LONGLONG:
case MYSQL_TYPE_DECIMAL:
#if MYSQL_VERSION_ID > 49999
case MYSQL_TYPE_NEWDECIMAL:
#endif
case MYSQL_TYPE_TIMESTAMP:
LM_DBG("use DB_INT result type\n");
RES_TYPES(_r)[col] = DB_INT;
break;
case MYSQL_TYPE_FLOAT:
case MYSQL_TYPE_DOUBLE:
LM_DBG("use DB_DOUBLE result type\n");
RES_TYPES(_r)[col] = DB_DOUBLE;
break;
case MYSQL_TYPE_DATETIME:
case MYSQL_TYPE_DATE:
LM_DBG("use DB_DATETIME result type\n");
RES_TYPES(_r)[col] = DB_DATETIME;
break;
case MYSQL_TYPE_BLOB:
LM_DBG("use DB_BLOB result type\n");
RES_TYPES(_r)[col] = DB_BLOB;
break;
case FIELD_TYPE_SET:
LM_DBG("use DB_BITMAP result type\n");
RES_TYPES(_r)[col] = DB_BITMAP;
break;
case MYSQL_TYPE_STRING:
case MYSQL_TYPE_VAR_STRING:
LM_DBG("use DB_STRING result type\n");
RES_TYPES(_r)[col] = DB_STRING;
break;
default:
LM_WARN("unhandled data type column (%.*s) type id (%d), "
"use DB_STRING as default\n", RES_NAMES(_r)[col]->len,
RES_NAMES(_r)[col]->s, fields[col].type);
RES_TYPES(_r)[col] = DB_STRING;
break;
}
}
return 0;
}
开发者ID:mtulio,项目名称:mtulio,代码行数:92,代码来源:res.c
示例11: load_sca_info_from_db
static int load_sca_info_from_db(void)
{
db_res_t * res = NULL;
db_val_t * values;
db_row_t * rows;
int i, j, nr_rows;
unsigned int valid_record;
unsigned int n_result_cols = 0;
unsigned int shared_line_col, watchers_col;
unsigned int app_shared_entity_col[MAX_APPEARANCE_INDEX];
unsigned int app_call_state_col[MAX_APPEARANCE_INDEX];
unsigned int app_call_info_uri_col[MAX_APPEARANCE_INDEX];
unsigned int app_call_info_appearance_uri_col[MAX_APPEARANCE_INDEX];
unsigned int app_b2bl_key_col[MAX_APPEARANCE_INDEX];
db_key_t q_cols[SCA_TABLE_TOTAL_COL_NO];
str shared_line, watchers_csv;
//str_lst_t *watchers;
//unsigned int size, watcher_size, watchers_no;
//unsigned int size;
unsigned int hash_index;
//char *p;
b2b_sca_record_t *record;
b2b_sca_call_t *call;
unsigned int shared_entity, appearance_index, call_state;
str call_info_uri, call_info_apperance_uri, b2bl_key;
b2bl_cb_ctx_t *cb_params;
if(use_sca_table()) return -1;
q_cols[shared_line_col = n_result_cols++] = &shared_line_column;
q_cols[watchers_col = n_result_cols++] = &watchers_column;
for (i=0; i<MAX_APPEARANCE_INDEX; i++) {
q_cols[app_shared_entity_col[i] = n_result_cols++] = &app_shared_entity_column[i];
q_cols[app_call_state_col[i] = n_result_cols++] = &app_call_state_column[i];
q_cols[app_call_info_uri_col[i] = n_result_cols++] = &app_call_info_uri_column[i];
q_cols[app_call_info_appearance_uri_col[i] = n_result_cols++] =
&app_call_info_appearance_uri_column[i];
q_cols[app_b2bl_key_col[i] = n_result_cols++] = &app_b2bl_key_column[i];
}
/* select the whole tabel and all the columns */
if (DB_CAPABILITY(sca_dbf, DB_CAP_FETCH)) {
if(sca_dbf.query(sca_db_handle, 0, 0, 0, q_cols, 0,
SCA_TABLE_TOTAL_COL_NO, 0, 0) < 0) {
LM_ERR("Error while querying (fetch) database\n");
return -1;
}
if(sca_dbf.fetch_result(sca_db_handle, &res, SCA_FETCH_SIZE)<0){
LM_ERR("fetching rows failed\n");
return -1;
}
} else {
if(sca_dbf.query(sca_db_handle, 0, 0, 0, q_cols, 0,
SCA_TABLE_TOTAL_COL_NO, 0, &res) < 0) {
LM_ERR("Error while querying database\n");
return -1;
}
}
nr_rows = RES_ROW_N(res);
do {
LM_DBG("loading [%i] records from db\n", nr_rows);
rows = RES_ROWS(res);
/* for every row/record */
for(i=0; i<nr_rows; i++){
values = ROW_VALUES(rows + i);
if (VAL_NULL(values+shared_line_col) || VAL_NULL(values+watchers_col)) {
LM_ERR("columns [%.*s] or/and [%.*s] cannot be null -> skipping\n",
shared_line_column.len, shared_line_column.s,
watchers_column.len, watchers_column.s);
continue;
}
shared_line.s = (char*)values[shared_line_col].val.string_val;
shared_line.len = strlen(shared_line.s);
watchers_csv.s = (char*)values[watchers_col].val.string_val;
watchers_csv.len = strlen(watchers_csv.s);
record = restore_record(&shared_line, &watchers_csv);
if (record == NULL)
goto error;
hash_index = core_hash(&shared_line, NULL, b2b_sca_hsize);
j = 0;
while (j < MAX_APPEARANCE_INDEX) {
if( VAL_NULL(values + app_shared_entity_col[j]) ||
VAL_NULL(values + app_call_state_col[j]) ||
VAL_NULL(values + app_call_info_uri_col[j]) ||
VAL_NULL(values + app_call_info_appearance_uri_col[j]) ||
VAL_NULL(values + app_b2bl_key_col[j]) ) {
goto cont;
}
appearance_index = j + 1;
/* 1 - get shared_entity */
shared_entity = values[app_shared_entity_col[j]].val.int_val;
if (shared_entity!=0 && shared_entity!=1) {
LM_ERR("Unexpected shared_entity [%d] "
//.........这里部分代码省略.........
开发者ID:GeorgeShaw,项目名称:opensips,代码行数:101,代码来源:sca_db_handler.c
示例12: insert_sca_info_into_db
int insert_sca_info_into_db(b2b_sca_record_t *record)
{
b2b_sca_call_t *call = NULL;
unsigned int n_q_cols = 0;
unsigned int i;
unsigned int appearance_index = MAX_APPEARANCE_INDEX;
unsigned int shared_line_col, watchers_col;
unsigned int app_shared_entity_col[MAX_APPEARANCE_INDEX];
unsigned int app_call_state_col[MAX_APPEARANCE_INDEX];
unsigned int app_call_info_uri_col[MAX_APPEARANCE_INDEX];
unsigned int app_call_info_appearance_uri_col[MAX_APPEARANCE_INDEX];
unsigned int app_b2bl_key_col[MAX_APPEARANCE_INDEX];
db_key_t q_cols[SCA_TABLE_TOTAL_COL_NO];
db_val_t q_vals[SCA_TABLE_TOTAL_COL_NO];
LM_DBG("\n");
if(use_sca_table()) return -1;
memset(q_vals, 0, SCA_TABLE_TOTAL_COL_NO * sizeof(db_val_t));
q_cols[shared_line_col = n_q_cols++] = &shared_line_column;
q_vals[shared_line_col].type = DB_STR;
q_cols[watchers_col = n_q_cols++] = &watchers_column;
q_vals[watchers_col].type = DB_STR;
for (i=0; i<MAX_APPEARANCE_INDEX; i++) {
q_cols[app_shared_entity_col[i] = n_q_cols++] = &app_shared_entity_column[i];
q_vals[app_shared_entity_col[i]].type = DB_INT;
q_cols[app_call_state_col[i] = n_q_cols++] = &app_call_state_column[i];
q_vals[app_call_state_col[i]].type = DB_INT;
q_cols[app_call_info_uri_col[i] = n_q_cols++] = &app_call_info_uri_column[i];
q_vals[app_call_info_uri_col[i]].type = DB_STR;
q_cols[app_call_info_appearance_uri_col[i] = n_q_cols++] =
&app_call_info_appearance_uri_column[i];
q_vals[app_call_info_appearance_uri_col[i]].type = DB_STR;
q_cols[app_b2bl_key_col[i] = n_q_cols++] = &app_b2bl_key_column[i];
q_vals[app_b2bl_key_col[i]].type = DB_STR;
}
q_vals[shared_line_col].val.str_val = record->shared_line;
/* FIXME: get all the watchers */
if (record->watchers) {
q_vals[watchers_col].val.str_val = record->watchers->watcher;
}
for (i=0; i<MAX_APPEARANCE_INDEX; i++) {
if (record->call[i]) {
if (call) {
LM_ERR("This should be an UPDATE not an INSERT\n");
return -1;
}
call = record->call[i];
appearance_index = i;
}
}
if (call) {
q_vals[app_shared_entity_col[appearance_index]].val.int_val = call->shared_entity;
q_vals[app_call_state_col[appearance_index]].val.int_val = call->call_state;
q_vals[app_call_info_uri_col[appearance_index]].val.str_val = call->call_info_uri;
q_vals[app_call_info_appearance_uri_col[appearance_index]].val.str_val =
call->call_info_apperance_uri;
q_vals[app_b2bl_key_col[appearance_index]].val.str_val = call->b2bl_key;
if((sca_dbf.insert(sca_db_handle, q_cols, q_vals, SCA_TABLE_TOTAL_COL_NO)) != 0) {
LM_ERR("could not add record\n");
return -1;
}
} else {
LM_ERR("Empty record?\n");
return -1;
}
return 0;
}
开发者ID:GeorgeShaw,项目名称:opensips,代码行数:75,代码来源:sca_db_handler.c
示例13: update_sca_info_to_db
int update_sca_info_to_db(b2b_sca_record_t *record, unsigned int appearance_index)
{
b2b_sca_call_t *call;
unsigned int i;
unsigned int n_q_cols = 0, n_q_vals = 0;
unsigned int shared_line_col, watchers_col;
unsigned int app_shared_entity_col[MAX_APPEARANCE_INDEX];
unsigned int app_call_state_col[MAX_APPEARANCE_INDEX];
unsigned int app_call_info_uri_col[MAX_APPEARANCE_INDEX];
unsigned int app_call_info_appearance_uri_col[MAX_APPEARANCE_INDEX];
unsigned int app_b2bl_key_col[MAX_APPEARANCE_INDEX];
db_key_t q_cols[SCA_TABLE_TOTAL_COL_NO];
db_val_t q_vals[SCA_TABLE_TOTAL_COL_NO];
LM_DBG("\n");
if(use_sca_table()) return -1;
memset(q_vals, 0, SCA_TABLE_TOTAL_COL_NO * sizeof(db_val_t));
q_cols[shared_line_col = n_q_cols++] = &shared_line_column;
q_vals[shared_line_col].type = DB_STR;
q_cols[watchers_col = n_q_cols++] = &watchers_column;
q_vals[watchers_col].type = DB_STR;
for (i=0; i<MAX_APPEARANCE_INDEX; i++) {
q_cols[app_shared_entity_col[i] = n_q_cols++] = &app_shared_entity_column[i];
q_vals[app_shared_entity_col[i]].type = DB_INT;
q_cols[app_call_state_col[i] = n_q_cols++] = &app_call_state_column[i];
q_vals[app_call_state_col[i]].type = DB_INT;
q_cols[app_call_info_uri_col[i] = n_q_cols++] = &app_call_info_uri_column[i];
q_vals[app_call_info_uri_col[i]].type = DB_STR;
q_cols[app_call_info_appearance_uri_col[i] = n_q_cols++] =
&app_call_info_appearance_uri_column[i];
q_vals[app_call_info_appearance_uri_col[i]].type = DB_STR;
q_cols[app_b2bl_key_col[i] = n_q_cols++] = &app_b2bl_key_column[i];
q_vals[app_b2bl_key_col[i]].type = DB_STR;
}
q_vals[shared_line_col].val.str_val = record->shared_line;
i = appearance_index - 1;
if (i >= MAX_APPEARANCE_INDEX) {
LM_ERR("Non matching call\n");
return -1;
}
call = record->call[i];
if (call) {
LM_DBG("update shared_entity [%d] and call_state [%d] for call[%d][%.*s]\n",
call->shared_entity, call->call_state, i,
call->b2bl_key.len, call->b2bl_key.s);
switch(call->call_state) {
case ALERTING_STATE:
q_vals[app_call_info_uri_col[i]].val.str_val = call->call_info_uri;
q_vals[app_call_info_appearance_uri_col[i]].val.str_val =
call->call_info_apperance_uri;
q_vals[app_b2bl_key_col[i]].val.str_val = call->b2bl_key;
LM_DBG("update [%.*s][%.*s][%.*s]\n",
call->call_info_uri.len, call->call_info_uri.s,
call->call_info_apperance_uri.len, call->call_info_apperance_uri.s,
call->b2bl_key.len, call->b2bl_key.s);
n_q_vals += 3;
default:
q_vals[app_shared_entity_col[i]].val.int_val = call->shared_entity;
q_vals[app_call_state_col[i]].val.int_val = call->call_state;
n_q_vals += 2;
}
} else {
n_q_vals = 5;
}
if(sca_dbf.update(sca_db_handle, q_cols, 0, q_vals,
q_cols + app_shared_entity_col[i],
q_vals + app_shared_entity_col[i], 1, n_q_vals) != 0) {
LM_ERR("failed to update record\n");
return -1;
}
return 0;
}
开发者ID:GeorgeShaw,项目名称:opensips,代码行数:80,代码来源:sca_db_handler.c
示例14: lua_sr_kemi_register_libs
void lua_sr_kemi_register_libs(lua_State *L)
{
luaL_Reg *_sr_crt_KSRMethods = NULL;
sr_kemi_module_t *emods = NULL;
int emods_size = 0;
int i;
int k;
int n;
char mname[128];
#if 0
/* dynamic lookup on function name */
lua_sr_kemi_register_core(L);
lua_sr_kemi_register_modules(L);
#endif
_sr_KSRMethods = malloc(SR_LUA_KSR_METHODS_SIZE * sizeof(luaL_Reg));
if(_sr_KSRMethods==NULL) {
LM_ERR("no more pkg memory\n");
return;
}
memset(_sr_KSRMethods, 0, SR_LUA_KSR_METHODS_SIZE * sizeof(luaL_Reg));
emods_size = sr_kemi_modules_size_get();
emods = sr_kemi_modules_get();
n = 0;
_sr_crt_KSRMethods = _sr_KSRMethods;
if(emods_size==0 || emods[0].kexp==NULL) {
LM_ERR("no kemi exports registered\n");
return;
}
for(i=0; emods[0].kexp[i].func!=NULL; i++) {
LM_DBG("exporting KSR.%s(...)\n", emods[0].kexp[i].fname.s);
_sr_crt_KSRMethods[i].name = emods[0].kexp[i].fname.s;
_sr_crt_KSRMethods[i].func =
sr_kemi_lua_export_associate(&emods[0].kexp[i]);
if(_sr_crt_KSRMethods[i].func == NULL) {
LM_ERR("failed to associate kemi function with lua export\n");
free(_sr_KSRMethods);
_sr_KSRMethods = NULL;
return;
}
n++;
}
luaL_openlib(L, "KSR", _sr_crt_KSRMethods, 0);
/* special modules - pv.get(...) can return int or str */
luaL_openlib(L, "KSR.pv", _sr_pv_Map, 0);
luaL_openlib(L, "KSR.x", _sr_kemi_x_Map, 0);
/* registered kemi modules */
if(emods_size>1) {
for(k=1; k<emods_size; k++) {
n++;
_sr_crt_KSRMethods = _sr_KSRMethods + n;
snprintf(mname, 128, "KSR.%s", emods[k].kexp[0].mname.s);
for(i=0; emods[k].kexp[i].func!=NULL; i++) {
LM_DBG("exporting %s.%s(...)\n", mname,
emods[k].kexp[i].fname.s);
_sr_crt_KSRMethods[i].name = emods[k].kexp[i].fname.s;
_sr_crt_KSRMethods[i].func =
sr_kemi_lua_export_associate(&emods[k].kexp[i]);
if(_sr_crt_KSRMethods[i].func == NULL) {
LM_ERR("failed to associate kemi function with func export\n");
free(_sr_KSRMethods);
_sr_KSRMethods = NULL;
return;
}
n++;
}
luaL_openlib(L, mname, _sr_crt_KSRMethods, 0);
LM_DBG("initializing kemi sub-module: %s (%s)\n", mname,
emods[k].kexp[0].mname.s);
}
}
LM_DBG("module 'KSR' has been initialized\n");
}
开发者ID:GreenfieldTech,项目名称:kamailio,代码行数:80,代码来源:app_lua_sr.c
示例15: dlg_onroute
/*!
* \brief Function that is registered as RR callback for dialog tracking
*
* Function that is registered as RR callback for dialog tracking. It
* sets the appropriate events after the SIP method and run the state
* machine to update the dialog state. It updates then the saved
* dialogs and also the statistics.
* \param req SIP request
* \param route_params record-route parameter
* \param param unused
*/
void dlg_onroute(struct sip_msg* req, str *route_params, void *param)
{
dlg_cell_t *dlg;
dlg_iuid_t *iuid;
str val, callid, ftag, ttag;
int h_entry, h_id, new_state, old_state, unref, event, timeout, reset;
unsigned int dir;
int ret = 0;
dlg = dlg_get_ctx_dialog();
if (dlg!=NULL) {
dlg_release(dlg);
return;
}
/* skip initial requests - they may end up here because of the
* preloaded route */
if ( (!req->to && parse_headers(req, HDR_TO_F,0)<0) || !req->to ) {
LM_ERR("bad request or missing TO hdr :-/\n");
return;
}
if ( get_to(req)->tag_value.len==0 )
return;
dlg = 0;
dir = DLG_DIR_NONE;
if ( seq_match_mode!=SEQ_MATCH_NO_ID ) {
if( d_rrb.get_route_param( req, &rr_param, &val)!=0) {
LM_DBG("Route param '%.*s' not found\n", rr_param.len,rr_param.s);
if (seq_match_mode==SEQ_MATCH_STRICT_ID )
return;
} else {
LM_DBG("route param is '%.*s' (len=%d)\n",val.len,val.s,val.len);
if ( parse_dlg_rr_param( val.s, val.s+val.len, &h_entry, &h_id)<0 )
return;
dlg = dlg_lookup(h_entry, h_id);
if (dlg==0) {
LM_WARN("unable to find dialog for %.*s "
"with route param '%.*s' [%u:%u]\n",
req->first_line.u.request.method.len,
req->first_line.u.request.method.s,
val.len,val.s, h_entry, h_id);
if (seq_match_mode==SEQ_MATCH_STRICT_ID )
return;
} else {
if (pre_match_parse( req, &callid, &ftag, &ttag, 1)<0) {
// lookup_dlg has incremented the ref count by 1
dlg_release(dlg);
return;
}
if (match_dialog( dlg, &callid, &ftag, &ttag, &dir )==0) {
LM_WARN("tight matching failed for %.*s with callid='%.*s'/%d, "
"ftag='%.*s'/%d, ttag='%.*s'/%d and direction=%d\n",
req->first_line.u.request.method.len,
req->first_line.u.request.method.s,
callid.len, callid.s, callid.len,
ftag.len, ftag.s, ftag.len,
ttag.len, ttag.s, ttag.len, dir);
LM_WARN("dialog identification elements are callid='%.*s'/%d, "
"caller tag='%.*s'/%d, callee tag='%.*s'/%d\n",
dlg->callid.len, dlg->callid.s, dlg->callid.len,
dlg->tag[DLG_CALLER_LEG].len, dlg->tag[DLG_CALLER_LEG].s,
dlg->tag[DLG_CALLER_LEG].len,
dlg->tag[DLG_CALLEE_LEG].len, dlg->tag[DLG_CALLEE_LEG].s,
dlg->tag[DLG_CALLEE_LEG].len);
// lookup_dlg has incremented the ref count by 1
dlg_release(dlg);
// Reset variables in order to do a lookup based on SIP-Elements.
dlg = 0;
dir = DLG_DIR_NONE;
if (seq_match_mode==SEQ_MATCH_STRICT_ID )
return;
}
}
}
}
if (dlg==0) {
if (pre_match_parse( req, &callid, &ftag, &ttag, 1)<0)
return;
/* TODO - try to use the RR dir detection to speed up here the
* search -bogdan */
dlg = get_dlg(&callid, &ftag, &ttag, &dir);
if (dlg==0){
//.........这里部分代码省略.........
开发者ID:GeorgeShaw,项目名称:kamailio,代码行数:101,代码来源:dlg_handlers.c
示例16: receive_message
/**
* Receives a message and does basic processing or call the sm_process().
* This gets called from the do_receive() for every message that is received.
* Basic processing, before the state machine, is done here.
* @param msg - the message received
* @param sp - the serviced peer that it was receiver on
*/
void receive_message(AAAMessage *msg,serviced_peer_t *sp)
{
AAA_AVP *avp1,*avp2;
LM_DBG("receive_message(): [%.*s] Recv msg %d\n",
sp->p?sp->p->fqdn.len:0,
sp->p?sp->p->fqdn.s:0,
msg->commandCode);
if (!sp->p){
switch (msg->commandCode){
case Code_CE:
if (is_req(msg)){
avp1 = AAAFindMatchingAVP(msg,msg->avpList.head,AVP_Origin_Host,0,0);
avp2 = AAAFi
|
请发表评论