#include <creator.h> #include <runtime_config.h> #define TP globals[fd] #define RET ret[fd] #define CMD_NUM 9 inherit "/cmds/base"; private mapping globals = ([]), files = ([]), ret = ([]); int cmd( string fname, int list ) { string *files; string euid; string args; int fd; int count; files = this_player()->get_files( fname ); if ( !sizeof( files ) ) { files += ({ this_player()->get_path( fname ) }); } euid = geteuid( this_player(1) ); // Place any default arguments in here. args = "--stdout"; if ( list ) { args += " --list"; } files = uniq_array( files ); count = 0; foreach( string file in files ) { if ( !master()->valid_read( file, euid, "cat" ) ) { tell_object( this_player(), "You don't have write access to " + file + ".\n" ); } else { args += " " + file[1..]; ++count; } } if ( count ) { log_file("/d/admin/log/ZCAT", ctime(time()) + ": " + this_player()->query_name() + " " + args + "\n"); fd = external_start( CMD_NUM, args, "read_call_back", "write_call_back", "close_call_back" ); } else { add_failed_mess( "zcat must have at least one argument.\n" ); return -1; } if ( fd == -1 ) { add_failed_mess( "zcat failed to start.\n" ); return -1; } TP = this_player(); RET = ""; tell_object( this_player(), "zcat started.\n" ); return 1; } /* cmd() */ void read_call_back(int fd, mixed mess) { int max_len; int new_total; mess = replace(mess, "/bin/", ""); max_len = get_config( __MAX_STRING_LENGTH__ ); new_total = strlen( RET ) + strlen( mess ); if ( new_total > max_len ) { mess = mess[ 0.. (new_total - max_len - 1) ]; } RET += mess; } /* read_call_back() */ void write_call_back( int fd ) { tell_object(TP, "zcat: A fatal error has occurred -- write_call_back " "was called.\n"); } /* write_call_back() */ void close_call_back(int fd) { if ( RET != "" ) { if ( catch( TP->more_string(strip_colours(RET)) ) ) { efun::tell_object( TP, RET ); } } else { tell_object(TP, "zcat finished.\n"); } map_delete(ret, fd); map_delete(globals, fd); } mixed *query_patterns() { return ({ "<string>", (: cmd( $4[0], 0 ) :), "{-l|--list|list} <string>", (: cmd( $4[1], 1 ) :) }); } /* query_patterns() */