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