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

#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;
}