#include #include #include #include #include #include #include #include #include #include "roots.h" #include "mt_recovery.h" /******************************************************************************* * freeme.biantao, 20160318. restore preset resources. **/ #define AID_XXXX_RW AID_MEDIA_RW static int copy_file(const char *src, const char *dst) { if (src == NULL || dst == NULL) { return -1; } int sfd; if ((sfd = open(src, O_RDONLY)) == -1) { perror("[copyFile] Open source file."); return -1; } int dfd; if ((dfd = open(dst, O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1) { perror("[copyFile] Open target file."); close(sfd); return -1; } char buffer[1024 * 8]; int length; while ((length = read(sfd, buffer, sizeof(buffer))) > 0){ write(dfd, buffer, length); } fsync(dfd); close(sfd); close(dfd); return 0; } static int copy_dir(const char *src, const char *dst) { if (src == NULL || dst == NULL) { return -1; } DIR *sdir; if ((sdir = opendir(src)) == NULL) { perror("[copyDir] Open source dir."); return -1; } DIR *ddir; if ((ddir = opendir(dst)) == NULL) { if (mkdir(dst, 0775) != 0) { perror("[copyDir] Make target dir."); closedir(sdir); return -1; } if (chown(dst, AID_XXXX_RW, AID_XXXX_RW) != 0) { perror("[copyDir] Chown target dir."); closedir(sdir); return -1; } if (chmod(dst, 0775) != 0) { perror("[copyDir] Chmod target dir."); closedir(sdir); return -1; } if ((ddir = opendir(dst)) == NULL) { perror("[copyDir] Open target dir."); closedir(sdir); return -1; } } struct stat s; char sfile[NAME_MAX]; char dfile[NAME_MAX]; struct dirent *sdirent; while ((sdirent = readdir(sdir)) != NULL) { if (strcmp(sdirent->d_name, ".") == 0 || strcmp(sdirent->d_name, "..") == 0) continue; snprintf(sfile, sizeof(sfile), "%s/%s", src, sdirent->d_name); snprintf(dfile, sizeof(dfile), "%s/%s", dst, sdirent->d_name); lstat(sfile, &s); if (S_ISREG(s.st_mode)) { if (copy_file(sfile, dfile) == 0) { chown(dfile, AID_XXXX_RW, AID_XXXX_RW); chmod(dfile, 0644); } } else if (S_ISDIR(s.st_mode)) { copy_dir(sfile, dfile); } } closedir(sdir); closedir(ddir); return 0; } // cp /system/presets/Music /data/media/0/Music // cp /system/presets/DCIM/camera /data/media/0/DCIM/camera bool restore_preload_resources() { bool ret = false; const char* SRC_DIR = "/system/presets"; const char* DST_DIR = "/data/media"; if (ensure_path_mounted("/system") == 0 && ensure_path_mounted("/data") == 0) { ret = copy_dir(SRC_DIR, DST_DIR) == 0; sync(); ensure_path_unmounted("/system"); ensure_path_unmounted("/data/"); } else { perror("[ReatorePreloadResources] Mount partition error."); } return ret; } /******************************************************************************* * freeme.biantao, 20160219. remove package. **/ bool remove_package_after_update(char *removed_packages_arg) { ensure_path_mounted("/system"); ensure_path_mounted("/data"); const char *delims = "|"; char *package_name = strtok(removed_packages_arg, delims); while (package_name != NULL) { ui_print("Remove package %s\n", package_name); remove_mota_file(package_name); package_name = strtok(NULL, delims); } return true; }