diff options
Diffstat (limited to 'lib/erl_interface/doc/src/erl_connect.xml')
-rw-r--r-- | lib/erl_interface/doc/src/erl_connect.xml | 662 |
1 files changed, 0 insertions, 662 deletions
diff --git a/lib/erl_interface/doc/src/erl_connect.xml b/lib/erl_interface/doc/src/erl_connect.xml deleted file mode 100644 index ab07535612..0000000000 --- a/lib/erl_interface/doc/src/erl_connect.xml +++ /dev/null @@ -1,662 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE cref SYSTEM "cref.dtd"> - -<cref> - <header> - <copyright> - <year>1996</year><year>2020</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_connect</title> - <prepared>Torbjörn Törnkvist</prepared> - <responsible>Torbjörn Törnkvist</responsible> - <docno></docno> - <approved>Bjarne Däcker</approved> - <checked>Torbjörn Törnkvist</checked> - <date>1998-07-03</date> - <rev>A</rev> - <file>erl_connect.xml</file> - </header> - <lib>erl_connect</lib> - <libsummary>Communicate with distributed Erlang.</libsummary> - <description> - <note><p>The support for VxWorks is deprecated as of OTP 22, and - will be removed in OTP 23.</p></note> - <note><p>The old legacy <c>erl_interface</c> library (functions - with prefix <c>erl_</c>) is deprecated as of OTP 22, and will be - removed in OTP 23. This does not apply to the <c>ei</c> - library. Reasonably new <c>gcc</c> compilers will issue deprecation - warnings. In order to disable these warnings, define the macro - <c>EI_NO_DEPR_WARN</c>.</p></note> - - <p>This module provides support for communication between distributed - Erlang nodes and C-nodes, in a manner that is transparent to Erlang - processes.</p> - - <p>A C-node appears to Erlang as a <em>hidden node</em>. - That is, Erlang processes that know the name of the - C-node can communicate with it in a normal manner, but - the node name does not appear in the listing provided by - <seealso marker="erts:erlang#nodes/0"><c>erlang:nodes/0</c></seealso> - in <c>ERTS</c>.</p> - </description> - - <funcs> - <func> - <name since=""><ret>int</ret><nametext>erl_accept(listensock, conp)</nametext></name> - <fsummary>Accept a connection.</fsummary> - <type> - <v>int listensock;</v> - <v>ErlConnect *conp;</v> - </type> - <desc> - <p>This function is used by a server process to accept a - connection from a client process.</p> - <list type="bulleted"> - <item><c>listensock</c> is an open socket descriptor on - which <c>listen()</c> has previously been called.</item> - <item><c>conp</c> is a pointer to an - <c>ErlConnect</c> struct, described as follows:</item> - </list> - <code type="none"><![CDATA[ -typedef struct { - char ipadr[4]; - char nodename[MAXNODELEN]; -} ErlConnect; - ]]></code> - <p>On success, <c>conp</c> is filled in with the address and - node name of the connecting client and a file descriptor is - returned. On failure, <c>ERL_ERROR</c> is returned and - <c>erl_errno</c> is set to <c>EIO</c>.</p> - </desc> - </func> - - <func> - <name since=""><ret>int</ret><nametext>erl_close_connection(fd)</nametext></name> - <fsummary>Close a connection to an Erlang node.</fsummary> - <type> - <v>int fd;</v> - </type> - <desc> - <p>Closes an open connection to an Erlang node.</p> - <p><c>Fd</c> is a file descriptor obtained from - <c>erl_connect()</c> or - <c>erl_xconnect()</c>.</p> - <p>Returns <c>0</c> on success. If the call fails, a non-zero value - is returned, and the reason for the error can be obtained with the - appropriate platform-dependent call.</p> - </desc> - </func> - - <func> - <name since=""><ret>int</ret><nametext>erl_connect(node)</nametext></name> - <name since=""><ret>int</ret><nametext>erl_xconnect(addr, alive)</nametext></name> - <fsummary>Establish a connection to an Erlang node.</fsummary> - <type> - <v>char *node, *alive;</v> - <v>struct in_addr *addr;</v> - </type> - <desc> - <p>Sets up a connection to an Erlang node.</p> - <p><c>erl_xconnect()</c> requires the IP address of the - remote host and the alivename of the remote node to be - specified. <c>erl_connect()</c> provides an alternative - interface, and determines the information from the node name - provided.</p> - <list type="bulleted"> - <item><c>addr</c> is the 32-bit IP address of the remote - host.</item> - <item><c>alive</c> is the alivename of the remote node. - </item> - <item><c>node</c> is the name of the remote node.</item> - </list> - <p>Returns an open file descriptor on success, otherwise a negative - value. In the latter case <c>erl_errno</c> is set to one - of:</p> - <taglist> - <tag><c>EHOSTUNREACH</c></tag> - <item>The remote host <c>node</c> is unreachable.</item> - <tag><c>ENOMEM</c></tag> - <item>No more memory is available.</item> - <tag><c>EIO</c></tag> - <item>I/O error.</item> - </taglist> - <p>Also, <c>errno</c> values from - <c>socket</c><em>(2)</em> and - <c>connect</c><em>(2)</em> - system calls can be propagated into <c>erl_errno</c>.</p> - <p><em>Example:</em></p> - <code type="none"><![CDATA[ -#define NODE "madonna@chivas.du.etx.ericsson.se" -#define ALIVE "madonna" -#define IP_ADDR "150.236.14.75" - -/*** Variant 1 ***/ -erl_connect( NODE ); - -/*** Variant 2 ***/ -struct in_addr addr; -addr = inet_addr(IP_ADDR); -erl_xconnect( &addr , ALIVE ); - ]]></code> - </desc> - </func> - - <func> - <name since=""><ret>int</ret><nametext>erl_connect_init(number, cookie, creation)</nametext></name> - <name since=""><ret>int</ret><nametext>erl_connect_xinit(host, alive, node, addr, cookie, creation)</nametext></name> - <fsummary>Initialize communication.</fsummary> - <type> - <v>int number;</v> - <v>char *cookie;</v> - <v>short creation;</v> - <v>char *host,*alive,*node;</v> - <v>struct in_addr *addr;</v> - </type> - <desc> - <p>Initializes the <c>erl_connect</c> module. - In particular, these functions are used to identify the name of the - C-node from which they are called. One of these functions must - be called before any of the other functions in the <c>erl_connect</c> - module are used.</p> - <p><c>erl_connect_xinit()</c> stores for later use - information about:</p> - <list type="bulleted"> - <item>Hostname of the node, <c>host</c></item> - <item>Alivename, <c>alive</c></item> - <item>Node name, <c>node</c></item> - <item>IP address, <c>addr</c></item> - <item>Cookie, <c>cookie</c></item> - <item>Creation number, <c>creation</c></item> - </list> - <p><c>erl_connect_init()</c> - provides an alternative interface that does not require as much - information from the caller. Instead, - <c>erl_connect_init()</c> - uses <c>gethostbyname()</c> to obtain default values.</p> - <p>If you use <c>erl_connect_init()</c>, your node will - have a short name, that is, it will not be fully qualified. If you - need to use fully qualified (long) names, use - <c>erl_connect_xinit()</c> instead.</p> - <list type="bulleted"> - <item> - <p><c>host</c> is the name of the host on which the node - is running.</p> - </item> - <item> - <p><c>alive</c> is the alivename of the node.</p> - </item> - <item> - <p><c>node</c> is the node name. It is to - be of the form <em>alivename@hostname</em>.</p> - </item> - <item> - <p><c>addr</c> is the 32-bit IP address of - <c>host</c>.</p> - </item> - <item> - <p><c>cookie</c> is the authorization string required - for access to the remote node. If <c>NULL</c>, the user - <c>HOME</c> directory is searched for a cookie file - <c>.erlang.cookie</c>. The path to - the home directory is retrieved from environment variable - <c>HOME</c> on Unix and from the - <c>HOMEDRIVE</c> and - <c>HOMEPATH</c> variables on Windows. For more - details, see the <seealso marker="kernel:auth"> - <c>auth</c></seealso> module in Kernel.</p> - </item> - <item> - <p><c>creation</c> helps identifying a particular - instance of a C-node. In particular, it can help prevent us from - receiving messages sent to an earlier process with the same - registered name.</p> - </item> - </list> - <p>A C-node acting as a server is assigned a creation number - when it calls <c>erl_publish()</c>.</p> - <p><c>number</c> is used by - <c>erl_connect_init()</c> to - construct the actual node name. In Example 2 - below, <em>"c17@a.DNS.name"</em> is the resulting node name.</p> - <p><em>Example 1:</em></p> - <code type="none"><![CDATA[ -struct in_addr addr; -addr = inet_addr("150.236.14.75"); -if (!erl_connect_xinit("chivas", - "madonna", - "madonna@chivas.du.etx.ericsson.se", - &addr; - "samplecookiestring..."), - 0) - erl_err_quit("<ERROR> when initializing !"); - ]]></code> - <p><em>Example 2:</em></p> - <code type="none"><![CDATA[ -if (!erl_connect_init(17, "samplecookiestring...", 0)) - erl_err_quit("<ERROR> when initializing !"); - ]]></code> - </desc> - </func> - - <func> - <name since=""><ret>int</ret><nametext>erl_publish(port)</nametext></name> - <fsummary>Publish a node name.</fsummary> - <type> - <v>int port;</v> - </type> - <desc> - <p>This function is used by a server process to register - with the local name server EPMD, thereby allowing - other processes to send messages by using the registered name. - Before calling this function, the process should - have called <c>bind()</c> and <c>listen()</c> - on an open socket.</p> - <p><c>port</c> is the local name to register, and is to be - the same as the port number that was previously bound to the - socket.</p> - <p>To unregister with EPMD, simply close the returned descriptor.</p> - <p>On success, a descriptor connecting the calling process to EPMD is - returned. On failure, <c>-1</c> is returned and - <c>erl_errno</c> is set to:</p> - <taglist> - <tag><c>EIO</c></tag> - <item>I/O error.</item> - </taglist> - <p>Also, <c>errno</c> values from - <c>socket</c><em>(2)</em> - and <c>connect</c><em>(2)</em> system calls can be - propagated into <c>erl_errno</c>.</p> - </desc> - </func> - - <func> - <name since=""><ret>int</ret><nametext>erl_receive(fd, bufp, bufsize)</nametext></name> - <fsummary>Receive a message.</fsummary> - <type> - <v>int fd;</v> - <v>char *bufp;</v> - <v>int bufsize;</v> - </type> - <desc> - <p>Receives a message consisting of a sequence - of bytes in the Erlang external format.</p> - <list type="bulleted"> - <item><c>fd</c> is an open descriptor to an Erlang - connection.</item> - <item><c>bufp</c> is a buffer large enough to hold the - expected message.</item> - <item><c>bufsize</c> indicates the size of - <c>bufp</c>.</item> - </list> - <p>If a <em>tick</em> occurs, that is, the Erlang node on the - other end of the connection has polled this node to see if it - is still alive, the function returns <c>ERL_TICK</c> and - no message is placed in the buffer. Also, - <c>erl_errno</c> is set to <c>EAGAIN</c>.</p> - <p>On success, the message is placed in the specified buffer - and the function returns the number of bytes actually read. On - failure, the function returns a negative value and sets - <c>erl_errno</c> to one of:</p> - <taglist> - <tag><c>EAGAIN</c></tag> - <item>Temporary error: Try again.</item> - <tag><c>EMSGSIZE</c></tag> - <item>Buffer is too small.</item> - <tag><c>EIO</c></tag> - <item>I/O error.</item> - </taglist> - </desc> - </func> - - <func> - <name since=""><ret>int</ret><nametext>erl_receive_msg(fd, bufp, bufsize, emsg)</nametext></name> - <fsummary>Receive and decode a message.</fsummary> - <type> - <v>int fd;</v> - <v>unsigned char *bufp;</v> - <v>int bufsize;</v> - <v>ErlMessage *emsg;</v> - </type> - <desc> - <p>Receives the message into the specified buffer - and decodes into <c>(ErlMessage *) emsg</c>.</p> - <list type="bulleted"> - <item><c>fd</c> is an open descriptor to an Erlang - connection.</item> - <item><c>bufp</c> is a buffer large enough to hold the - expected message.</item> - <item><c>bufsize</c> indicates the size of - <c>bufp</c>.</item> - <item>><c>emsg</c> is a pointer to an - <c>ErlMessage</c> structure - into which the message will be decoded. - <c>ErlMessage</c> is defined as follows:</item> - </list> - <code type="none"><![CDATA[ -typedef struct { - int type; - ETERM *msg; - ETERM *to; - ETERM *from; - char to_name[MAXREGLEN]; -} ErlMessage; - ]]></code> - <note> - <p>The definition of <c>ErlMessage</c> has changed since - earlier versions of <c>Erl_Interface</c>.</p> - </note> - <p><c>type</c> identifies the type of message, one of the - following:</p> - <taglist> - <tag><c>ERL_SEND</c></tag> - <item> - <p>An ordinary send operation has occurred and - <c>emsg->to</c> contains the pid of the recipient. - The message is in <c>emsg->msg</c>.</p> - </item> - <tag><c>ERL_REG_SEND</c></tag> - <item> - <p>A registered send operation has occurred and - <c>emsg->from</c> contains the pid of the sender. - The message is in <c>emsg->msg</c>.</p> - </item> - <tag><c>ERL_LINK</c> or <c>ERL_UNLINK</c> - </tag> - <item> - <p><c>emsg->to</c> and <c>emsg->from</c> - contain the pids of the sender and recipient of the link or - unlink. <c>emsg->msg</c> is not used.</p> - </item> - <tag><c>ERL_EXIT</c></tag> - <item> - <p>A link is broken. <c>emsg->to</c> and - <c>emsg->from</c> contain the pids of the linked - processes, and <c>emsg->msg</c> contains the reason - for the exit.</p> - </item> - </taglist> - <note> - <p>It is the caller's responsibility to release the - memory pointed to by <c>emsg->msg</c>, - <c>emsg->to</c>, and - <c>emsg->from</c>.</p> - </note> - <p>If a <em>tick</em> occurs, that is, the Erlang node on the - other end of the connection has polled this node to see if it - is still alive, the function returns <c>ERL_TICK</c> - indicating that the tick has been received and responded to, - but no message is placed in the buffer. In this case you - are to call <c>erl_receive_msg()</c> again.</p> - <p>On success, the function returns <c>ERL_MSG</c> and the - <c>Emsg</c> struct is initialized as described above, or - <c>ERL_TICK</c>, in which case no message is returned. On - failure, the function returns <c>ERL_ERROR</c> and sets - <c>erl_errno</c> to one of:</p> - <taglist> - <tag><c>EMSGSIZE</c></tag> - <item>Buffer is too small.</item> - <tag><c>ENOMEM</c></tag> - <item>No more memory is available.</item> - <tag><c>EIO</c></tag> - <item>I/O error.</item> - </taglist> - </desc> - </func> - - <func> - <name since=""><ret>int</ret><nametext>erl_reg_send(fd, to, msg)</nametext></name> - <fsummary>Send a message to a registered name.</fsummary> - <type> - <v>int fd;</v> - <v>char *to;</v> - <v>ETERM *msg;</v> - </type> - <desc> - <p>Sends an Erlang term to a registered process.</p> - <list type="bulleted"> - <item><c>fd</c> is an open descriptor to an Erlang - connection.</item> - <item><c>to</c> is a string containing the registered name - of the intended recipient of the message.</item> - <item><c>msg</c> is the Erlang term to be sent.</item> - </list> - <p>Returns <c>1</c> on success, otherwise <c>0</c>. In - the latter case <c>erl_errno</c> is set to one of:</p> - <taglist> - <tag><c>ENOMEM</c></tag> - <item>No more memory is available.</item> - <tag><c>EIO</c></tag> - <item>I/O error.</item> - </taglist> - </desc> - </func> - - <func> - <name since=""><ret>ETERM *</ret><nametext>erl_rpc(fd, mod, fun, args)</nametext></name> - <name since=""><ret>int</ret><nametext>erl_rpc_from(fd, timeout, emsg)</nametext></name> - <name since=""><ret>int</ret><nametext>erl_rpc_to(fd, mod, fun, args)</nametext></name> - <fsummary>Remote Procedure Call.</fsummary> - <type> - <v>int fd, timeout;</v> - <v>char *mod, *fun;</v> - <v>ETERM *args;</v> - <v>ErlMessage *emsg;</v> - </type> - <desc> - <p>Supports calling Erlang functions on remote nodes. - <c>erl_rpc_to()</c> sends an RPC request to a remote node - and <c>erl_rpc_from()</c> receives the results of such a - call. <c>erl_rpc()</c> combines the functionality of - these two functions by sending an RPC request and waiting for the - results. See also <seealso marker="kernel:rpc#call/4"> - <c>rpc:call/4</c></seealso> in <c>Kernel</c>.</p> - <list type="bulleted"> - <item><c>fd</c> is an open descriptor to an Erlang - connection.</item> - <item><c>timeout</c> is the maximum time (in milliseconds) - to wait for - results. To wait forever, specify <c>ERL_NO_TIMEOUT</c>. - When <c>erl_rpc()</c> calls <c>erl_rpc_from()</c>, the call will - never timeout.</item> - <item><c>mod</c> is the name of the module containing the - function to be run on the remote node.</item> - <item><c>fun</c> is the name of the function to run. - </item> - <item><c>args</c> is an Erlang list, containing the - arguments to be passed to the function.</item> - <item><c>emsg</c> is a message containing the result of - the function call.</item> - </list> - <p>The actual message returned by the RPC server - is a 2-tuple <c>{rex,Reply}</c>. If you use - <c>erl_rpc_from()</c> in your code, this is the message - you will need to parse. If you use <c>erl_rpc()</c>, the - tuple itself is parsed for you, and the message returned to your - program is the Erlang term containing <c>Reply</c> only. - Replies to RPC requests are always <c>ERL_SEND</c> messages.</p> - <note> - <p>It is the caller's responsibility to free the returned - <c>ETERM</c> structure and the memory pointed to by - <c>emsg->msg</c> and <c>emsg->to</c>.</p> - </note> - <p><c>erl_rpc()</c> returns the remote function's return - value on success, otherwise <c>NULL</c>.</p> - <p><c>erl_rpc_to()</c> returns <c>0</c> on - success, otherwise a negative number.</p> - <p><c>erl_rcp_from()</c> returns <c>ERL_MSG</c> - on success (with <c>Emsg</c> now - containing the reply tuple), otherwise one of - <c>ERL_TICK</c>, <c>ERL_TIMEOUT</c>, or - <c>ERL_ERROR</c>.</p> - <p>When failing, - all three functions set <c>erl_errno</c> to one of:</p> - <taglist> - <tag><c>ENOMEM</c></tag> - <item>No more memory is available.</item> - <tag><c>EIO</c></tag> - <item>I/O error.</item> - <tag><c>ETIMEDOUT</c></tag> - <item>Timeout has expired.</item> - <tag><c>EAGAIN</c></tag> - <item>Temporary error: Try again.</item> - </taglist> - </desc> - </func> - - <func> - <name since=""><ret>int</ret><nametext>erl_send(fd, to, msg)</nametext></name> - <fsummary>Send a message.</fsummary> - <type> - <v>int fd;</v> - <v>ETERM *to, *msg;</v> - </type> - <desc> - <p>Sends an Erlang term to a process.</p> - <list type="bulleted"> - <item><c>fd</c> is an open descriptor to an Erlang - connection.</item> - <item><c>to</c> is an Erlang term containing the pid of - the intended recipient of the message.</item> - <item>><c>msg</c> is the Erlang term to be sent.</item> - </list> - <p>Returns <c>1</c> on success, otherwise <c>0</c>. In - the latter case <c>erl_errno</c> is set to one of:</p> - <taglist> - <tag><c>EINVAL</c></tag> - <item>Invalid argument: <c>to</c> is not a valid Erlang - pid.</item> - <tag><c>ENOMEM</c></tag> - <item>No more memory is available.</item> - <tag><c>EIO</c></tag> - <item>I/O error.</item> - </taglist> - </desc> - </func> - - <func> - <name since=""><ret>const char *</ret><nametext>erl_thisalivename()</nametext></name> - <name since=""><ret>const char *</ret><nametext>erl_thiscookie()</nametext></name> - <name since=""><ret>short</ret><nametext>erl_thiscreation()</nametext></name> - <name since=""><ret>const char *</ret><nametext>erl_thishostname()</nametext></name> - <name since=""><ret>const char *</ret><nametext>erl_thisnodename()</nametext></name> - <fsummary>Retrieve some values.</fsummary> - <desc> - <p>Retrieves information about - the C-node. These values are initially set with - <c>erl_connect_init()</c> or - <c>erl_connect_xinit()</c>.</p> - </desc> - </func> - - <func> - <name since=""><ret>int</ret><nametext>erl_unpublish(alive)</nametext></name> - <fsummary>Forcefully unpublish a node name.</fsummary> - <type> - <v>char *alive;</v> - </type> - <desc> - <p>This function can be called by a process to unregister a - specified node from EPMD on the local host. This is, however, usually - not allowed, unless EPMD was started with flag - <c>-relaxed_command_check</c>, which it normally is not.</p> - <p>To unregister a node you have published, you should instead - close the descriptor that was returned by - <c>ei_publish()</c>.</p> - <warning> - <p>This function is deprecated and will be removed in a future - release.</p> - </warning> - <p><c>alive</c> is the name of the node to unregister, that - is, the first component of the node name, without - <c>@hostname</c>.</p> - <p>If the node was successfully unregistered from EPMD, <c>0</c> is - returned, otherwise <c>-1</c> is returned and - <c>erl_errno</c> is set to <c>EIO</c>.</p> - </desc> - </func> - - <func> - <name since=""><ret>int</ret><nametext>erl_xreceive_msg(fd, bufpp, bufsizep, emsg)</nametext></name> - <fsummary>Receive and decode a message.</fsummary> - <type> - <v>int fd;</v> - <v>unsigned char **bufpp;</v> - <v>int *bufsizep;</v> - <v>ErlMessage *emsg;</v> - </type> - <desc> - <p>Similar to <c>erl_receive_msg</c>. The difference is - that <c>erl_xreceive_msg</c> expects the buffer to - have been allocated by <c>malloc</c>, and reallocates it - if the received - message does not fit into the original buffer. Therefore - both buffer and buffer length are given as pointers; their values - can change by the call.</p> - <p>On success, the function returns <c>ERL_MSG</c> and the - <c>Emsg</c> struct is initialized as described above, or - <c>ERL_TICK</c>, in which case no message is returned. On - failure, the function returns <c>ERL_ERROR</c> and sets - <c>erl_errno</c> to one of:</p> - <taglist> - <tag><c>EMSGSIZE</c></tag> - <item>Buffer is too small.</item> - <tag><c>ENOMEM</c></tag> - <item>No more memory is available.</item> - <tag><c>EIO</c></tag> - <item>I/O error.</item> - </taglist> - </desc> - </func> - - <func> - <name since=""><ret>struct hostent *</ret><nametext>erl_gethostbyaddr(addr, length, type)</nametext></name> - <name since=""><ret>struct hostent *</ret><nametext>erl_gethostbyaddr_r(addr, length, type, hostp, buffer, buflen, h_errnop)</nametext></name> - <name since=""><ret>struct hostent *</ret><nametext>erl_gethostbyname(name)</nametext></name> - <name since=""><ret>struct hostent *</ret><nametext>erl_gethostbyname_r(name, hostp, buffer, buflen, h_errnop)</nametext></name> - - <fsummary>Name lookup functions.</fsummary> - <type> - <v>const char *name;</v> - <v>const char *addr;</v> - <v>int length;</v> - <v>int type;</v> - <v>struct hostent *hostp;</v> - <v>char *buffer;</v> - <v>int buflen;</v> - <v>int *h_errnop;</v> - </type> - <desc> - <p>Convenience functions for some common name lookup functions.</p> - </desc> - </func> - </funcs> - - <section> - <title>Debug Information</title> - <p>If a connection attempt fails, the following can be checked:</p> - - <list type="bulleted"> - <item><c>erl_errno</c></item> - <item>That the correct cookie was used</item> - <item>That EPMD is running</item> - <item>That the remote Erlang node on the other side is running the same - version of Erlang as the <c>erl_interface</c> library</item> - </list> - </section> -</cref> |