am 56c5105b
: support for ext4/EMMC filesystems in updater binary
Merge commit '56c5105bd7096704eaed35329b2c8c84cc282867' into gingerbread-plus-aosp * commit '56c5105bd7096704eaed35329b2c8c84cc282867': support for ext4/EMMC filesystems in updater binary
This commit is contained in:
commit
9f89b0e467
6 changed files with 76 additions and 37 deletions
8
common.h
8
common.h
|
@ -73,12 +73,12 @@ void ui_show_indeterminate_progress();
|
|||
void ui_reset_progress();
|
||||
|
||||
#define LOGE(...) ui_print("E:" __VA_ARGS__)
|
||||
#define LOGW(...) fprintf(stderr, "W:" __VA_ARGS__)
|
||||
#define LOGI(...) fprintf(stderr, "I:" __VA_ARGS__)
|
||||
#define LOGW(...) fprintf(stdout, "W:" __VA_ARGS__)
|
||||
#define LOGI(...) fprintf(stdout, "I:" __VA_ARGS__)
|
||||
|
||||
#if 0
|
||||
#define LOGV(...) fprintf(stderr, "V:" __VA_ARGS__)
|
||||
#define LOGD(...) fprintf(stderr, "D:" __VA_ARGS__)
|
||||
#define LOGV(...) fprintf(stdout, "V:" __VA_ARGS__)
|
||||
#define LOGD(...) fprintf(stdout, "D:" __VA_ARGS__)
|
||||
#else
|
||||
#define LOGV(...) do {} while (0)
|
||||
#define LOGD(...) do {} while (0)
|
||||
|
|
|
@ -112,7 +112,7 @@ try_update_binary(const char *path, ZipArchive *zip) {
|
|||
if (pid == 0) {
|
||||
close(pipefd[0]);
|
||||
execv(binary, args);
|
||||
fprintf(stderr, "E:Can't run %s (%s)\n", binary, strerror(errno));
|
||||
fprintf(stdout, "E:Can't run %s (%s)\n", binary, strerror(errno));
|
||||
_exit(-1);
|
||||
}
|
||||
close(pipefd[1]);
|
||||
|
|
12
recovery.c
12
recovery.c
|
@ -673,7 +673,7 @@ prompt_and_wait() {
|
|||
|
||||
static void
|
||||
print_property(const char *key, const char *name, void *cookie) {
|
||||
fprintf(stderr, "%s=%s\n", key, name);
|
||||
printf("%s=%s\n", key, name);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -683,7 +683,7 @@ main(int argc, char **argv) {
|
|||
// If these fail, there's not really anywhere to complain...
|
||||
freopen(TEMPORARY_LOG_FILE, "a", stdout); setbuf(stdout, NULL);
|
||||
freopen(TEMPORARY_LOG_FILE, "a", stderr); setbuf(stderr, NULL);
|
||||
fprintf(stderr, "Starting recovery on %s", ctime(&start));
|
||||
printf("Starting recovery on %s", ctime(&start));
|
||||
|
||||
ui_init();
|
||||
get_args(&argc, &argv);
|
||||
|
@ -714,14 +714,14 @@ main(int argc, char **argv) {
|
|||
|
||||
device_recovery_start();
|
||||
|
||||
fprintf(stderr, "Command:");
|
||||
printf("Command:");
|
||||
for (arg = 0; arg < argc; arg++) {
|
||||
fprintf(stderr, " \"%s\"", argv[arg]);
|
||||
printf(" \"%s\"", argv[arg]);
|
||||
}
|
||||
fprintf(stderr, "\n\n");
|
||||
printf("\n\n");
|
||||
|
||||
property_list(print_property, NULL);
|
||||
fprintf(stderr, "\n");
|
||||
printf("\n");
|
||||
|
||||
int status = INSTALL_SUCCESS;
|
||||
|
||||
|
|
2
ui.c
2
ui.c
|
@ -404,7 +404,7 @@ void ui_print(const char *fmt, ...)
|
|||
vsnprintf(buf, 256, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
fputs(buf, stderr);
|
||||
fputs(buf, stdout);
|
||||
|
||||
// This can get called before ui_init(), so be careful.
|
||||
pthread_mutex_lock(&gUpdateMutex);
|
||||
|
|
|
@ -18,7 +18,13 @@ LOCAL_MODULE_TAGS := eng
|
|||
|
||||
LOCAL_SRC_FILES := $(updater_src_files)
|
||||
|
||||
LOCAL_STATIC_LIBRARIES := $(TARGET_RECOVERY_UPDATER_LIBS) $(TARGET_RECOVERY_UPDATER_EXTRA_LIBS)
|
||||
ifeq ($(TARGET_USERIMAGES_USE_EXT4), true)
|
||||
LOCAL_CFLAGS += -DUSE_EXT4
|
||||
LOCAL_C_INCLUDES += system/extras/ext4_utils
|
||||
LOCAL_STATIC_LIBRARIES += libext4_utils libz
|
||||
endif
|
||||
|
||||
LOCAL_STATIC_LIBRARIES += $(TARGET_RECOVERY_UPDATER_LIBS) $(TARGET_RECOVERY_UPDATER_EXTRA_LIBS)
|
||||
LOCAL_STATIC_LIBRARIES += libapplypatch libedify libmtdutils libminzip libz
|
||||
LOCAL_STATIC_LIBRARIES += libmincrypt libbz
|
||||
LOCAL_STATIC_LIBRARIES += libcutils libstdc++ libc
|
||||
|
|
|
@ -36,24 +36,35 @@
|
|||
#include "updater.h"
|
||||
#include "applypatch/applypatch.h"
|
||||
|
||||
// mount(type, location, mount_point)
|
||||
#ifdef USE_EXT4
|
||||
#include "make_ext4fs.h"
|
||||
#endif
|
||||
|
||||
// mount(fs_type, partition_type, location, mount_point)
|
||||
//
|
||||
// what: type="MTD" location="<partition>" to mount a yaffs2 filesystem
|
||||
// type="vfat" location="/dev/block/<whatever>" to mount a device
|
||||
// fs_type="yaffs2" partition_type="MTD" location=partition
|
||||
// fs_type="ext4" partition_type="EMMC" location=device
|
||||
Value* MountFn(const char* name, State* state, int argc, Expr* argv[]) {
|
||||
char* result = NULL;
|
||||
if (argc != 3) {
|
||||
return ErrorAbort(state, "%s() expects 3 args, got %d", name, argc);
|
||||
if (argc != 4) {
|
||||
return ErrorAbort(state, "%s() expects 4 args, got %d", name, argc);
|
||||
}
|
||||
char* type;
|
||||
char* fs_type;
|
||||
char* partition_type;
|
||||
char* location;
|
||||
char* mount_point;
|
||||
if (ReadArgs(state, argv, 3, &type, &location, &mount_point) < 0) {
|
||||
if (ReadArgs(state, argv, 4, &fs_type, &partition_type,
|
||||
&location, &mount_point) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (strlen(type) == 0) {
|
||||
ErrorAbort(state, "type argument to %s() can't be empty", name);
|
||||
if (strlen(fs_type) == 0) {
|
||||
ErrorAbort(state, "fs_type argument to %s() can't be empty", name);
|
||||
goto done;
|
||||
}
|
||||
if (strlen(partition_type) == 0) {
|
||||
ErrorAbort(state, "partition_type argument to %s() can't be empty",
|
||||
name);
|
||||
goto done;
|
||||
}
|
||||
if (strlen(location) == 0) {
|
||||
|
@ -67,7 +78,7 @@ Value* MountFn(const char* name, State* state, int argc, Expr* argv[]) {
|
|||
|
||||
mkdir(mount_point, 0755);
|
||||
|
||||
if (strcmp(type, "MTD") == 0) {
|
||||
if (strcmp(partition_type, "MTD") == 0) {
|
||||
mtd_scan_partitions();
|
||||
const MtdPartition* mtd;
|
||||
mtd = mtd_find_partition_by_name(location);
|
||||
|
@ -77,7 +88,7 @@ Value* MountFn(const char* name, State* state, int argc, Expr* argv[]) {
|
|||
result = strdup("");
|
||||
goto done;
|
||||
}
|
||||
if (mtd_mount_partition(mtd, mount_point, "yaffs2", 0 /* rw */) != 0) {
|
||||
if (mtd_mount_partition(mtd, mount_point, fs_type, 0 /* rw */) != 0) {
|
||||
fprintf(stderr, "mtd mount of %s failed: %s\n",
|
||||
location, strerror(errno));
|
||||
result = strdup("");
|
||||
|
@ -85,7 +96,7 @@ Value* MountFn(const char* name, State* state, int argc, Expr* argv[]) {
|
|||
}
|
||||
result = mount_point;
|
||||
} else {
|
||||
if (mount(location, mount_point, type,
|
||||
if (mount(location, mount_point, fs_type,
|
||||
MS_NOATIME | MS_NODEV | MS_NODIRATIME, "") < 0) {
|
||||
fprintf(stderr, "%s: failed to mount %s at %s: %s\n",
|
||||
name, location, mount_point, strerror(errno));
|
||||
|
@ -96,7 +107,8 @@ Value* MountFn(const char* name, State* state, int argc, Expr* argv[]) {
|
|||
}
|
||||
|
||||
done:
|
||||
free(type);
|
||||
free(fs_type);
|
||||
free(partition_type);
|
||||
free(location);
|
||||
if (result != mount_point) free(mount_point);
|
||||
return StringValue(result);
|
||||
|
@ -162,22 +174,29 @@ done:
|
|||
}
|
||||
|
||||
|
||||
// format(type, location)
|
||||
// format(fs_type, partition_type, location)
|
||||
//
|
||||
// type="MTD" location=partition
|
||||
// fs_type="yaffs2" partition_type="MTD" location=partition
|
||||
// fs_type="ext4" partition_type="EMMC" location=device
|
||||
Value* FormatFn(const char* name, State* state, int argc, Expr* argv[]) {
|
||||
char* result = NULL;
|
||||
if (argc != 2) {
|
||||
return ErrorAbort(state, "%s() expects 2 args, got %d", name, argc);
|
||||
if (argc != 3) {
|
||||
return ErrorAbort(state, "%s() expects 3 args, got %d", name, argc);
|
||||
}
|
||||
char* type;
|
||||
char* fs_type;
|
||||
char* partition_type;
|
||||
char* location;
|
||||
if (ReadArgs(state, argv, 2, &type, &location) < 0) {
|
||||
if (ReadArgs(state, argv, 3, &fs_type, &partition_type, &location) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (strlen(type) == 0) {
|
||||
ErrorAbort(state, "type argument to %s() can't be empty", name);
|
||||
if (strlen(fs_type) == 0) {
|
||||
ErrorAbort(state, "fs_type argument to %s() can't be empty", name);
|
||||
goto done;
|
||||
}
|
||||
if (strlen(partition_type) == 0) {
|
||||
ErrorAbort(state, "partition_type argument to %s() can't be empty",
|
||||
name);
|
||||
goto done;
|
||||
}
|
||||
if (strlen(location) == 0) {
|
||||
|
@ -185,7 +204,7 @@ Value* FormatFn(const char* name, State* state, int argc, Expr* argv[]) {
|
|||
goto done;
|
||||
}
|
||||
|
||||
if (strcmp(type, "MTD") == 0) {
|
||||
if (strcmp(partition_type, "MTD") == 0) {
|
||||
mtd_scan_partitions();
|
||||
const MtdPartition* mtd = mtd_find_partition_by_name(location);
|
||||
if (mtd == NULL) {
|
||||
|
@ -212,12 +231,26 @@ Value* FormatFn(const char* name, State* state, int argc, Expr* argv[]) {
|
|||
goto done;
|
||||
}
|
||||
result = location;
|
||||
#ifdef USE_EXT4
|
||||
} else if (strcmp(fs_type, "ext4") == 0) {
|
||||
reset_ext4fs_info();
|
||||
int status = make_ext4fs(location, NULL, NULL, 0, 0);
|
||||
if (status != 0) {
|
||||
fprintf(stderr, "%s: make_ext4fs failed (%d) on %s",
|
||||
name, status, location);
|
||||
result = strdup("");
|
||||
goto done;
|
||||
}
|
||||
result = location;
|
||||
#endif
|
||||
} else {
|
||||
fprintf(stderr, "%s: unsupported type \"%s\"", name, type);
|
||||
fprintf(stderr, "%s: unsupported fs_type \"%s\" partition_type \"%s\"",
|
||||
name, fs_type, partition_type);
|
||||
}
|
||||
|
||||
done:
|
||||
free(type);
|
||||
free(fs_type);
|
||||
free(partition_type);
|
||||
if (result != location) free(location);
|
||||
return StringValue(result);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue