setup_fs.c revision 337847a149d956ed6d5990f84006f7340475f715
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; 17337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 18337847a149d956ed6d5990f84006f7340475f715Ken Sumrall /* we might be looking at an indirect reference */ 19337847a149d956ed6d5990f84006f7340475f715Ken Sumrall n = readlink(blockdev, path, sizeof(path) - 1); 20337847a149d956ed6d5990f84006f7340475f715Ken Sumrall if (n > 0) { 21337847a149d956ed6d5990f84006f7340475f715Ken Sumrall path[n] = 0; 22337847a149d956ed6d5990f84006f7340475f715Ken Sumrall if (!memcmp(path, "/dev/block/", 11)) 23337847a149d956ed6d5990f84006f7340475f715Ken Sumrall blockdev = path + 11; 24337847a149d956ed6d5990f84006f7340475f715Ken Sumrall } 25337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 26337847a149d956ed6d5990f84006f7340475f715Ken Sumrall if (strchr(blockdev,'/')) { 27337847a149d956ed6d5990f84006f7340475f715Ken Sumrall fprintf(stderr,"not a block device name: %s\n", blockdev); 28337847a149d956ed6d5990f84006f7340475f715Ken Sumrall return 0; 29337847a149d956ed6d5990f84006f7340475f715Ken Sumrall } 30337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 31337847a149d956ed6d5990f84006f7340475f715Ken Sumrall sprintf(buf,"/sys/fs/ext4/%s", blockdev); 32337847a149d956ed6d5990f84006f7340475f715Ken Sumrall if (access(buf, F_OK) == 0) { 33337847a149d956ed6d5990f84006f7340475f715Ken Sumrall fprintf(stderr,"device %s already has a filesystem\n", blockdev); 34337847a149d956ed6d5990f84006f7340475f715Ken Sumrall return 0; 35337847a149d956ed6d5990f84006f7340475f715Ken Sumrall } 36337847a149d956ed6d5990f84006f7340475f715Ken Sumrall sprintf(buf,"/dev/block/%s", blockdev); 37337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 38337847a149d956ed6d5990f84006f7340475f715Ken Sumrall if (!partition_wiped(buf)) { 39337847a149d956ed6d5990f84006f7340475f715Ken Sumrall fprintf(stderr,"device %s not wiped, probably encrypted, not wiping\n", blockdev); 40337847a149d956ed6d5990f84006f7340475f715Ken Sumrall return 0; 41337847a149d956ed6d5990f84006f7340475f715Ken Sumrall } 42337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 43337847a149d956ed6d5990f84006f7340475f715Ken Sumrall fprintf(stderr,"+++\n"); 44337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 45337847a149d956ed6d5990f84006f7340475f715Ken Sumrall child = fork(); 46337847a149d956ed6d5990f84006f7340475f715Ken Sumrall if (child < 0) { 47337847a149d956ed6d5990f84006f7340475f715Ken Sumrall fprintf(stderr,"error: fork failed\n"); 48337847a149d956ed6d5990f84006f7340475f715Ken Sumrall return 0; 49337847a149d956ed6d5990f84006f7340475f715Ken Sumrall } 50337847a149d956ed6d5990f84006f7340475f715Ken Sumrall if (child == 0) { 51337847a149d956ed6d5990f84006f7340475f715Ken Sumrall execl(mkfs, mkfs, buf, NULL); 52337847a149d956ed6d5990f84006f7340475f715Ken Sumrall exit(-1); 53337847a149d956ed6d5990f84006f7340475f715Ken Sumrall } 54337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 55337847a149d956ed6d5990f84006f7340475f715Ken Sumrall while (waitpid(-1, &status, 0) != child) ; 56337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 57337847a149d956ed6d5990f84006f7340475f715Ken Sumrall fprintf(stderr,"---\n"); 58337847a149d956ed6d5990f84006f7340475f715Ken Sumrall return 1; 59337847a149d956ed6d5990f84006f7340475f715Ken Sumrall} 60337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 61337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 62337847a149d956ed6d5990f84006f7340475f715Ken Sumrallint main(int argc, char **argv) 63337847a149d956ed6d5990f84006f7340475f715Ken Sumrall{ 64337847a149d956ed6d5990f84006f7340475f715Ken Sumrall int need_reboot = 0; 65337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 66337847a149d956ed6d5990f84006f7340475f715Ken Sumrall while (argc > 1) { 67337847a149d956ed6d5990f84006f7340475f715Ken Sumrall if (strlen(argv[1]) < 128) 68337847a149d956ed6d5990f84006f7340475f715Ken Sumrall need_reboot |= setup_fs(argv[1]); 69337847a149d956ed6d5990f84006f7340475f715Ken Sumrall argv++; 70337847a149d956ed6d5990f84006f7340475f715Ken Sumrall argc--; 71337847a149d956ed6d5990f84006f7340475f715Ken Sumrall } 72337847a149d956ed6d5990f84006f7340475f715Ken Sumrall 73337847a149d956ed6d5990f84006f7340475f715Ken Sumrall if (need_reboot) { 74337847a149d956ed6d5990f84006f7340475f715Ken Sumrall fprintf(stderr,"REBOOT!\n"); 75337847a149d956ed6d5990f84006f7340475f715Ken Sumrall android_reboot(ANDROID_RB_RESTART, 0, 0); 76337847a149d956ed6d5990f84006f7340475f715Ken Sumrall exit(-1); 77337847a149d956ed6d5990f84006f7340475f715Ken Sumrall } 78337847a149d956ed6d5990f84006f7340475f715Ken Sumrall return 0; 79337847a149d956ed6d5990f84006f7340475f715Ken Sumrall} 80