TinyMAZE/
TinyMAZE/config/
TinyMAZE/doc/
TinyMAZE/run/msgs/
TinyMAZE/src/
TinyMAZE/src/db/
TinyMAZE/src/ident/
TinyMAZE/src/io/
TinyMAZE/src/prog/
TinyMAZE/src/softcode/
TinyMAZE/src/util/
#include <stdio.h>
#include "externs.h"

static char **host_lockouts;

void read_host_lockouts(void)
{
  const char *filename = "../config/hosts.lockout";
  FILE *fp;
  char *read;
  int ctr = 0;

  host_lockouts = (char **)stack_alloc(sizeof(char *), 1, 0);
  host_lockouts[0] = NULL;

  if(!(fp = fopen(filename, "r")))
    return;

  while((read = get_next_line(fp)))
  {
    host_lockouts =
      (char **)stack_realloc(host_lockouts, sizeof(char *)*(ctr+2));
    host_lockouts[ctr] = stack_string_alloc(read, 1);
    host_lockouts[ctr+1] = NULL;
  }

  fclose(fp);
}

void write_host_lockouts(void)
{
  const char *filename = "../config/hosts.lockout";
  FILE *fp;
  int i;

  if(!(fp = fopen(filename, "w")))
    return;

  fprintf(fp, "# Add a list of IP addresses you want denied access.\n");
  fprintf(fp, "# The list should consist of 1 IP per line.\n");
  fprintf(fp, "# The address may contain wildcards (i.e. 127.0.0.* or 12.34.5?.78)\n");

  for(i = 0;host_lockouts[i];i++)
  {
    fprintf(fp, "%s\n", host_lockouts[i]);
    stack_free(host_lockouts[i]);
  }
  stack_free(host_lockouts);

  fclose(fp);
}

bool chk_host_lockout(int sock, char *addr)
{
  char *msg = "Sorry, the host you're connecting from has been denied.\r\n";
  int i;

  for(i = 0;host_lockouts[i];i++)
    if(wildcard_match(host_lockouts[i], addr, NULL))
    {
      write(sock, msg, strlen(msg));
      log_io(tprintf("New connection from %s has been denied due to lockout.",
        addr));
      close(sock);
      return(0);
    }

  return(1);
}

static void do_hostlockout_list(OBJ *player, char *arg)
{
  int i;

  if(!*host_lockouts)
  {
    notify(player, "There are no host lockouts.");
    return;
  }

  notify(player, "|+Y|Host Lockouts|+W|:");

  for(i = 0;host_lockouts[i];i++)
    notify(player, tprintf("|+B|  %s", host_lockouts[i]));

  notify(player, tprintf("|+C|%d |+B|host lockout%s",
    i, check_plural(i, "", "s")));
}

static void do_hostlockout_add(OBJ *player, char *arg)
{
  int i;

  for(i = 0;host_lockouts[i];++i);  /* Whole loop */

  host_lockouts = (char **)stack_realloc(host_lockouts, sizeof(char *)*(i+2));
  SET(host_lockouts[i], arg);
  host_lockouts[i+1] = NULL;

  notify(player, tprintf("Host '%s' has been locked out.", arg));
}

static void do_hostlockout_delete(OBJ *player, char *arg)
{
  int i;

  for(i = 0;host_lockouts[i];++i)
    if(!strcmp(host_lockouts[i], arg))
      break;

  if(!host_lockouts[i])
  {
    notify(player, tprintf("No host lockout match for '%s'", arg));
    return;
  }

  stack_free(host_lockouts[i]);

  while(host_lockouts[i+1])
  {
    host_lockouts[i] = host_lockouts[i+1];
    i++;
  }
  host_lockouts[i] = NULL;
  host_lockouts = (char **)stack_realloc(host_lockouts, sizeof(char *)*(i+1));

  notify(player, tprintf("Host '%s' is no longer locked out.", arg));
}

void do_hostlockout(OBJ *player, char *arg1, char *arg2)
{
  SUBCOMMAND *c, commands[] =
  {
    { "list",   do_hostlockout_list,   1 },
    { "add",    do_hostlockout_add,    1 },
    { "delete", do_hostlockout_delete, 1 },
    { NULL },
  };

  if(!(c = subcommand_match(player, arg1, commands, NULL)))
    subcommand_print(player, "+hostlockout", commands);
  else
    c->func(player, arg2);
}