1a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner/* 2a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner * Copyright (C) 2010 The Android Open Source Project 3a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner * 4a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner * Licensed under the Apache License, Version 2.0 (the "License"); 5a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner * you may not use this file except in compliance with the License. 6a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner * You may obtain a copy of the License at 7a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner * 8a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner * http://www.apache.org/licenses/LICENSE-2.0 9a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner * 10a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner * Unless required by applicable law or agreed to in writing, software 11a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner * distributed under the License is distributed on an "AS IS" BASIS, 12a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner * See the License for the specific language governing permissions and 14a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner * limitations under the License. 15a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner */ 16a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner 17a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner#include <sparse/sparse.h> 18a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner 19a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner#include <fcntl.h> 20a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner#include <stdbool.h> 21a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner#include <stdio.h> 22a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner#include <stdlib.h> 23a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner#include <string.h> 24a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner#include <sys/types.h> 25a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner#include <sys/stat.h> 26a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner#include <sys/types.h> 27a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner#include <unistd.h> 28a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner 29a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner#ifndef O_BINARY 30a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner#define O_BINARY 0 31a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner#endif 32a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner 33a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turnervoid usage() 34a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner{ 35a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner fprintf(stderr, "Usage: simg2img <sparse_image_files> <raw_image_file>\n"); 36a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner} 37a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner 38a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turnerint main(int argc, char *argv[]) 39a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner{ 40a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner int in; 41a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner int out; 42a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner int i; 43a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner int ret; 44a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner struct sparse_file *s; 45a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner 46a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner if (argc < 3) { 47a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner usage(); 48a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner exit(-1); 49a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner } 50a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner 51a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner out = open(argv[argc - 1], O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0664); 52a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner if (out < 0) { 53a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner fprintf(stderr, "Cannot open output file %s\n", argv[argc - 1]); 54a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner exit(-1); 55a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner } 56a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner 57a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner for (i = 1; i < argc - 1; i++) { 58a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner if (strcmp(argv[i], "-") == 0) { 59a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner in = STDIN_FILENO; 60a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner } else { 61a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner in = open(argv[i], O_RDONLY | O_BINARY); 62a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner if (in < 0) { 63a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner fprintf(stderr, "Cannot open input file %s\n", argv[i]); 64a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner exit(-1); 65a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner } 66a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner } 67a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner 68a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner s = sparse_file_import(in, true, false); 69a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner if (!s) { 70a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner fprintf(stderr, "Failed to read sparse file\n"); 71a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner exit(-1); 72a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner } 73a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner 74a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner lseek(out, SEEK_SET, 0); 75a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner 76a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner ret = sparse_file_write(s, out, false, false, false); 77a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner if (ret < 0) { 78a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner fprintf(stderr, "Cannot write output file\n"); 79a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner exit(-1); 80a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner } 81a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner sparse_file_destroy(s); 82a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner close(in); 83a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner } 84a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner 85a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner close(out); 86a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner 87a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner exit(0); 88a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner} 89a2394cf2fab37ca4ec91e57db74f06f15a3656beDavid 'Digit' Turner 90