NAME
        master for LDMud 3.3

DESCRIPTION
        This directory contains descriptions for the functions that
        LDMud 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, but can also be specified on
        the commandline (usually 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. Functions to be called by the driver can be public
        or static, but not private.

        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 the mud 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
            masters uid.
          - 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
            pre-load, which preload() then does.
          - The interpreter sets up the IP communication and enters
            the backend loop.

        If the master is reloaded during system operation, these
        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 these 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 *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 a virtual object.

        mixed include_file (string file, string compiled_file, int sys_include)
          Return the full pathname for an included file. // 3.2.8 and later

        mixed inherit_file (string file, string compiled_file)
          Return the full pathname for an inherited object. // 3.2.8 and later

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

        string printf_obj_name (object obj)  // 3.2.6 and later
        string object_name (object obj)      // 3.2.1 .. 3.2.5
          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_imp (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, int warn)
          Announce a compiler-time error or warning.

        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.

        void runtime_warning (string msg, string curobj, string prg, int line)
          Announce a runtime warning.

        -----------------------------------------------------------------
            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 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()
          Return the string to be used as root-uid.

        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_file_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)
