diff options
author | George Joseph <george.joseph@fairview5.com> | 2015-11-30 21:19:18 -0700 |
---|---|---|
committer | George Joseph <george.joseph@fairview5.com> | 2015-12-02 19:32:26 -0700 |
commit | ed9134282e22c6985ce853f53d7569aa5b93ebe0 (patch) | |
tree | 63de5799220775edf7d9500316287735c7ca7fcf /res/res_pjsip/pjsip_options.c | |
parent | eadad24b595c3b6e5f0472f9936e7e37259308b5 (diff) |
res_pjsip: Update logging to show contact->uri in messages
An earlier commit changed the id of dynamic contacts to contain
a hash instead of the uri. This patch updates status change
logging to show the aor/uri instead of the id. This required
adding the aor id to contact and contact_status and adding
uri to contact_status. The aor id gets added to contact and
contact_status in their allocators and the uri gets added to
contact_status in pjsip_options when the contact_status is
created or updated.
ASTERISK-25598 #close
Reported-by: George Joseph
Tested-by: George Joseph
Change-Id: I56cbec1d2ddbe8461367dd8b6da8a6f47f6fe511
Diffstat (limited to 'res/res_pjsip/pjsip_options.c')
-rw-r--r-- | res/res_pjsip/pjsip_options.c | 74 |
1 files changed, 56 insertions, 18 deletions
diff --git a/res/res_pjsip/pjsip_options.c b/res/res_pjsip/pjsip_options.c index b1724896d..e0557871e 100644 --- a/res/res_pjsip/pjsip_options.c +++ b/res/res_pjsip/pjsip_options.c @@ -42,7 +42,6 @@ static const char *status_map [] = { [UNKNOWN] = "Unknown", [CREATED] = "Created", [REMOVED] = "Removed", - }; static const char *short_status_map [] = { @@ -65,18 +64,43 @@ const char *ast_sip_get_contact_short_status_label(const enum ast_sip_contact_st /*! * \internal + * \brief Destroy a ast_sip_contact_status object. + */ +static void contact_status_destroy(void * obj) +{ + struct ast_sip_contact_status *status = obj; + + ast_free(status->aor); + ast_free(status->uri); +} + +/*! + * \internal * \brief Create a ast_sip_contact_status object. */ static void *contact_status_alloc(const char *name) { - struct ast_sip_contact_status *status = ast_sorcery_generic_alloc(sizeof(*status), NULL); + struct ast_sip_contact_status *status = ast_sorcery_generic_alloc(sizeof(*status), contact_status_destroy); + char *id = ast_strdupa(name); + char *aor = id; + char *aor_separator = NULL; if (!status) { ast_log(LOG_ERROR, "Unable to allocate ast_sip_contact_status\n"); return NULL; } - status->status = UNKNOWN; + /* Dynamic contacts are delimited with ";@" and static ones with "@@" */ + if ((aor_separator = strstr(id, ";@")) || (aor_separator = strstr(id, "@@"))) { + *aor_separator = '\0'; + } + ast_assert(aor_separator != NULL); + + status->aor = ast_strdup(aor); + if (!status->aor) { + ao2_cleanup(status); + return NULL; + } return status; } @@ -98,12 +122,17 @@ struct ast_sip_contact_status *ast_res_pjsip_find_or_create_contact_status(const status = ast_sorcery_alloc(ast_sip_get_sorcery(), CONTACT_STATUS, ast_sorcery_object_get_id(contact)); if (!status) { - ast_log(LOG_ERROR, "Unable to create ast_sip_contact_status for contact %s\n", - contact->uri); + ast_log(LOG_ERROR, "Unable to create ast_sip_contact_status for contact %s/%s\n", + contact->aor, contact->uri); + return NULL; + } + + status->uri = ast_strdup(contact->uri); + if (!status->uri) { + ao2_cleanup(status); return NULL; } - status->status = UNKNOWN; status->rtt_start = ast_tv(0, 0); status->rtt = 0; @@ -127,8 +156,8 @@ struct ast_sip_contact_status *ast_res_pjsip_find_or_create_contact_status(const static void update_contact_status(const struct ast_sip_contact *contact, enum ast_sip_contact_status_type value) { - struct ast_sip_contact_status *status; - struct ast_sip_contact_status *update; + RAII_VAR(struct ast_sip_contact_status *, status, NULL, ao2_cleanup); + RAII_VAR(struct ast_sip_contact_status *, update, NULL, ao2_cleanup); status = ast_res_pjsip_find_or_create_contact_status(contact); if (!status) { @@ -145,6 +174,11 @@ static void update_contact_status(const struct ast_sip_contact *contact, return; } + update->uri = ast_strdup(contact->uri); + if (!update->uri) { + return; + } + update->last_status = status->status; update->status = value; if (update->last_status != update->status) { @@ -175,9 +209,6 @@ static void update_contact_status(const struct ast_sip_contact *contact, ast_log(LOG_ERROR, "Unable to update ast_sip_contact_status for contact %s\n", contact->uri); } - - ao2_ref(status, -1); - ao2_ref(update, -1); } /*! @@ -187,8 +218,8 @@ static void update_contact_status(const struct ast_sip_contact *contact, */ static void init_start_time(const struct ast_sip_contact *contact) { - struct ast_sip_contact_status *status; - struct ast_sip_contact_status *update; + RAII_VAR(struct ast_sip_contact_status *, status, NULL, ao2_cleanup); + RAII_VAR(struct ast_sip_contact_status *, update, NULL, ao2_cleanup); status = ast_res_pjsip_find_or_create_contact_status(contact); if (!status) { @@ -205,6 +236,11 @@ static void init_start_time(const struct ast_sip_contact *contact) return; } + update->uri = ast_strdup(contact->uri); + if (!update->uri) { + return; + } + update->status = status->status; update->last_status = status->last_status; update->rtt = status->rtt; @@ -214,9 +250,6 @@ static void init_start_time(const struct ast_sip_contact *contact) ast_log(LOG_ERROR, "Unable to update ast_sip_contact_status for contact %s\n", contact->uri); } - - ao2_ref(status, -1); - ao2_ref(update, -1); } /*! @@ -993,6 +1026,9 @@ static int rtt_start_to_str(const void *obj, const intptr_t *args, char **buf) return 0; } +static char status_value_unknown[2]; +static char status_value_created[2]; + int ast_sip_initialize_sorcery_qualify(void) { struct ast_sorcery *sorcery = ast_sip_get_sorcery(); @@ -1006,10 +1042,12 @@ int ast_sip_initialize_sorcery_qualify(void) return -1; } + snprintf(status_value_unknown, sizeof(status_value_unknown), "%u", UNKNOWN); ast_sorcery_object_field_register_nodoc(sorcery, CONTACT_STATUS, "last_status", - "0", OPT_UINT_T, 1, FLDSET(struct ast_sip_contact_status, last_status)); + status_value_unknown, OPT_UINT_T, 1, FLDSET(struct ast_sip_contact_status, last_status)); + snprintf(status_value_created, sizeof(status_value_created), "%u", CREATED); ast_sorcery_object_field_register_nodoc(sorcery, CONTACT_STATUS, "status", - "0", OPT_UINT_T, 1, FLDSET(struct ast_sip_contact_status, status)); + status_value_created, OPT_UINT_T, 1, FLDSET(struct ast_sip_contact_status, status)); ast_sorcery_object_field_register_custom_nodoc(sorcery, CONTACT_STATUS, "rtt_start", "0.0", rtt_start_handler, rtt_start_to_str, NULL, 0, 0); ast_sorcery_object_field_register_nodoc(sorcery, CONTACT_STATUS, "rtt", |