Ticket refs #5366: icwmp: fix transaction issue in case there are multiple RPC calls in one session

This commit is contained in:
Omar Kallel 2021-06-07 15:39:51 +01:00
parent 78a6d48e1e
commit 32246cad8d
10 changed files with 265 additions and 199 deletions

View file

@ -788,7 +788,7 @@ void load_queue_event(mxml_node_t *tree, struct cwmp *cwmp)
int idx = -1, id = -1;
struct event_container *event_container_save = NULL;
struct backup_attributes bkp_attrs = {.index = &idx, .id = &id, .command_key = &command_key };
struct backup_attributes bkp_attrs = { .index = &idx, .id = &id, .command_key = &command_key };
load_specific_backup_attributes(tree, &bkp_attrs);
b = mxmlWalkNext(b, tree, MXML_DESCEND);
@ -827,7 +827,7 @@ void load_schedule_inform(mxml_node_t *tree)
struct schedule_inform *schedule_inform = NULL;
struct list_head *ilist = NULL;
struct backup_attributes bkp_attrs = {.command_key = &command_key, .time = &scheduled_time };
struct backup_attributes bkp_attrs = { .command_key = &command_key, .time = &scheduled_time };
load_specific_backup_attributes(tree, &bkp_attrs);
list_for_each (ilist, &(list_schedule_inform)) {
@ -852,13 +852,13 @@ void load_download(mxml_node_t *tree)
download_request = calloc(1, sizeof(struct download));
struct backup_attributes bkp_attrs = {.url = &download_request->url,
.command_key = &download_request->command_key,
.file_type = &download_request->file_type,
.username = &download_request->username,
.password = &download_request->password,
.file_size = &download_request->file_size,
.time = &download_request->scheduled_time };
struct backup_attributes bkp_attrs = { .url = &download_request->url,
.command_key = &download_request->command_key,
.file_type = &download_request->file_type,
.username = &download_request->username,
.password = &download_request->password,
.file_size = &download_request->file_size,
.time = &download_request->scheduled_time };
load_specific_backup_attributes(tree, &bkp_attrs);
list_for_each (ilist, &(list_download)) {
@ -943,7 +943,7 @@ void load_upload(mxml_node_t *tree)
upload_request = calloc(1, sizeof(struct upload));
struct backup_attributes bkp_attrs = {.url = &upload_request->url, .command_key = &upload_request->command_key, .file_type = &upload_request->file_type, .username = &upload_request->username, .password = &upload_request->password, .time = &upload_request->scheduled_time };
struct backup_attributes bkp_attrs = { .url = &upload_request->url, .command_key = &upload_request->command_key, .file_type = &upload_request->file_type, .username = &upload_request->username, .password = &upload_request->password, .time = &upload_request->scheduled_time };
load_specific_backup_attributes(tree, &bkp_attrs);
list_for_each (ilist, &(list_upload)) {
@ -966,7 +966,7 @@ void load_change_du_state(mxml_node_t *tree)
change_du_state_request = calloc(1, sizeof(struct change_du_state));
INIT_LIST_HEAD(&(change_du_state_request->list_operation));
struct backup_attributes bkp_attrs = {.command_key = &change_du_state_request->command_key, .time = &change_du_state_request->timeout };
struct backup_attributes bkp_attrs = { .command_key = &change_du_state_request->command_key, .time = &change_du_state_request->timeout };
load_specific_backup_attributes(tree, &bkp_attrs);
b = mxmlWalkNext(b, tree, MXML_DESCEND);
@ -977,20 +977,20 @@ void load_change_du_state(mxml_node_t *tree)
elem = (operations *)calloc(1, sizeof(operations));
elem->type = DU_UPDATE;
list_add_tail(&(elem->list), &(change_du_state_request->list_operation));
struct backup_attributes update_bkp_attrs = {.uuid = &elem->uuid, .version = &elem->version, .url = &elem->url, .username = &elem->username, .password = &elem->password };
struct backup_attributes update_bkp_attrs = { .uuid = &elem->uuid, .version = &elem->version, .url = &elem->url, .username = &elem->username, .password = &elem->password };
load_specific_backup_attributes(b, &update_bkp_attrs);
} else if (strcmp(b->value.element.name, "install") == 0) {
elem = (operations *)calloc(1, sizeof(operations));
elem->type = DU_INSTALL;
list_add_tail(&(elem->list), &(change_du_state_request->list_operation));
struct backup_attributes install_bkp_attrs = {.uuid = &elem->uuid, .executionenvref = &elem->executionenvref, .url = &elem->url, .username = &elem->username, .password = &elem->password };
struct backup_attributes install_bkp_attrs = { .uuid = &elem->uuid, .executionenvref = &elem->executionenvref, .url = &elem->url, .username = &elem->username, .password = &elem->password };
load_specific_backup_attributes(b, &install_bkp_attrs);
} else if (strcmp(b->value.element.name, "uninstall") == 0) {
elem = (operations *)calloc(1, sizeof(operations));
elem->type = DU_UNINSTALL;
list_add_tail(&(elem->list), &(change_du_state_request->list_operation));
struct backup_attributes uninstall_bkp_attrs = {.uuid = &elem->uuid, .version = &elem->version, .executionenvref = &elem->executionenvref };
struct backup_attributes uninstall_bkp_attrs = { .uuid = &elem->uuid, .version = &elem->version, .executionenvref = &elem->executionenvref };
load_specific_backup_attributes(b, &uninstall_bkp_attrs);
}
}
@ -1008,7 +1008,7 @@ void load_du_state_change_complete(mxml_node_t *tree, struct cwmp *cwmp)
du_state_change_complete_request = calloc(1, sizeof(struct du_state_change_complete));
INIT_LIST_HEAD(&(du_state_change_complete_request->list_opresult));
struct backup_attributes bkp_attrs = {.command_key = &du_state_change_complete_request->command_key, .time = &du_state_change_complete_request->timeout };
struct backup_attributes bkp_attrs = { .command_key = &du_state_change_complete_request->command_key, .time = &du_state_change_complete_request->timeout };
load_specific_backup_attributes(tree, &bkp_attrs);
b = mxmlWalkNext(b, tree, MXML_DESCEND);
@ -1019,15 +1019,15 @@ void load_du_state_change_complete(mxml_node_t *tree, struct cwmp *cwmp)
elem = (opresult *)calloc(1, sizeof(opresult));
list_add_tail(&(elem->list), &(du_state_change_complete_request->list_opresult));
struct backup_attributes opresult_bkp_attrs = {.uuid = &elem->uuid,
.version = &elem->version,
.du_ref = &elem->du_ref,
.current_state = &elem->current_state,
.resolved = &elem->resolved,
.start_time = &elem->start_time,
.complete_time = &elem->complete_time,
.fault = &elem->fault,
.execution_unit_ref = &elem->execution_unit_ref };
struct backup_attributes opresult_bkp_attrs = { .uuid = &elem->uuid,
.version = &elem->version,
.du_ref = &elem->du_ref,
.current_state = &elem->current_state,
.resolved = &elem->resolved,
.start_time = &elem->start_time,
.complete_time = &elem->complete_time,
.fault = &elem->fault,
.execution_unit_ref = &elem->execution_unit_ref };
load_specific_backup_attributes(b, &opresult_bkp_attrs);
}
}
@ -1042,12 +1042,12 @@ void load_transfer_complete(mxml_node_t *tree, struct cwmp *cwmp)
ptransfer_complete = calloc(1, sizeof(struct transfer_complete));
struct backup_attributes bkp_attrs = {.command_key = &ptransfer_complete->command_key,
.start_time = &ptransfer_complete->start_time,
.complete_time = &ptransfer_complete->complete_time,
.old_software_version = &ptransfer_complete->old_software_version,
.fault_code = &ptransfer_complete->fault_code,
.type = &ptransfer_complete->type };
struct backup_attributes bkp_attrs = { .command_key = &ptransfer_complete->command_key,
.start_time = &ptransfer_complete->start_time,
.complete_time = &ptransfer_complete->complete_time,
.old_software_version = &ptransfer_complete->old_software_version,
.fault_code = &ptransfer_complete->fault_code,
.type = &ptransfer_complete->type };
load_specific_backup_attributes(tree, &bkp_attrs);
cwmp_root_cause_transfer_complete(cwmp, ptransfer_complete);

