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