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