1337847a149d956ed6d5990f84006f7340475f715Ken Sumrall#include <stdio.h> 2337847a149d956ed6d5990f84006f7340475f715Ken Sumrall#include <stdlib.h> 3337847a149d956ed6d5990f84006f7340475f715Ken Sumrall#include <string.h> 4337847a149d956ed6d5990f84006f7340475f715Ken Sumrall#include <unistd.h> 5337847a149d956ed6d5990f84006f7340475f715Ken Sumrall#include <sys/reboot.h> 6337847a149d956ed6d5990f84006f7340475f715Ken Sumrall#include <sys/wait.h> 7337847a149d956ed6d5990f84006f7340475f715Ken Sumrall#include <cutils/android_reboot.h> 8337847a149d956ed6d5990f84006f7340475f715Ken Sumrall#include <cutils/partition_utils.h> 9337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 10337847a149d956ed6d5990f84006f7340475f715Ken Sumrallconst char *mkfs = "/system/bin/make_ext4fs"; 11337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 12337847a149d956ed6d5990f84006f7340475f715Ken Sumrallint setup_fs(const char *blockdev) 13337847a149d956ed6d5990f84006f7340475f715Ken Sumrall{ 14337847a149d956ed6d5990f84006f7340475f715Ken Sumrall char buf[256], path[128]; 15337847a149d956ed6d5990f84006f7340475f715Ken Sumrall pid_t child; 16337847a149d956ed6d5990f84006f7340475f715Ken Sumrall int status, n; 17a0b154fab1f1dd3fd11c63de18d375412cdfd1c7Ken Sumrall pid_t pid; 18337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 19337847a149d956ed6d5990f84006f7340475f715Ken Sumrall /* we might be looking at an indirect reference */ 20337847a149d956ed6d5990f84006f7340475f715Ken Sumrall n = readlink(blockdev, path, sizeof(path) - 1); 21337847a149d956ed6d5990f84006f7340475f715Ken Sumrall if (n > 0) { 22337847a149d956ed6d5990f84006f7340475f715Ken Sumrall path[n] = 0; 23337847a149d956ed6d5990f84006f7340475f715Ken Sumrall if (!memcmp(path, "/dev/block/", 11)) 24337847a149d956ed6d5990f84006f7340475f715Ken Sumrall blockdev = path + 11; 25337847a149d956ed6d5990f84006f7340475f715Ken Sumrall } 26337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 27337847a149d956ed6d5990f84006f7340475f715Ken Sumrall if (strchr(blockdev,'/')) { 28337847a149d956ed6d5990f84006f7340475f715Ken Sumrall fprintf(stderr,"not a block device name: %s\n", blockdev); 29337847a149d956ed6d5990f84006f7340475f715Ken Sumrall return 0; 30337847a149d956ed6d5990f84006f7340475f715Ken Sumrall } 31a0b154fab1f1dd3fd11c63de18d375412cdfd1c7Ken Sumrall 32a0b154fab1f1dd3fd11c63de18d375412cdfd1c7Ken Sumrall snprintf(buf, sizeof(buf), "/sys/fs/ext4/%s", blockdev); 33337847a149d956ed6d5990f84006f7340475f715Ken Sumrall if (access(buf, F_OK) == 0) { 34337847a149d956ed6d5990f84006f7340475f715Ken Sumrall fprintf(stderr,"device %s already has a filesystem\n", blockdev); 35337847a149d956ed6d5990f84006f7340475f715Ken Sumrall return 0; 36337847a149d956ed6d5990f84006f7340475f715Ken Sumrall } 37a0b154fab1f1dd3fd11c63de18d375412cdfd1c7Ken Sumrall snprintf(buf, sizeof(buf), "/dev/block/%s", blockdev); 38337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 39337847a149d956ed6d5990f84006f7340475f715Ken Sumrall if (!partition_wiped(buf)) { 40337847a149d956ed6d5990f84006f7340475f715Ken Sumrall fprintf(stderr,"device %s not wiped, probably encrypted, not wiping\n", blockdev); 41337847a149d956ed6d5990f84006f7340475f715Ken Sumrall return 0; 42337847a149d956ed6d5990f84006f7340475f715Ken Sumrall } 43337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 44337847a149d956ed6d5990f84006f7340475f715Ken Sumrall fprintf(stderr,"+++\n"); 45337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 46337847a149d956ed6d5990f84006f7340475f715Ken Sumrall child = fork(); 47337847a149d956ed6d5990f84006f7340475f715Ken Sumrall if (child < 0) { 48a0b154fab1f1dd3fd11c63de18d375412cdfd1c7Ken Sumrall fprintf(stderr,"error: setup_fs: fork failed\n"); 49337847a149d956ed6d5990f84006f7340475f715Ken Sumrall return 0; 50337847a149d956ed6d5990f84006f7340475f715Ken Sumrall } 51337847a149d956ed6d5990f84006f7340475f715Ken Sumrall if (child == 0) { 52337847a149d956ed6d5990f84006f7340475f715Ken Sumrall execl(mkfs, mkfs, buf, NULL); 53337847a149d956ed6d5990f84006f7340475f715Ken Sumrall exit(-1); 54337847a149d956ed6d5990f84006f7340475f715Ken Sumrall } 55337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 56a0b154fab1f1dd3fd11c63de18d375412cdfd1c7Ken Sumrall while ((pid=waitpid(-1, &status, 0)) != child) { 57a0b154fab1f1dd3fd11c63de18d375412cdfd1c7Ken Sumrall if (pid == -1) { 58a0b154fab1f1dd3fd11c63de18d375412cdfd1c7Ken Sumrall fprintf(stderr, "error: setup_fs: waitpid failed!\n"); 59a0b154fab1f1dd3fd11c63de18d375412cdfd1c7Ken Sumrall return 1; 60a0b154fab1f1dd3fd11c63de18d375412cdfd1c7Ken Sumrall } 61a0b154fab1f1dd3fd11c63de18d375412cdfd1c7Ken Sumrall } 62337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 63337847a149d956ed6d5990f84006f7340475f715Ken Sumrall fprintf(stderr,"---\n"); 64337847a149d956ed6d5990f84006f7340475f715Ken Sumrall return 1; 65337847a149d956ed6d5990f84006f7340475f715Ken Sumrall} 66337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 67337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 68337847a149d956ed6d5990f84006f7340475f715Ken Sumrallint main(int argc, char **argv) 69337847a149d956ed6d5990f84006f7340475f715Ken Sumrall{ 70337847a149d956ed6d5990f84006f7340475f715Ken Sumrall int need_reboot = 0; 71337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 72337847a149d956ed6d5990f84006f7340475f715Ken Sumrall while (argc > 1) { 73337847a149d956ed6d5990f84006f7340475f715Ken Sumrall if (strlen(argv[1]) < 128) 74337847a149d956ed6d5990f84006f7340475f715Ken Sumrall need_reboot |= setup_fs(argv[1]); 75337847a149d956ed6d5990f84006f7340475f715Ken Sumrall argv++; 76337847a149d956ed6d5990f84006f7340475f715Ken Sumrall argc--; 77337847a149d956ed6d5990f84006f7340475f715Ken Sumrall } 78337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 79337847a149d956ed6d5990f84006f7340475f715Ken Sumrall if (need_reboot) { 80337847a149d956ed6d5990f84006f7340475f715Ken Sumrall fprintf(stderr,"REBOOT!\n"); 81337847a149d956ed6d5990f84006f7340475f715Ken Sumrall android_reboot(ANDROID_RB_RESTART, 0, 0); 82337847a149d956ed6d5990f84006f7340475f715Ken Sumrall exit(-1); 83337847a149d956ed6d5990f84006f7340475f715Ken Sumrall } 84337847a149d956ed6d5990f84006f7340475f715Ken Sumrall return 0; 85337847a149d956ed6d5990f84006f7340475f715Ken Sumrall} 86