18642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland/* 28642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland * Copyright (C) 2010 The Android Open Source Project 38642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland * 48642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland * Licensed under the Apache License, Version 2.0 (the "License"); 58642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland * you may not use this file except in compliance with the License. 68642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland * You may obtain a copy of the License at 78642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland * 88642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland * http://www.apache.org/licenses/LICENSE-2.0 98642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland * 108642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland * Unless required by applicable law or agreed to in writing, software 118642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland * distributed under the License is distributed on an "AS IS" BASIS, 128642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland * See the License for the specific language governing permissions and 148642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland * limitations under the License. 158642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland */ 168642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland 178642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland#include <unistd.h> 188642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland#include <libgen.h> 198642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland 208642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland#if defined(__linux__) 218642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland#include <linux/fs.h> 228642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland#elif defined(__APPLE__) && defined(__MACH__) 238642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland#include <sys/disk.h> 248642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland#endif 258642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland 268642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland#include "make_ext4fs.h" 278642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland 288642b7fba54727a38f751516bcdc452fb09ef610Brian Swetlandextern struct fs_info info; 298642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland 308642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland 318642b7fba54727a38f751516bcdc452fb09ef610Brian Swetlandstatic void usage(char *path) 328642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland{ 338642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland fprintf(stderr, "%s [ -l <len> ] [ -j <journal size> ] [ -b <block_size> ]\n", basename(path)); 348642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland fprintf(stderr, " [ -g <blocks per group> ] [ -i <inodes> ] [ -I <inode size> ]\n"); 358642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland fprintf(stderr, " [ -L <label> ] [ -f ] [ -a <android mountpoint> ]\n"); 368642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland fprintf(stderr, " [ -z | -s ] [ -J ]\n"); 378642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland fprintf(stderr, " <filename> [<directory>]\n"); 388642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland} 398642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland 408642b7fba54727a38f751516bcdc452fb09ef610Brian Swetlandint main(int argc, char **argv) 418642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland{ 428642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland int opt; 438642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland const char *filename = NULL; 448642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland const char *directory = NULL; 458642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland char *mountpoint = ""; 468642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland int android = 0; 478642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland int gzip = 0; 488642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland int sparse = 0; 498642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland 508642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland while ((opt = getopt(argc, argv, "l:j:b:g:i:I:L:a:fzJs")) != -1) { 518642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland switch (opt) { 528642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland case 'l': 538642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland info.len = parse_num(optarg); 548642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland break; 558642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland case 'j': 568642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland info.journal_blocks = parse_num(optarg); 578642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland break; 588642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland case 'b': 598642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland info.block_size = parse_num(optarg); 608642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland break; 618642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland case 'g': 628642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland info.blocks_per_group = parse_num(optarg); 638642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland break; 648642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland case 'i': 658642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland info.inodes = parse_num(optarg); 668642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland break; 678642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland case 'I': 688642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland info.inode_size = parse_num(optarg); 698642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland break; 708642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland case 'L': 718642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland info.label = optarg; 728642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland break; 738642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland case 'f': 748642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland force = 1; 758642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland break; 768642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland case 'a': 778642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland android = 1; 788642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland mountpoint = optarg; 798642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland break; 808642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland case 'z': 818642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland gzip = 1; 828642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland break; 838642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland case 'J': 848642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland info.no_journal = 1; 858642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland break; 868642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland case 's': 878642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland sparse = 1; 888642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland break; 898642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland default: /* '?' */ 908642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland usage(argv[0]); 918642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland exit(EXIT_FAILURE); 928642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland } 938642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland } 948642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland 958642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland if (gzip && sparse) { 968642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland fprintf(stderr, "Cannot specify both gzip and sparse\n"); 978642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland usage(argv[0]); 988642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland exit(EXIT_FAILURE); 998642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland } 1008642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland 1018642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland if (optind >= argc) { 1028642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland fprintf(stderr, "Expected filename after options\n"); 1038642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland usage(argv[0]); 1048642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland exit(EXIT_FAILURE); 1058642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland } 1068642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland 1078642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland filename = argv[optind++]; 1088642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland 1098642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland if (optind < argc) 1108642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland directory = argv[optind++]; 1118642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland 1128642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland if (optind < argc) { 1138642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland fprintf(stderr, "Unexpected argument: %s\n", argv[optind]); 1148642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland usage(argv[0]); 1158642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland exit(EXIT_FAILURE); 1168642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland } 1178642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland 1188642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland return make_ext4fs(filename, directory, mountpoint, android, gzip, sparse); 1198642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland} 120