128fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross/* 228fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * Copyright (C) 2010 The Android Open Source Project 328fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 428fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * Licensed under the Apache License, Version 2.0 (the "License"); 528fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * you may not use this file except in compliance with the License. 628fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * You may obtain a copy of the License at 728fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 828fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * http://www.apache.org/licenses/LICENSE-2.0 928fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * 1028fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * Unless required by applicable law or agreed to in writing, software 1128fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * distributed under the License is distributed on an "AS IS" BASIS, 1228fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1328fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * See the License for the specific language governing permissions and 1428fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross * limitations under the License. 1528fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross */ 1628fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross 170c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross#include <sparse/sparse.h> 1828fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross 1928fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross#include <fcntl.h> 200c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross#include <stdbool.h> 2128fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross#include <stdio.h> 2228fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross#include <stdlib.h> 2328fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross#include <string.h> 2428fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross#include <sys/types.h> 2528fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross#include <sys/stat.h> 2628fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross#include <sys/types.h> 2728fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross#include <unistd.h> 2828fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross 29bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross#ifndef O_BINARY 30bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross#define O_BINARY 0 31bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross#endif 32bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross 3328fa5bc347390480fe190294c6c385b6a9f0d68bColin Crossvoid usage() 3428fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross{ 35bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross fprintf(stderr, "Usage: simg2img <sparse_image_files> <raw_image_file>\n"); 3628fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross} 3728fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross 3828fa5bc347390480fe190294c6c385b6a9f0d68bColin Crossint main(int argc, char *argv[]) 3928fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross{ 4028fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross int in; 4128fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross int out; 42bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross int i; 430c4c47f88dfc15cada154a1cf9b4db88b49890f0Colin Cross struct sparse_file *s; 4428fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross 45bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross if (argc < 3) { 4628fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross usage(); 4728fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross exit(-1); 4828fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross } 4928fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross 50bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross out = open(argv[argc - 1], O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0664); 51bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross if (out < 0) { 52bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross fprintf(stderr, "Cannot open output file %s\n", argv[argc - 1]); 53bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross exit(-1); 5428fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross } 5528fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross 56bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross for (i = 1; i < argc - 1; i++) { 57bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross if (strcmp(argv[i], "-") == 0) { 58bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross in = STDIN_FILENO; 59bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross } else { 60bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross in = open(argv[i], O_RDONLY | O_BINARY); 61bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross if (in < 0) { 62bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross fprintf(stderr, "Cannot open input file %s\n", argv[i]); 63bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross exit(-1); 64bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross } 65bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross } 66bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross 67bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross s = sparse_file_import(in, true, false); 68bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross if (!s) { 69bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross fprintf(stderr, "Failed to read sparse file\n"); 7028fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross exit(-1); 7128fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross } 7228fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross 73f21f0f16e7056eb5c9029e4aa82b17958a744bb7caozhiyuan if (lseek(out, 0, SEEK_SET) == -1) { 74f21f0f16e7056eb5c9029e4aa82b17958a744bb7caozhiyuan perror("lseek failed"); 75f21f0f16e7056eb5c9029e4aa82b17958a744bb7caozhiyuan exit(EXIT_FAILURE); 76f21f0f16e7056eb5c9029e4aa82b17958a744bb7caozhiyuan } 77bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross 78f21f0f16e7056eb5c9029e4aa82b17958a744bb7caozhiyuan if (sparse_file_write(s, out, false, false, false) < 0) { 79bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross fprintf(stderr, "Cannot write output file\n"); 80bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross exit(-1); 81bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross } 82bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross sparse_file_destroy(s); 83bdc6d39ed6c09199a5d806f29b71b44cbb27c5c2Colin Cross close(in); 8428fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross } 8528fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross 8628fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross close(out); 8728fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross 8828fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross exit(0); 8928fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross} 9028fa5bc347390480fe190294c6c385b6a9f0d68bColin Cross 91