mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-04 11:58:52 +00:00
Merge "res_pjsip.c: Fix ident_to_str() and refactor ident_handler()."
This commit is contained in:
@@ -572,12 +572,63 @@ static int outbound_auths_to_str(const void *obj, const intptr_t *args, char **b
|
||||
return ast_sip_auths_to_str(&endpoint->outbound_auths, buf);
|
||||
}
|
||||
|
||||
/*!
|
||||
* \internal
|
||||
* \brief Convert identify_by method to string.
|
||||
*
|
||||
* \param method Method value to convert to string
|
||||
*
|
||||
* \return String representation.
|
||||
*/
|
||||
static const char *sip_endpoint_identifier_type2str(enum ast_sip_endpoint_identifier_type method)
|
||||
{
|
||||
const char *str = "<unknown>";
|
||||
|
||||
switch (method) {
|
||||
case AST_SIP_ENDPOINT_IDENTIFY_BY_USERNAME:
|
||||
str = "username";
|
||||
break;
|
||||
case AST_SIP_ENDPOINT_IDENTIFY_BY_AUTH_USERNAME:
|
||||
str = "auth_username";
|
||||
break;
|
||||
case AST_SIP_ENDPOINT_IDENTIFY_BY_IP:
|
||||
str = "ip";
|
||||
break;
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \internal
|
||||
* \brief Convert string to an endpoint identifier token.
|
||||
*
|
||||
* \param str String to convert
|
||||
*
|
||||
* \retval enum ast_sip_endpoint_identifier_type token value on success.
|
||||
* \retval -1 on failure.
|
||||
*/
|
||||
static int sip_endpoint_identifier_str2type(const char *str)
|
||||
{
|
||||
int method;
|
||||
|
||||
if (!strcasecmp(str, "username")) {
|
||||
method = AST_SIP_ENDPOINT_IDENTIFY_BY_USERNAME;
|
||||
} else if (!strcasecmp(str, "auth_username")) {
|
||||
method = AST_SIP_ENDPOINT_IDENTIFY_BY_AUTH_USERNAME;
|
||||
} else if (!strcasecmp(str, "ip")) {
|
||||
method = AST_SIP_ENDPOINT_IDENTIFY_BY_IP;
|
||||
} else {
|
||||
method = -1;
|
||||
}
|
||||
return method;
|
||||
}
|
||||
|
||||
static int ident_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
|
||||
{
|
||||
struct ast_sip_endpoint *endpoint = obj;
|
||||
char *idents = ast_strdupa(var->value);
|
||||
char *val;
|
||||
enum ast_sip_endpoint_identifier_type method;
|
||||
int method;
|
||||
|
||||
/*
|
||||
* If there's already something in the vector when we get here,
|
||||
@@ -593,13 +644,8 @@ static int ident_handler(const struct aco_option *opt, struct ast_variable *var,
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!strcasecmp(val, "username")) {
|
||||
method = AST_SIP_ENDPOINT_IDENTIFY_BY_USERNAME;
|
||||
} else if (!strcasecmp(val, "auth_username")) {
|
||||
method = AST_SIP_ENDPOINT_IDENTIFY_BY_AUTH_USERNAME;
|
||||
} else if (!strcasecmp(val, "ip")) {
|
||||
method = AST_SIP_ENDPOINT_IDENTIFY_BY_IP;
|
||||
} else {
|
||||
method = sip_endpoint_identifier_str2type(val);
|
||||
if (method == -1) {
|
||||
ast_log(LOG_ERROR, "Unrecognized identification method %s specified for endpoint %s\n",
|
||||
val, ast_sorcery_object_get_id(endpoint));
|
||||
AST_VECTOR_RESET(&endpoint->ident_method_order, AST_VECTOR_ELEM_CLEANUP_NOOP);
|
||||
@@ -622,34 +668,41 @@ static int ident_to_str(const void *obj, const intptr_t *args, char **buf)
|
||||
{
|
||||
const struct ast_sip_endpoint *endpoint = obj;
|
||||
int methods;
|
||||
char *method;
|
||||
int i;
|
||||
int j = 0;
|
||||
int idx;
|
||||
int buf_used = 0;
|
||||
int buf_size = MAX_OBJECT_FIELD;
|
||||
|
||||
methods = AST_VECTOR_SIZE(&endpoint->ident_method_order);
|
||||
if (!methods) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!(*buf = ast_calloc(MAX_OBJECT_FIELD, sizeof(char)))) {
|
||||
*buf = ast_malloc(buf_size);
|
||||
if (!*buf) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (i = 0; i < methods; i++) {
|
||||
switch (AST_VECTOR_GET(&endpoint->ident_method_order, i)) {
|
||||
case AST_SIP_ENDPOINT_IDENTIFY_BY_USERNAME :
|
||||
method = "username";
|
||||
break;
|
||||
case AST_SIP_ENDPOINT_IDENTIFY_BY_AUTH_USERNAME :
|
||||
method = "auth_username";
|
||||
break;
|
||||
case AST_SIP_ENDPOINT_IDENTIFY_BY_IP :
|
||||
method = "ip";
|
||||
break;
|
||||
default:
|
||||
for (idx = 0; idx < methods; ++idx) {
|
||||
enum ast_sip_endpoint_identifier_type method;
|
||||
const char *method_str;
|
||||
|
||||
method = AST_VECTOR_GET(&endpoint->ident_method_order, idx);
|
||||
method_str = sip_endpoint_identifier_type2str(method);
|
||||
|
||||
/* Should never have an "<unknown>" method string */
|
||||
ast_assert(strcmp(method_str, "<unknown>"));
|
||||
if (!strcmp(method_str, "<unknown>")) {
|
||||
continue;
|
||||
}
|
||||
j = sprintf(*buf + j, "%s%s", method, i < methods - 1 ? "," : "");
|
||||
|
||||
buf_used += snprintf(*buf + buf_used, buf_size - buf_used, "%s%s",
|
||||
method_str, idx < methods - 1 ? "," : "");
|
||||
if (buf_size <= buf_used) {
|
||||
/* Need more room than available, truncating. */
|
||||
*(*buf + (buf_size - 1)) = '\0';
|
||||
ast_log(LOG_WARNING, "Truncated identify_by string: %s\n", *buf);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user