NAME
	master for LPMud 3.2

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, and thus it's create() (!compat only) and
	    its reset() is called, though it's not much use, since
	    most of the important things won't work already.
	  - get_root_uid() is called. If the result is valid, it
	    becomes the masters uid and euid.
	  - get_bb_uid() is called.
	  - inaugurate_master() is called.
	  - flag() is called for each given '-f' commandline option.
	  - get_simul_efun() is called.
	  - define_include_dirs() is called.
	  - Preloading is done:
	      compat : The filenames of the objects are read from
		       INIT_FILE and the objects are loaded. Then
		       epilog() is called.
	      !compat: epilog() is called. If it returns an array of
		       strings, it is considered holding the filenames
		       of the objects to preload. They are then given
		       one at a time as argument to preload() which
		       does the actual preloading.
	  - 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 thus it's create() (!compat only) and
	    its reset() is called.
	  - Any auto-include string is cleared.
	  - get_root_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 create ()	// !compat
	  Initialize the object. Not very useful, though.

	void reset (int flag)  // !native
	void reset ()	       // native
	  Initialize (compat only) or reset the object.

	void inaugurate_master ()
	  Perform mudlib specific setup of the 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.

	void	epilog ()	    // compat
	string *epilog (int eflag)  // !compat
	  Perform final actions before opening the system to users.
	  The semantics of this function differ for compat and !compat mode.

	void preload (string file)  // !compat
	  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.

	-----------------------------------------------------------------
	    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)
	  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 creator_file (mixed obj)
	  Return the name of the creator of an object.
	  This is called in every mode!

	string get_root_uid ()	// !compat
	  Return the string to be used as root-uid.

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

	int valid_seteuid (object obj, string neweuid)	// !compat
	  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)

	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)
