NAME
	master for LPMud 3.2.1

DESCRIPTION
	This directory contains descriptions for the functions that
	Amylaar's version of the LPC parser, expects to find in the
	master object (similar to lfuns, but for the master object
	only). The name of the master object is hardcoded in the
	parser (to "secure/master").

	The master is the gateway between the interpreter and the
	mudlib to perform actions with mudlib specific effects. Calls
	to the master by the interpreter have an automatic catch() in
	effect.

	Note that the master is loaded first of all objects. Thus you
	shouldn't inherit an other object, nor is the compiler able to
	search include files (read: they must be specified with full
	path).

	Amylaar says: actually, you can inherit, but the file will be
	loaded then before the master, which isn't good for most
	files.

	A short survey of the things that happen at system startup
	time:

	The Initialisation functions are called after (re)loading the
	master to establish the most basic operation parameters.

	The initialisation of LPMud on startup follows this schedule:
	  - The interpreter evaluates the commandline options and
	    initializes itself.
	  - The master is loaded, but since the driverhooks are not set yet,
	    no standard initialisation lfun is called.
	  - get_master_uid() is called. If the result is valid, it becomes the
	  - inaugurate_master() is called.
	  - flag() is called for each given '-f' commandline option.
	  - get_simul_efun() is called.
	  - the WIZLIST is read in.
	  - epilog() is called. If it returns an array of strings,
	    they are given one at a time as argument to preload().
	    Traditionally, these strings are the filenames of the objects to
	    preload, which preload() then does.
	  - The interpreter sets up the IP communication and enters
	    the backend loop.

	If the master is reloaded during system operation, this
	actions are taken:
	  - The master is loaded, and its initialisation lfun is
	    called according to the settings of the driverhooks (if set).
	  - Any auto-include string and all driverhooks are cleared.
	  - get_master_uid() is called. If the result is valid, it becomes the
	    masters uid and euid.
	  - inaugurate_master() is called.

	If the master was destructed, but couldn't be reloaded, the old
	master object could be reactivated. In that case:
	  - reactivate_destructed_master() is called.
	  - inaugurate_master() is called.


	Security hint: most of this functions are not useful to be
	called directly from other objects and can be made private or
	static. Unlike create(), these functions that are applied to
	the master object are found by the interpreter even if not
	publicly accessible.



	A short reference to all expected master functions...
	----------------------------------------------------------------
	    Initialisation

	void inaugurate_master ()
	  Perform mudlib specific setup of the master.

	string get_master_uid ()
	  Return the string to be used as uid (and -euid) of a
	  (re)loaded master. 

	void flag (string arg)
	  Evaluate an argument given as option '-f' to the driver.

	string *define_include_dirs ()
	  Define where the include files are searched.

	string *epilog (int eflag)
	  Perform final actions before opening the system to users.

	void preload (string file)
	  Preload a given object.

	void external_master_reload ()
	  Called after a reload of the master on external request.

	void reactivate_destructed_master (int removed)
	  Reactivate a formerly destructed master.

	string|string * get_simul_efun ()
	  Load the simul_efun object and return one or more paths of it.

	----------------------------------------------------------------
	    Handling of user connections

	object connect ()
	  Handle the request for a new connection.

	void disconnect (object obj)
	  Handle the loss of an IP connection.

	void remove_player (object user)
	  Remove a user object from the system.

	void stale_erq (closure callback)
	  Notify the loss of the erq demon.

	-----------------------------------------------------------------
	    Runtime Support

	object compile_object (string filename)
	  Compile an virtual object.

	string get_wiz_name (string file)
	  Return the author of a file.

	string object_name (object obj)
	  Return a printable name for an object.

	mixed prepare_destruct (object obj)
	  Prepare the destruction of the given object.

	void quota_demon (void)
	  Handle quotas in times of memory shortage.

	void receive_udp (string host, string msg, int port)
	  Handle a received IMP message.

	void slow_shut_down (int minutes)
	  Schedule a shutdown for the near future.

	void notify_shutdown ()
	  Notify the master about an immediate shutdown.

	-----------------------------------------------------------------
	    Error Handling

	void dangling_lfun_closure ()
	  Handle a dangling lfun-closure.

	void log_error (string file, string err)
	  Announce a compiler-time error.

	mixed heart_beat_error (object culprit, string err,
				string prg, string curobj, int line)
	  Announce an error in the heart_beat() function.

	void runtime_error (string err, string prg, string curobj, int line)
	  Announce a runtime error.

	-----------------------------------------------------------------
	    Security and Permissions

	int privilege_violation (string op, mixed who, mixed arg3, mixed arg4)
	  Validate the execution of a privileged operation.

	int query_allow_shadow (object victim)
	  Validate a shadowing.

	int query_player_level (string what)
	  Check if the user is of high enough level for several things.

	int valid_exec (string name)
	  Validate the rebinding of an IP connection by usage of efun
	  exec().

	int valid_query_snoop (object obj)
	  Validate if the snoopers of an object may be revealed by
	  usage of the efun query_snoop().

	int valid_snoop (object snoopee, object snooper)
	  Validate the start/stop of a snoop.

	------------------------------------------------------------------
	    Userids and depending Security

	string get_bb_uid()  // euids
	  Return the string to be used as root-uid.

	int valid_seteuid (object obj, string neweuid)	// euids
	  Validate the change of an objects euid by efun seteuid().

	int|string valid_read (string path, string euid, string fun, object caller)
	int|string valid_write (string path, string euid, string fun, object caller)
	  Validate a reading/writing file operation.

	-----------------------------------------------------------------
	    ed() Support

	string make_path_absolute (string str)
	  Absolutize a relative filename given to the editor.

	int save_ed_setup (object who, int code)
	  Save individual settings of ed for a wizard.

	int retrieve_ed_setup (object who)
	  Retrieve individual settings of ed for a wizard.

	string get_ed_buffer_save_object_name (string file)
	  Return a filename for the ed buffer to be saved into.

	----------------------------------------------------------------
	    parse_command() Support  (!compat, SUPPLY_PARSE_COMMAND defined)

	string *parse_command_id_list ()
	  Return generic singular ids.

	string *parse_command_plural_id_list ()
	  Return generic plural ids.

	string *parse_command_adjectiv_id_list ()
	  Return generic adjective ids.

	string *parse_command_prepos_list ()
	  Return common prepositions.

	string parse_command_all_word()
	  Return the one(!) 'all' word.

SEE ALSO
	master(M), efun(E), applied(A), concepts(C), driver(D), lpc(LPC)
