mirror of
https://dev.iopsys.eu/bbf/icwmp.git
synced 2026-03-12 03:58:34 +01:00
Ticket refs #5366: icwmp: fix transaction issue in case there are multiple RPC calls in one session
This commit is contained in:
parent
78a6d48e1e
commit
32246cad8d
10 changed files with 265 additions and 199 deletions
|
|
@ -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
101
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();
|
||||
}
|
||||
|
|
|
|||
22
cwmp.c
22
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);
|
||||
|
|
|
|||
48
cwmp_cli.c
48
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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
21
inc/common.h
21
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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
103
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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue