diff --git a/backupSession.c b/backupSession.c index 4fb1b2f..383c060 100644 --- a/backupSession.c +++ b/backupSession.c @@ -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); diff --git a/common.c b/common.c index 9e31f96..018391b 100755 --- a/common.c +++ b/common.c @@ -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(); +} diff --git a/cwmp.c b/cwmp.c index 19ce13c..bdb0919 100644 --- a/cwmp.c +++ b/cwmp.c @@ -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); diff --git a/cwmp_cli.c b/cwmp_cli.c index 0dee7eb..27e8933 100644 --- a/cwmp_cli.c +++ b/cwmp_cli.c @@ -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; } diff --git a/datamodel_interface.c b/datamodel_interface.c index 299bfd6..48252d7 100755 --- a/datamodel_interface.c +++ b/datamodel_interface.c @@ -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; } diff --git a/inc/backupSession.h b/inc/backupSession.h index 95440ad..78fd2ac 100644 --- a/inc/backupSession.h +++ b/inc/backupSession.h @@ -22,7 +22,14 @@ #define CWMP_BACKUP_SESSION "" #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; diff --git a/inc/common.h b/inc/common.h index c3b1d97..0b5303b 100644 --- a/inc/common.h +++ b/inc/common.h @@ -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 diff --git a/inc/datamodel_interface.h b/inc/datamodel_interface.h index b829e3d..cf59824 100644 --- a/inc/datamodel_interface.h +++ b/inc/datamodel_interface.h @@ -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); diff --git a/inc/session.h b/inc/session.h index 3762735..080364e 100644 --- a/inc/session.h +++ b/inc/session.h @@ -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 diff --git a/xml.c b/xml.c index c04fd5f..5d382b1 100755 --- a/xml.c +++ b/xml.c @@ -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; } /*