/** * @changed Added basic support for defines and includes. * - Sandoz, Spring 2002. * @changed Added time taken and eval cost. * - Sandoz, 26th Sept. 2002. */ inherit COMMAND_BASE; #define LOG_FILE "/secure/log/EXEC" #define ERROR 0 #define COST 1 #define TIME 2 #define RETURN 3 /** @ignore yes */ mixed do_exec( string str ) { string file, wiz_dir, *tmp, pre; mixed ret; object ob; ret = allocate( 4 ); if( !TP ) { ret[ERROR] = "fail"; return ret; } wiz_dir = "/w/" + TP->query_name(); if( file_size(wiz_dir) != -2 ) { ret[ERROR] = "fail"; notify_fail("Directory: " + wiz_dir + " does not exist.\n"); return ret; } file = wiz_dir + "/exec_tmp"; if( ob = find_object(file) ) { file->dest_me(); if( ob ) destruct(ob); } if( file_size(file + ".c") > 0 ) rm( file+".c" ); unguarded( (: write_file( LOG_FILE, ctime(time()) + " - " + TP->query_name() + ": " + $(str) + "\n") :) ); tmp = explode( str, ";" ); str = ""; pre = ""; foreach( string line in tmp ) { if( line[0..6] == "#define" || line[0..7] == "#include" ) pre += line+"\n"; else str += line+";"; } write_file( file + ".c", ( sizeof(pre) ? pre : "" ) + "void dest_me() { destruct(TO); }\n" "mixed do_call() {\n"+str+";\n}\n"); if( ret[ERROR] = catch( ob = load_object(file) ) ) { if( ob ) destruct(ob); rm( file+".c"); return ret; } ret[ERROR] = catch { ret[COST] = eval_cost(); ret[TIME] = time_expression( ret[RETURN] = file->do_call() ); ret[COST] -= eval_cost(); }; if( ob = find_object(file) ) ob->dest_me(); rm( file+".c"); return ret; } /* do_exec() */ /** @ignore yes */ int cmd( string str ) { mixed ret = do_exec( str ); if( ret[ERROR] == "fail") return 0; if( !ret[ERROR] ) { TP->more_string( sprintf("\nTime taken: %i Eval cost: %i\n" "Returns: %O", ret[TIME], ret[COST], ret[RETURN] ), "Exec results"); } else { printf("Exec failed: %s", ret[ERROR] ); } return 1; } /* cmd() */ /** @ignore yes */ mixed query_patterns() { return ({"<string'code'>", (: cmd($4[0]) :) }); }