/****************************************************************************
* [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[MAX_STRING_LENGTH];
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[MAX_STRING_LENGTH];
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[MAX_STRING_LENGTH];
char my_name[MAX_STRING_LENGTH];
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[MAX_INPUT_LENGTH];
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char *arg3 = NULL;
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;
arg3 = arg2;
if( arg3[0] == '*' )
arg3++;
if( arg3[strlen( arg3 ) - 1] == '*' )
arg3[strlen( arg3 ) - 1] = '\0';
for( temp = immortal_host_start; temp; temp = temp->next )
{
if( !str_cmp( arg1, temp->name ) && !str_cmp( arg3, 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;
}