/*
 * timeout - wait for timeout
 *
 * Copyright (c) 2007 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
#include <common.h>
#include <command.h>
#include <linux/stat.h>
#include <errno.h>
#include <getopt.h>
#include <clock.h>

#define TIMEOUT_RETURN	(1 << 0)
#define TIMEOUT_CTRLC	(1 << 1)
#define TIMEOUT_ANYKEY	(1 << 2)
#define TIMEOUT_SILENT	(1 << 3)

static int do_timeout(struct command *cmdtp, int argc, char *argv[])
{
	int timeout = 3, ret = 1;
	int flags = 0, opt, countdown;
	uint64_t start, second;

	while((opt = getopt(argc, argv, "t:crsa")) > 0) {
		switch(opt) {
		case 'r':
			flags |= TIMEOUT_RETURN;
			break;
		case 'c':
			flags |= TIMEOUT_CTRLC;
			break;
		case 'a':
			flags |= TIMEOUT_ANYKEY;
			break;
		case 's':
			flags |= TIMEOUT_SILENT;
			break;
		default:
			return 1;
		}
	}

	if (optind == argc)
		return COMMAND_ERROR_USAGE;

	timeout = simple_strtoul(argv[optind], NULL, 0);

	start = get_time_ns();
	second = start;

	countdown = timeout;

	if (!(flags & TIMEOUT_SILENT))
		printf("%2d", countdown--);

	do {
		if (tstc()) {
			int key = getc();
			if (flags & TIMEOUT_CTRLC && key == 3)
				goto  out;
			if (flags & TIMEOUT_ANYKEY)
				goto out;
			if (flags & TIMEOUT_RETURN && key == '\n')
				goto out;
		}
		if (!(flags & TIMEOUT_SILENT) && is_timeout(second, SECOND)) {
			printf("\b\b%2d", countdown--);
			second += SECOND;
		}
	} while (!is_timeout(start, timeout * SECOND));

	ret = 0;
out:
	if (!(flags & TIMEOUT_SILENT))
		printf("\n");

	return ret;
}

static const __maybe_unused char cmd_timeout_help[] =
"Usage: timeout [OPTION]... <timeout>\n"
"Wait <timeout> seconds for a timeout. Return 1 if the user intervented\n"
"or 0 if a timeout occured\n"
"  -a  interrupt on any key\n"
"  -c  interrupt on ctrl-c\n"
"  -r  interrupt on return\n"
"  -s  silent mode\n";

BAREBOX_CMD_START(timeout)
	.cmd		= do_timeout,
	.usage		= "wait for a specified timeout",
	BAREBOX_CMD_HELP(cmd_timeout_help)
BAREBOX_CMD_END

