diff options
Diffstat (limited to 'twinstall.cpp')
-rw-r--r-- | twinstall.cpp | 66 |
1 files changed, 52 insertions, 14 deletions
diff --git a/twinstall.cpp b/twinstall.cpp index b3b9b774b..4b055a3aa 100644 --- a/twinstall.cpp +++ b/twinstall.cpp @@ -53,29 +53,48 @@ extern "C" { static const char* properties_path = "/dev/__properties__"; static const char* properties_path_renamed = "/dev/__properties_kk__"; +static bool legacy_props_env_initd = false; +static bool legacy_props_path_modified = false; -static void switch_to_legacy_properties() +static int switch_to_legacy_properties() { - char tmp[32]; - int propfd, propsz; - legacy_properties_init(); - legacy_get_property_workspace(&propfd, &propsz); - sprintf(tmp, "%d,%d", dup(propfd), propsz); - setenv("ANDROID_PROPERTY_WORKSPACE", tmp, 1); + if (!legacy_props_env_initd) { + if (legacy_properties_init() != 0) + return -1; + + char tmp[32]; + int propfd, propsz; + legacy_get_property_workspace(&propfd, &propsz); + sprintf(tmp, "%d,%d", dup(propfd), propsz); + setenv("ANDROID_PROPERTY_WORKSPACE", tmp, 1); + legacy_props_env_initd = true; + } if (TWFunc::Path_Exists(properties_path)) { // hide real properties so that the updater uses the envvar to find the legacy format properties - if (rename(properties_path, properties_path_renamed) != 0) - LOGERR("Renaming properties failed: %s (assertions in old installers may fail)\n", strerror(errno)); + if (rename(properties_path, properties_path_renamed) != 0) { + LOGERR("Renaming %s failed: %s\n", properties_path, strerror(errno)); + return -1; + } else { + legacy_props_path_modified = true; + } } + + return 0; } -static void switch_to_new_properties() +static int switch_to_new_properties() { if (TWFunc::Path_Exists(properties_path_renamed)) { - if (rename(properties_path_renamed, properties_path) != 0) - LOGERR("Restoring properties failed: %s\n", strerror(errno)); + if (rename(properties_path_renamed, properties_path) != 0) { + LOGERR("Renaming %s failed: %s\n", properties_path_renamed, strerror(errno)); + return -1; + } else { + legacy_props_path_modified = false; + } } + + return 0; } static int Run_Update_Binary(const char *path, ZipArchive *Zip, int* wipe_cache) { @@ -143,6 +162,15 @@ static int Run_Update_Binary(const char *path, ZipArchive *Zip, int* wipe_cache) } mzCloseZipArchive(Zip); +#ifndef TW_NO_LEGACY_PROPS + /* Set legacy properties */ + if (switch_to_legacy_properties() != 0) { + LOGERR("Legacy property environment did not initialize successfully. Properties may not be detected.\n"); + } else { + LOGINFO("Legacy property environment initialized.\n"); + } +#endif + pipe(pipe_fd); args[0] = Temp_Binary.c_str(); @@ -155,7 +183,6 @@ static int Run_Update_Binary(const char *path, ZipArchive *Zip, int* wipe_cache) pid_t pid = fork(); if (pid == 0) { - switch_to_legacy_properties(); close(pipe_fd[0]); execve(Temp_Binary.c_str(), (char* const*)args, environ); printf("E:Can't execute '%s'\n", Temp_Binary.c_str()); @@ -204,7 +231,18 @@ static int Run_Update_Binary(const char *path, ZipArchive *Zip, int* wipe_cache) fclose(child_data); waitpid(pid, &status, 0); - switch_to_new_properties(); + +#ifndef TW_NO_LEGACY_PROPS + /* Unset legacy properties */ + if (legacy_props_path_modified) { + if (switch_to_new_properties() != 0) { + LOGERR("Legacy property environment did not disable successfully. Legacy properties may still be in use.\n"); + } else { + LOGINFO("Legacy property environment disabled.\n"); + } + } +#endif + if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { LOGERR("Error executing updater binary in zip '%s'\n", path); return INSTALL_ERROR; |