mirror of
git://git.psyced.org/git/psyclpc
synced 2024-08-15 03:20:16 +00:00
315 lines
7.8 KiB
C
315 lines
7.8 KiB
C
/* Test Master.c
|
|
*
|
|
* Minimal master.c to provide a very rudimentary test of the gamedriver.
|
|
* To perform the test, cd to the directory this file is in and give the
|
|
* command
|
|
* driver -N -e -m. -Mtest_master.c -s-1 -sv-1 4242
|
|
* (this assumes that you called the gamedriver 'driver' and that it is
|
|
* in your searchpath).
|
|
* Once it's running, telnet to localhost, port 4242. You should be
|
|
* connected to the driver now and be able to enter commands.
|
|
* The command 'help' will list you the commands available.
|
|
*
|
|
* A second test consists of the simple command
|
|
* driver --version
|
|
* The driver shall just print the version and exit immediately.
|
|
*/
|
|
|
|
//---------------------------------------------------------------------------
|
|
void inaugurate_master (int arg)
|
|
|
|
// Initialise the master object.
|
|
// We have to set the uid hooks, otherwise we can't clone a login object.
|
|
|
|
{
|
|
set_driver_hook(2, unbound_lambda(({}), "uid"));
|
|
set_driver_hook(3, unbound_lambda(({}), "uid"));
|
|
set_driver_hook(10, "What?\n");
|
|
#ifdef NOECHO
|
|
set_driver_hook(13, "telnetneg");
|
|
set_driver_hook(14, "set_noecho");
|
|
#endif
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
int old_flag;
|
|
|
|
void set_noecho(int flag)
|
|
{
|
|
if (flag & ~old_flag & 1)
|
|
{
|
|
write("sending IAC WILL ECHO\n");
|
|
binary_message(({ 0xff, 0xfb, 0x01 })); // IAC WILL ECHO
|
|
}
|
|
else if (old_flag & ~flag & 1)
|
|
{
|
|
write("sending IAC WONT ECHO\n");
|
|
binary_message(({ 0xff, 0xfc, 0x01 })); // IAC WONT ECHO
|
|
}
|
|
if (flag & ~old_flag & 2)
|
|
{
|
|
write("sending IAC WILL+DO SGA\n");
|
|
binary_message(({ 0xff, 0xfb, 0x03 })); // IAC WILL SGA
|
|
binary_message(({ 0xff, 0xfd, 0x03 })); // IAC DO SGA
|
|
}
|
|
else if (old_flag & ~flag & 2)
|
|
{
|
|
write("sending IAC WONT+DONT SGA\n");
|
|
binary_message(({ 0xff, 0xfc, 0x03 })); // IAC WONT SGA
|
|
binary_message(({ 0xff, 0xfe, 0x03 })); // IAC DONT SGA
|
|
}
|
|
old_flag = flag;
|
|
} /* set_noecho() */
|
|
|
|
void telnetneg(int a, int b, int* c)
|
|
{
|
|
// just ignore, should work with linux telnet
|
|
printf("got %d %d %O\n", a,b,c);
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
string get_simul_efun ()
|
|
|
|
// Load the simul-efun object "/sefun" if existing and return its pathname.
|
|
|
|
{
|
|
object sefun;
|
|
|
|
if (!catch(sefun = load_object("/sefun")))
|
|
return object_name(sefun);
|
|
return 0;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
string get_master_uid()
|
|
|
|
// Return the master uid.
|
|
{
|
|
return " R O O T ";
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void flag (string arg)
|
|
|
|
// Evaluate an argument given as option '-f' to the driver.
|
|
|
|
{
|
|
debug_message(sprintf("%O: flag(%O)\n", this_object(), arg));
|
|
if (arg == "test")
|
|
{
|
|
/* Insert your test code here */
|
|
return;
|
|
}
|
|
|
|
if (arg == "gc")
|
|
{
|
|
garbage_collection();
|
|
return;
|
|
}
|
|
|
|
if (arg == "dhry")
|
|
{
|
|
limited( (: load_object("dhrystone")->main(1000) :) );
|
|
shutdown();
|
|
return;
|
|
}
|
|
|
|
if (arg == "dhry2")
|
|
{
|
|
limited( (: load_object("dhrystone2")->main(1000) :) );
|
|
shutdown();
|
|
return;
|
|
}
|
|
|
|
if (arg == "shutdown")
|
|
{
|
|
shutdown();
|
|
return;
|
|
}
|
|
write ("master: Unknown flag "+arg+"\n");
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
mixed prepare_destruct (object obj)
|
|
|
|
// Prepare the destruction of the object.
|
|
|
|
{
|
|
debug_message(sprintf("%O: prepare_destruct(%O)\n", this_object(), obj));
|
|
return 0;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
object connect ()
|
|
|
|
// Handle the request for a new connection.
|
|
// We simply return a clone of ourself (we can't simply return this object
|
|
// unfortunately), the gamedriver will then call logon() here.
|
|
|
|
{
|
|
object obj;
|
|
debug_message(sprintf("%O: connect()\n", this_object()));
|
|
obj = clone_object(object_name(this_object()));
|
|
return obj;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
static nomask mixed logon ()
|
|
|
|
// A connection was successfully bound to this object.
|
|
// Print some status data and add the commands.
|
|
|
|
{
|
|
debug_message(sprintf("%O: logon()\n", this_object()));
|
|
write("\nLDMud " __VERSION__ "\n\n----------\n");
|
|
write(debug_info(4,0));
|
|
write("----------\n\n");
|
|
enable_commands();
|
|
add_action("f_help", "help");
|
|
add_action("f_shutdown", "shutdown");
|
|
add_action("f_echo", "echo");
|
|
add_action("f_flag", "flag");
|
|
add_action("f_gc", "gc");
|
|
add_action("f_upd", "upd");
|
|
add_action("f_quit", "quit");
|
|
add_action("f_charmode", "charmode");
|
|
set_combine_charset("abc");
|
|
|
|
return 1; // To verify that the connection was accepted.
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
int f_help (string arg)
|
|
|
|
// The 'help' command.
|
|
|
|
{
|
|
debug_message(sprintf("%O: f_help()\n", this_object()));
|
|
write(
|
|
" help - Prints this message\n"
|
|
" shutdown - shuts down the driver\n"
|
|
" flag - passes the argument to the flag() function\n"
|
|
" echo - tests the input_to() function\n"
|
|
" gc - performes a garbage collection\n"
|
|
" upd - reloads the master object\n"
|
|
" quit - terminates the connection, but leaves the driver running\n"
|
|
);
|
|
return 1;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
int f_flag (string arg)
|
|
|
|
// The 'flag' command.
|
|
|
|
{
|
|
debug_message(sprintf("%O: f_flag()\n", this_object()));
|
|
flag(arg);
|
|
return 1;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
int f_gc (string arg)
|
|
|
|
// The 'gc' command.
|
|
|
|
{
|
|
write("Requested a garbage collection.\n");
|
|
garbage_collection();
|
|
return 1;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
int f_echo (string arg)
|
|
|
|
// The 'echo' command.
|
|
|
|
{
|
|
debug_message(sprintf("%O: f_echo()\n", this_object()));
|
|
input_to("echoline", 4, "Please enter a line: ");
|
|
return 1;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void echoline (string text)
|
|
|
|
// The user entered some text. Echo it.
|
|
|
|
{
|
|
debug_message(sprintf("%O: echoline()\n", this_object()));
|
|
write("You entered: '"+text+"'\n");
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
int f_charmode (string arg)
|
|
{
|
|
write("Entering charmode. Enter 'enough' to stop.\n");
|
|
input_to("charinput", 2);
|
|
return 1;
|
|
}
|
|
|
|
string in;
|
|
|
|
void charinput(string char)
|
|
{
|
|
string cmd;
|
|
|
|
printf(" Got %O (%s)\n", char
|
|
, implode(map(to_array(char), #'to_string),","));
|
|
|
|
if (!in)
|
|
in = char;
|
|
else if (!strlen(char) || char[0] == 13)
|
|
{
|
|
cmd = in;
|
|
in = char[1..];
|
|
}
|
|
else
|
|
{
|
|
in += char;
|
|
}
|
|
if (cmd !="enough")
|
|
input_to("charinput", 2);
|
|
else
|
|
write("Ok.\n");
|
|
} /* charinput() */
|
|
|
|
//---------------------------------------------------------------------------
|
|
int f_shutdown (string arg)
|
|
|
|
// The 'shutdown' command.
|
|
|
|
{
|
|
debug_message(sprintf("%O: f_shutdown()\n", this_object()));
|
|
write("Shutting down.\n");
|
|
shutdown();
|
|
return 1;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
int f_upd (string arg)
|
|
|
|
// The 'upd' command.
|
|
|
|
{
|
|
debug_message(sprintf("%O: f_upd()\n", this_object()));
|
|
write("Removing old master...\n");
|
|
destruct(find_object(__MASTER_OBJECT__));
|
|
write("Loading master again...\n");
|
|
load_object(__MASTER_OBJECT__);
|
|
write("...done.\n");
|
|
return 1;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
int f_quit (string arg)
|
|
|
|
// The 'quit' command.
|
|
|
|
{
|
|
debug_message(sprintf("%O: f_quit()\n", this_object()));
|
|
write("Bye-bye.\n");
|
|
destruct(this_object());
|
|
return 1;
|
|
}
|
|
|