/****************************************************************************
* [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame | \\._.// *
* -----------------------------------------------------------| (0...0) *
* SMAUG 1.4 (C) 1994, 1995, 1996, 1998 by Derek Snider | ).:.( *
* -----------------------------------------------------------| {o o} *
* SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus, | / ' ' \ *
* Scryn, Rennard, Swordbearer, Gorog, Grishnakh, Nivek, |~'~.VxvxV.~'~*
* Tricops and Fireblade | *
* ------------------------------------------------------------------------ *
* Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* ------------------------------------------------------------------------ *
* Immortal Host module by Shaddai *
****************************************************************************/
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include "mud.h"
/*
* This loads the Immortal host data structure to keep certain immortals
* from logging on from certain sites... IE keep hackers out of the high
* level immortals. Shaddai July 27, 1997
*/
#if defined(KEY)
#undef KEY
#endif
#define KEY( literal, field, value ) \
if ( !str_cmp( word, literal ) ) \
{ \
field = value; \
fMatch = TRUE; \
break; \
}
int load_imm_host()
{
FILE *fp;
char *word;
char buf[MSL];
bool my_continue = TRUE;
bool fMatch = FALSE;
IMMORTAL_HOST *host;
if ((fp = fopen(IMM_HOST_FILE, "r")) == NULL)
{
log_string("No immortal host data");
return rNONE;
}
while (my_continue)
{
word = feof(fp) ? "#END" : fread_word(fp);
fMatch = FALSE;
switch (UPPER(word[0]))
{
case '#':
if (!str_cmp(word, "#END"))
{
fclose(fp);
fMatch = TRUE;
my_continue = FALSE;
}
break;
case 'S':
if (!str_cmp(word, "Start"))
{
CREATE(host, IMMORTAL_HOST, 1);
LINK(host, immortal_host_start, immortal_host_end, next, prev);
fread_imm_host(fp, host);
fMatch = TRUE;
}
break;
}
if (!fMatch)
{
sprintf(buf, "Load_imm_host: no match: %s", word);
bug(buf, 0);
}
}
log_string("Done.");
return rNONE;
}
/*
* This function reads one immortal host to a file.
* Shaddai July 27, 1997
*/
int fread_imm_host(FILE * fp, IMMORTAL_HOST * data)
{
char buf[MSL];
char *word;
bool fMatch;
int temp;
for (;;)
{
word = feof(fp) ? "End" : fread_word(fp);
fMatch = FALSE;
switch (UPPER(word[0]))
{
case 'E':
if (!str_cmp(word, "End"))
return rNONE;
case 'H':
KEY("Host", data->host, fread_string_nohash(fp));
break;
case 'N':
KEY("Name", data->name, fread_string_nohash(fp));
break;
case 'P':
if (!str_cmp(word, "Prefix"))
{
temp = fread_number(fp);
if (temp)
data->prefix = TRUE;
else
data->prefix = FALSE;
fMatch = TRUE;
}
break;
case 'S':
if (!str_cmp(word, "Suffix"))
{
temp = fread_number(fp);
if (temp)
data->suffix = TRUE;
else
data->suffix = FALSE;
fMatch = TRUE;
}
break;
}
if (!fMatch)
{
sprintf(buf, "Fread_immortal_host: no match: %s", word);
bug(buf, 0);
}
}
return rNONE;
}
bool check_immortal_domain(CHAR_DATA * ch, char *host)
{
bool found = FALSE;
IMMORTAL_HOST *temp;
char my_host[MSL];
char my_name[MSL];
int i = 0;
for (i = 0; i < strlen(host); i++)
my_host[i] = LOWER(host[i]);
my_host[i] = '\0';
for (i = 0; i < strlen(ch->name); i++)
my_name[i] = LOWER(ch->name[i]);
my_name[i] = '\0';
for (temp = immortal_host_start; temp; temp = temp->next)
{
if (!str_cmp(my_name, strlower(temp->name)))
{
found = TRUE;
if (temp->prefix && temp->suffix && strstr(temp->host, my_host))
return TRUE;
else if (temp->prefix && !str_suffix(temp->host, my_host))
return TRUE;
else if (temp->suffix && !str_prefix(temp->host, my_host))
return TRUE;
else if (!str_cmp(temp->host, my_host))
{
return TRUE;
}
}
}
if (!found)
return TRUE;
else
return FALSE;
}
void do_add_imm_host(CHAR_DATA * ch, char *argument)
{
char type[MIL];
char arg1[MIL];
char arg2[MIL];
char *name;
IMMORTAL_HOST *temp, *host;
argument = one_argument(argument, type);
argument = one_argument(argument, arg1);
argument = one_argument(argument, arg2);
set_char_color(AT_IMMORT, ch);
if (type[0] == '\0')
{
if (immortal_host_start == NULL)
{
send_to_char("No immortals are protected at this time.\n\r", ch);
return;
}
send_to_char("Immortal Host\n\r", ch);
set_char_color(AT_PLAIN, ch);
for (temp = immortal_host_start; temp; temp = temp->next)
ch_printf(ch, "%-8s %c%s%c\n\r", temp->name, (temp->prefix ? '*' : ' '), temp->host, (temp->suffix ? '*' : ' '));
return;
}
/* Ok we have a new entry make sure it doesn't contain a ~ */
if (!str_cmp(type, "save"))
{
do_write_imm_host();
send_to_char("Done.\n\r", ch);
return;
}
if (arg2[0] == '\0' || arg1[0] == '\0')
{
send_to_char("Syntax: immhost add <name> <host>\n\r", ch);
send_to_char("Syntax: immhost delete <name> <host>\n\r", ch);
send_to_char("Syntax: immhost save\n\r", ch);
return;
}
if (!str_cmp(type, "delete"))
{
IMMORTAL_HOST *it = NULL;
for (temp = immortal_host_start; temp; temp = temp->next)
{
if (!str_cmp(arg1, temp->name) && !str_cmp(arg2, temp->host))
{
it = temp;
break;
}
}
if (it == NULL)
{
send_to_char("Didn't find that entry.\n\r", ch);
return;
}
DISPOSE(temp->name);
DISPOSE(temp->host);
UNLINK(it, immortal_host_start, immortal_host_end, next, prev);
DISPOSE(it);
}
else if (!str_cmp(type, "add"))
{
bool prefix = FALSE, suffix = FALSE;
IMMORTAL_HOST *temp;
int i;
smash_tilde(arg1);
smash_tilde(arg2);
name = arg2;
if (arg2[0] == '*')
{
prefix = TRUE;
name++;
}
if (name[strlen(name) - 1] == '*')
{
suffix = TRUE;
name[strlen(name) - 1] = '\0';
}
arg1[0] = toupper(arg1[0]);
for (i = 0; i < (int) strlen(name); i++)
name[i] = LOWER(name[i]);
for (temp = immortal_host_start; temp; temp = temp->next)
{
if (!str_cmp(temp->name, arg1) && !str_cmp(temp->host, name))
{
send_to_char("Entry already exists.\n\r", ch);
return;
}
}
CREATE(host, IMMORTAL_HOST, 1);
host->name = str_dup(arg1);
host->host = str_dup(name);
host->prefix = prefix;
host->suffix = suffix;
LINK(host, immortal_host_start, immortal_host_end, next, prev);
}
else
{
send_to_char("Syntax: immhost add <name> <host>\n\r", ch);
send_to_char("Syntax: immhost delete <name> <host>\n\r", ch);
send_to_char("Syntax: immhost save\n\r", ch);
return;
}
send_to_char("Done.\n\r", ch);
return;
}
void do_write_imm_host(void)
{
IMMORTAL_HOST *temp;
FILE *fp;
fclose(fpReserve);
if (immortal_host_start == NULL)
{
unlink(IMM_HOST_FILE);
fpReserve = fopen(NULL_FILE, "r");
return;
}
if ((fp = fopen(IMM_HOST_FILE, "w")) == NULL)
{
bug("Do_write_imm_host: fopen", 0);
perror(IMM_HOST_FILE);
fpReserve = fopen(NULL_FILE, "r");
return;
}
for (temp = immortal_host_start; temp; temp = temp->next)
{
fprintf(fp, "Start\n");
fprintf(fp, "Name\t%s~\n", temp->name);
fprintf(fp, "Host\t%s~\n", temp->host);
if (temp->prefix)
fprintf(fp, "Prefix\t1\n");
if (temp->suffix)
fprintf(fp, "Suffix\t1\n");
fprintf(fp, "End\n");
}
fprintf(fp, "#END\n");
fclose(fp);
fpReserve = fopen(NULL_FILE, "r");
return;
}