int acc_log_request( struct sip_msg *rq) { static char log_msg[MAX_SYSLOG_SIZE]; static char *log_msg_end=log_msg+MAX_SYSLOG_SIZE-2; char *p; int n; int m; int i; /* get default values */ m = core2strar( rq, val_arr, int_arr, type_arr); /* get extra values */ m += extra2strar( log_extra, rq, val_arr+m, int_arr+m, type_arr+m); for ( i=0,p=log_msg ; i<m ; i++ ) { if (p+1+log_attrs[i].len+1+val_arr[i].len >= log_msg_end) { LM_WARN("acc message too long, truncating..\n"); p = log_msg_end; break; } *(p++) = A_SEPARATOR_CHR; memcpy(p, log_attrs[i].s, log_attrs[i].len); p += log_attrs[i].len; *(p++) = A_EQ_CHR; memcpy(p, val_arr[i].s, val_arr[i].len); p += val_arr[i].len; } /* get per leg attributes */ if ( leg_info ) { n = legs2strar(leg_info,rq,val_arr+m,int_arr+m,type_arr+m, 1); do { for (i=m; i<m+n; i++) { if (p+1+log_attrs[i].len+1+val_arr[i].len >= log_msg_end) { LM_WARN("acc message too long, truncating..\n"); p = log_msg_end; break; } *(p++) = A_SEPARATOR_CHR; memcpy(p, log_attrs[i].s, log_attrs[i].len); p += log_attrs[i].len; *(p++) = A_EQ_CHR; memcpy(p, val_arr[i].s, val_arr[i].len); p += val_arr[i].len; } }while (p!=log_msg_end && (n=legs2strar(leg_info,rq,val_arr+m, int_arr+m,type_arr+m, 0))!=0); } /* terminating line */ *(p++) = '\n'; *(p++) = 0; LM_GEN2(log_facility, log_level, "%.*stimestamp=%lu%s", acc_env.text.len, acc_env.text.s,(unsigned long) acc_env.ts, log_msg); return 1; }
/* collect all crd data and write it to a syslog */ static int log_write_cdr( struct dlg_cell* dialog, struct sip_msg* message) { static char cdr_message[ MAX_SYSLOG_SIZE]; static char* const cdr_message_end = cdr_message + MAX_SYSLOG_SIZE - 2;// -2 because of the string ending '\n\0' char* message_position = NULL; int message_index = 0; int counter = 0; if(cdr_log_enable==0) return 0; /* get default values */ message_index = cdr_core2strar( dialog, cdr_value_array, cdr_int_array, cdr_type_array); /* get extra values */ message_index += extra2strar( cdr_extra, message, cdr_value_array + message_index, cdr_int_array + message_index, cdr_type_array + message_index); for( counter = 0, message_position = cdr_message; counter < message_index ; counter++ ) { const char* const next_message_end = message_position + 2 + // ', ' -> two letters cdr_attrs[ counter].len + 1 + // '=' -> one letter cdr_value_array[ counter].len; if( next_message_end >= cdr_message_end || next_message_end < message_position) { LM_WARN("cdr message too long, truncating..\n"); message_position = cdr_message_end; break; } if( counter > 0) { *(message_position++) = A_SEPARATOR_CHR; *(message_position++) = A_SEPARATOR_CHR_2; } memcpy( message_position, cdr_attrs[ counter].s, cdr_attrs[ counter].len); message_position += cdr_attrs[ counter].len; *( message_position++) = A_EQ_CHR; memcpy( message_position, cdr_value_array[ counter].s, cdr_value_array[ counter].len); message_position += cdr_value_array[ counter].len; } /* terminating line */ *(message_position++) = '\n'; *(message_position++) = '\0'; LM_GEN2( cdr_facility, log_level, "%s", cdr_message); return 0; }
/* collect all crd data and write it to a syslog */ static int log_write_cdr( struct dlg_cell* dialog, struct sip_msg* message) { static char cdr_message[ MAX_SYSLOG_SIZE]; static char* const cdr_message_end = cdr_message + MAX_SYSLOG_SIZE - 2;// -2 because of the string ending '\n\0' char* message_position = NULL; int message_index = 0; int extra_index = 0; int counter = 0; if(cdr_log_enable==0) return 0; /* get default values */ message_index = cdr_core2strar( dialog, cdr_value_array, cdr_int_array, cdr_type_array); /* get extra values */ if (message) { extra_index += extra2strar( cdr_extra, message, cdr_value_array + message_index, cdr_int_array + message_index, cdr_type_array + message_index); } else if (cdr_expired_dlg_enable){ LM_DBG("fallback to dlg_only search because of message does not exist.\n"); message_index += extra2strar_dlg_only( cdr_extra, dialog, cdr_value_array + message_index, cdr_int_array + message_index, cdr_type_array + message_index, &dlgb); } message_index += extra_index; for( counter = 0, message_position = cdr_message; counter < message_index ; counter++ ) { const char* const next_message_end = message_position + 2 + // ', ' -> two letters cdr_attrs[ counter].len + 1 + // '=' -> one letter cdr_value_array[ counter].len; if( next_message_end >= cdr_message_end || next_message_end < message_position) { LM_WARN("cdr message too long, truncating..\n"); message_position = cdr_message_end; break; } if( counter > 0) { *(message_position++) = A_SEPARATOR_CHR; *(message_position++) = A_SEPARATOR_CHR_2; } memcpy( message_position, cdr_attrs[ counter].s, cdr_attrs[ counter].len); message_position += cdr_attrs[ counter].len; *( message_position++) = A_EQ_CHR; memcpy( message_position, cdr_value_array[ counter].s, cdr_value_array[ counter].len); message_position += cdr_value_array[ counter].len; } /* terminating line */ *(message_position++) = '\n'; *(message_position++) = '\0'; LM_GEN2( cdr_facility, log_level, "%s", cdr_message); /* free memory allocated by extra2strar, nothing is done in case no extra strings were found by extra2strar */ free_strar_mem( &(cdr_type_array[message_index-extra_index]), &(cdr_value_array[message_index-extra_index]), extra_index, message_index); return 0; }
int acc_log_request( struct sip_msg *rq) { static char log_msg[MAX_SYSLOG_SIZE]; static char *log_msg_end=log_msg+MAX_SYSLOG_SIZE-2; char *p; int n; int m; int i; struct tm *t; /* get default values */ m = core2strar( rq, val_arr, int_arr, type_arr); /* get extra values */ m += extra2strar( log_extra, rq, val_arr+m, int_arr+m, type_arr+m); for ( i=0,p=log_msg ; i<m ; i++ ) { if (p+1+log_attrs[i].len+1+val_arr[i].len >= log_msg_end) { LM_WARN("acc message too long, truncating..\n"); p = log_msg_end; break; } *(p++) = A_SEPARATOR_CHR; memcpy(p, log_attrs[i].s, log_attrs[i].len); p += log_attrs[i].len; *(p++) = A_EQ_CHR; if (val_arr[i].s != NULL) { memcpy(p, val_arr[i].s, val_arr[i].len); p += val_arr[i].len; } } /* get per leg attributes */ if ( leg_info ) { n = legs2strar(leg_info,rq,val_arr+m,int_arr+m,type_arr+m, 1); do { for (i=m; i<m+n; i++) { if (p+1+log_attrs[i].len+1+val_arr[i].len >= log_msg_end) { LM_WARN("acc message too long, truncating..\n"); p = log_msg_end; break; } *(p++) = A_SEPARATOR_CHR; memcpy(p, log_attrs[i].s, log_attrs[i].len); p += log_attrs[i].len; *(p++) = A_EQ_CHR; if (val_arr[i].s != NULL) { memcpy(p, val_arr[i].s, val_arr[i].len); p += val_arr[i].len; } } } while (p!=log_msg_end && (n=legs2strar(leg_info,rq,val_arr+m, int_arr+m,type_arr+m, 0))!=0); } /* terminating line */ *(p++) = '\n'; *(p++) = 0; if(acc_time_mode==1) { LM_GEN2(log_facility, log_level, "%.*stimestamp=%lu;%s=%u%s", acc_env.text.len, acc_env.text.s,(unsigned long)acc_env.ts, acc_time_exten.s, (unsigned int)acc_env.tv.tv_usec, log_msg); } else if(acc_time_mode==2) { LM_GEN2(log_facility, log_level, "%.*stimestamp=%lu;%s=%.3f%s", acc_env.text.len, acc_env.text.s,(unsigned long)acc_env.ts, acc_time_attr.s, (((double)(acc_env.tv.tv_sec * 1000) + (acc_env.tv.tv_usec / 1000)) / 1000), log_msg); } else if(acc_time_mode==3 || acc_time_mode==4) { if(acc_time_mode==3) { t = localtime(&acc_env.ts); } else { t = gmtime(&acc_env.ts); } if(strftime(acc_time_format_buf, ACC_TIME_FORMAT_SIZE, acc_time_format, t)<=0) { acc_time_format_buf[0] = '\0'; } LM_GEN2(log_facility, log_level, "%.*stimestamp=%lu;%s=%s%s", acc_env.text.len, acc_env.text.s,(unsigned long)acc_env.ts, acc_time_attr.s, acc_time_format_buf, log_msg); } else { LM_GEN2(log_facility, log_level, "%.*stimestamp=%lu%s", acc_env.text.len, acc_env.text.s,(unsigned long)acc_env.ts, log_msg); } return 1; }
int acc_log_cdrs(struct dlg_cell *dlg, struct sip_msg *msg) { static char log_msg[MAX_SYSLOG_SIZE]; static char *log_msg_end=log_msg+MAX_SYSLOG_SIZE-2; char *p; int nr_vals, i, j, ret, res = -1; time_t created, start_time; str core_s, leg_s, extra_s; short nr_legs; core_s.s = extra_s.s = leg_s.s = 0; ret = prebuild_core_arr(dlg, &core_s, &start_time); if (ret < 0) { LM_ERR("cannot copy core arguments\n"); goto end; } ret = prebuild_extra_arr(dlg, msg, &extra_s, &log_extra_str, log_extra_bye, ret); if (ret < 0) { LM_ERR("cannot copy extra arguments\n"); goto end; } /* here starts the extra leg */ nr_vals = prebuild_leg_arr(dlg, &leg_s, &nr_legs); if (nr_vals < 0) { LM_ERR("cannot compute leg values\n"); goto end; } if (!(created = acc_get_created(dlg))) { LM_ERR("cannot get created\n"); goto end; } for ( i = 0,p = log_msg ; i<ret ; i++ ) { if (p + 1 + log_attrs[i].len + 1 + val_arr[i].len >= log_msg_end) { LM_WARN("acc message too long, truncating..\n"); p = log_msg_end; break; } *(p++) = A_SEPARATOR_CHR; memcpy(p, log_attrs[i].s, log_attrs[i].len); p += log_attrs[i].len; *(p++) = A_EQ_CHR; memcpy(p, val_arr[i].s, val_arr[i].len); p += val_arr[i].len; } LM_DBG("core+extra = %d - nr_legs = %d - nr_vals = %d\n", ret, nr_legs, nr_vals); if ( leg_info ) { leg_s.len = 4; for (j=0; j<nr_legs; j++) { complete_dlg_values(&leg_s,val_arr+ret,nr_vals); for (i=ret; i<ret+nr_vals; i++) { if (p+1+log_attrs[i].len+1+val_arr[i].len >= log_msg_end) { LM_WARN("acc message too long, truncating..\n"); p = log_msg_end; break; } *(p++) = A_SEPARATOR_CHR; memcpy(p, log_attrs[i].s, log_attrs[i].len); p += log_attrs[i].len; *(p++) = A_EQ_CHR; memcpy(p, val_arr[i].s, val_arr[i].len); p += val_arr[i].len; } } } /* terminating line */ *(p++) = '\n'; *(p++) = 0; LM_GEN2(acc_log_facility, log_level, "%.*screated=%lu;call_start_time=%lu;duration=%lu;setuptime=%lu%s", acc_env.text.len, acc_env.text.s,(unsigned long)created, (unsigned long)start_time, (unsigned long)(time(NULL)-start_time), (unsigned long)(start_time - created), log_msg); res = 1; end: if (core_s.s) pkg_free(core_s.s); if (extra_s.s) pkg_free(extra_s.s); if (leg_s.s) pkg_free(leg_s.s); return res; }