Beispiel #1
0
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;
}
Beispiel #2
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;
}
Beispiel #3
0
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));
}
Beispiel #4
0
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);
}
Beispiel #5
0
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;
}
Beispiel #6
0
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;
}
Beispiel #7
0
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;
}