/* // File : compat_0.9.18.2.c // Purpose : Simulated efuns to replace efuns removed from the MudOS Driver // between versions 0.9.18.1 and 0.9.18.2 // 93-09-21 : Pallando wrote simul_efun versions of: log_file(), extract(), // first_inventory(), next_inventory(), shadowp() and cat() // Missing : next_living(), add_worth(), add_verb() and add_xverb() */ #include <config.h> #include <uid.h> #include <commands.h> #define CAT_LINES_DEFAULT 24 #define CAT_LINES_MAXIMUM 40 #define MAX_LOG_SIZE 200000 varargs int cat( string path, int start, int num ) { string text; int trun; if( !path ) return 0; // syntax error if( !start ) start = 0; if( !num ) num = CAT_LINES_DEFAULT; if( num > CAT_LINES_MAXIMUM ) { num = CAT_LINES_MAXIMUM; trun = 1; } seteuid( geteuid( previous_object() ) ); if( text = read_file( path, start, num ) ) { if( trun && ( strlen( text ) < file_size( path ) ) ) text += "***TRUNCATED***\n"; message( "cat", text, this_player() ); return 1; // success } // File doesn't exist, start is a non-positive number or // you have tried to read past the end of the file return 0; // fail } varargs string extract( string str, int from, int to ) { if( !stringp( str ) ) return ""; // syntax error if( nullp( from ) ) return str; if( nullp( to ) ) to = strlen( str ); return str[from..to]; } object first_inventory( mixed ob ) { object *inv; if( stringp( ob ) ) ob = find_object( ob ); if( !objectp( ob ) ) return 0; if( sizeof( inv = all_inventory( ob ) ) ) return inv[0]; return 0; } // NB Use of this function is inefficient. Where before you may have done: // { // object ob; // for( ob = first_inventory( X ) ; ob ; ob = next_inventory( ob ) ) // ... // } // you should now do // { // int loop, size; object ob, *obs; // size = sizeof( obs = all_inventory( X ) ); // for( loop = 0 ; loop < size ; loop++ ) // ob = obs[loop]; // ... // } object next_inventory( object ob ) { object env, *inv; int ind; if( !objectp( ob ) ) return 0; // syntax error if( !objectp( env = environment( ob ) ) ) return 0; // fail // The following 'if' statement is the equivalent of: // inv = all_inventory( env ); // ind = 1 + member_array( ob, inv ); // if( ind == sizeof( inv ) ) return 0; // but has been made compact for speed if( sizeof( inv = all_inventory( env ) ) == ( ind = 1 + member_array( ob, inv ) ) ) return 0; // fail return inv[ind]; // success } object shadowp( object ob ) { return query_shadowing( ob ); } void log_file( string file, string text ) { if( !stringp( file ) || !stringp( text ) ) return; // syntax error if( -1 != strsrch( file, ".." ) ) return; // security error if (previous_object()) { if (base_name( previous_object() ) ==USER_OB || base_name( previous_object() ) == CONNECTION || base_name( previous_object() ) == CMD_ED) { seteuid(ROOT_UID) ; } else { seteuid(geteuid(previous_object())) ; } } file = LOG_DIR + file; // would 'sprintf' be much better here? if( file_size( file ) > MAX_LOG_SIZE ) rename( file, file + ".old" ); write_file( file, text ); }