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