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