diff --git a/cwmp_uci.c b/cwmp_uci.c index 9949436..ee296d3 100644 --- a/cwmp_uci.c +++ b/cwmp_uci.c @@ -707,9 +707,8 @@ int cwmp_uci_import(char *package_name, const char *input_path, uci_config_paths struct uci_element *e = NULL; int ret = CWMP_OK; FILE *input = fopen(input_path, "r"); - if (!input) { + if (!input) return -1; - } if (uci_import(uci_save_conf_paths[uci_type].uci_ctx, input, package_name, &package, (package_name != NULL)) != UCI_OK) { ret = -1; diff --git a/download.c b/download.c index d295b63..a6cf59f 100644 --- a/download.c +++ b/download.c @@ -18,6 +18,7 @@ #include "log.h" #include "cwmp_time.h" #include "event.h" +#include "cwmp_uci.h" LIST_HEAD(list_download); LIST_HEAD(list_schedule_download); @@ -168,7 +169,7 @@ int cwmp_apply_multiple_firmware() return CWMP_OK; } -int cwmp_launch_download(struct download *pdownload, enum load_type ltype, struct transfer_complete **ptransfer_complete) +int cwmp_launch_download(struct download *pdownload, char *download_file_name, enum load_type ltype, struct transfer_complete **ptransfer_complete) { int error = FAULT_CPE_NO_FAULT; char *download_startTime; @@ -216,7 +217,13 @@ int cwmp_launch_download(struct download *pdownload, enum load_type ltype, struc //TODO Not Supported error = FAULT_CPE_NO_FAULT; } else if (strcmp(pdownload->file_type, VENDOR_CONFIG_FILE_TYPE) == 0) { - rename(ICWMP_DOWNLOAD_FILE, VENDOR_CONFIG_FILE); + if (download_file_name != NULL) { + char file_path[512]; + snprintf(file_path, sizeof(file_path), "/tmp/%s", download_file_name); + rename(ICWMP_DOWNLOAD_FILE, file_path); + } else + rename(ICWMP_DOWNLOAD_FILE, VENDOR_CONFIG_FILE); + error = FAULT_CPE_NO_FAULT; } else if (strcmp(pdownload->file_type, TONE_FILE_TYPE) == 0) { //TODO Not Supported @@ -249,7 +256,15 @@ end_download: return error; } -int apply_downloaded_file(struct cwmp *cwmp, struct download *pdownload, struct transfer_complete *ptransfer_complete) +char *get_file_name_by_download_url(char *url) +{ + char *slash = strrchr(url, '/'); + if (slash == NULL) + return NULL; + return slash+1; +} + +int apply_downloaded_file(struct cwmp *cwmp, struct download *pdownload, char *download_file_name, struct transfer_complete *ptransfer_complete) { int error = FAULT_CPE_NO_FAULT; if (pdownload->file_type[0] == '1') { @@ -273,7 +288,17 @@ int apply_downloaded_file(struct cwmp *cwmp, struct download *pdownload, struct error = FAULT_CPE_NO_FAULT; } else if (strcmp(pdownload->file_type, VENDOR_CONFIG_FILE_TYPE) == 0) { cwmp_uci_init(); - int err = cwmp_uci_import(NULL, VENDOR_CONFIG_FILE, UCI_STANDARD_CONFIG); + int err = CWMP_OK; + if (download_file_name != NULL) { + char file_path[512]; + snprintf(file_path, sizeof(file_path), "/tmp/%s", download_file_name); + err = cwmp_uci_import(download_file_name, file_path, UCI_STANDARD_CONFIG); + remove(file_path); + } else { + err = cwmp_uci_import("vendor_conf_file", VENDOR_CONFIG_FILE, UCI_STANDARD_CONFIG); + remove(VENDOR_CONFIG_FILE); + } + cwmp_uci_exit(); if (err == CWMP_OK) error = FAULT_CPE_NO_FAULT; @@ -368,8 +393,9 @@ void *thread_cwmp_rpc_cpe_download(void *v) } if ((timeout >= 0) && (timeout <= time_of_grace)) { pthread_mutex_lock(&(cwmp->mutex_session_send)); + char *download_file_name = get_file_name_by_download_url(pdownload->url); CWMP_LOG(INFO, "Launch download file %s", pdownload->url); - error = cwmp_launch_download(pdownload, TYPE_DOWNLOAD, &ptransfer_complete); + error = cwmp_launch_download(pdownload, download_file_name, TYPE_DOWNLOAD, &ptransfer_complete); sleep(3); if (error != FAULT_CPE_NO_FAULT) { bkp_session_insert_transfer_complete(ptransfer_complete); @@ -377,7 +403,7 @@ void *thread_cwmp_rpc_cpe_download(void *v) cwmp_root_cause_transfer_complete(cwmp, ptransfer_complete); bkp_session_delete_transfer_complete(ptransfer_complete); } else { - error = apply_downloaded_file(cwmp, pdownload, ptransfer_complete); + error = apply_downloaded_file(cwmp, pdownload, download_file_name, ptransfer_complete); if (error || pdownload->file_type[0] == '6') bkp_session_delete_transfer_complete(ptransfer_complete); } @@ -511,11 +537,12 @@ void *thread_cwmp_rpc_cpe_schedule_download(void *v) if (min_time == 0) { continue; } else if (min_time <= current_time) { + char *download_file_name = get_file_name_by_download_url(current_download->url); if ((min_time == current_download->timewindowstruct[0].windowstart && (current_download->timewindowstruct[0].windowmode)[0] == '2') || (min_time == current_download->timewindowstruct[1].windowstart && (current_download->timewindowstruct[1].windowmode)[0] == '2')) { pthread_mutex_lock(&mutex_schedule_download); ptransfer_complete = calloc(1, sizeof(struct transfer_complete)); ptransfer_complete->type = TYPE_SCHEDULE_DOWNLOAD; - error = cwmp_launch_download(current_download, TYPE_SCHEDULE_DOWNLOAD, &ptransfer_complete); + error = cwmp_launch_download(current_download, download_file_name, TYPE_SCHEDULE_DOWNLOAD, &ptransfer_complete); if (error != FAULT_CPE_NO_FAULT) { bkp_session_insert_transfer_complete(ptransfer_complete); bkp_session_save(); @@ -526,7 +553,7 @@ void *thread_cwmp_rpc_cpe_schedule_download(void *v) if (pthread_mutex_trylock(&(cwmp->mutex_session_send)) == 0) { pthread_mutex_lock(&mutex_apply_schedule_download); pthread_mutex_lock(&mutex_schedule_download); - error = apply_downloaded_file(cwmp, current_download, ptransfer_complete); + error = apply_downloaded_file(cwmp, current_download, download_file_name, ptransfer_complete); if (error == FAULT_CPE_NO_FAULT) exit(EXIT_SUCCESS); @@ -551,14 +578,14 @@ void *thread_cwmp_rpc_cpe_schedule_download(void *v) else { pthread_mutex_lock(&(cwmp->mutex_session_send)); CWMP_LOG(INFO, "Launch download file %s", current_download->url); - error = cwmp_launch_download(current_download, TYPE_SCHEDULE_DOWNLOAD, &ptransfer_complete); + error = cwmp_launch_download(current_download, download_file_name, TYPE_SCHEDULE_DOWNLOAD, &ptransfer_complete); if (error != FAULT_CPE_NO_FAULT) { bkp_session_insert_transfer_complete(ptransfer_complete); bkp_session_save(); cwmp_root_cause_transfer_complete(cwmp, ptransfer_complete); bkp_session_delete_transfer_complete(ptransfer_complete); } else { - error = apply_downloaded_file(cwmp, current_download, ptransfer_complete); + error = apply_downloaded_file(cwmp, current_download, download_file_name, ptransfer_complete); if (error == FAULT_CPE_NO_FAULT) exit(EXIT_SUCCESS); } diff --git a/inc/download.h b/inc/download.h index 14ccefa..c8efee7 100644 --- a/inc/download.h +++ b/inc/download.h @@ -7,7 +7,7 @@ #define ICWMP_DOWNLOAD_FILE "/tmp/icwmp_download" #define FIRMWARE_UPGRADE_IMAGE "/tmp/firmware.bin" #define WEB_CONTENT_FILE "/tmp/web_content.ipk" -#define VENDOR_CONFIG_FILE "/tmp/vendor_configuration_file.cfg" +#define VENDOR_CONFIG_FILE "/tmp/vendor_conf_file" #define FIRMWARE_UPGRADE_IMAGE_FILE_TYPE "1 Firmware Upgrade Image" #define WEB_CONTENT_FILE_TYPE "2 Web Content" @@ -41,5 +41,5 @@ int cwmp_rpc_acs_destroy_data_transfer_complete(struct session *session, struct void *thread_cwmp_rpc_cpe_download(void *v); void *thread_cwmp_rpc_cpe_schedule_download(void *v); void *thread_cwmp_rpc_cpe_apply_schedule_download(void *v); -int cwmp_launch_download(struct download *pdownload, enum load_type ltype, struct transfer_complete **ptransfer_complete); +int cwmp_launch_download(struct download *pdownload, char *download_file_name, enum load_type ltype, struct transfer_complete **ptransfer_complete); #endif diff --git a/test/cmocka/icwmp_download_unit_test.c b/test/cmocka/icwmp_download_unit_test.c index 5071496..c15fa2c 100644 --- a/test/cmocka/icwmp_download_unit_test.c +++ b/test/cmocka/icwmp_download_unit_test.c @@ -94,7 +94,7 @@ static void cwmp_launch_download_unit_test(void **state) pdownload->password = icwmp_strdup("iopsys"); pdownload->url = icwmp_strdup("http://127.0.0.1/firmware_v1.0.bin"); - int error = cwmp_launch_download(pdownload, TYPE_DOWNLOAD, &ptransfer_complete); + int error = cwmp_launch_download(pdownload, "firmware_v1.0.bin", TYPE_DOWNLOAD, &ptransfer_complete); transfer_complete_test = ptransfer_complete; assert_int_equal(error, FAULT_CPE_NO_FAULT); @@ -119,7 +119,7 @@ static void cwmp_launch_download_unit_test(void **state) pdownload->password = icwmp_strdup("iopsys"); pdownload->url = icwmp_strdup("http://127.0.0.1/firmware.bin"); - error = cwmp_launch_download(pdownload, TYPE_DOWNLOAD, &ptransfer_complete); + error = cwmp_launch_download(pdownload, "firmware_v1.0.bin", TYPE_DOWNLOAD, &ptransfer_complete); transfer_complete_test = ptransfer_complete; assert_int_equal(error, FAULT_CPE_DOWNLOAD_FAIL_CONTACT_SERVER); @@ -143,7 +143,7 @@ static void cwmp_launch_download_unit_test(void **state) pdownload->password = icwmp_strdup("iopsys"); pdownload->url = icwmp_strdup("http://127.0.0.1/firmware_v1.0.bin"); - error = cwmp_launch_download(pdownload, TYPE_DOWNLOAD, &ptransfer_complete); + error = cwmp_launch_download(pdownload, "firmware_v1.0.bin", TYPE_DOWNLOAD, &ptransfer_complete); transfer_complete_test = ptransfer_complete; assert_int_equal(error, FAULT_CPE_INVALID_ARGUMENTS); @@ -167,7 +167,7 @@ static void cwmp_launch_download_unit_test(void **state) pdownload->password = icwmp_strdup("iopsys"); pdownload->url = icwmp_strdup("http://127.0.0.1/invalid_firmware_v1.0.bin"); - error = cwmp_launch_download(pdownload, TYPE_DOWNLOAD, &ptransfer_complete); + error = cwmp_launch_download(pdownload, "firmware_v1.0.bin", TYPE_DOWNLOAD, &ptransfer_complete); transfer_complete_test = ptransfer_complete; assert_int_equal(error, FAULT_CPE_DOWNLOAD_FAIL_FILE_CORRUPTED);