/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#define _FILE_OFFSET_BITS 64
#define _LARGEFILE64_SOURCE 1

#include <fcntl.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

#include <sparse/sparse.h>

#ifndef O_BINARY
#define O_BINARY 0
#endif

#if defined(__APPLE__) && defined(__MACH__)
#define lseek64 lseek
#define off64_t off_t
#endif

void usage()
{
    fprintf(stderr, "Usage: img2simg <raw_image_file> <sparse_image_file> [<block_size>]\n");
}

int main(int argc, char *argv[])
{
	int in;
	int out;
	unsigned int i;
	int ret;
	struct sparse_file *s;
	unsigned int block_size = 4096;
	off64_t len;

	if (argc < 3 || argc > 4) {
		usage();
		exit(-1);
	}

	if (argc == 4) {
		block_size = atoi(argv[3]);
	}

	if (block_size < 1024 || block_size % 4 != 0) {
		usage();
		exit(-1);
	}

	if (strcmp(argv[1], "-") == 0) {
		in = STDIN_FILENO;
	} else {
		in = open(argv[1], O_RDONLY | O_BINARY);
		if (in < 0) {
			fprintf(stderr, "Cannot open input file %s\n", argv[1]);
			exit(-1);
		}
	}

	if (strcmp(argv[2], "-") == 0) {
		out = STDOUT_FILENO;
	} else {
		out = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0664);
		if (out < 0) {
			fprintf(stderr, "Cannot open output file %s\n", argv[2]);
			exit(-1);
		}
	}

	len = lseek64(in, 0, SEEK_END);
	lseek64(in, 0, SEEK_SET);

	s = sparse_file_new(block_size, len);
	if (!s) {
		fprintf(stderr, "Failed to create sparse file\n");
		exit(-1);
	}

	sparse_file_verbose(s);
	ret = sparse_file_read(s, in, false, false);
	if (ret) {
		fprintf(stderr, "Failed to read file\n");
		exit(-1);
	}

	ret = sparse_file_write(s, out, false, true, false);
	if (ret) {
		fprintf(stderr, "Failed to write sparse file\n");
		exit(-1);
	}

	close(in);
	close(out);

	exit(0);
}
