int msg_parse_payload(sip_msg_t *msg, const char *payload) { char *body = strdup(payload); char * pch; char value[256]; char rest[256]; int irest; // Sanity check if (!msg || !payload) return 1; for (pch = strtok(body, "\n"); pch; pch = strtok(NULL, "\n")) { // fix last ngrep line character if (pch[strlen(pch) - 1] == '.') pch[strlen(pch) - 1] = '\0'; // Copy the payload line by line (easier to process by the UI) msg->payload[msg->plines++] = strdup(pch); if (!strlen(pch)) continue; if (sscanf(pch, "X-Call-ID: %[^@\t\n\r]", value) == 1) { msg_set_attribute(msg, SIP_ATTR_XCALLID, value); continue; } if (sscanf(pch, "X-CID: %[^@\t\n\r]", value) == 1) { msg_set_attribute(msg, SIP_ATTR_XCALLID, value); continue; } if (sscanf(pch, "SIP/2.0 %[^\t\n\r]", value)) { if (!msg_get_attribute(msg, SIP_ATTR_METHOD)) { msg_set_attribute(msg, SIP_ATTR_METHOD, value); } continue; } if (sscanf(pch, "CSeq: %d %[^\t\n\r]", &irest, value)) { if (!msg_get_attribute(msg, SIP_ATTR_METHOD)) { // ACK Messages are not considered requests if (strcasecmp(value, "ACK")) msg_set_attribute(msg, SIP_ATTR_REQUEST, "1"); msg_set_attribute(msg, SIP_ATTR_METHOD, value); } continue; } if (sscanf(pch, "From: %[^:]:%[^\t\n\r>;]", rest, value)) { msg_set_attribute(msg, SIP_ATTR_SIPFROM, value); continue; } if (sscanf(pch, "To: %[^:]:%[^\t\n\r>;]", rest, value)) { msg_set_attribute(msg, SIP_ATTR_SIPTO, value); continue; } if (!strncasecmp(pch, "Content-Type: application/sdp", 29)) { sprintf(value, "%s (SDP)", msg_get_attribute(msg, SIP_ATTR_METHOD)); msg_set_attribute(msg, SIP_ATTR_METHOD, value); continue; } } free(body); return 0; }
int save_raw_to_file(PANEL *panel) { char field_value[48]; FILE *f; sip_msg_t *msg = NULL; // Get panel information save_raw_info_t *info = (save_raw_info_t*) panel_userptr(panel); // Get current field value. // We trim spaces with sscanf because and empty field is stored as // space characters memset(field_value, 0, sizeof(field_value)); sscanf(field_buffer(info->fields[FLD_SAVE_RAW_FILE], 0), "%[^ ]", field_value); if (!(f = fopen(field_value, "w"))) { save_raw_error_message(panel, "Unable to open save file for writing"); return 0; } // Print the call group messages into the pad while ((msg = call_group_get_next_msg(info->group, msg))) { fprintf(f, "%s %s %s -> %s\n%s\n\n", msg_get_attribute(msg, SIP_ATTR_DATE), msg_get_attribute(msg, SIP_ATTR_TIME), msg_get_attribute(msg, SIP_ATTR_SRC), msg_get_attribute(msg, SIP_ATTR_DST), msg->payload); } fclose(f); return 27; }
void save_msg_txt(FILE *f, sip_msg_t *msg) { char date[20], time[20], src[80], dst[80]; fprintf(f, "%s %s %s -> %s\n%s\n\n", msg_get_attribute(msg, SIP_ATTR_DATE, date), msg_get_attribute(msg, SIP_ATTR_TIME, time), msg_get_attribute(msg, SIP_ATTR_SRC, src), msg_get_attribute(msg, SIP_ATTR_DST, dst), msg_get_payload(msg)); }
const char * call_get_attribute(sip_call_t *call, enum sip_attr_id id) { char value[80]; if (id == SIP_ATTR_MSGCNT) { // FIXME REALLY sprintf(value, "%d", call_msg_count(call)); return strdup(value); } if (id == SIP_ATTR_STARTING) { return msg_get_attribute(call_get_next_msg(call, NULL), SIP_ATTR_METHOD); } return msg_get_attribute(call_get_next_msg(call, NULL), id); }
char * sip_get_msg_header(sip_msg_t *msg, char *out) { char from_addr[80], to_addr[80], time[80], date[80]; // Source and Destination address msg_get_attribute(msg, SIP_ATTR_DATE, date); msg_get_attribute(msg, SIP_ATTR_TIME, time); msg_get_attribute(msg, SIP_ATTR_SRC, from_addr); msg_get_attribute(msg, SIP_ATTR_DST, to_addr); // Get msg header sprintf(out, "%s %s %s -> %s", date, time, from_addr, to_addr); return out; }
const char * call_get_attribute(sip_call_t *call, enum sip_attr_id id, char *value) { sip_msg_t *first, *last; if (!call) return NULL; switch (id) { case SIP_ATTR_CALLINDEX: sprintf(value, "%d", call->index); break; case SIP_ATTR_CALLID: sprintf(value, "%s", call->callid); break; case SIP_ATTR_XCALLID: sprintf(value, "%s", call->xcallid); break; case SIP_ATTR_MSGCNT: sprintf(value, "%d", vector_count(call->msgs)); break; case SIP_ATTR_CALLSTATE: sprintf(value, "%s", call_state_to_str(call->state)); break; case SIP_ATTR_TRANSPORT: first = vector_first(call->msgs); sprintf(value, "%s", sip_transport_str(first->packet->type)); break; case SIP_ATTR_CONVDUR: timeval_to_duration(msg_get_time(call->cstart_msg), msg_get_time(call->cend_msg), value); break; case SIP_ATTR_TOTALDUR: first = vector_first(call->msgs); last = vector_last(call->msgs); timeval_to_duration(msg_get_time(first), msg_get_time(last), value); break; default: return msg_get_attribute(vector_first(call->msgs), id, value); break; } return strlen(value) ? value : NULL; }
const char * call_get_attribute(sip_call_t *call, enum sip_attr_id id) { if (!call) return NULL; switch (id) { case SIP_ATTR_CALLINDEX: case SIP_ATTR_CALLID: case SIP_ATTR_MSGCNT: case SIP_ATTR_CALLSTATE: case SIP_ATTR_CONVDUR: case SIP_ATTR_TOTALDUR: return sip_attr_get_value(call->attrs, id); default: return msg_get_attribute(vector_first(call->msgs), id); } return NULL; }