<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE erlref SYSTEM "erlref.dtd">

<erlref>
  <header>
    <copyright>
      <year>1996</year><year>2013</year>
      <holder>Ericsson AB. All Rights Reserved.</holder>
    </copyright>
    <legalnotice>
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
      You may obtain a copy of the License at
 
          http://www.apache.org/licenses/LICENSE-2.0

      Unless required by applicable law or agreed to in writing, software
      distributed under the License is distributed on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      See the License for the specific language governing permissions and
      limitations under the License.
    
    </legalnotice>

    <title>erl_prim_loader</title>
    <prepared></prepared>
    <docno></docno>
    <date></date>
    <rev></rev>
    <file>erl_prim_loader.xml</file>
  </header>
  <module>erl_prim_loader</module>
  <modulesummary>Low Level Erlang Loader</modulesummary>
  <description>
    <p><c>erl_prim_loader</c> is used to load all Erlang modules into
      the system. The start script is also fetched with this low level
      loader.</p>
    <p><c>erl_prim_loader</c> knows about the environment and how to
      fetch modules.</p>
    <p>The <c>-loader Loader</c> command line flag can be used to
      choose the method used by the <c>erl_prim_loader</c>. Two
      <c>Loader</c> methods are supported by the Erlang runtime system:
      <c>efile</c> and <c>inet</c>.</p>

    <warning><p>The support for loading of code from archive files is
     experimental. The sole purpose of releasing it before it is ready
     is to obtain early feedback. The file format, semantics,
     interfaces etc. may be changed in a future release. The functions
     <c>list_dir/1</c> and <c>read_file_info/1</c> as well as the flag
     <c>-loader_debug</c> are also experimental</p></warning>

  </description>
  <datatypes>
    <datatype>
      <name name="host"/>
    </datatype>
  </datatypes>

  <funcs>
    <func>
      <name name="start" arity="3"/>
      <fsummary>Start the Erlang low level loader</fsummary>
      <desc>
        <p>Starts the Erlang low level loader. This function is called
          by the <c>init</c> process (and module). The <c>init</c>
          process reads the command line flags <c>-id <anno>Id</anno></c>,
          <c>-loader <anno>Loader</anno></c>, and <c>-hosts <anno>Hosts</anno></c>. These are
          the arguments supplied to the <c>start/3</c> function.</p>
        <p>If <c>-loader</c> is not given, the default loader is
          <c>efile</c> which tells the system to read from the file
          system.</p>
        <p>If <c>-loader</c> is <c>inet</c>, the <c>-id <anno>Id</anno></c>,
          <c>-hosts <anno>Hosts</anno></c>, and <c>-setcookie Cookie</c> flags must
          also be supplied. <c><anno>Hosts</anno></c> identifies hosts which this
          node can contact in order to load modules. One Erlang
          runtime system with a <c>erl_boot_server</c> process must be
          started on each of hosts given in <c><anno>Hosts</anno></c> in order to
          answer the requests. See <seealso
          marker="kernel:erl_boot_server">erl_boot_server(3)</seealso>.</p>
      </desc>
    </func>
    <func>
      <name name="get_file" arity="1"/>
      <fsummary>Get a file</fsummary>
      <desc>
        <p>This function fetches a file using the low level loader.
          <c><anno>Filename</anno></c> is either an absolute file name or just the name
          of the file, for example <c>"lists.beam"</c>. If an internal
          path is set to the loader, this path is used to find the file.
          If a user supplied loader is used, the path can be stripped
          off if it is obsolete, and the loader does not use a path.
          <c><anno>FullName</anno></c> is the complete name of the fetched file.
          <c><anno>Bin</anno></c> is the contents of the file as a binary.</p>

	  <p>The <c><anno>Filename</anno></c> can also be a file in an archive. For example
          <c>$OTPROOT/lib/</c><c>mnesia-4.4.7.ez/mnesia-4.4.7/ebin/</c><c>mnesia.beam</c>.
          See <seealso marker="kernel:code">code(3)</seealso> about archive files.</p>
      </desc>
    </func>
    <func>
      <name name="get_path" arity="0"/>
      <fsummary>Get the path set in the loader</fsummary>
      <desc>
        <p>This function gets the path set in the loader. The path is
          set by the <c>init</c> process according to information found
          in the start script.</p>
      </desc>
    </func>
    <func>
      <name name="list_dir" arity="1"/>
      <fsummary>List files in a directory</fsummary>
      <desc>
        <p>Lists all the files in a directory. Returns
          <c>{ok, <anno>Filenames</anno>}</c> if successful. Otherwise, it returns
          <c>error</c>. <c><anno>Filenames</anno></c> is a list of
          the names of all the files in the directory. The names are
          not sorted.</p>
	  <p>The <c><anno>Dir</anno></c> can also be a directory in an archive. For example
          <c>$OTPROOT/lib/</c><c>mnesia-4.4.7.ez/mnesia-4.4.7/ebin</c>.
           See <seealso marker="kernel:code">code(3)</seealso> about archive files.</p>
      </desc>
    </func>
    <func>
      <name name="read_file_info" arity="1"/>
      <fsummary>Get information about a file</fsummary>
      <desc>
        <p>Retrieves information about a file. Returns
          <c>{ok, <anno>FileInfo</anno>}</c> if successful, otherwise
          <c>error</c>. <c><anno>FileInfo</anno></c> is a record
          <c>file_info</c>, defined in the Kernel include file
          <c>file.hrl</c>. Include the following directive in the module
          from which the function is called:</p>
        <code type="none">
