#include <common.h>
#include <command.h>
#include <fs.h>
#include <fcntl.h>
#include <ioctl.h>
#include <errno.h>
#include <getopt.h>
#include <linux/mtd/mtd.h>
#include <linux/kernel.h>
#include <linux/mtd/mtd-abi.h>
#include <mtd/ubi-user.h>
#include <ubi-media.h>

static int do_ubimkvol(struct command *cmdtp, int argc, char *argv[])
{
	struct ubi_mkvol_req req;
	int fd, ret;
	size_t size;

	if (argc != 4)
		return COMMAND_ERROR_USAGE;

	size = strtoul_suffix(argv[3], NULL, 0);
	req.name_len = min_t(int, strlen(argv[2]), UBI_VOL_NAME_MAX);
	strncpy(req.name, argv[2], req.name_len);
	req.name[req.name_len] = 0;

	req.vol_type = UBI_DYNAMIC_VOLUME;
	req.bytes = size;
	req.vol_id = UBI_VOL_NUM_AUTO;
	req.alignment = 1;

	fd = open(argv[1], O_WRONLY);
	if (fd < 0) {
		perror("open");
		return 1;
	}

	ret = ioctl(fd, UBI_IOCMKVOL, &req);
	if (ret)
		printf("failed to create: %s\n", strerror(-ret));
	close(fd);

	return ret ? 1 : 0;
}

static const __maybe_unused char cmd_ubimkvol_help[] =
"Usage: ubimkvol <ubidev> <name> <size>\n"
"Create an ubi volume on <ubidev> with name <name> and size <size>\n"
"If size os zero all available space is used for the volume\n";

BAREBOX_CMD_START(ubimkvol)
	.cmd		= do_ubimkvol,
	.usage		= "create an ubi volume",
	BAREBOX_CMD_HELP(cmd_ubimkvol_help)
BAREBOX_CMD_END


static int do_ubiattach(struct command *cmdtp, int argc, char *argv[])
{
	struct mtd_info_user user;
	int fd, ret;

	if (argc != 2)
		return COMMAND_ERROR_USAGE;

	fd = open(argv[1], O_RDWR);
	if (fd < 0) {
		perror("open");
		return 1;
	}

	ret = ioctl(fd, MEMGETINFO, &user);
	if (!ret)
		ret = ubi_attach_mtd_dev(user.mtd, UBI_DEV_NUM_AUTO, 0);

	if (ret)
		printf("failed to attach: %s\n", strerror(-ret));

	close(fd);

	return ret ? 1 : 0;
}

static const __maybe_unused char cmd_ubiattach_help[] =
"Usage: ubiattach <mtddev>\n"
"Attach <mtddev> to ubi\n";

BAREBOX_CMD_START(ubiattach)
	.cmd		= do_ubiattach,
	.usage		= "attach a mtd dev to ubi",
	BAREBOX_CMD_HELP(cmd_ubiattach_help)
BAREBOX_CMD_END

static int do_ubirmvol(struct command *cmdtp, int argc, char *argv[])
{
	struct ubi_mkvol_req req;
	int fd, ret;

	if (argc != 3)
		return COMMAND_ERROR_USAGE;

	strncpy(req.name, argv[2], UBI_VOL_NAME_MAX);
	req.name[UBI_VOL_NAME_MAX] = 0;

	fd = open(argv[1], O_WRONLY);
	if (fd < 0) {
		perror("open");
		return 1;
	}

	ret = ioctl(fd, UBI_IOCRMVOL, &req);
	if (ret)
		printf("failed to delete: %s\n", strerror(-ret));
	close(fd);

	return ret ? 1 : 0;
}

static const __maybe_unused char cmd_ubirmvol_help[] =
"Usage: ubirmvol <ubidev> <name>\n"
"Delete ubi volume <name> from <ubidev>\n";

BAREBOX_CMD_START(ubirmvol)
	.cmd		= do_ubirmvol,
	.usage		= "delete an ubi volume",
	BAREBOX_CMD_HELP(cmd_ubirmvol_help)
BAREBOX_CMD_END

