#include <sys/mount.h>
#include <sys/stat.h>
#include <sys/types.h>
+#include <sys/wait.h>
#include <unistd.h>
#include "system-recovery.h"
return SUCCEED;
}
+static int verify_recovery_image(void)
+{
+ int ret;
+ pid_t pid;
+ int status;
+
+ ret = access(IMAGE_VERIFIER_PATH, F_OK);
+ switch (ret) {
+ case 0:
+ break;
+ case ENOENT:
+ _W("No image verifier... Skip it");
+ return SUCCEED;
+ default:
+ _E("access for %s failed (%d)", IMAGE_VERIFIER_PATH, errno);
+ return errno;
+ }
+
+ pid = fork();
+ switch (pid) {
+ case -1:
+ _E("fork failed");
+ return EIO;
+ case 0:
+ // Child : execute image verifier
+ ret = execl(IMAGE_VERIFIER_PATH, IMAGE_VERIFIER_PATH, recovery_image_path, NULL);
+ ASSERT_RETV(ret != -1, errno, "execl for %s failed (%d)", IMAGE_VERIFIER_PATH, errno);
+ exit(ret);
+ break;
+ default:
+ // Parent : receive child's result
+ ret = wait(&status);
+ ASSERT_RETV(ret != -1, errno, "wait failed (%d)", errno);
+
+ ASSERT_RETV(WIFEXITED(status), EIO,
+ "Image verifier doesn't terminated normally");
+ ASSERT_RETV(WEXITSTATUS(status) == SUCCEED, WEXITSTATUS(status),
+ "Image verification failed (%d)", WEXITSTATUS(status));
+ return SUCCEED;
+ }
+
+ return EFAULT;
+}
+
static int mount_recovery_image(void)
{
int ret;
ret = find_recovery_image();
ASSERT_RETV(ret == SUCCEED, ret, "Failed to find recovery image(%d)", ret);
+ ret = verify_recovery_image();
+ ASSERT_RETV(ret == SUCCEED, ret, "Failed to verify recovery image (%d)", ret);
+
ret = mount_recovery_image();
ASSERT_RETV(ret == SUCCEED, ret, "Failed to mount recovery image (%d)", ret);