12eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash/* 22eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash * Copyright (C) 2016 The Android Open Source Project 32eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash * 42eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash * Licensed under the Apache License, Version 2.0 (the "License"); 52eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash * you may not use this file except in compliance with the License. 62eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash * You may obtain a copy of the License at 72eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash * 82eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash * http://www.apache.org/licenses/LICENSE-2.0 92eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash * 102eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash * Unless required by applicable law or agreed to in writing, software 112eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash * distributed under the License is distributed on an "AS IS" BASIS, 122eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash * See the License for the specific language governing permissions and 142eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash * limitations under the License. 152eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash */ 162eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash 172eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash#include <ctype.h> 182eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash#include <errno.h> 192eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash#include <stdio.h> 202eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash#include <stdlib.h> 212eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash#include <string.h> 222eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash 232eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash#define MAX_PATH 4096 242eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash#define MAX_FILE_VERSION 100 252eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash 262eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyashstatic void usage(char *filename) 272eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash{ 282eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash fprintf(stderr, "Usage: %s input_blk_alloc_file output_base_fs_file \n", filename); 292eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash} 302eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash 312eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyashint main(int argc, char **argv) 322eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash{ 332eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash FILE *blk_alloc_file = NULL, *base_fs_file = NULL; 342eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash char filename[MAX_PATH], file_version[MAX_FILE_VERSION], *spaced_allocs = NULL; 352eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash size_t spaced_allocs_len = 0; 362eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash 372eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash if (argc != 3) { 382eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash usage(argv[0]); 392eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash exit(EXIT_FAILURE); 402eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash } 412eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash blk_alloc_file = fopen(argv[1], "r"); 422eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash if (blk_alloc_file == NULL) { 432eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash fprintf(stderr, "failed to open %s: %s\n", argv[1], strerror(errno)); 442eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash exit(EXIT_FAILURE); 452eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash } 462eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash base_fs_file = fopen(argv[2], "w"); 472eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash if (base_fs_file == NULL) { 482eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash fprintf(stderr, "failed to open %s: %s\n", argv[2], strerror(errno)); 492eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash exit(EXIT_FAILURE); 502eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash } 512eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash if (fscanf(blk_alloc_file, "Base EXT4 version %s", file_version) > 0) { 522eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash char c; 532eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash printf("%s is already in *.base_fs format, just copying into %s...\n", argv[1], argv[2]); 542eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash rewind(blk_alloc_file); 552eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash while ((c = fgetc(blk_alloc_file)) != EOF) { 562eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash fputc(c, base_fs_file); 572eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash } 582eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash return 0; 592eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash } else { 602eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash printf("Converting %s into *.base_fs format as %s...\n", argv[1], argv[2]); 612eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash rewind(blk_alloc_file); 622eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash } 632eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash fprintf(base_fs_file, "Base EXT4 version 1.0\n"); 642eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash while(fscanf(blk_alloc_file, "%s ", filename) != EOF) { 652eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash int i; 662eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash fprintf(base_fs_file, "%s ", filename); 672eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash if (getline(&spaced_allocs, &spaced_allocs_len, blk_alloc_file) == -1) { 682eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash fprintf(stderr, "Bad blk_alloc format\n"); 692eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash exit(EXIT_FAILURE); 702eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash } 712eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash for (i = 0; spaced_allocs[i]; i++) { 722eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash if (spaced_allocs[i] == ' ') { 732eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash if (!isspace(spaced_allocs[i + 1])) fputc(',', base_fs_file); 742eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash } else fputc(spaced_allocs[i], base_fs_file); 752eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash } 762eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash } 772eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash free(spaced_allocs); 782eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash fclose(blk_alloc_file); 792eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash fclose(base_fs_file); 802eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash return 0; 812eb7904ffb4c59e159fccdf47021f95756dc2f19Mohamad Ayyash} 82