diff --git a/jni/daemon/bootstages.c b/jni/daemon/bootstages.c index 45d820ed7..b077c895a 100644 --- a/jni/daemon/bootstages.c +++ b/jni/daemon/bootstages.c @@ -54,81 +54,6 @@ struct node_entry { #define IS_LNK(n) (n->type == DT_LNK) #define IS_REG(n) (n->type == DT_REG) -/****************** - * Image handling * - ******************/ - -#define round_size(a) ((((a) / 32) + 2) * 32) -#define SOURCE_TMP "/dev/source" -#define TARGET_TMP "/dev/target" - -static int merge_img(const char *source, const char *target) { - if (access(source, F_OK) == -1) - return 0; - if (access(target, F_OK) == -1) { - rename(source, target); - return 0; - } - - // resize target to worst case - int s_used, s_total, t_used, t_total, n_total; - get_img_size(source, &s_used, &s_total); - get_img_size(target, &t_used, &t_total); - n_total = round_size(s_used + t_used); - if (n_total != t_total) - resize_img(target, n_total); - - xmkdir(SOURCE_TMP, 0755); - xmkdir(TARGET_TMP, 0755); - char *s_loop, *t_loop; - s_loop = mount_image(source, SOURCE_TMP); - if (s_loop == NULL) return 1; - t_loop = mount_image(target, TARGET_TMP); - if (t_loop == NULL) return 1; - - DIR *dir; - struct dirent *entry; - if (!(dir = opendir(SOURCE_TMP))) - return 1; - while ((entry = xreaddir(dir))) { - if (entry->d_type == DT_DIR) { - if (strcmp(entry->d_name, ".") == 0 || - strcmp(entry->d_name, "..") == 0 || - strcmp(entry->d_name, ".core") == 0 || - strcmp(entry->d_name, "lost+found") == 0) - continue; - // Cleanup old module if exists - snprintf(buf, PATH_MAX, "%s/%s", TARGET_TMP, entry->d_name); - if (access(buf, F_OK) == 0) { - LOGI("Upgrade module: %s\n", entry->d_name); - rm_rf(buf); - } else { - LOGI("New module: %s\n", entry->d_name); - } - } - } - closedir(dir); - clone_dir(SOURCE_TMP, TARGET_TMP); - - // Unmount all loop devices - umount_image(SOURCE_TMP, s_loop); - umount_image(TARGET_TMP, t_loop); - rmdir(SOURCE_TMP); - rmdir(TARGET_TMP); - free(s_loop); - free(t_loop); - unlink(source); - return 0; -} - -static void trim_img(const char *img) { - int used, total, new_size; - get_img_size(img, &used, &total); - new_size = round_size(used); - if (new_size != total) - resize_img(img, new_size); -} - /*********** * Scripts * ***********/ diff --git a/jni/include/utils.h b/jni/include/utils.h index a4c0393e7..d73729589 100644 --- a/jni/include/utils.h +++ b/jni/include/utils.h @@ -96,10 +96,17 @@ int switch_mnt_ns(int pid); void link_busybox(); // img.c + +#define round_size(a) ((((a) / 32) + 2) * 32) +#define SOURCE_TMP "/dev/source" +#define TARGET_TMP "/dev/target" + int create_img(const char *img, int size); int get_img_size(const char *img, int *used, int *total); int resize_img(const char *img, int size); char *mount_image(const char *img, const char *target); void umount_image(const char *target, const char *device); +int merge_img(const char *source, const char *target); +void trim_img(const char *img); #endif diff --git a/jni/utils/img.c b/jni/utils/img.c index 3849bc308..b27d69d72 100644 --- a/jni/utils/img.c +++ b/jni/utils/img.c @@ -146,3 +146,72 @@ void umount_image(const char *target, const char *device) { ioctl(fd, LOOP_CLR_FD); close(fd); } + +int merge_img(const char *source, const char *target) { + if (access(source, F_OK) == -1) + return 0; + if (access(target, F_OK) == -1) { + rename(source, target); + return 0; + } + + char buffer[PATH_MAX]; + + // resize target to worst case + int s_used, s_total, t_used, t_total, n_total; + get_img_size(source, &s_used, &s_total); + get_img_size(target, &t_used, &t_total); + n_total = round_size(s_used + t_used); + if (n_total != t_total) + resize_img(target, n_total); + + xmkdir(SOURCE_TMP, 0755); + xmkdir(TARGET_TMP, 0755); + char *s_loop, *t_loop; + s_loop = mount_image(source, SOURCE_TMP); + if (s_loop == NULL) return 1; + t_loop = mount_image(target, TARGET_TMP); + if (t_loop == NULL) return 1; + + DIR *dir; + struct dirent *entry; + if (!(dir = opendir(SOURCE_TMP))) + return 1; + while ((entry = xreaddir(dir))) { + if (entry->d_type == DT_DIR) { + if (strcmp(entry->d_name, ".") == 0 || + strcmp(entry->d_name, "..") == 0 || + strcmp(entry->d_name, ".core") == 0 || + strcmp(entry->d_name, "lost+found") == 0) + continue; + // Cleanup old module if exists + snprintf(buffer, sizeof(buffer), "%s/%s", TARGET_TMP, entry->d_name); + if (access(buffer, F_OK) == 0) { + LOGI("Upgrade module: %s\n", entry->d_name); + rm_rf(buffer); + } else { + LOGI("New module: %s\n", entry->d_name); + } + } + } + closedir(dir); + clone_dir(SOURCE_TMP, TARGET_TMP); + + // Unmount all loop devices + umount_image(SOURCE_TMP, s_loop); + umount_image(TARGET_TMP, t_loop); + rmdir(SOURCE_TMP); + rmdir(TARGET_TMP); + free(s_loop); + free(t_loop); + unlink(source); + return 0; +} + +void trim_img(const char *img) { + int used, total, new_size; + get_img_size(img, &used, &total); + new_size = round_size(used); + if (new_size != total) + resize_img(img, new_size); +}