/*
 * Copyright (C) 2000 Lennert Buytenhek
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <getopt.h>

#include "libbridge.h"
#include "config.h"

#include "brctl.h"

static void help()
{
	printf("Usage: brctl [commands]\n");
	printf("commands:\n");
	command_helpall();
}

int main(int argc, char *const* argv)
{
	const struct command *cmd;
	int f;
	static const struct option options[] = {
		{ .name = "help", .val = 'h' },
		{ .name = "version", .val = 'V' },
		{ 0 }
	};

	while ((f = getopt_long(argc, argv, "Vh", options, NULL)) != EOF) 
		switch(f) {
		case 'h':
			help();
			return 0;
		case 'V':
			printf("%s, %s\n", PACKAGE_NAME, PACKAGE_VERSION);
			return 0;
		default:
			fprintf(stderr, "Unknown option '%c'\n", f);
			goto help;
		}
			
	if (argc == optind)
		goto help;
	
	if (br_init()) {
		fprintf(stderr, "can't setup bridge control: %s\n",
			strerror(errno));
		return 1;
	}

	argc -= optind;
	argv += optind;
	if ((cmd = command_lookup(*argv)) == NULL) {
		fprintf(stderr, "never heard of command [%s]\n", *argv);
		goto help;
	}
	
	if (argc < cmd->nargs + 1) {
		printf("Incorrect number of arguments for command\n");
		printf("Usage: brctl %s %s\n", cmd->name, cmd->help);
		return 1;
	}

	return cmd->func(argc, argv);

help:
	help();
	return 1;
}
