/* Copyright 2012 The ChromiumOS Authors
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 *
 * Exports the kernel commandline from a given partition/image.
 */

#include <getopt.h>
#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>

#include "futility.h"
#include "vboot_host.h"

enum {
	OPT_KLOADADDR = 1000,
	OPT_HELP,
};

static const struct option long_opts[] = {
	{"kloadaddr", 1, NULL, OPT_KLOADADDR},
	{"help", 0, 0, OPT_HELP},
	{NULL, 0, NULL, 0}
};

/* Print help and return error */
static void print_help(int argc, char *argv[])
{
	printf("\nUsage:  " MYNAME " %s [--kloadaddr ADDRESS] "
	       "KERNEL_PARTITION\n\n", argv[0]);
}

static int do_dump_kern_cfg(int argc, char *argv[])
{
	char *infile = NULL;
	char *config = NULL;
	uint64_t kernel_body_load_address = USE_PREAMBLE_LOAD_ADDR;
	int parse_error = 0;
	char *e;
	int i;

	while (((i = getopt_long(argc, argv, ":", long_opts, NULL)) != -1) &&
	       !parse_error) {
		switch (i) {
		default:
		case '?':
			/* Unhandled option */
			parse_error = 1;
			break;

		case 0:
			/* silently handled option */
			break;

		case OPT_KLOADADDR:
			kernel_body_load_address = strtoul(optarg, &e, 0);
			if (!*optarg || (e && *e)) {
				ERROR("Invalid --kloadaddr\n");
				parse_error = 1;
			}
			break;

		case OPT_HELP:
			print_help(argc, argv);
			return 0;
		}
	}

	if (optind >= argc) {
		ERROR("Expected argument after options\n");
		parse_error = 1;
	} else
		infile = argv[optind];

	if (parse_error) {
		print_help(argc, argv);
		return 1;
	}

	if (!infile || !*infile) {
		ERROR("Must specify filename\n");
		return 1;
	}

	config = FindKernelConfig(infile, kernel_body_load_address);
	if (!config)
		return 1;

	printf("%s", config);

	free(config);
	return 0;
}

DECLARE_FUTIL_COMMAND(dump_kernel_config, do_dump_kern_cfg, VBOOT_VERSION_ALL,
		      "Prints the kernel command line");
