mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-20 16:50:14 +00:00
Merge "res_pjsip.c: Fix ident_to_str() and refactor ident_handler()." into 13
This commit is contained in:
@@ -574,12 +574,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);
|
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)
|
static int ident_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
|
||||||
{
|
{
|
||||||
struct ast_sip_endpoint *endpoint = obj;
|
struct ast_sip_endpoint *endpoint = obj;
|
||||||
char *idents = ast_strdupa(var->value);
|
char *idents = ast_strdupa(var->value);
|
||||||
char *val;
|
char *val;
|
||||||
enum ast_sip_endpoint_identifier_type method;
|
int method;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If there's already something in the vector when we get here,
|
* If there's already something in the vector when we get here,
|
||||||
@@ -595,13 +646,8 @@ static int ident_handler(const struct aco_option *opt, struct ast_variable *var,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!strcasecmp(val, "username")) {
|
method = sip_endpoint_identifier_str2type(val);
|
||||||
method = AST_SIP_ENDPOINT_IDENTIFY_BY_USERNAME;
|
if (method == -1) {
|
||||||
} 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 {
|
|
||||||
ast_log(LOG_ERROR, "Unrecognized identification method %s specified for endpoint %s\n",
|
ast_log(LOG_ERROR, "Unrecognized identification method %s specified for endpoint %s\n",
|
||||||
val, ast_sorcery_object_get_id(endpoint));
|
val, ast_sorcery_object_get_id(endpoint));
|
||||||
AST_VECTOR_RESET(&endpoint->ident_method_order, AST_VECTOR_ELEM_CLEANUP_NOOP);
|
AST_VECTOR_RESET(&endpoint->ident_method_order, AST_VECTOR_ELEM_CLEANUP_NOOP);
|
||||||
@@ -624,34 +670,41 @@ static int ident_to_str(const void *obj, const intptr_t *args, char **buf)
|
|||||||
{
|
{
|
||||||
const struct ast_sip_endpoint *endpoint = obj;
|
const struct ast_sip_endpoint *endpoint = obj;
|
||||||
int methods;
|
int methods;
|
||||||
char *method;
|
int idx;
|
||||||
int i;
|
int buf_used = 0;
|
||||||
int j = 0;
|
int buf_size = MAX_OBJECT_FIELD;
|
||||||
|
|
||||||
methods = AST_VECTOR_SIZE(&endpoint->ident_method_order);
|
methods = AST_VECTOR_SIZE(&endpoint->ident_method_order);
|
||||||
if (!methods) {
|
if (!methods) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(*buf = ast_calloc(MAX_OBJECT_FIELD, sizeof(char)))) {
|
*buf = ast_malloc(buf_size);
|
||||||
|
if (!*buf) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < methods; i++) {
|
for (idx = 0; idx < methods; ++idx) {
|
||||||
switch (AST_VECTOR_GET(&endpoint->ident_method_order, i)) {
|
enum ast_sip_endpoint_identifier_type method;
|
||||||
case AST_SIP_ENDPOINT_IDENTIFY_BY_USERNAME :
|
const char *method_str;
|
||||||
method = "username";
|
|
||||||
break;
|
method = AST_VECTOR_GET(&endpoint->ident_method_order, idx);
|
||||||
case AST_SIP_ENDPOINT_IDENTIFY_BY_AUTH_USERNAME :
|
method_str = sip_endpoint_identifier_type2str(method);
|
||||||
method = "auth_username";
|
|
||||||
break;
|
/* Should never have an "<unknown>" method string */
|
||||||
case AST_SIP_ENDPOINT_IDENTIFY_BY_IP :
|
ast_assert(strcmp(method_str, "<unknown>"));
|
||||||
method = "ip";
|
if (!strcmp(method_str, "<unknown>")) {
|
||||||
break;
|
|
||||||
default:
|
|
||||||
continue;
|
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;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user