1263eefd9fb9608432636c903423e43848e69f39dDoug Zongker/*
2263eefd9fb9608432636c903423e43848e69f39dDoug Zongker * Copyright (C) 2010 The Android Open Source Project
3263eefd9fb9608432636c903423e43848e69f39dDoug Zongker *
4263eefd9fb9608432636c903423e43848e69f39dDoug Zongker * Licensed under the Apache License, Version 2.0 (the "License");
5263eefd9fb9608432636c903423e43848e69f39dDoug Zongker * you may not use this file except in compliance with the License.
6263eefd9fb9608432636c903423e43848e69f39dDoug Zongker * You may obtain a copy of the License at
7263eefd9fb9608432636c903423e43848e69f39dDoug Zongker *
8263eefd9fb9608432636c903423e43848e69f39dDoug Zongker *      http://www.apache.org/licenses/LICENSE-2.0
9263eefd9fb9608432636c903423e43848e69f39dDoug Zongker *
10263eefd9fb9608432636c903423e43848e69f39dDoug Zongker * Unless required by applicable law or agreed to in writing, software
11263eefd9fb9608432636c903423e43848e69f39dDoug Zongker * distributed under the License is distributed on an "AS IS" BASIS,
12263eefd9fb9608432636c903423e43848e69f39dDoug Zongker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13263eefd9fb9608432636c903423e43848e69f39dDoug Zongker * See the License for the specific language governing permissions and
14263eefd9fb9608432636c903423e43848e69f39dDoug Zongker * limitations under the License.
15263eefd9fb9608432636c903423e43848e69f39dDoug Zongker */
16263eefd9fb9608432636c903423e43848e69f39dDoug Zongker
170349bd9f14d252673a7a25767da4a80121aaaaf2Anatol Pomazau#include <fcntl.h>
18354350e3a92955e66abd1ea15536f8b6e5e66493Anatol Pomazau#include <libgen.h>
19965298695c981ee5a67e86977a8e40a50f7392abColin Cross#include <stdio.h>
200349bd9f14d252673a7a25767da4a80121aaaaf2Anatol Pomazau#include <unistd.h>
21263eefd9fb9608432636c903423e43848e69f39dDoug Zongker
22263eefd9fb9608432636c903423e43848e69f39dDoug Zongker#if defined(__linux__)
23263eefd9fb9608432636c903423e43848e69f39dDoug Zongker#include <linux/fs.h>
24263eefd9fb9608432636c903423e43848e69f39dDoug Zongker#elif defined(__APPLE__) && defined(__MACH__)
25263eefd9fb9608432636c903423e43848e69f39dDoug Zongker#include <sys/disk.h>
26263eefd9fb9608432636c903423e43848e69f39dDoug Zongker#endif
27263eefd9fb9608432636c903423e43848e69f39dDoug Zongker
2868e3dfd81ddb9367a0c3e0c72148c23a3227ed48Kenny Root#ifdef ANDROID
2968e3dfd81ddb9367a0c3e0c72148c23a3227ed48Kenny Root#include <private/android_filesystem_config.h>
30aa8b3553d9c5b0f89d13df6412af0dd1e25e5a3bMohamad Ayyash#include <private/canned_fs_config.h>
3168e3dfd81ddb9367a0c3e0c72148c23a3227ed48Kenny Root#endif
3268e3dfd81ddb9367a0c3e0c72148c23a3227ed48Kenny Root
33965298695c981ee5a67e86977a8e40a50f7392abColin Cross#ifndef USE_MINGW
34965298695c981ee5a67e86977a8e40a50f7392abColin Cross#include <selinux/selinux.h>
35965298695c981ee5a67e86977a8e40a50f7392abColin Cross#include <selinux/label.h>
36c28ca56319d72ac9f026689b5516c75f719900afJeff Vander Stoep#if !defined(HOST)
37965298695c981ee5a67e86977a8e40a50f7392abColin Cross#include <selinux/android.h>
38c28ca56319d72ac9f026689b5516c75f719900afJeff Vander Stoep#endif
39965298695c981ee5a67e86977a8e40a50f7392abColin Cross#else
40965298695c981ee5a67e86977a8e40a50f7392abColin Crossstruct selabel_handle;
41965298695c981ee5a67e86977a8e40a50f7392abColin Cross#endif
42965298695c981ee5a67e86977a8e40a50f7392abColin Cross
43263eefd9fb9608432636c903423e43848e69f39dDoug Zongker#include "make_ext4fs.h"
44965298695c981ee5a67e86977a8e40a50f7392abColin Cross#include "ext4_utils.h"
45263eefd9fb9608432636c903423e43848e69f39dDoug Zongker
460349bd9f14d252673a7a25767da4a80121aaaaf2Anatol Pomazau#ifndef USE_MINGW /* O_BINARY is windows-specific flag */
470349bd9f14d252673a7a25767da4a80121aaaaf2Anatol Pomazau#define O_BINARY 0
480349bd9f14d252673a7a25767da4a80121aaaaf2Anatol Pomazau#endif
490349bd9f14d252673a7a25767da4a80121aaaaf2Anatol Pomazau
50263eefd9fb9608432636c903423e43848e69f39dDoug Zongkerextern struct fs_info info;
51263eefd9fb9608432636c903423e43848e69f39dDoug Zongker
52263eefd9fb9608432636c903423e43848e69f39dDoug Zongker
53263eefd9fb9608432636c903423e43848e69f39dDoug Zongkerstatic void usage(char *path)
54263eefd9fb9608432636c903423e43848e69f39dDoug Zongker{
5500740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau	fprintf(stderr, "%s [ -l <len> ] [ -j <journal size> ] [ -b <block_size> ]\n", basename(path));
5600740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau	fprintf(stderr, "    [ -g <blocks per group> ] [ -i <inodes> ] [ -I <inode size> ]\n");
577538cc97e1695608123739d6ef8ff2ee1572aaecJeff Sharkey	fprintf(stderr, "    [ -L <label> ] [ -f ] [ -a <android mountpoint> ] [ -u ]\n");
58aad1accb587aa708012b329c784332dcc9991de6Doug Zongker	fprintf(stderr, "    [ -S file_contexts ] [ -C fs_config ] [ -T timestamp ]\n");
5918785a86a30135ac65b88db9886bfc22d6608849Mohamad Ayyash	fprintf(stderr, "    [ -z | -s ] [ -w ] [ -c ] [ -J ] [ -v ] [ -B <block_list_file> ]\n");
609579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash	fprintf(stderr, "    [ -d <base_alloc_file_in> ] [ -D <base_alloc_file_out> ]\n");
61b89e81dcb9bfa707912d9e370949b250367b0998Thierry Strudel	fprintf(stderr, "    <filename> [[<directory>] <target_out_directory>]\n");
62263eefd9fb9608432636c903423e43848e69f39dDoug Zongker}
63263eefd9fb9608432636c903423e43848e69f39dDoug Zongker
64263eefd9fb9608432636c903423e43848e69f39dDoug Zongkerint main(int argc, char **argv)
65263eefd9fb9608432636c903423e43848e69f39dDoug Zongker{
6600740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau	int opt;
6700740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau	const char *filename = NULL;
6800740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau	const char *directory = NULL;
69b89e81dcb9bfa707912d9e370949b250367b0998Thierry Strudel	const char *target_out_directory = NULL;
70a4460149a5fadc639dbb708c332a75f9717c12d6Colin Cross	char *mountpoint = NULL;
7168e3dfd81ddb9367a0c3e0c72148c23a3227ed48Kenny Root	fs_config_func_t fs_config_func = NULL;
72aad1accb587aa708012b329c784332dcc9991de6Doug Zongker	const char *fs_config_file = NULL;
7300740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau	int gzip = 0;
7400740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau	int sparse = 0;
7500740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau	int crc = 0;
7600740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau	int wipe = 0;
777538cc97e1695608123739d6ef8ff2ee1572aaecJeff Sharkey	int real_uuid = 0;
780349bd9f14d252673a7a25767da4a80121aaaaf2Anatol Pomazau	int fd;
790349bd9f14d252673a7a25767da4a80121aaaaf2Anatol Pomazau	int exitcode;
802057370a2db739d8a7d8a475c9a0773efc3d91a0William Roberts	int verbose = 0;
819526680de97e2bc963a70d1fabffe165a688bb1eDoug Zongker	time_t fixed_time = -1;
822e5c52322d54d0f98d36b499fcaa31a0e84ca87cKenny Root	struct selabel_handle *sehnd = NULL;
83bec598e982301bf2714d37b14e312c9845c7cc0cDoug Zongker	FILE* block_list_file = NULL;
849579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash	FILE* base_alloc_file_in = NULL;
859579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash	FILE* base_alloc_file_out = NULL;
86723f1c75295ce812dc062a537856cd5a54277895Kenny Root#ifndef USE_MINGW
872e5c52322d54d0f98d36b499fcaa31a0e84ca87cKenny Root	struct selinux_opt seopts[] = { { SELABEL_OPT_PATH, "" } };
88b4eca4b24af9c80ebb2a7fa2ba539a48096b7576Stephen Smalley#endif
8900740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau
909579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash	while ((opt = getopt(argc, argv, "l:j:b:g:i:I:L:a:S:T:C:B:d:D:fwzJsctvu")) != -1) {
9100740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		switch (opt) {
9200740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		case 'l':
9300740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			info.len = parse_num(optarg);
9400740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			break;
9500740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		case 'j':
9600740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			info.journal_blocks = parse_num(optarg);
9700740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			break;
9800740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		case 'b':
9900740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			info.block_size = parse_num(optarg);
10000740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			break;
10100740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		case 'g':
10200740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			info.blocks_per_group = parse_num(optarg);
10300740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			break;
10400740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		case 'i':
10500740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			info.inodes = parse_num(optarg);
10600740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			break;
10700740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		case 'I':
10800740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			info.inode_size = parse_num(optarg);
10900740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			break;
11000740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		case 'L':
11100740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			info.label = optarg;
11200740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			break;
11300740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		case 'f':
11400740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			force = 1;
11500740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			break;
11600740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		case 'a':
11768e3dfd81ddb9367a0c3e0c72148c23a3227ed48Kenny Root#ifdef ANDROID
11800740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			mountpoint = optarg;
11968e3dfd81ddb9367a0c3e0c72148c23a3227ed48Kenny Root#else
12068e3dfd81ddb9367a0c3e0c72148c23a3227ed48Kenny Root			fprintf(stderr, "can't set android permissions - built without android support\n");
12168e3dfd81ddb9367a0c3e0c72148c23a3227ed48Kenny Root			usage(argv[0]);
12268e3dfd81ddb9367a0c3e0c72148c23a3227ed48Kenny Root			exit(EXIT_FAILURE);
12368e3dfd81ddb9367a0c3e0c72148c23a3227ed48Kenny Root#endif
12400740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			break;
12500740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		case 'w':
12600740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			wipe = 1;
12700740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			break;
1287538cc97e1695608123739d6ef8ff2ee1572aaecJeff Sharkey		case 'u':
1297538cc97e1695608123739d6ef8ff2ee1572aaecJeff Sharkey			real_uuid = 1;
1307538cc97e1695608123739d6ef8ff2ee1572aaecJeff Sharkey			break;
13100740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		case 'z':
13200740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			gzip = 1;
13300740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			break;
134e4b5ae8ab07e698b95f004c9226000b02f853abcColin Cross		case 'J':
135e4b5ae8ab07e698b95f004c9226000b02f853abcColin Cross			info.no_journal = 1;
136e4b5ae8ab07e698b95f004c9226000b02f853abcColin Cross			break;
137757ace516d8e4350616b5fd10da0c982d3d5ec74Colin Cross		case 'c':
138757ace516d8e4350616b5fd10da0c982d3d5ec74Colin Cross			crc = 1;
139757ace516d8e4350616b5fd10da0c982d3d5ec74Colin Cross			break;
14000740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		case 's':
14100740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			sparse = 1;
14200740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			break;
14300740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		case 't':
14456497f28bd20001dd5f931208e8d948cf2f81b2fColin Cross			fprintf(stderr, "Warning: -t (initialize inode tables) is deprecated\n");
14500740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			break;
1462e5c52322d54d0f98d36b499fcaa31a0e84ca87cKenny Root		case 'S':
147723f1c75295ce812dc062a537856cd5a54277895Kenny Root#ifndef USE_MINGW
1482e5c52322d54d0f98d36b499fcaa31a0e84ca87cKenny Root			seopts[0].value = optarg;
1492e5c52322d54d0f98d36b499fcaa31a0e84ca87cKenny Root			sehnd = selabel_open(SELABEL_CTX_FILE, seopts, 1);
1502e5c52322d54d0f98d36b499fcaa31a0e84ca87cKenny Root			if (!sehnd) {
1512e5c52322d54d0f98d36b499fcaa31a0e84ca87cKenny Root				perror(optarg);
1522e5c52322d54d0f98d36b499fcaa31a0e84ca87cKenny Root				exit(EXIT_FAILURE);
1532e5c52322d54d0f98d36b499fcaa31a0e84ca87cKenny Root			}
154b4eca4b24af9c80ebb2a7fa2ba539a48096b7576Stephen Smalley#endif
155723f1c75295ce812dc062a537856cd5a54277895Kenny Root			break;
1562057370a2db739d8a7d8a475c9a0773efc3d91a0William Roberts		case 'v':
1572057370a2db739d8a7d8a475c9a0773efc3d91a0William Roberts			verbose = 1;
1582057370a2db739d8a7d8a475c9a0773efc3d91a0William Roberts			break;
1599526680de97e2bc963a70d1fabffe165a688bb1eDoug Zongker		case 'T':
1609526680de97e2bc963a70d1fabffe165a688bb1eDoug Zongker			fixed_time = strtoll(optarg, NULL, 0);
1619526680de97e2bc963a70d1fabffe165a688bb1eDoug Zongker			break;
162aad1accb587aa708012b329c784332dcc9991de6Doug Zongker		case 'C':
163aad1accb587aa708012b329c784332dcc9991de6Doug Zongker			fs_config_file = optarg;
164aad1accb587aa708012b329c784332dcc9991de6Doug Zongker			break;
165bec598e982301bf2714d37b14e312c9845c7cc0cDoug Zongker		case 'B':
166bec598e982301bf2714d37b14e312c9845c7cc0cDoug Zongker			block_list_file = fopen(optarg, "w");
167bec598e982301bf2714d37b14e312c9845c7cc0cDoug Zongker			if (block_list_file == NULL) {
168bec598e982301bf2714d37b14e312c9845c7cc0cDoug Zongker				fprintf(stderr, "failed to open block_list_file: %s\n", strerror(errno));
169bec598e982301bf2714d37b14e312c9845c7cc0cDoug Zongker				exit(EXIT_FAILURE);
170bec598e982301bf2714d37b14e312c9845c7cc0cDoug Zongker			}
171bec598e982301bf2714d37b14e312c9845c7cc0cDoug Zongker			break;
1729579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash		case 'd':
1739579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash			base_alloc_file_in = fopen(optarg, "r");
1749579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash			if (base_alloc_file_in == NULL) {
1759579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash				fprintf(stderr, "failed to open base_alloc_file_in: %s\n", strerror(errno));
1769579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash				exit(EXIT_FAILURE);
1779579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash			}
1789579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash			break;
1799579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash		case 'D':
1809579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash			base_alloc_file_out = fopen(optarg, "w");
1819579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash			if (base_alloc_file_out == NULL) {
1829579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash				fprintf(stderr, "failed to open base_alloc_file_out: %s\n", strerror(errno));
1839579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash				exit(EXIT_FAILURE);
1849579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash			}
1859579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash			break;
18600740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		default: /* '?' */
18700740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			usage(argv[0]);
18800740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau			exit(EXIT_FAILURE);
18900740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		}
19000740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau	}
191263eefd9fb9608432636c903423e43848e69f39dDoug Zongker
1925da2f366f8714eafff0337c32f10c314488cfdefrpcraig#if !defined(HOST)
1935da2f366f8714eafff0337c32f10c314488cfdefrpcraig	// Use only if -S option not requested
194a4460149a5fadc639dbb708c332a75f9717c12d6Colin Cross	if (!sehnd && mountpoint) {
1955da2f366f8714eafff0337c32f10c314488cfdefrpcraig		sehnd = selinux_android_file_context_handle();
1965da2f366f8714eafff0337c32f10c314488cfdefrpcraig
1975da2f366f8714eafff0337c32f10c314488cfdefrpcraig		if (!sehnd) {
1985da2f366f8714eafff0337c32f10c314488cfdefrpcraig			perror(optarg);
1995da2f366f8714eafff0337c32f10c314488cfdefrpcraig			exit(EXIT_FAILURE);
2005da2f366f8714eafff0337c32f10c314488cfdefrpcraig		}
2015da2f366f8714eafff0337c32f10c314488cfdefrpcraig	}
2025da2f366f8714eafff0337c32f10c314488cfdefrpcraig#endif
2035da2f366f8714eafff0337c32f10c314488cfdefrpcraig
204aad1accb587aa708012b329c784332dcc9991de6Doug Zongker	if (fs_config_file) {
205aad1accb587aa708012b329c784332dcc9991de6Doug Zongker		if (load_canned_fs_config(fs_config_file) < 0) {
206aad1accb587aa708012b329c784332dcc9991de6Doug Zongker			fprintf(stderr, "failed to load %s\n", fs_config_file);
207aad1accb587aa708012b329c784332dcc9991de6Doug Zongker			exit(EXIT_FAILURE);
208aad1accb587aa708012b329c784332dcc9991de6Doug Zongker		}
209aad1accb587aa708012b329c784332dcc9991de6Doug Zongker		fs_config_func = canned_fs_config;
210aad1accb587aa708012b329c784332dcc9991de6Doug Zongker	} else if (mountpoint) {
211aad1accb587aa708012b329c784332dcc9991de6Doug Zongker		fs_config_func = fs_config;
212aad1accb587aa708012b329c784332dcc9991de6Doug Zongker	}
213aad1accb587aa708012b329c784332dcc9991de6Doug Zongker
21400740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau	if (wipe && sparse) {
21500740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		fprintf(stderr, "Cannot specifiy both wipe and sparse\n");
21600740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		usage(argv[0]);
21700740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		exit(EXIT_FAILURE);
21800740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau	}
21900740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau
22000740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau	if (wipe && gzip) {
22100740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		fprintf(stderr, "Cannot specifiy both wipe and gzip\n");
22200740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		usage(argv[0]);
22300740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		exit(EXIT_FAILURE);
22400740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau	}
22500740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau
22600740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau	if (optind >= argc) {
22700740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		fprintf(stderr, "Expected filename after options\n");
22800740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		usage(argv[0]);
22900740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		exit(EXIT_FAILURE);
23000740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau	}
23100740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau
23200740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau	filename = argv[optind++];
23300740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau
23400740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau	if (optind < argc)
23500740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		directory = argv[optind++];
23600740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau
237b89e81dcb9bfa707912d9e370949b250367b0998Thierry Strudel	if (optind < argc)
238b89e81dcb9bfa707912d9e370949b250367b0998Thierry Strudel		target_out_directory = argv[optind++];
239b89e81dcb9bfa707912d9e370949b250367b0998Thierry Strudel
24000740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau	if (optind < argc) {
24100740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		fprintf(stderr, "Unexpected argument: %s\n", argv[optind]);
24200740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		usage(argv[0]);
24300740cc344cabd6cae6a8cc661c04c9c79b91a71Anatol Pomazau		exit(EXIT_FAILURE);
24475249edab0b22ea9aae9c7278b9f2c196c7d25d4Ken Sumrall	}
24575249edab0b22ea9aae9c7278b9f2c196c7d25d4Ken Sumrall
2460349bd9f14d252673a7a25767da4a80121aaaaf2Anatol Pomazau	if (strcmp(filename, "-")) {
2470349bd9f14d252673a7a25767da4a80121aaaaf2Anatol Pomazau		fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0644);
2480349bd9f14d252673a7a25767da4a80121aaaaf2Anatol Pomazau		if (fd < 0) {
24927f830fdfa2c49c25ce1324990afcd6f00eccee3Colin Cross			perror("open");
2500349bd9f14d252673a7a25767da4a80121aaaaf2Anatol Pomazau			return EXIT_FAILURE;
2510349bd9f14d252673a7a25767da4a80121aaaaf2Anatol Pomazau		}
2520349bd9f14d252673a7a25767da4a80121aaaaf2Anatol Pomazau	} else {
2530349bd9f14d252673a7a25767da4a80121aaaaf2Anatol Pomazau		fd = STDOUT_FILENO;
2540349bd9f14d252673a7a25767da4a80121aaaaf2Anatol Pomazau	}
2550349bd9f14d252673a7a25767da4a80121aaaaf2Anatol Pomazau
256b89e81dcb9bfa707912d9e370949b250367b0998Thierry Strudel	exitcode = make_ext4fs_internal(fd, directory, target_out_directory, mountpoint, fs_config_func, gzip,
2579579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash		sparse, crc, wipe, real_uuid, sehnd, verbose, fixed_time,
2589579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash		block_list_file, base_alloc_file_in, base_alloc_file_out);
2590349bd9f14d252673a7a25767da4a80121aaaaf2Anatol Pomazau	close(fd);
260bec598e982301bf2714d37b14e312c9845c7cc0cDoug Zongker	if (block_list_file)
261bec598e982301bf2714d37b14e312c9845c7cc0cDoug Zongker		fclose(block_list_file);
2629579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash	if (base_alloc_file_out)
2639579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash		fclose(base_alloc_file_out);
2649579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash	if (base_alloc_file_in)
2659579198cd7d5b88b3508f1b00ddd77bd8da60682Mohamad Ayyash		fclose(base_alloc_file_in);
26639ef30bb574a41bba898dd924e081b678365acccJP Abgrall	if (exitcode && strcmp(filename, "-"))
26739ef30bb574a41bba898dd924e081b678365acccJP Abgrall		unlink(filename);
2680349bd9f14d252673a7a25767da4a80121aaaaf2Anatol Pomazau	return exitcode;
269263eefd9fb9608432636c903423e43848e69f39dDoug Zongker}
270