/* CLI utility for creating rmodules */
/* SPDX-License-Identifier: GPL-2.0-only */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <getopt.h>
#include "common.h"
#include "rmodule.h"

static const char *optstring  = "i:o:vh?";
static struct option long_options[] = {
	{"inelf",        required_argument, 0, 'i' },
	{"outelf",       required_argument, 0, 'o' },
	{"verbose",      no_argument,       0, 'v' },
	{"help",         no_argument,       0, 'h' },
	{NULL,           0,                 0,  0  }
};

static void usage(char *name)
{
	printf(
		"rmodtool: utility for creating rmodules\n\n"
		"USAGE: %s [-h] [-v] <-i|--inelf name> <-o|--outelf name>\n",
		name
	);
}

int main(int argc, char *argv[])
{
	int c;
	struct buffer elfin;
	struct buffer elfout;
	const char *input_file = NULL;
	const char *output_file = NULL;

	if (argc < 3) {
		usage(argv[0]);
		return 1;
	}

	while (1) {
		int optindex = 0;

		c = getopt_long(argc, argv, optstring, long_options, &optindex);

		if (c == -1)
			break;

		switch (c) {
		case 'i':
			input_file = optarg;
			break;
		case 'h':
			usage(argv[0]);
			return 1;
		case 'o':
			output_file = optarg;
			break;
		case 'v':
			verbose++;
			break;
		default:
			break;
		}
	}

	if (input_file == NULL || output_file == NULL) {
		usage(argv[0]);
		return 1;
	}

	if (buffer_from_file(&elfin, input_file)) {
		ERROR("Couldn't read in file '%s'.\n", input_file);
		return 1;
	}

	if (rmodule_create(&elfin, &elfout)) {
		ERROR("Unable to create rmodule from '%s'.\n", input_file);
		return 1;
	}

	if (buffer_write_file(&elfout, output_file)) {
		ERROR("Unable to write rmodule elf '%s'.\n", output_file);
		return 1;
	}

	return 0;
}