-include_lib("kernel/include/file.hrl").</code>
        <p>See <seealso marker="kernel:file">file(3)</seealso> for more info about
          the record <c>file_info</c>.</p>
	<p>The <c><anno>Filename</anno></c> can also be a file in an archive. For example
          <c>$OTPROOT/lib/</c><c>mnesia-4.4.7.ez/mnesia-4.4.7/ebin/</c><c>mnesia</c>.
          See <seealso marker="kernel:code">code(3)</seealso> about archive files.</p>
      </desc>
    </func>
    <func>
      <name name="read_link_info" arity="1"/>
      <fsummary>Get information about a link or file</fsummary>
      <desc>
        <p>This function works like
          <seealso marker="#read_file_info/1">read_file_info/1</seealso>
          except that if <c><anno>Filename</anno></c> is a symbolic link,
          information about the link will be returned in the <c>file_info</c>
          record and the <c>type</c> field of the record will be set to
          <c>symlink</c>.</p>
        <p>If <c><anno>Filename</anno></c> is not a symbolic link, this function
          returns exactly the same result as <c>read_file_info/1</c>.
          On platforms that do not support symbolic links, this function
          is always equivalent to <c>read_file_info/1</c>.</p>
      </desc>
    </func>
    <func>
      <name name="set_path" arity="1"/>
      <fsummary>Set the path of the loader</fsummary>
      <desc>
        <p>This function sets the path of the loader if <c>init</c>
          interprets a <c>path</c> command in the start script.</p>
      </desc>
    </func>
  </funcs>

  <section>
    <title>Command Line Flags</title>
    <p>The <c>erl_prim_loader</c> module interprets the following
      command line flags:</p>
    <taglist>
      <tag><c>-loader Loader</c></tag>
      <item>
        <p>Specifies the name of the loader used by
          <c>erl_prim_loader</c>. <c>Loader</c> can be <c>efile</c>
          (use the local file system) or <c>inet</c> (load using
          the <c>boot_server</c> on another Erlang node).</p>
        <p>If the <c>-loader</c> flag is omitted, it defaults to
          <c>efile</c>.</p>
      </item>
      <tag><c>-loader_debug</c></tag>
      <item>
          <p>Makes the <c>efile</c> loader write some debug information,
           such as the reason for failures, while it handles files.</p>
      </item>
      <tag><c>-hosts Hosts</c></tag>
      <item>
        <p>Specifies which other Erlang nodes the <c>inet</c> loader
          can use. This flag is mandatory if the <c>-loader inet</c>
          flag is present. On each host, there must be on Erlang node
          with the <c>erl_boot_server</c> which handles the load
          requests. <c>Hosts</c> is a list of IP addresses (hostnames
          are not acceptable).</p>
      </item>
      <tag><c>-id Id</c></tag>
      <item>
        <p>Specifies the identity of the Erlang runtime system. If
          the system runs as a distributed node, <c>Id</c> must be
          identical to the name supplied with the <c>-sname</c> or
          <c>-name</c> distribution flags.</p>
      </item>
      <tag><c>-setcookie Cookie</c></tag>
      <item>
        <p>Specifies the cookie of the Erlang runtime system. This flag
          is mandatory if the <c>-loader inet</c> flag is present.</p>
      </item>
    </taglist>
  </section>

  <section>
    <title>SEE ALSO</title>
    <p><seealso marker="init">init(3)</seealso>, 
      <seealso marker="kernel:erl_boot_server">erl_boot_server(3)</seealso></p>
  </section>
</erlref>

