/*
 * libxt_LED.c - shared library add-on to iptables to add customized LED
 *               trigger support.
 *
 * (C) 2008 Adam Nielsen <a.nielsen@shikadi.net>
 *
 * 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.
 *
 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <xtables.h>
#include <linux/netfilter/xt_LED.h>

enum {
	O_LED_TRIGGER_ID = 0,
	O_LED_DELAY,
	O_LED_ALWAYS_BLINK,
};

#define s struct xt_led_info
static const struct xt_option_entry LED_opts[] = {
	{.name = "led-trigger-id", .id = O_LED_TRIGGER_ID,
	 .flags = XTOPT_MAND, .type = XTTYPE_STRING, .min = 0,
	 .max = sizeof(((struct xt_led_info *)NULL)->id) -
	        sizeof("netfilter-")},
	{.name = "led-delay", .id = O_LED_DELAY, .type = XTTYPE_STRING},
	{.name = "led-always-blink", .id = O_LED_ALWAYS_BLINK,
	 .type = XTTYPE_NONE},
	XTOPT_TABLEEND,
};
#undef s

static void LED_help(void)
{
	printf(
"LED target options:\n"
"--led-trigger-id name           suffix for led trigger name\n"
"--led-delay ms                  leave the LED on for this number of\n"
"                                milliseconds after triggering.\n"
"--led-always-blink              blink on arriving packets, even if\n"
"                                the LED is already on.\n"
	);
}

static void LED_parse(struct xt_option_call *cb)
{
	struct xt_led_info *led = cb->data;

	xtables_option_parse(cb);
	switch (cb->entry->id) {
	case O_LED_TRIGGER_ID:
		snprintf(led->id, sizeof(led->id), "netfilter-%s", cb->arg);
		break;
	case O_LED_DELAY:
		if (strncasecmp(cb->arg, "inf", 3) == 0)
			led->delay = -1;
		else if (!xtables_strtoui(cb->arg, NULL, &led->delay, 0, UINT32_MAX))
			xtables_error(PARAMETER_PROBLEM,
				"Delay value must be within range 0..%u",
				UINT32_MAX);
		break;
	case O_LED_ALWAYS_BLINK:
		led->always_blink = 1;
		break;
	}
}

static void LED_print(const void *ip, const struct xt_entry_target *target,
		      int numeric)
{
	const struct xt_led_info *led = (void *)target->data;
	const char *id = led->id + strlen("netfilter-"); /* trim off prefix */

	printf(" led-trigger-id:\"");
	/* Escape double quotes and backslashes in the ID */
	while (*id != '\0') {
		if (*id == '"' || *id == '\\')
			printf("\\");
		printf("%c", *id++);
	}
	printf("\"");

	if (led->delay == -1)
		printf(" led-delay:inf");
	else
		printf(" led-delay:%dms", led->delay);

	if (led->always_blink)
		printf(" led-always-blink");
}

static void LED_save(const void *ip, const struct xt_entry_target *target)
{
	const struct xt_led_info *led = (void *)target->data;
	const char *id = led->id + strlen("netfilter-"); /* trim off prefix */

	printf(" --led-trigger-id \"");
	/* Escape double quotes and backslashes in the ID */
	while (*id != '\0') {
		if (*id == '"' || *id == '\\')
			printf("\\");
		printf("%c", *id++);
	}
	printf("\"");

	/* Only print the delay if it's not zero (the default) */
	if (led->delay > 0)
		printf(" --led-delay %d", led->delay);
	else if (led->delay == -1)
		printf(" --led-delay inf");

	/* Only print always_blink if it's not set to the default */
	if (led->always_blink)
		printf(" --led-always-blink");
}

static struct xtables_target led_tg_reg = {
	.version       = XTABLES_VERSION,
	.name          = "LED",
	.family        = PF_UNSPEC,
	.revision      = 0,
	.size          = XT_ALIGN(sizeof(struct xt_led_info)),
	.userspacesize = offsetof(struct xt_led_info, internal_data),
	.help          = LED_help,
	.print         = LED_print,
	.save          = LED_save,
	.x6_parse      = LED_parse,
	.x6_options    = LED_opts,
};

void _init(void)
{
	xtables_register_target(&led_tg_reg);
}
