make_ext4fs_main.c revision 107a9f161babc20daf915311146b0e864d3b4157
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (C) 2010 The Android Open Source Project 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * you may not use this file except in compliance with the License. 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * You may obtain a copy of the License at 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 125ae3f93f3bafbeb1fc9a3324475c58c725749c5eAnatol Pomazau * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * See the License for the specific language governing permissions and 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * limitations under the License. 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h> 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <libgen.h> 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if defined(__linux__) 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <linux/fs.h> 225ae3f93f3bafbeb1fc9a3324475c58c725749c5eAnatol Pomazau#elif defined(__APPLE__) && defined(__MACH__) 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/disk.h> 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "make_ext4fs.h" 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern struct fs_info info; 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void usage(char *path) 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "%s [ -l <len> ] [ -j <journal size> ] [ -b <block_size> ]\n", basename(path)); 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, " [ -g <blocks per group> ] [ -i <inodes> ] [ -I <inode size> ]\n"); 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, " [ -L <label> ] [ -f ] [ -a <android mountpoint> ]\n"); 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, " [ -z | -s ] [ -t ] [ -w ] [ -c ] [ -J ]\n"); 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, " <filename> [<directory>]\n"); 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint main(int argc, char **argv) 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int opt; 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *filename = NULL; 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *directory = NULL; 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *mountpoint = ""; 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int android = 0; 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int gzip = 0; 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int sparse = 0; 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int crc = 0; 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int wipe = 0; 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int init_itabs = 0; 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while ((opt = getopt(argc, argv, "l:j:b:g:i:I:L:a:fwzJsct")) != -1) { 54b2de4db941f5329f9f19e70feff5786b2d5acbb6Dan Murphy switch (opt) { 55b2de4db941f5329f9f19e70feff5786b2d5acbb6Dan Murphy case 'l': 56b2de4db941f5329f9f19e70feff5786b2d5acbb6Dan Murphy info.len = parse_num(optarg); 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'j': 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project info.journal_blocks = parse_num(optarg); 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'b': 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project info.block_size = parse_num(optarg); 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 64913eb8bf874fcec647667bd7113da65b6e38488aDavid Krause case 'g': 65913eb8bf874fcec647667bd7113da65b6e38488aDavid Krause info.blocks_per_group = parse_num(optarg); 66913eb8bf874fcec647667bd7113da65b6e38488aDavid Krause break; 67913eb8bf874fcec647667bd7113da65b6e38488aDavid Krause case 'i': 68913eb8bf874fcec647667bd7113da65b6e38488aDavid Krause info.inodes = parse_num(optarg); 695ae3f93f3bafbeb1fc9a3324475c58c725749c5eAnatol Pomazau break; 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'I': 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project info.inode_size = parse_num(optarg); 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'L': 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project info.label = optarg; 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'f': 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project force = 1; 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'a': 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project android = 1; 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mountpoint = optarg; 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'w': 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project wipe = 1; 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'z': 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gzip = 1; 885ae3f93f3bafbeb1fc9a3324475c58c725749c5eAnatol Pomazau break; 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'J': 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project info.no_journal = 1; 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'c': 935ae3f93f3bafbeb1fc9a3324475c58c725749c5eAnatol Pomazau crc = 1; 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 's': 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sparse = 1; 97b4add9b74525210478bac702d27fdaf9cf7ab18fElliott Hughes break; 98b4add9b74525210478bac702d27fdaf9cf7ab18fElliott Hughes case 't': 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project init_itabs = 1; 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project default: /* '?' */ 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usage(argv[0]); 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(EXIT_FAILURE); 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1065ae3f93f3bafbeb1fc9a3324475c58c725749c5eAnatol Pomazau 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (gzip && sparse) { 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "Cannot specify both gzip and sparse\n"); 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usage(argv[0]); 1105ae3f93f3bafbeb1fc9a3324475c58c725749c5eAnatol Pomazau exit(EXIT_FAILURE); 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (wipe && sparse) { 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "Cannot specifiy both wipe and sparse\n"); 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usage(argv[0]); 1165ae3f93f3bafbeb1fc9a3324475c58c725749c5eAnatol Pomazau exit(EXIT_FAILURE); 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (wipe && gzip) { 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "Cannot specifiy both wipe and gzip\n"); 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usage(argv[0]); 1225ae3f93f3bafbeb1fc9a3324475c58c725749c5eAnatol Pomazau exit(EXIT_FAILURE); 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (optind >= argc) { 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "Expected filename after options\n"); 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usage(argv[0]); 128b4add9b74525210478bac702d27fdaf9cf7ab18fElliott Hughes exit(EXIT_FAILURE); 1295ae3f93f3bafbeb1fc9a3324475c58c725749c5eAnatol Pomazau } 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project filename = argv[optind++]; 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (optind < argc) 134f8ff3a5ae21ce34f22928709cc6f992ff2fdd56eJP Abgrall directory = argv[optind++]; 135f8ff3a5ae21ce34f22928709cc6f992ff2fdd56eJP Abgrall 136f8ff3a5ae21ce34f22928709cc6f992ff2fdd56eJP Abgrall if (optind < argc) { 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "Unexpected argument: %s\n", argv[optind]); 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usage(argv[0]); 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(EXIT_FAILURE); 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return make_ext4fs_internal(filename, directory, mountpoint, android, gzip, 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sparse, crc, wipe, init_itabs); 144c840653efd8d05a33778d3e73c3521977564bde3mgross} 145c840653efd8d05a33778d3e73c3521977564bde3mgross