diff --git a/src/datamodel_interface.c b/src/datamodel_interface.c index 8b42bb5..8c091d2 100755 --- a/src/datamodel_interface.c +++ b/src/datamodel_interface.c @@ -20,6 +20,7 @@ struct list_params_result { struct list_head *parameters_list; struct list_head *alias_list; int error; + char *err_param; const char *error_msg; }; @@ -177,6 +178,10 @@ static void ubus_get_parameter_callback(struct ubus_request *req, int type __att if (tb[3]) { result->error = blobmsg_get_u32(tb[3]); + if (tb[0]) { + result->err_param = strdup(blobmsg_get_string(tb[0])); + } + return; } @@ -362,7 +367,8 @@ int instantiate_param_name(const char *param, char **inst_path) struct blob_buf b = {0}; struct list_params_result get_result = { .parameters_list = ¶ms_list, - .error = FAULT_CPE_NO_FAULT + .error = FAULT_CPE_NO_FAULT, + .err_param = NULL }; CWMP_MEMSET(&b, 0, sizeof(struct blob_buf)); @@ -381,6 +387,7 @@ int instantiate_param_name(const char *param, char **inst_path) if (get_result.error) { cwmp_free_all_dm_parameter_list(¶ms_list); + FREE(get_result.err_param); break; } @@ -431,7 +438,8 @@ char *cwmp_get_parameter_values(const char *parameter_name, struct list_head *pa struct list_params_result get_result = { .parameters_list = parameters_list, .alias_list = &alias_list, - .error = FAULT_CPE_NO_FAULT + .error = FAULT_CPE_NO_FAULT, + .err_param = NULL }; unsigned int len = CWMP_STRLEN(parameter_name); @@ -464,6 +472,12 @@ char *cwmp_get_parameter_values(const char *parameter_name, struct list_head *pa CWMP_LOG(WARNING, "Get parameter values (%s) failed: fault_code: %d", param, get_result.error); + if (get_result.err_param && cwmp_ctx.session != NULL) { + snprintf(cwmp_ctx.session->fault_msg, sizeof(cwmp_ctx.session->fault_msg), + "GetParameterValues failed for %s", get_result.err_param); + } + + FREE(get_result.err_param); FREE(inst_path); cwmp_free_all_dm_parameter_list(&alias_list); snprintf(buf, sizeof(buf), "%d", get_result.error); @@ -487,7 +501,8 @@ char *cwmp_get_parameter_names(const char *parameter_name, bool next_level, stru .parameters_list = parameters_list, .alias_list = &alias_list, .error = FAULT_CPE_NO_FAULT, - .error_msg = 0 + .error_msg = NULL, + .err_param = NULL }; unsigned int len = CWMP_STRLEN(parameter_name); @@ -524,11 +539,11 @@ char *cwmp_get_parameter_names(const char *parameter_name, bool next_level, stru CWMP_LOG(WARNING, "Get parameter Names (%s) failed: fault_code: %d", object, get_result.error); + FREE(get_result.err_param); FREE(inst_path); cwmp_free_all_dm_alias_list(&alias_list); snprintf(buf, sizeof(buf), "%d", get_result.error); - if (err_msg) *err_msg = get_result.error_msg; return icwmp_strdup(buf); } @@ -546,7 +561,8 @@ char *cwmp_validate_multi_instance_path(const char *object, struct list_head *pa .parameters_list = parameters_list, .alias_list = NULL, .error = FAULT_CPE_NO_FAULT, - .error_msg = 0 + .error_msg = NULL, + .err_param = NULL }; CWMP_MEMSET(&b, 0, sizeof(struct blob_buf)); @@ -571,6 +587,7 @@ char *cwmp_validate_multi_instance_path(const char *object, struct list_head *pa char buf[8] = {0}; snprintf(buf, sizeof(buf), "%d", get_result.error); CWMP_LOG(WARNING, "Get parameter Names (%s) failed: fault_code: %d", object, get_result.error); + FREE(get_result.err_param); return icwmp_strdup(buf); } @@ -583,7 +600,8 @@ char *cwmp_validate_parameter_name(const char *param_name, bool next_level, stru struct list_params_result get_result = { .parameters_list = param_list, .alias_list = NULL, - .error = FAULT_CPE_NO_FAULT + .error = FAULT_CPE_NO_FAULT, + .err_param = NULL }; unsigned int len = CWMP_STRLEN(param_name); @@ -615,6 +633,7 @@ char *cwmp_validate_parameter_name(const char *param_name, bool next_level, stru if (get_result.error) { char err[8] = {0}; + FREE(get_result.err_param); snprintf(err, sizeof(err), "%d", get_result.error); return icwmp_strdup(err); } @@ -792,7 +811,7 @@ bool cwmp_add_object(const char *object_name, struct object_result *res) len = CWMP_STRLEN(object_name); if (!len) { res->fault_code = FAULT_9005; - snprintf(res->fault_msg, sizeof(res->fault_msg), "Invalid Object Name"); + snprintf(res->fault_msg, sizeof(res->fault_msg), "Object name should not be empty"); return false; } @@ -810,7 +829,7 @@ bool cwmp_add_object(const char *object_name, struct object_result *res) char *tmp = strrchr(ob_path, '['); if (!tmp) { res->fault_code = FAULT_9005; - snprintf(res->fault_msg, sizeof(res->fault_msg), "Invalid Object Name"); + snprintf(res->fault_msg, sizeof(res->fault_msg), "Invalid Object Name %s", object_name); return false; } @@ -821,13 +840,13 @@ bool cwmp_add_object(const char *object_name, struct object_result *res) if (CWMP_OK != instantiate_param_name(ob_path, &inst_path)) { res->fault_code = FAULT_9005; - snprintf(res->fault_msg, sizeof(res->fault_msg), "Invalid Object Name"); + snprintf(res->fault_msg, sizeof(res->fault_msg), "Invalid Object Name %s", object_name); return false; } if (CWMP_STRLEN(inst_path) == 0) { res->fault_code = FAULT_9005; - snprintf(res->fault_msg, sizeof(res->fault_msg), "Invalid Object Name"); + snprintf(res->fault_msg, sizeof(res->fault_msg), "Invalid Object Name %s", object_name); return false; } @@ -883,19 +902,19 @@ bool cwmp_delete_object(const char *object_name, struct object_result *res) len = CWMP_STRLEN(object_name); if (!len) { res->fault_code = FAULT_9005; - snprintf(res->fault_msg, sizeof(res->fault_msg), "Invalid Object Name"); + snprintf(res->fault_msg, sizeof(res->fault_msg), "Object name should not be empty"); return false; } if (CWMP_OK != instantiate_param_name(object_name, &inst_path)) { res->fault_code = FAULT_9005; - snprintf(res->fault_msg, sizeof(res->fault_msg), "Invalid Object Name"); + snprintf(res->fault_msg, sizeof(res->fault_msg), "Invalid Object Name %s", object_name); return false; } if (CWMP_STRLEN(inst_path) == 0) { res->fault_code = FAULT_9005; - snprintf(res->fault_msg, sizeof(res->fault_msg), "Invalid Object Name"); + snprintf(res->fault_msg, sizeof(res->fault_msg), "Invalid Object Name %s", object_name); return false; } diff --git a/src/datamodel_interface.h b/src/datamodel_interface.h index c25d2dc..01192b2 100644 --- a/src/datamodel_interface.h +++ b/src/datamodel_interface.h @@ -14,6 +14,7 @@ #define SRC_DATAMODELIFACE_H_ #include "common.h" +#include "session.h" struct object_result { char *instance; diff --git a/src/rpc.c b/src/rpc.c index 7f5d91b..c1854df 100755 --- a/src/rpc.c +++ b/src/rpc.c @@ -2384,7 +2384,8 @@ int cwmp_create_fault_message(struct rpc *rpc_cpe, int fault_code, const char *f CWMP_LOG(INFO, "Fault detected"); cwmp_ctx.session->fault_code = fault_code; - snprintf(cwmp_ctx.session->fault_msg, sizeof(cwmp_ctx.session->fault_msg), "%s", fault_msg ? fault_msg : ""); + if (CWMP_STRLEN(cwmp_ctx.session->fault_msg) == 0) + snprintf(cwmp_ctx.session->fault_msg, sizeof(cwmp_ctx.session->fault_msg), "%s", fault_msg ? fault_msg : ""); MXML_DELETE(cwmp_ctx.session->tree_out);