#include #include #include #include #include #include #include #include #include #include #include #include #include #include "common.h" #include "install.h" #include "bootloader.h" #define URL_MAX_LENGTH 512 #define CMDLINE_LENGTH 2048 extern bool bSDBootUpdate; static int start_main (const char *binary, char *args[], int* pipefd) { pid_t pid = fork(); if(pid == 0){ close(pipefd[0]); execv(binary, args); printf("E:Can't run %s (%s)\n", binary, strerror(errno)); fprintf(stdout, "E:Can't run %s (%s)\n", binary, strerror(errno)); _exit(-1); } close(pipefd[1]); char buffer[1024]; FILE* from_child = fdopen(pipefd[0], "r"); while (fgets(buffer, sizeof(buffer), from_child) != NULL) { char* command = strtok(buffer, " \n"); if (command == NULL) { continue; } else if (strcmp(command, "progress") == 0) { char* fraction_s = strtok(NULL, " \n"); char* seconds_s = strtok(NULL, " \n"); float fraction = strtof(fraction_s, NULL); int seconds = strtol(seconds_s, NULL, 10); ui_show_progress(fraction * (1-VERIFICATION_PROGRESS_FRACTION), seconds); } else if (strcmp(command, "set_progress") == 0) { char* fraction_s = strtok(NULL, " \n"); float fraction = strtof(fraction_s, NULL); ui_set_progress(fraction); } else if (strcmp(command, "ui_print") == 0) { char* str = strtok(NULL, "\n"); if (str) { printf(" >>>>>> %s <<<<<<\n", str); ui_print("%s", str); } else { ui_print("\n"); } } else { LOGE("unknown command [%s]\n", command); } } fclose(from_child); int status; waitpid(pid, &status, 0); if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { LOGE("Error in %s\n(Status %d)\n", binary, WEXITSTATUS(status)); return INSTALL_ERROR; } return INSTALL_SUCCESS; } int do_rk_updateEngine(const char *binary, const char *path) { LOGI("[%s] start with main.\n", __func__); char *update="--update"; char *update_sdboot="--update=sdboot"; int pipefd[2]; pipe(pipefd); //updateEngine --update --image_url=path --partition=0x3a0000 char *args[6]; char args_1[20] = {0}; char args_2[URL_MAX_LENGTH] = {0}; char args_4[32] = {0}; args[0] = (char* )binary; args[1] = args_1; sprintf(args[1], "--pipefd=%d", pipefd[1]); args[2] = args_2; sprintf(args[2], "--image_url=%s", path); if (bSDBootUpdate) { char path_second[64] = {0}; char path_second_dir[64] = {0}; sprintf(path_second_dir, "%s", path); dirname(path_second_dir); sprintf(path_second, "%s/update_ab.img", path_second_dir); if (access(path_second, F_OK) == 0) { sprintf(args[2], "--image_url=%s", path_second); } else { sprintf(path_second, "%s/update_ota.img", path_second_dir); if (access(path_second, F_OK) == 0) { sprintf(args[2], "--image_url=%s", path_second); } } } LOGI("SDcard update data: [%s]\n", args[2]); if (bSDBootUpdate) { args[3] = (char *)update_sdboot; } else { args[3] = (char *)update; } args[4] = args_4; args[5] = NULL; if (bSDBootUpdate) { // If SD boot, ignore --partition sprintf(args[4], "--partition=0x%s", "FFFF00"); } else { struct bootloader_message boot; get_bootloader_message(&boot); sprintf(args[4], "--partition=0x%X", *((int *)(boot.needupdate))); } return start_main(binary, args, pipefd); } int do_rk_update(const char *binary, const char *path) { LOGI("[%s] start with main.\n", __func__); int pipefd[2]; pipe(pipefd); char* args[6]; args[0] = (char* )binary; args[1] = "Version 1.0"; char args_2[10] = {0}; args[2] = args_2; sprintf(args[2], "%d", pipefd[1]); args[3] = (char*)path; char args_4[8] = {0}; args[4] = args_4; sprintf(args[4], "%d", (int)bSDBootUpdate); args[5] = NULL; return start_main(binary, args, pipefd); #if 0 pid_t pid = fork(); if(pid == 0){ close(pipefd[0]); execv(binary, args); printf("E:Can't run %s (%s)\n", binary, strerror(errno)); fprintf(stdout, "E:Can't run %s (%s)\n", binary, strerror(errno)); _exit(-1); } close(pipefd[1]); char buffer[1024]; FILE* from_child = fdopen(pipefd[0], "r"); while (fgets(buffer, sizeof(buffer), from_child) != NULL) { char* command = strtok(buffer, " \n"); if (command == NULL) { continue; } else if (strcmp(command, "progress") == 0) { char* fraction_s = strtok(NULL, " \n"); char* seconds_s = strtok(NULL, " \n"); float fraction = strtof(fraction_s, NULL); int seconds = strtol(seconds_s, NULL, 10); ui_show_progress(fraction * (1-VERIFICATION_PROGRESS_FRACTION), seconds); } else if (strcmp(command, "set_progress") == 0) { char* fraction_s = strtok(NULL, " \n"); float fraction = strtof(fraction_s, NULL); ui_set_progress(fraction); } else if (strcmp(command, "ui_print") == 0) { char* str = strtok(NULL, "\n"); if (str) { printf("ui_print = %s.\n", str); ui_print("%s", str); } else { ui_print("\n"); } } else { LOGE("unknown command [%s]\n", command); } } fclose(from_child); int status; waitpid(pid, &status, 0); if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { LOGE("Error in %s\n(Status %d)\n", path, WEXITSTATUS(status)); return INSTALL_ERROR; } return INSTALL_SUCCESS; #endif }