📄 msilo.c
字号:
DBG("MSILO:m_store: TO used as R-URI\n"); if(parse_uri(pto->uri.s, pto->uri.len, &puri)!=0) { LOG(L_ERR, "MSILO:m_store: bad R-URI!\n"); goto error; } if(puri.user.len<=0 || puri.user.s==NULL || puri.host.len<=0 || puri.host.s==NULL) { LOG(L_ERR, "MSILO:m_store: bad URI in To header!\n"); goto error; } } db_keys[nr_keys] = sc_uri_user; db_vals[nr_keys].type = DB_STR; db_vals[nr_keys].nul = 0; db_vals[nr_keys].val.str_val.s = puri.user.s; db_vals[nr_keys].val.str_val.len = puri.user.len; nr_keys++; db_keys[nr_keys] = sc_uri_host; db_vals[nr_keys].type = DB_STR; db_vals[nr_keys].nul = 0; db_vals[nr_keys].val.str_val.s = puri.host.s; db_vals[nr_keys].val.str_val.len = puri.host.len; nr_keys++; /* add the message's body in SQL query */ db_keys[nr_keys] = sc_body; db_vals[nr_keys].type = DB_BLOB; db_vals[nr_keys].nul = 0; db_vals[nr_keys].val.blob_val.s = body.s; db_vals[nr_keys].val.blob_val.len = body.len; nr_keys++; lexpire = ms_expire_time; /* add 'content-type' -- parse the content-type header */ if ((mime=parse_content_type_hdr(msg))<1 ) { LOG(L_ERR,"MSILO:m_store: ERROR cannot parse Content-Type header\n"); goto error; } db_keys[nr_keys] = sc_ctype; db_vals[nr_keys].type = DB_STR; db_vals[nr_keys].nul = 0; db_vals[nr_keys].val.str_val.s = "text/plain"; db_vals[nr_keys].val.str_val.len = 10; /** check the content-type value */ if( mime!=(TYPE_TEXT<<16)+SUBTYPE_PLAIN && mime!=(TYPE_MESSAGE<<16)+SUBTYPE_CPIM ) { if(m_extract_content_type(msg->content_type->body.s, msg->content_type->body.len, &ctype, CT_TYPE) != -1) { DBG("MSILO:m_store: 'content-type' found\n"); db_vals[nr_keys].val.str_val.s = ctype.type.s; db_vals[nr_keys].val.str_val.len = ctype.type.len; } } /* check 'expires' -- no more parsing - already done by get_body() */ if(msg->expires && msg->expires->body.len > 0) { DBG("MSILO:m_store: 'expires' found\n"); val = atoi(msg->expires->body.s); if(val > 0) lexpire = (ms_expire_time<=val)?ms_expire_time:val; } /* current time */ val = (int)time(NULL); /* add expiration time */ db_keys[nr_keys] = sc_exp_time; db_vals[nr_keys].type = DB_INT; db_vals[nr_keys].nul = 0; db_vals[nr_keys].val.int_val = val+lexpire; nr_keys++; /* add incoming time */ db_keys[nr_keys] = sc_inc_time; db_vals[nr_keys].type = DB_INT; db_vals[nr_keys].nul = 0; db_vals[nr_keys].val.int_val = val; nr_keys++; if (msilo_dbf.use_table(db_con, ms_db_table) < 0) { LOG(L_ERR, "MSILO:m_store: Error in use_table\n"); goto error; } if(msilo_dbf.insert(db_con, db_keys, db_vals, nr_keys) < 0) { LOG(L_ERR, "MSILO:m_store: error storing message\n"); goto error; } DBG("MSILO:m_store: message stored. T:<%.*s> F:<%.*s>\n", pto->uri.len, pto->uri.s, pfrom->uri.len, pfrom->uri.s); if(reg_addr.len > 0 && reg_addr.len+CONTACT_PREFIX_LEN+CONTACT_SUFFIX_LEN+1<1024) { DBG("MSILO:m_store: sending info message.\n"); strcpy(buf1, CONTACT_PREFIX); strncat(buf1,reg_addr.s,reg_addr.len); strncat(buf1, CONTACT_SUFFIX, CONTACT_SUFFIX_LEN); str_hdr.len = CONTACT_PREFIX_LEN+reg_addr.len+CONTACT_SUFFIX_LEN; str_hdr.s = buf1; strncpy(buf, "User [", 6); body.len = 6; if(pto->uri.len+OFFLINE_MESSAGE_LEN+7/*6+1*/ < 512) { strncpy(buf+body.len, pto->uri.s, pto->uri.len); body.len += pto->uri.len; } strncpy(buf+body.len, OFFLINE_MESSAGE, OFFLINE_MESSAGE_LEN); body.len += OFFLINE_MESSAGE_LEN; body.s = buf; /* look for Contact header -- must be parsed by now*/ ctaddr.s = NULL; if(ms_use_contact && msg->contact!=NULL && msg->contact->body.s!=NULL && msg->contact->body.len > 0) { DBG("MSILO:m_store: contact header found\n"); if((msg->contact->parsed!=NULL && ((contact_body_t*)(msg->contact->parsed))->contacts!=NULL) || (parse_contact(msg->contact)==0 && msg->contact->parsed!=NULL && ((contact_body_t*)(msg->contact->parsed))->contacts!=NULL)) { DBG("MSILO:m_store: using contact header for info msg\n"); ctaddr.s = ((contact_body_t*)(msg->contact->parsed))->contacts->uri.s; ctaddr.len = ((contact_body_t*)(msg->contact->parsed))->contacts->uri.len; if(!ctaddr.s || ctaddr.len < 6 || strncmp(ctaddr.s, "sip:", 4) || ctaddr.s[4]==' ') ctaddr.s = NULL; else DBG("MSILO:m_store: feedback contact [%.*s]\n", ctaddr.len,ctaddr.s); } } tmb.t_request(&msg_type, /* Type of the message */ (ctaddr.s)?&ctaddr:&pfrom->uri, /* Request-URI */ &pfrom->uri, /* To */ ®_addr, /* From */ &str_hdr, /* Optional headers including CRLF */ &body, /* Message body */ NULL, /* Callback function */ NULL /* Callback parameter */ ); } return 1;error: return -1;}/** * dump message */static int m_dump(struct sip_msg* msg, char* str1, char* str2){ struct to_body to, *pto = NULL; db_key_t db_keys[2]; db_val_t db_vals[2]; db_key_t db_cols[6]; db_res_t* db_res = NULL; int i, db_no_cols = 6, db_no_keys = 2, mid, n; char hdr_buf[1024], body_buf[1024]; struct sip_uri puri; str str_vals[4], hdr_str , body_str; time_t rtime; /* init */ db_keys[0]=sc_uri_user; db_keys[1]=sc_uri_host; db_cols[0]=sc_mid; db_cols[1]=sc_from; db_cols[2]=sc_to; db_cols[3]=sc_body; db_cols[4]=sc_ctype; db_cols[5]=sc_inc_time; DBG("MSILO:m_dump: ------------ start ------------\n"); hdr_str.s=hdr_buf; hdr_str.len=1024; body_str.s=body_buf; body_str.len=1024; /* check for TO header */ if(msg->to==NULL && (parse_headers(msg, HDR_TO, 0)==-1 || msg->to==NULL || msg->to->body.s==NULL)) { LOG(L_ERR,"MSILO:m_dump: ERROR cannot find TO HEADER!\n"); goto error; } /* get TO header URI */ if(msg->to->parsed != NULL) { pto = (struct to_body*)msg->to->parsed; DBG("MSILO:m_dump: 'To' header ALREADY PARSED: <%.*s>\n", pto->uri.len, pto->uri.s ); } else { memset( &to , 0, sizeof(to) ); parse_to(msg->to->body.s, msg->to->body.s + msg->to->body.len + 1, &to); if(to.uri.len <= 0) /* || to.error != PARSE_OK) */ { DBG("MSILO:m_dump: 'To' header NOT parsed\n"); goto error; } pto = &to; } /** * check if has expires=0 (REGISTER) */ if(parse_headers(msg, HDR_EXPIRES, 0) >= 0) { /* check 'expires' > 0 */ if(msg->expires && msg->expires->body.len > 0) { i = atoi(msg->expires->body.s); if(i <= 0) { /* user goes offline */ DBG("MSILO:m_dump: user <%.*s> goes offline - expires=%d\n", pto->uri.len, pto->uri.s, i); goto error; } else DBG("MSILO:m_dump: user <%.*s> online - expires=%d\n", pto->uri.len, pto->uri.s, i); } } else { DBG("MSILO:m_dump: 'expires' threw error at parsing\n"); goto error; } if(parse_uri(pto->uri.s, pto->uri.len, &puri)!=0) { LOG(L_ERR, "MSILO:m_dump: bad R-URI!\n"); goto error; } if(puri.user.len<=0 || puri.user.s==NULL || puri.host.len<=0 || puri.host.s==NULL) { LOG(L_ERR, "MSILO:m_dump: bad URI in To header!\n"); goto error; } db_vals[0].type = DB_STR; db_vals[0].nul = 0; db_vals[0].val.str_val.s = puri.user.s; db_vals[0].val.str_val.len = puri.user.len; db_vals[1].type = DB_STR; db_vals[1].nul = 0; db_vals[1].val.str_val.s = puri.host.s; db_vals[1].val.str_val.len = puri.host.len; if (msilo_dbf.use_table(db_con, ms_db_table) < 0) { LOG(L_ERR, "MSILO:m_dump: Error in use_table\n"); goto error; } if((msilo_dbf.query(db_con,db_keys,NULL,db_vals,db_cols,db_no_keys, db_no_cols, NULL,&db_res)!=0) || (RES_ROW_N(db_res) <= 0)) { DBG("MSILO:m_dump: no stored message for <%.*s>!\n", pto->uri.len, pto->uri.s); goto done; } DBG("MSILO:m_dump: dumping [%d] messages for <%.*s>!!!\n", RES_ROW_N(db_res), pto->uri.len, pto->uri.s); for(i = 0; i < RES_ROW_N(db_res); i++) { mid = RES_ROWS(db_res)[i].values[0].val.int_val; if(msg_list_check_msg(ml, mid)) { DBG("MSILO:m_dump: message[%d] mid=%d already sent.\n", i, mid); continue; } memset(str_vals, 0, 4*sizeof(str)); SET_STR_VAL(str_vals[0], db_res, i, 1); /* from */ SET_STR_VAL(str_vals[1], db_res, i, 2); /* to */ SET_STR_VAL(str_vals[2], db_res, i, 3); /* body */ SET_STR_VAL(str_vals[3], db_res, i, 4); /* ctype */ hdr_str.len = 1024; if(m_build_headers(&hdr_str, str_vals[3] /*ctype*/, str_vals[0]/*from*/) < 0) { DBG("MSILO:m_dump: headers building failed!!!\n"); if (msilo_dbf.free_result(db_con, db_res) < 0) DBG("MSILO:m_dump: Error while freeing result of" " query\n"); msg_list_set_flag(ml, mid, MS_MSG_ERRO); goto error; } DBG("MSILO:m_dump: msg [%d-%d] for: %.*s\n", i+1, mid, pto->uri.len, pto->uri.s); /** sending using TM function: t_uac */ body_str.len = 1024; rtime = (time_t)RES_ROWS(db_res)[i].values[5/*inc time*/].val.int_val; n = m_build_body(&body_str, rtime, str_vals[2/*body*/]); if(n<0) DBG("MSILO:m_dump: sending simple body\n"); else DBG("MSILO:m_dump: sending composed body\n"); tmb.t_request(&msg_type, /* Type of the message */ &pto->uri, /* Request-URI */ &str_vals[1], /* To */ &str_vals[0], /* From */ &hdr_str, /* Optional headers including CRLF */ (n<0)?&str_vals[2]:&body_str, /* Message body */ m_tm_callback, /* Callback function */ (void*)(long)mid /* Callback parameter */ ); }done: /** * Free the result because we don't need it * anymore */ if (db_res!=NULL && msilo_dbf.free_result(db_con, db_res) < 0) DBG("MSILO:m_dump: Error while freeing result of query\n"); return 1;error: return -1;}/** * - cleaning up the messages that got reply * - delete expired messages from database */void m_clean_silo(unsigned int ticks, void *param){ msg_list_el mle = NULL, p; db_key_t db_keys[MAX_DEL_KEYS]; db_val_t db_vals[MAX_DEL_KEYS]; db_op_t db_ops[1] = { OP_LEQ }; int n; DBG("MSILO:clean_silo: cleaning stored messages - %d\n", ticks); msg_list_check(ml); mle = p = msg_list_reset(ml); n = 0; while(p) { if(p->flag & MS_MSG_DONE) { db_keys[n] = sc_mid; db_vals[n].type = DB_INT; db_vals[n].nul = 0; db_vals[n].val.int_val = p->msgid; DBG("MSILO:clean_silo: cleaning sent message [%d]\n", p->msgid); n++; if(n==MAX_DEL_KEYS) { if (msilo_dbf.delete(db_con, db_keys, NULL, db_vals, n) < 0) DBG("MSILO:clean_silo: error cleaning %d messages.\n",n); n = 0; } } p = p->next; } if(n>0) { if (msilo_dbf.delete(db_con, db_keys, NULL, db_vals, n) < 0) DBG("MSILO:clean_silo: error cleaning %d messages\n", n); n = 0; } msg_list_el_free_all(mle); /* cleaning expired messages */ if(ticks%(ms_check_time*ms_clean_period)<ms_check_time) { DBG("MSILO:clean_silo: cleaning expired messages\n"); db_keys[0] = sc_exp_time; db_vals[0].type = DB_INT; db_vals[0].nul = 0; db_vals[0].val.int_val = (int)time(NULL); if (msilo_dbf.delete(db_con, db_keys, db_ops, db_vals, 1) < 0) DBG("MSILO:clean_silo: ERROR cleaning expired messages\n"); }}/** * destroy function */void destroy(void){ DBG("MSILO: destroy module ...\n"); msg_list_free(ml); if(db_con && msilo_dbf.close) msilo_dbf.close(db_con);}/** * TM callback function - delete message from database if was sent OK */void m_tm_callback( struct cell *t, int type, struct tmcb_params *ps){ DBG("MSILO:m_tm_callback: completed with status %d\n", ps->code); if(!ps->param) { DBG("MSILO m_tm_callback: message id not received\n"); goto done; } if(!db_con) { DBG("MSILO:m_tm_callback: db_con is NULL\n"); goto done; } if(ps->code < 200 || ps->code >= 300) { DBG("MSILO:m_tm_callback: message <%ld> was not sent successfully\n", (long)ps->param); msg_list_set_flag(ml, (int)(long)ps->param, MS_MSG_ERRO); goto done; } msg_list_set_flag(ml, (int)(long)ps->param, MS_MSG_DONE); done: return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -