/**************************************************************************** * [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; }