101
common.c
View file

@ -29,7 +29,8 @@ char *commandKey = NULL;
long int flashsize = 256000000;
static unsigned long int next_rand_seed = 1;
struct cwmp cwmp_main = { 0 };
int nbre_services = 0;
char *list_services[MAX_NBRE_SERVICES] = { 0 };
LIST_HEAD(cwmp_memory_list);
struct cwmp_mem {
@ -39,34 +40,34 @@ struct cwmp_mem {
struct option cwmp_long_options[] = { { "boot-event", no_argument, NULL, 'b' }, { "get-rpc-methods", no_argument, NULL, 'g' }, { "command-input", no_argument, NULL, 'c' }, { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'v' }, { NULL, 0, NULL, 0 } };
struct FAULT_CPE FAULT_CPE_ARRAY[] = {[FAULT_CPE_METHOD_NOT_SUPPORTED] = { "9000", FAULT_9000, FAULT_CPE_TYPE_SERVER, "Method not supported" },
[FAULT_CPE_REQUEST_DENIED] = { "9001", FAULT_9001, FAULT_CPE_TYPE_SERVER, "Request denied (no reason specified)" },
[FAULT_CPE_INTERNAL_ERROR] = { "9002", FAULT_9002, FAULT_CPE_TYPE_SERVER, "Internal error" },
[FAULT_CPE_INVALID_ARGUMENTS] = { "9003", FAULT_9003, FAULT_CPE_TYPE_CLIENT, "Invalid arguments" },
[FAULT_CPE_RESOURCES_EXCEEDED] = { "9004", FAULT_9004, FAULT_CPE_TYPE_SERVER, "Resources exceeded" },
[FAULT_CPE_INVALID_PARAMETER_NAME] = { "9005", FAULT_9005, FAULT_CPE_TYPE_CLIENT, "Invalid parameter name" },
[FAULT_CPE_INVALID_PARAMETER_TYPE] = { "9006", FAULT_9006, FAULT_CPE_TYPE_CLIENT, "Invalid parameter type" },
[FAULT_CPE_INVALID_PARAMETER_VALUE] = { "9007", FAULT_9007, FAULT_CPE_TYPE_CLIENT, "Invalid parameter value" },
[FAULT_CPE_NON_WRITABLE_PARAMETER] = { "9008", FAULT_9008, FAULT_CPE_TYPE_CLIENT, "Attempt to set a non-writable parameter" },
[FAULT_CPE_NOTIFICATION_REJECTED] = { "9009", FAULT_9009, FAULT_CPE_TYPE_SERVER, "Notification request rejected" },
[FAULT_CPE_DOWNLOAD_FAILURE] = { "9010", FAULT_9010, FAULT_CPE_TYPE_SERVER, "Download failure" },
[FAULT_CPE_UPLOAD_FAILURE] = { "9011", FAULT_9011, FAULT_CPE_TYPE_SERVER, "Upload failure" },
[FAULT_CPE_FILE_TRANSFER_AUTHENTICATION_FAILURE] = { "9012", FAULT_9012, FAULT_CPE_TYPE_SERVER, "File transfer server authentication failure" },
[FAULT_CPE_FILE_TRANSFER_UNSUPPORTED_PROTOCOL] = { "9013", FAULT_9013, FAULT_CPE_TYPE_SERVER, "Unsupported protocol for file transfer" },
[FAULT_CPE_DOWNLOAD_FAIL_MULTICAST_GROUP] = { "9014", FAULT_9014, FAULT_CPE_TYPE_SERVER, "Download failure: unable to join multicast group" },
[FAULT_CPE_DOWNLOAD_FAIL_CONTACT_SERVER] = { "9015", FAULT_9015, FAULT_CPE_TYPE_SERVER, "Download failure: unable to contact file server" },
[FAULT_CPE_DOWNLOAD_FAIL_ACCESS_FILE] = { "9016", FAULT_9016, FAULT_CPE_TYPE_SERVER, "Download failure: unable to access file" },
[FAULT_CPE_DOWNLOAD_FAIL_COMPLETE_DOWNLOAD] = { "9017", FAULT_9017, FAULT_CPE_TYPE_SERVER, "Download failure: unable to complete download" },
[FAULT_CPE_DOWNLOAD_FAIL_FILE_CORRUPTED] = { "9018", FAULT_9018, FAULT_CPE_TYPE_SERVER, "Download failure: file corrupted" },
[FAULT_CPE_DOWNLOAD_FAIL_FILE_AUTHENTICATION] = { "9019", FAULT_9019, FAULT_CPE_TYPE_SERVER, "Download failure: file authentication failure" },
[FAULT_CPE_DOWNLOAD_FAIL_WITHIN_TIME_WINDOW] = { "9020", FAULT_9020, FAULT_CPE_TYPE_SERVER, "Download failure: unable to complete download" },
[FAULT_CPE_DUPLICATE_DEPLOYMENT_UNIT] = { "9026", FAULT_9026, FAULT_CPE_TYPE_SERVER, "Duplicate deployment unit" },
[FAULT_CPE_SYSTEM_RESOURCES_EXCEEDED] = { "9027", FAULT_9027, FAULT_CPE_TYPE_SERVER, "System ressources exceeded" },
[FAULT_CPE_UNKNOWN_DEPLOYMENT_UNIT] = { "9028", FAULT_9028, FAULT_CPE_TYPE_SERVER, "Unknown deployment unit" },
[FAULT_CPE_INVALID_DEPLOYMENT_UNIT_STATE] = { "9029", FAULT_9029, FAULT_CPE_TYPE_SERVER, "Invalid deployment unit state" },
[FAULT_CPE_INVALID_DOWNGRADE_REJECTED] = { "9030", FAULT_9030, FAULT_CPE_TYPE_SERVER, "Invalid deployment unit Update: Downgrade not permitted" },
[FAULT_CPE_INVALID_UPDATE_VERSION_UNSPECIFIED] = { "9031", FAULT_9031, FAULT_CPE_TYPE_SERVER, "Invalid deployment unit Update: Version not specified" },
[FAULT_CPE_INVALID_UPDATE_VERSION_EXIST] = { "9031", FAULT_9032, FAULT_CPE_TYPE_SERVER, "Invalid deployment unit Update: Version already exist" } };
struct FAULT_CPE FAULT_CPE_ARRAY[] = { [FAULT_CPE_METHOD_NOT_SUPPORTED] = { "9000", FAULT_9000, FAULT_CPE_TYPE_SERVER, "Method not supported" },
[FAULT_CPE_REQUEST_DENIED] = { "9001", FAULT_9001, FAULT_CPE_TYPE_SERVER, "Request denied (no reason specified)" },
[FAULT_CPE_INTERNAL_ERROR] = { "9002", FAULT_9002, FAULT_CPE_TYPE_SERVER, "Internal error" },
[FAULT_CPE_INVALID_ARGUMENTS] = { "9003", FAULT_9003, FAULT_CPE_TYPE_CLIENT, "Invalid arguments" },
[FAULT_CPE_RESOURCES_EXCEEDED] = { "9004", FAULT_9004, FAULT_CPE_TYPE_SERVER, "Resources exceeded" },
[FAULT_CPE_INVALID_PARAMETER_NAME] = { "9005", FAULT_9005, FAULT_CPE_TYPE_CLIENT, "Invalid parameter name" },
[FAULT_CPE_INVALID_PARAMETER_TYPE] = { "9006", FAULT_9006, FAULT_CPE_TYPE_CLIENT, "Invalid parameter type" },
[FAULT_CPE_INVALID_PARAMETER_VALUE] = { "9007", FAULT_9007, FAULT_CPE_TYPE_CLIENT, "Invalid parameter value" },
[FAULT_CPE_NON_WRITABLE_PARAMETER] = { "9008", FAULT_9008, FAULT_CPE_TYPE_CLIENT, "Attempt to set a non-writable parameter" },
[FAULT_CPE_NOTIFICATION_REJECTED] = { "9009", FAULT_9009, FAULT_CPE_TYPE_SERVER, "Notification request rejected" },
[FAULT_CPE_DOWNLOAD_FAILURE] = { "9010", FAULT_9010, FAULT_CPE_TYPE_SERVER, "Download failure" },
[FAULT_CPE_UPLOAD_FAILURE] = { "9011", FAULT_9011, FAULT_CPE_TYPE_SERVER, "Upload failure" },
[FAULT_CPE_FILE_TRANSFER_AUTHENTICATION_FAILURE] = { "9012", FAULT_9012, FAULT_CPE_TYPE_SERVER, "File transfer server authentication failure" },
[FAULT_CPE_FILE_TRANSFER_UNSUPPORTED_PROTOCOL] = { "9013", FAULT_9013, FAULT_CPE_TYPE_SERVER, "Unsupported protocol for file transfer" },
[FAULT_CPE_DOWNLOAD_FAIL_MULTICAST_GROUP] = { "9014", FAULT_9014, FAULT_CPE_TYPE_SERVER, "Download failure: unable to join multicast group" },
[FAULT_CPE_DOWNLOAD_FAIL_CONTACT_SERVER] = { "9015", FAULT_9015, FAULT_CPE_TYPE_SERVER, "Download failure: unable to contact file server" },
[FAULT_CPE_DOWNLOAD_FAIL_ACCESS_FILE] = { "9016", FAULT_9016, FAULT_CPE_TYPE_SERVER, "Download failure: unable to access file" },
[FAULT_CPE_DOWNLOAD_FAIL_COMPLETE_DOWNLOAD] = { "9017", FAULT_9017, FAULT_CPE_TYPE_SERVER, "Download failure: unable to complete download" },
[FAULT_CPE_DOWNLOAD_FAIL_FILE_CORRUPTED] = { "9018", FAULT_9018, FAULT_CPE_TYPE_SERVER, "Download failure: file corrupted" },
[FAULT_CPE_DOWNLOAD_FAIL_FILE_AUTHENTICATION] = { "9019", FAULT_9019, FAULT_CPE_TYPE_SERVER, "Download failure: file authentication failure" },
[FAULT_CPE_DOWNLOAD_FAIL_WITHIN_TIME_WINDOW] = { "9020", FAULT_9020, FAULT_CPE_TYPE_SERVER, "Download failure: unable to complete download" },
[FAULT_CPE_DUPLICATE_DEPLOYMENT_UNIT] = { "9026", FAULT_9026, FAULT_CPE_TYPE_SERVER, "Duplicate deployment unit" },
[FAULT_CPE_SYSTEM_RESOURCES_EXCEEDED] = { "9027", FAULT_9027, FAULT_CPE_TYPE_SERVER, "System ressources exceeded" },
[FAULT_CPE_UNKNOWN_DEPLOYMENT_UNIT] = { "9028", FAULT_9028, FAULT_CPE_TYPE_SERVER, "Unknown deployment unit" },
[FAULT_CPE_INVALID_DEPLOYMENT_UNIT_STATE] = { "9029", FAULT_9029, FAULT_CPE_TYPE_SERVER, "Invalid deployment unit state" },
[FAULT_CPE_INVALID_DOWNGRADE_REJECTED] = { "9030", FAULT_9030, FAULT_CPE_TYPE_SERVER, "Invalid deployment unit Update: Downgrade not permitted" },
[FAULT_CPE_INVALID_UPDATE_VERSION_UNSPECIFIED] = { "9031", FAULT_9031, FAULT_CPE_TYPE_SERVER, "Invalid deployment unit Update: Version not specified" },
[FAULT_CPE_INVALID_UPDATE_VERSION_EXIST] = { "9031", FAULT_9032, FAULT_CPE_TYPE_SERVER, "Invalid deployment unit Update: Version already exist" } };
static void show_help(void)
{
@ -561,3 +562,45 @@ void icwmp_cleanmem()
free(mem);
}
}
/*
* Services Management
*/
void icwmp_init_list_services()
{
int i;
for (i = 0; i < MAX_NBRE_SERVICES; i++)
list_services[i] = NULL;
}
int icwmp_add_service(char *service)
{
if (nbre_services >= MAX_NBRE_SERVICES)
return -1;
list_services[nbre_services++] = strdup(service);
return 0;
}
void icwmp_free_list_services()
{
int i = 0;
for (i = 0; i < nbre_services; i++) {
if (list_services[i] != NULL) {
FREE(list_services[i]);
list_services[i] = NULL;
}
}
nbre_services = 0;
}
void icwmp_restart_services()
{
int i;
for (i = 0; i < nbre_services; i++) {
if (list_services[i] == NULL || strlen(list_services[i]) <= 0)
continue;
cwmp_ubus_call("uci", "commit", CWMP_UBUS_ARGS{ { "config", { .str_val = list_services[i] }, UBUS_String } }, 1, NULL, NULL);
}
icwmp_free_list_services();
icwmp_init_list_services();
}

22
cwmp.c
View file

@ -149,18 +149,13 @@ end:
int run_session_end_func(void)
{
if (end_session_flag & END_SESSION_TRANSACTION_COMMIT) {
cwmp_transaction_commit();
transaction_started = false;
}
if (end_session_flag & END_SESSION_RELOAD) {
CWMP_LOG(INFO, "Config reload: end session request");
cwmp_apply_acs_changes();
}
if (end_session_flag & END_SESSION_SET_NOTIFICATION_UPDATE) {
CWMP_LOG(INFO, "SetParameterAttributes end session: update enabled notify file");
CWMP_LOG(INFO, "SetParameterAttributes/Values end session: update enabled notify file");
cwmp_update_enabled_notify_file();
}
@ -199,20 +194,25 @@ int run_session_end_func(void)
cwmp_upload_diagnostics();
}
if (end_session_flag & END_SESSION_RESTART_SERVICES) {
CWMP_LOG(INFO, "Restart mofidied services");
icwmp_restart_services();
}
if (end_session_flag & END_SESSION_REBOOT) {
CWMP_LOG(INFO, "Executing Reboot: end session request");
cwmp_reboot(commandKey);
exit(EXIT_SUCCESS);
}
if (end_session_flag & END_SESSION_X_FACTORY_RESET_SOFT) {
CWMP_LOG(INFO, "Executing factory reset soft: end session request");
if (end_session_flag & END_SESSION_FACTORY_RESET) {
CWMP_LOG(INFO, "Executing factory reset: end session request");
cwmp_factory_reset();
exit(EXIT_SUCCESS);
}
if (end_session_flag & END_SESSION_FACTORY_RESET) {
CWMP_LOG(INFO, "Executing factory reset: end session request");
if (end_session_flag & END_SESSION_X_FACTORY_RESET_SOFT) {
CWMP_LOG(INFO, "Executing factory reset soft: end session request");
cwmp_factory_reset();
exit(EXIT_SUCCESS);
}
@ -340,7 +340,7 @@ int cwmp_init(int argc, char **argv, struct cwmp *cwmp)
memset(&env, 0, sizeof(struct env));
if ((error = global_env_init(argc, argv, &env)))
return error;
icwmp_init_list_services();
/* Only One instance should run*/
cwmp->pid_file = fopen("/var/run/icwmpd.pid", "w+");
fcntl(fileno(cwmp->pid_file), F_SETFD, fcntl(fileno(cwmp->pid_file), F_GETFD) | FD_CLOEXEC);

View file

@ -74,11 +74,9 @@ void display_get_cmd_result(struct cmd_input in __attribute__((unused)), union c
char *cmd_set_exec_func(struct cmd_input in, union cmd_result *res __attribute__((unused)))
{
int flag;
if (!transaction_started) {
if (transaction_id == 0) {
if (!cwmp_transaction_start("cwmp"))
return strdup(get_fault_message_by_fault_code("9002"));
transaction_started = true;
}
LIST_HEAD(list_set_param_value);
LIST_HEAD(faults_list);
@ -89,17 +87,13 @@ char *cmd_set_exec_func(struct cmd_input in, union cmd_result *res __attribute__
list_for_each_entry (param_fault, &faults_list, list) {
char fault[5];
snprintf(fault, 5, "%d", param_fault->fault);
if (transaction_started) {
if (transaction_id)
cwmp_transaction_abort();
transaction_started = false;
}
return strdup(fault);
}
}
if (transaction_started) {
if (transaction_id)
cwmp_transaction_commit();
transaction_started = false;
}
return NULL;
}
@ -119,25 +113,19 @@ void display_set_cmd_result(struct cmd_input in, union cmd_result res __attribut
*/
char *cmd_add_exec_func(struct cmd_input in, union cmd_result *res)
{
if (!transaction_started) {
if (transaction_id == 0) {
if (!cwmp_transaction_start("cwmp"))
return strdup(get_fault_message_by_fault_code("9002"));
transaction_started = true;
}
char *fault = cwmp_add_object(in.first_input, in.second_input ? in.second_input : "add_obj", &(res->instance));
if (fault != NULL) {
if (transaction_started) {
if (transaction_id)
cwmp_transaction_abort();
transaction_started = false;
}
return strdup(fault);
}
if (transaction_started) {
if (transaction_id)
cwmp_transaction_commit();
transaction_started = false;
}
return NULL;
}
@ -159,25 +147,19 @@ void display_add_cmd_result(struct cmd_input in, union cmd_result res, char *fau
*/
char *cmd_del_exec_func(struct cmd_input in, union cmd_result *res __attribute__((unused)))
{
if (!transaction_started) {
if (transaction_id == 0) {
if (!cwmp_transaction_start("cwmp"))
return strdup(get_fault_message_by_fault_code("9002"));
transaction_started = true;
}
char *fault = cwmp_delete_object(in.first_input, in.second_input ? in.second_input : "del_obj");
if (fault != NULL) {
if (transaction_started) {
if (transaction_id)
cwmp_transaction_abort();
transaction_started = false;
}
return strdup(fault);
}
if (transaction_started) {
if (transaction_id)
cwmp_transaction_commit();
transaction_started = false;
}
return NULL;
}
@ -220,24 +202,18 @@ void display_get_notif_cmd_result(struct cmd_input in __attribute__((unused)), u
*/
char *cmd_set_notif_exec_func(struct cmd_input in, union cmd_result *res __attribute__((unused)))
{
if (!transaction_started) {
if (transaction_id == 0) {
if (!cwmp_transaction_start("cwmp"))
return strdup(get_fault_message_by_fault_code("9002"));
transaction_started = true;
}
char *fault = cwmp_set_parameter_attributes(in.first_input, in.second_input);
if (fault != NULL) {
if (transaction_started) {
if (transaction_id)
cwmp_transaction_abort();
transaction_started = false;
}
return strdup(fault);
}
if (transaction_started) {
if (transaction_id)
cwmp_transaction_commit();
transaction_started = false;
}
return NULL;
}

View file

@ -13,7 +13,6 @@
#include "ubus.h"
#include "notifications.h"
bool transaction_started = false;
int transaction_id = 0;
enum get_results_types
@ -126,6 +125,44 @@ int get_single_fault_from_blob_attr(struct blob_attr *msg)
/*
* Transaction Functions
*/
void ubus_transaction_commit_callback(struct ubus_request *req __attribute__((unused)), int type __attribute__((unused)), struct blob_attr *msg)
{
bool *status = (bool *)req->priv;
const struct blobmsg_policy p[1] = { { "status", BLOBMSG_TYPE_BOOL } };
struct blob_attr *updated_services = NULL;
struct blob_attr *cur;
int rem;
struct blob_attr *tb[1] = { NULL };
blobmsg_parse(p, 1, tb, blobmsg_data(msg), blobmsg_len(msg));
if (!tb[0]) {
*status = false;
return;
}
*status = blobmsg_get_u8(tb[0]);
if (*status == false)
return;
blobmsg_for_each_attr(cur, msg, rem)
{
if (blobmsg_type(cur) == BLOBMSG_TYPE_ARRAY) {
updated_services = cur;
break;
}
}
if (updated_services) {
blobmsg_for_each_attr(cur, updated_services, rem)
{
char *service_name = blobmsg_get_string(cur);
if (!service_name || strlen(service_name) <= 0 || strcmp(service_name, "cwmp") == 0)
continue;
CWMP_LOG(INFO, "Detected service: %s will be restarted in the end session", service_name);
/*Add the service to the list*/
if (strcmp(service_name, "cwmp") != 0)
icwmp_add_service(service_name);
}
}
}
void ubus_transaction_callback(struct ubus_request *req __attribute__((unused)), int type __attribute__((unused)), struct blob_attr *msg)
{
@ -156,11 +193,14 @@ bool cwmp_transaction_start(char *app)
{
CWMP_LOG(INFO, "Starting transaction ...");
bool status = false;
int e = cwmp_ubus_call("usp.raw", "transaction_start", CWMP_UBUS_ARGS{ { "app", {.str_val = app }, UBUS_String } }, 1, ubus_transaction_callback, &status);
int e = cwmp_ubus_call("usp.raw", "transaction_start", CWMP_UBUS_ARGS{ { "app", { .str_val = app }, UBUS_String } }, 1, ubus_transaction_callback, &status);
if (e != 0) {
CWMP_LOG(INFO, "Transaction start failed: Ubus err code: %d", e);
status = false;
}
if (!status) {
CWMP_LOG(INFO, "Transaction Start doesn't success\n");
}
return status;
}
@ -168,11 +208,15 @@ bool cwmp_transaction_commit()
{
CWMP_LOG(INFO, "Transaction Commit ...");
bool status = false;
int e = cwmp_ubus_call("usp.raw", "transaction_commit", CWMP_UBUS_ARGS{ { "transaction_id", {.int_val = transaction_id }, UBUS_Integer } }, 1, ubus_transaction_callback, &status);
int e = cwmp_ubus_call("usp.raw", "transaction_commit", CWMP_UBUS_ARGS{ { "transaction_id", { .int_val = transaction_id }, UBUS_Integer }, { "restart_services", { .bool_val = false }, UBUS_Bool } }, 2, ubus_transaction_commit_callback, &status);
if (e != 0) {
CWMP_LOG(INFO, "Transaction commit failed: Ubus err code: %d", e);
status = false;
}
if (!status) {
CWMP_LOG(INFO, "Transaction Commit with id: %d doesn't success\n", transaction_id);
}
transaction_id = 0;
return status;
}
@ -181,11 +225,15 @@ bool cwmp_transaction_abort()
{
CWMP_LOG(INFO, "Transaction Abort ...");
bool status = false;
int e = cwmp_ubus_call("usp.raw", "transaction_abort", CWMP_UBUS_ARGS{ { "transaction_id", {.int_val = transaction_id }, UBUS_Integer } }, 1, ubus_transaction_callback, &status);
int e = cwmp_ubus_call("usp.raw", "transaction_abort", CWMP_UBUS_ARGS{ { "transaction_id", { .int_val = transaction_id }, UBUS_Integer } }, 1, ubus_transaction_callback, &status);
if (e != 0) {
CWMP_LOG(INFO, "Transaction abort failed: Ubus err code: %d", e);
status = false;
}
if (!status) {
CWMP_LOG(INFO, "Transaction Abort of transaction with id: %d failed\n", transaction_id);
}
transaction_id = 0;
return status;
}
@ -193,7 +241,7 @@ bool cwmp_transaction_status()
{
CWMP_LOG(INFO, "Transaction Status");
bool status = false;
int e = cwmp_ubus_call("usp.raw", "transaction_status", CWMP_UBUS_ARGS{ { "transaction_id", {.int_val = transaction_id }, UBUS_Integer } }, 1, ubus_transaction_status_callback, &status);
int e = cwmp_ubus_call("usp.raw", "transaction_status", CWMP_UBUS_ARGS{ { "transaction_id", { .int_val = transaction_id }, UBUS_Integer } }, 1, ubus_transaction_status_callback, &status);
if (e != 0) {
CWMP_LOG(INFO, "Transaction status failed: Ubus err code: %d", e);
return false;
@ -237,7 +285,7 @@ void ubus_get_single_parameter_callback(struct ubus_request *req, int type __att
char *cwmp_get_single_parameter_value(char *parameter_name, struct cwmp_dm_parameter *dm_parameter)
{
int e;
e = cwmp_ubus_call("usp.raw", "get", CWMP_UBUS_ARGS{ { "path", {.str_val = !parameter_name || parameter_name[0] == '\0' ? DM_ROOT_OBJ : parameter_name }, UBUS_String }, { "proto", {.str_val = "cwmp" }, UBUS_String } }, 2, ubus_get_single_parameter_callback, dm_parameter);
e = cwmp_ubus_call("usp.raw", "get", CWMP_UBUS_ARGS{ { "path", { .str_val = !parameter_name || parameter_name[0] == '\0' ? DM_ROOT_OBJ : parameter_name }, UBUS_String }, { "proto", { .str_val = "cwmp" }, UBUS_String } }, 2, ubus_get_single_parameter_callback, dm_parameter);
if (e < 0) {
CWMP_LOG(INFO, "get ubus method failed: Ubus err code: %d", e);
return "9002";
@ -270,8 +318,8 @@ void ubus_get_parameter_callback(struct ubus_request *req, int type __attribute_
char *cwmp_get_parameter_values(char *parameter_name, struct list_head *parameters_list)
{
int e;
struct list_params_result get_result = {.parameters_list = parameters_list };
e = cwmp_ubus_call("usp.raw", "get", CWMP_UBUS_ARGS{ { "path", {.str_val = !parameter_name || parameter_name[0] == '\0' ? DM_ROOT_OBJ : parameter_name }, UBUS_String }, { "proto", {.str_val = "cwmp" }, UBUS_String } }, 2, ubus_get_parameter_callback, &get_result);
struct list_params_result get_result = { .parameters_list = parameters_list };
e = cwmp_ubus_call("usp.raw", "get", CWMP_UBUS_ARGS{ { "path", { .str_val = !parameter_name || parameter_name[0] == '\0' ? DM_ROOT_OBJ : parameter_name }, UBUS_String }, { "proto", { .str_val = "cwmp" }, UBUS_String } }, 2, ubus_get_parameter_callback, &get_result);
if (e < 0) {
CWMP_LOG(INFO, "get ubus method failed: Ubus err code: %d", e);
return "9002";
@ -287,8 +335,8 @@ char *cwmp_get_parameter_values(char *parameter_name, struct list_head *paramete
char *cwmp_get_parameter_names(char *object_name, bool next_level, struct list_head *parameters_list)
{
int e;
struct list_params_result get_result = {.parameters_list = parameters_list };
e = cwmp_ubus_call("usp.raw", "object_names", CWMP_UBUS_ARGS{ { "path", {.str_val = object_name }, UBUS_String }, { "next-level", {.bool_val = next_level }, UBUS_Bool }, { "proto", {.str_val = "cwmp" }, UBUS_String } }, 3, ubus_get_parameter_callback, &get_result);
struct list_params_result get_result = { .parameters_list = parameters_list };
e = cwmp_ubus_call("usp.raw", "object_names", CWMP_UBUS_ARGS{ { "path", { .str_val = object_name }, UBUS_String }, { "next-level", { .bool_val = next_level }, UBUS_Bool }, { "proto", { .str_val = "cwmp" }, UBUS_String } }, 3, ubus_get_parameter_callback, &get_result);
if (e < 0) {
CWMP_LOG(INFO, "object_names ubus method failed: Ubus err code: %d", e);
return "9002";
@ -338,9 +386,9 @@ void ubus_setm_values_callback(struct ubus_request *req, int type __attribute__(
int cwmp_set_multiple_parameters_values(struct list_head *parameters_values_list, char *parameter_key, int *flag, struct list_head *faults_list)
{
int e;
struct setm_values_res set_result = {.flag = flag, .faults_list = faults_list };
struct setm_values_res set_result = { .flag = flag, .faults_list = faults_list };
e = cwmp_ubus_call("usp.raw", "setm_values",
CWMP_UBUS_ARGS{ { "pv_tuple", {.param_value_list = parameters_values_list }, UBUS_List_Param }, { "key", {.str_val = parameter_key }, UBUS_String }, { "transaction_id", {.int_val = transaction_id }, UBUS_Integer }, { "proto", {.str_val = "cwmp" }, UBUS_String } }, 4,
CWMP_UBUS_ARGS{ { "pv_tuple", { .param_value_list = parameters_values_list }, UBUS_List_Param }, { "key", { .str_val = parameter_key }, UBUS_String }, { "transaction_id", { .int_val = transaction_id }, UBUS_Integer }, { "proto", { .str_val = "cwmp" }, UBUS_String } }, 4,
ubus_setm_values_callback, &set_result);
if (e < 0) {
@ -390,8 +438,8 @@ void ubus_objects_callback(struct ubus_request *req, int type __attribute__((unu
char *cwmp_add_object(char *object_name, char *key, char **instance)
{
int e;
struct object_result add_result = {.instance = instance };
e = cwmp_ubus_call("usp.raw", "add_object", CWMP_UBUS_ARGS{ { "path", {.str_val = object_name }, UBUS_String }, { "key", {.str_val = key }, UBUS_String }, { "transaction_id", {.int_val = transaction_id }, UBUS_Integer }, { "proto", {.str_val = "cwmp" }, UBUS_String } }, 4,
struct object_result add_result = { .instance = instance };
e = cwmp_ubus_call("usp.raw", "add_object", CWMP_UBUS_ARGS{ { "path", { .str_val = object_name }, UBUS_String }, { "key", { .str_val = key }, UBUS_String }, { "transaction_id", { .int_val = transaction_id }, UBUS_Integer }, { "proto", { .str_val = "cwmp" }, UBUS_String } }, 4,
ubus_objects_callback, &add_result);
if (e < 0) {
@ -408,8 +456,8 @@ char *cwmp_add_object(char *object_name, char *key, char **instance)
char *cwmp_delete_object(char *object_name, char *key)
{
int e;
struct object_result add_result = {.instance = NULL };
e = cwmp_ubus_call("usp.raw", "del_object", CWMP_UBUS_ARGS{ { "path", {.str_val = object_name }, UBUS_String }, { "key", {.str_val = key }, UBUS_String }, { "transaction_id", {.int_val = transaction_id }, UBUS_Integer }, { "proto", {.str_val = "cwmp" }, UBUS_String } }, 4,
struct object_result add_result = { .instance = NULL };
e = cwmp_ubus_call("usp.raw", "del_object", CWMP_UBUS_ARGS{ { "path", { .str_val = object_name }, UBUS_String }, { "key", { .str_val = key }, UBUS_String }, { "transaction_id", { .int_val = transaction_id }, UBUS_Integer }, { "proto", { .str_val = "cwmp" }, UBUS_String } }, 4,
ubus_objects_callback, &add_result);
if (e < 0) {
CWMP_LOG(INFO, "del_object ubus method failed: Ubus err code: %d", e);
@ -447,8 +495,8 @@ void ubus_parameter_attributes_callback(struct ubus_request *req, int type __att
char *cwmp_get_parameter_attributes(char *parameter_name, struct list_head *parameters_list)
{
int e;
struct list_params_result get_result = {.parameters_list = parameters_list };
e = cwmp_ubus_call("usp.raw", "getm_attributes", CWMP_UBUS_ARGS{ { "paths", {.array_value = { {.str_value = !parameter_name || parameter_name[0] == '\0' ? DM_ROOT_OBJ : parameter_name } } }, UBUS_Array_Str }, { "proto", {.str_val = "cwmp" }, UBUS_String } }, 2,
struct list_params_result get_result = { .parameters_list = parameters_list };
e = cwmp_ubus_call("usp.raw", "getm_attributes", CWMP_UBUS_ARGS{ { "paths", { .array_value = { { .str_value = !parameter_name || parameter_name[0] == '\0' ? DM_ROOT_OBJ : parameter_name } } }, UBUS_Array_Str }, { "proto", { .str_val = "cwmp" }, UBUS_String } }, 2,
ubus_parameter_attributes_callback, &get_result);
if (e < 0) {
CWMP_LOG(INFO, "getm_attributes ubus method failed: Ubus err code: %d", e);
@ -466,10 +514,11 @@ char *cwmp_get_parameter_attributes(char *parameter_name, struct list_head *para
char *cwmp_set_parameter_attributes(char *parameter_name, char *notification)
{
int e;
struct list_params_result set_result = {.parameters_list = NULL };
e = cwmp_ubus_call("usp.raw", "setm_attributes", CWMP_UBUS_ARGS{ { "paths", {.array_value = { {.param_value = { "path", parameter_name } }, {.param_value = { "notify-type", notification } }, {.param_value = { "notify", "1" } } } }, UBUS_Array_Obj },
{ "transaction_id", {.int_val = transaction_id }, UBUS_Integer },
{ "proto", {.str_val = "cwmp" }, UBUS_String } },
struct list_params_result set_result = { .parameters_list = NULL };
e = cwmp_ubus_call("usp.raw", "setm_attributes",
CWMP_UBUS_ARGS{ { "paths", { .array_value = { { .param_value = { "path", parameter_name } }, { .param_value = { "notify-type", notification } }, { .param_value = { "notify", "1" } } } }, UBUS_Array_Obj },
{ "transaction_id", { .int_val = transaction_id }, UBUS_Integer },
{ "proto", { .str_val = "cwmp" }, UBUS_String } },
3, ubus_parameter_attributes_callback, &set_result);
if (e < 0) {
CWMP_LOG(INFO, "setm_attributes ubus method failed: Ubus err code: %d", e);
@ -491,7 +540,7 @@ int cwmp_update_enabled_notify_file(void)
{
int e, fault;
struct cwmp *cwmp = &cwmp_main;
e = cwmp_ubus_call("usp.raw", "list_notify", CWMP_UBUS_ARGS{ { "instance_mode", {.int_val = cwmp->conf.instance_mode }, UBUS_Integer }, { "proto", {.str_val = "cwmp" }, UBUS_String } }, 2, cwmp_update_enabled_notify_file_callback, &fault);
e = cwmp_ubus_call("usp.raw", "list_notify", CWMP_UBUS_ARGS{ { "instance_mode", { .int_val = cwmp->conf.instance_mode }, UBUS_Integer }, { "proto", { .str_val = "cwmp" }, UBUS_String } }, 2, cwmp_update_enabled_notify_file_callback, &fault);
if (e || fault)
return 0;
return 1;
@ -501,6 +550,6 @@ int check_value_change(void)
{
struct cwmp *cwmp = &cwmp_main;
int ret = 0;
cwmp_ubus_call("usp.raw", "list_notify", CWMP_UBUS_ARGS{ { "instance_mode", {.int_val = cwmp->conf.instance_mode }, UBUS_Integer }, { "proto", {.str_val = "cwmp" }, UBUS_String } }, 2, ubus_check_value_change_callback, &ret);
cwmp_ubus_call("usp.raw", "list_notify", CWMP_UBUS_ARGS{ { "instance_mode", { .int_val = cwmp->conf.instance_mode }, UBUS_Integer }, { "proto", { .str_val = "cwmp" }, UBUS_String } }, 2, ubus_check_value_change_callback, &ret);
return ret;
}

View file

@ -22,7 +22,14 @@
#define CWMP_BACKUP_SESSION "<cwmp></cwmp>"
#define CWMP_BKP_FILE "/etc/icwmpd/.icwmpd_backup_session.xml"
typedef enum backup_loading { ALL, ACS, CR_IP, CR_IPv6, CR_PORT } backup_loading;
typedef enum backup_loading
{
ALL,
ACS,
CR_IP,
CR_IPv6,
CR_PORT
} backup_loading;
struct search_keywords {
char *name;

View file

@ -49,6 +49,10 @@
#define DEFAULT_SESSION_TIMEOUT 60
#define DEFAULT_ACSURL "http://192.168.1.1:8080/openacs/acs"
#define MAX_NBRE_SERVICES 256
extern int nbre_services;
extern char *list_services[MAX_NBRE_SERVICES];
extern char *commandKey;
#define FIREWALL_CWMP "/etc/firewall.cwmp"
@ -155,7 +159,8 @@ enum cwmp_start
enum cwmp_ret_err
{
CWMP_OK, /* No Error */
CWMP_XML_ERR = -1,
CWMP_OK = 0, /* No Error */
CWMP_GEN_ERR, /* General Error */
CWMP_MEM_ERR, /* Memory Error */
CWMP_MUTEX_ERR,
@ -502,6 +507,10 @@ char *icwmp_strdup(const char *s);
int icwmp_asprintf(char **s, const char *format, ...);
void icwmp_free(void *m);
void icwmp_cleanmem();
void icwmp_init_list_services();
int icwmp_add_service(char *service);
void icwmp_free_list_services();
void icwmp_restart_services();
#ifndef FREE
#define FREE(x) \
do { \
@ -512,10 +521,10 @@ void icwmp_cleanmem();
} while (0)
#endif
#define CWMP_STRNCPY(DST, SRC, SIZE) \
do { \
strncpy(DST, SRC, SIZE-1); \
DST[SIZE-1] = '\0'; \
} while(0)
#define CWMP_STRNCPY(DST, SRC, SIZE) \
do { \
strncpy(DST, SRC, SIZE - 1); \
DST[SIZE - 1] = '\0'; \
} while (0)
#endif

View file

@ -3,7 +3,6 @@
#include "common.h"
#define DM_ROOT_OBJ "Device."
extern bool transaction_started;
extern int transaction_id;
struct blob_attr *get_parameters_array(struct blob_attr *msg);

View file

@ -44,7 +44,7 @@ enum end_session_enum
END_SESSION_UDPECHO_DIAGNOSTIC = 1 << 10,
END_SESSION_SERVERSELECTION_DIAGNOSTIC = 1 << 11,
END_SESSION_SET_NOTIFICATION_UPDATE = 1 << 12,
END_SESSION_TRANSACTION_COMMIT = 1 << 13
END_SESSION_RESTART_SERVICES = 1 << 13
};
enum enum_session_status

103
xml.c
View file

@ -1465,7 +1465,7 @@ int cwmp_handle_rpc_cpe_set_parameter_values(struct session *session, struct rpc
char *parameter_value = NULL;
char *parameter_key = NULL;
char *v, *c = NULL;
int fault_code = FAULT_CPE_INTERNAL_ERROR;
int fault_code = FAULT_CPE_INTERNAL_ERROR, ret = 0;
b = mxmlFindElement(session->body_in, session->body_in, "ParameterList", NULL, NULL, MXML_DESCEND);
if (!b) {
@ -1520,10 +1520,9 @@ int cwmp_handle_rpc_cpe_set_parameter_values(struct session *session, struct rpc
if (b && b->type == MXML_OPAQUE && b->value.opaque)
parameter_key = b->value.opaque;
int flag = 0;
if (!transaction_started) {
if (transaction_id == 0) {
if (!cwmp_transaction_start("cwmp"))
goto fault;
transaction_started = true;
}
fault_code = cwmp_set_multiple_parameters_values(&list_set_param_value, parameter_key ? parameter_key : "", &flag, rpc->list_set_value_fault);
if (fault_code != FAULT_CPE_NO_FAULT)
@ -1551,25 +1550,22 @@ int cwmp_handle_rpc_cpe_set_parameter_values(struct session *session, struct rpc
if (!b)
goto fault;
cwmp_set_end_session(flag | END_SESSION_TRANSACTION_COMMIT | END_SESSION_SET_NOTIFICATION_UPDATE);
if (!cwmp_transaction_commit())
goto fault;
cwmp_set_end_session(flag | END_SESSION_RESTART_SERVICES | END_SESSION_SET_NOTIFICATION_UPDATE | END_SESSION_RELOAD);
return 0;
fault:
if (cwmp_create_fault_message(session, rpc, fault_code))
goto error;
cwmp_free_all_list_param_fault(rpc->list_set_value_fault);
if (transaction_started) {
cwmp_transaction_abort();
transaction_started = false;
}
return 0;
ret = CWMP_XML_ERR;
error:
if (transaction_started) {
cwmp_free_all_list_param_fault(rpc->list_set_value_fault);
if (transaction_id) {
cwmp_transaction_abort();
transaction_started = false;
transaction_id = 0;
}
return -1;
return ret;
}
/*
@ -1580,7 +1576,7 @@ int cwmp_handle_rpc_cpe_set_parameter_attributes(struct session *session, struct
{
mxml_node_t *n, *b = session->body_in;
char *parameter_name = NULL, *parameter_notification = NULL;
int fault_code = FAULT_CPE_INTERNAL_ERROR;
int fault_code = FAULT_CPE_INTERNAL_ERROR, ret = 0;
char c[256];
/* handle cwmp:SetParameterAttributes */
@ -1593,10 +1589,9 @@ int cwmp_handle_rpc_cpe_set_parameter_attributes(struct session *session, struct
goto fault;
b = n;
if (!transaction_started) {
if (transaction_id == 0) {
if (!cwmp_transaction_start("cwmp"))
goto fault;
transaction_started = true;
}
while (b != NULL) {
if (b && b->type == MXML_ELEMENT && !strcmp(b->value.element.name, "SetParameterAttributesStruct")) {
@ -1642,24 +1637,20 @@ int cwmp_handle_rpc_cpe_set_parameter_attributes(struct session *session, struct
if (!b)
goto fault;
cwmp_set_end_session(END_SESSION_SET_NOTIFICATION_UPDATE | END_SESSION_RELOAD | END_SESSION_TRANSACTION_COMMIT);
if (!cwmp_transaction_commit())
goto fault;
cwmp_set_end_session(END_SESSION_SET_NOTIFICATION_UPDATE | END_SESSION_RESTART_SERVICES);
return 0;
fault:
if (cwmp_create_fault_message(session, rpc, fault_code))
goto error;
if (transaction_started) {
ret = CWMP_XML_ERR;
if (transaction_id) {
cwmp_transaction_abort();
transaction_started = false;
transaction_id = 0;
}
return 0;
error:
if (transaction_started) {
cwmp_transaction_abort();
transaction_started = false;
}
return -1;
return ret;
}
/*
@ -1671,7 +1662,7 @@ int cwmp_handle_rpc_cpe_add_object(struct session *session, struct rpc *rpc)
mxml_node_t *b;
char *object_name = NULL;
char *parameter_key = NULL;
int fault_code = FAULT_CPE_INTERNAL_ERROR;
int fault_code = FAULT_CPE_INTERNAL_ERROR, ret = 0;
char *instance = NULL;
b = session->body_in;
@ -1685,10 +1676,9 @@ int cwmp_handle_rpc_cpe_add_object(struct session *session, struct rpc *rpc)
b = mxmlWalkNext(b, session->body_in, MXML_DESCEND);
}
if (!transaction_started) {
if (transaction_id == 0) {
if (!cwmp_transaction_start("cwmp"))
goto fault;
transaction_started = true;
}
if (object_name) {
@ -1727,25 +1717,22 @@ int cwmp_handle_rpc_cpe_add_object(struct session *session, struct rpc *rpc)
if (!b)
goto fault;
FREE(instance);
cwmp_set_end_session(END_SESSION_TRANSACTION_COMMIT);
if (!cwmp_transaction_commit())
goto fault;
cwmp_set_end_session(END_SESSION_RESTART_SERVICES);
return 0;
fault:
FREE(instance);
if (cwmp_create_fault_message(session, rpc, fault_code))
goto error;
if (transaction_started) {
ret = CWMP_XML_ERR;
if (transaction_id) {
cwmp_transaction_abort();
transaction_started = false;
transaction_id = 0;
}
return 0;
error:
if (transaction_started) {
cwmp_transaction_abort();
transaction_started = false;
}
return -1;
return ret;
}
/*
@ -1757,7 +1744,7 @@ int cwmp_handle_rpc_cpe_delete_object(struct session *session, struct rpc *rpc)
mxml_node_t *b;
char *object_name = NULL;
char *parameter_key = NULL;
int fault_code = FAULT_CPE_INTERNAL_ERROR;
int fault_code = FAULT_CPE_INTERNAL_ERROR, ret = 0;
b = session->body_in;
while (b) {
@ -1769,10 +1756,9 @@ int cwmp_handle_rpc_cpe_delete_object(struct session *session, struct rpc *rpc)
}
b = mxmlWalkNext(b, session->body_in, MXML_DESCEND);
}
if (!transaction_started) {
if (transaction_id == 0) {
if (!cwmp_transaction_start("cwmp"))
goto fault;
transaction_started = true;
}
if (object_name) {
char *err = cwmp_delete_object(object_name, parameter_key ? parameter_key : "");
@ -1800,24 +1786,21 @@ int cwmp_handle_rpc_cpe_delete_object(struct session *session, struct rpc *rpc)
b = mxmlNewOpaque(b, "1");
if (!b)
goto fault;
cwmp_set_end_session(END_SESSION_TRANSACTION_COMMIT);
if (!cwmp_transaction_commit())
goto fault;
cwmp_set_end_session(END_SESSION_RESTART_SERVICES);
return 0;
fault:
if (cwmp_create_fault_message(session, rpc, fault_code))
goto error;
if (transaction_started) {
ret = CWMP_XML_ERR;
if (transaction_id) {
cwmp_transaction_abort();
transaction_started = false;
transaction_id = 0;
}
return 0;
error:
if (transaction_started) {
cwmp_transaction_abort();
transaction_started = false;
}
return -1;
return ret;
}
/*