You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
3.8 KiB
159 lines
3.8 KiB
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <string.h> |
|
|
|
#include <sys/stat.h> |
|
#include <sys/types.h> |
|
#include <dirent.h> |
|
#include <fcntl.h> |
|
#include <unistd.h> |
|
|
|
#include <private/android_filesystem_config.h> |
|
|
|
#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; |
|
}
|
|
|