diff options
-rw-r--r-- | legacy_properties.h | 4 | ||||
-rw-r--r-- | legacy_property_service.c | 14 | ||||
-rw-r--r-- | legacy_property_service.h | 2 | ||||
-rw-r--r-- | twinstall.cpp | 62 |
4 files changed, 59 insertions, 23 deletions
diff --git a/legacy_properties.h b/legacy_properties.h index 9eb6bc751..44cdd958d 100644 --- a/legacy_properties.h +++ b/legacy_properties.h @@ -63,7 +63,7 @@ struct prop_info { char value[PROP_VALUE_MAX]; }; -struct prop_msg +struct prop_msg { unsigned cmd; char name[PROP_NAME_MAX]; @@ -71,7 +71,7 @@ struct prop_msg }; #define PROP_MSG_SETPROP 1 - + /* ** Rules: ** diff --git a/legacy_property_service.c b/legacy_property_service.c index 0dc95ad48..12865c417 100644 --- a/legacy_property_service.c +++ b/legacy_property_service.c @@ -33,13 +33,11 @@ #include <sys/atomics.h> #include "legacy_property_service.h" - static int persistent_properties_loaded = 0; static int property_area_inited = 0; static int property_set_fd = -1; - typedef struct { void *data; size_t size; @@ -203,9 +201,13 @@ static void copy_property_to_legacy(const char *key, const char *value, void *co legacy_property_set(key, value); } -void legacy_properties_init() +int legacy_properties_init() { - init_property_area(); - property_list(copy_property_to_legacy, 0); -} + if(init_property_area() != 0) + return -1; + if(property_list(copy_property_to_legacy, 0) != 0) + return -1; + + return 0; +} diff --git a/legacy_property_service.h b/legacy_property_service.h index 172055fa2..d20bdeff6 100644 --- a/legacy_property_service.h +++ b/legacy_property_service.h @@ -20,6 +20,6 @@ #include <stdbool.h> void legacy_get_property_workspace(int *fd, int *sz); -void legacy_properties_init(); +int legacy_properties_init(); #endif /* _LEGACY_PROPERTY_H */ diff --git a/twinstall.cpp b/twinstall.cpp index b3b9b774b..5b3242756 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,13 @@ static int Run_Update_Binary(const char *path, ZipArchive *Zip, int* wipe_cache) } mzCloseZipArchive(Zip); + /* 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"); + } + pipe(pipe_fd); args[0] = Temp_Binary.c_str(); @@ -155,7 +181,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 +229,16 @@ static int Run_Update_Binary(const char *path, ZipArchive *Zip, int* wipe_cache) fclose(child_data); waitpid(pid, &status, 0); - switch_to_new_properties(); + + /* 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"); + } + } + if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { LOGERR("Error executing updater binary in zip '%s'\n", path); return INSTALL_ERROR; |