1ei_connect(3)                 C Library Functions                ei_connect(3)
2
3
4

NAME

6       ei_connect - Communicate with distributed Erlang.
7

DESCRIPTION

9       This  module enables C-programs to communicate with Erlang nodes, using
10       the Erlang distribution over TCP/IP.
11
12       A C-node appears to Erlang as a hidden node. That is, Erlang  processes
13       that  know  the  name of the C-node can communicate with it in a normal
14       manner, but the node name is not  shown  in  the  listing  provided  by
15       erlang:nodes/0 in ERTS.
16
17       The  environment  variable  ERL_EPMD_PORT can be used to indicate which
18       logical cluster a C-node belongs to.
19

TIME-OUT FUNCTIONS

21       Most functions appear in a version with the suffix _tmo appended to the
22       function  name.  Those  functions take an extra argument, a time-out in
23       milliseconds. The semantics is this: for each  communication  primitive
24       involved  in  the  operation, if the primitive does not complete within
25       the time specified, the function returns an error and erl_errno is  set
26       to ETIMEDOUT. With communication primitive is meant an operation on the
27       socket, like connect, accept, recv, or send.
28
29       Clearly the time-outs are for implementing fault tolerance, not to keep
30       hard  real-time  promises.  The  _tmo  functions are for detecting non-
31       responsive peers and to avoid blocking on socket operations.
32
33       A time-out value of 0 (zero) means that time-outs are disabled. Calling
34       a _tmo function with the last argument as 0 is therefore the same thing
35       as calling the function without the _tmo suffix.
36
37       As with all other functions starting with ei_, you are not expected  to
38       put  the socket in non-blocking mode yourself in the program. Every use
39       of non-blocking mode is embedded inside  the  time-out  functions.  The
40       socket  will  always  be back in blocking mode after the operations are
41       completed (regardless of the result).  To  avoid  problems,  leave  the
42       socket options alone. ei handles any socket options that need modifica‐
43       tion.
44
45       In all other senses, the _tmo functions inherit all the  return  values
46       and the semantics from the functions without the _tmo suffix.
47

USER SUPPLIED SOCKET IMPLEMENTATION

49       By  default  ei  supplies a TCP/IPv4 socket interface that is used when
50       communicating. The user can however plug in  his/her  own  IPv4  socket
51       implementation.  This, for example, in order to communicate over TLS. A
52       user supplied socket implementation is plugged in by passing a callback
53       structure to either ei_connect_init_ussi() or ei_connect_xinit_ussi().
54
55       All  callbacks  in the ei_socket_callbacks structure should return zero
56       on success; and a posix error code on failure.
57
58       The addr argument of the listen, accept, and connect callbacks refer to
59       appropriate address structure for currently used protocol. Currently ei
60       only supports IPv4. That is, at this  time  addr  always  points  to  a
61       struct sockaddr_in structure.
62
63       The  ei_socket_callbacks  structure  may be enlarged in the future. All
64       fields not set, needs to be zeroed out. Currently the following  fields
65       exist:
66
67         flags:
68           Flags  informing  ei  about  the  behaviour of the callbacks. Flags
69           should be bitwise or:ed together. If no flag,  is  set,  the  flags
70           field should contain 0. Currently, supported flags:
71
72           EI_SCLBK_FLG_FULL_IMPL:
73             If  set,  the  accept(), connect(), writev(), write(), and read()
74             callbacks implements timeouts. The timeout is passed in  the  tmo
75             argument  and  is given in milli seconds. Note that the tmo argu‐
76             ment to these callbacks differ from the timeout arguments in  the
77             ei  API.  Zero  means  a  zero timeout. That is, poll and timeout
78             immediately unless the operation is successful.  EI_SCLBK_INF_TMO
79             (max  unsigned) means infinite timeout. The file descriptor is in
80             blocking mode when a callback is called, and it must be in block‐
81             ing mode when the callback returns.
82
83             If not set, ei will implement the timeout using select() in order
84             to determine when to call the callbacks and when to time out. The
85             tmo  arguments of the accept(), connect(), writev(), write(), and
86             read() callbacks should be ignored. The callbacks may  be  called
87             in  non-blocking  mode.  The  callbacks are not allowed to change
88             between blocking and non-blocking mode.  In  order  for  this  to
89             work,  select() needs to interact with the socket primitives used
90             the same way as it interacts with the ordinary socket primitives.
91             If this is not the case, the callbacks need to implement timeouts
92             and this flag should be set.
93
94           More flags may be introduced in the future.
95
96         int (*socket)(void **ctx, void *setup_ctx):
97           Create a socket and a context for the socket.
98
99           On success it should set *ctx to point to a context for the created
100           socket.  This context will be passed to all other socket callbacks.
101           This function will be passed the same setup_context  as  passed  to
102           the  preceeding  ei_connect_init_ussi()  or ei_connect_xinit_ussi()
103           call.
104
105     Note:
106         During the lifetime of a socket, the pointer *ctx has to  remain  the
107         same. That is, it cannot later be relocated.
108
109
110           This callback is mandatory.
111
112         int (*close)(void *ctx):
113           Close the socket identified by ctx and destroy the context.
114
115           This callback is mandatory.
116
117         int (*listen)(void *ctx, void *addr, int *len, int backlog):
118           Bind  the  socket  identified  by ctx to a local interface and then
119           listen on it.
120
121           The addr and len arguments are both  input  and  output  arguments.
122           When called addr points to an address structure of lenght *len con‐
123           taining information on how to bind the socket.  Uppon  return  this
124           callback  should  have  updated the structure referred by addr with
125           information on how the socket actually was bound.  *len  should  be
126           updated  to  reflect  the size of *addr updated. backlog identifies
127           the size of the backlog for the listen socket.
128
129           This callback is mandatory.
130
131         int (*accept)(void **ctx, void *addr, int *len, unsigned tmo):
132           Accept connections on the listen socket identified by *ctx.
133
134           When a connection is accepted, a new context for the accepted  con‐
135           nection  should  be  created and *ctx should be updated to point to
136           the new context for  the  accepted  connection.  When  called  addr
137           points  to an uninitialized address structure of lenght *len. Uppon
138           return this callback should have updated this structure with infor‐
139           mation  about the client address. *len should be updated to reflect
140           the size of *addr updated.
141
142           If the EI_SCLBK_FLG_FULL_IMPL flag has been set, tmo contains time‐
143           out time in milliseconds.
144
145     Note:
146         During  the  lifetime of a socket, the pointer *ctx has to remain the
147         same. That is, it cannot later be relocated.
148
149
150           This callback is mandatory.
151
152         int (*connect)(void *ctx, void *addr, int len, unsigned tmo):
153           Connect the socket identified by ctx to the address  identified  by
154           addr.
155
156           When  called addr points to an address structure of lenght len con‐
157           taining information on where to connect.
158
159           If the EI_SCLBK_FLG_FULL_IMPL flag has been set, tmo contains time‐
160           out time in milliseconds.
161
162           This callback is mandatory.
163
164         int  (*writev)(void *ctx, const void *iov, long iovcnt, ssize_t *len,
165         unsigned tmo):
166           Write data on the connected socket identified by ctx.
167
168           iov points to an array of struct iovec structures of length  iovcnt
169           containing  data  to write to the socket. On success, this callback
170           should set *len to the amount of bytes successfully written on  the
171           socket.
172
173           If the EI_SCLBK_FLG_FULL_IMPL flag has been set, tmo contains time‐
174           out time in milliseconds.
175
176           This callback  is  optional.  Set  the  writev  field  in  the  the
177           ei_socket_callbacks structure to NULL if not implemented.
178
179         int (*write)(void *ctx, const char *buf, ssize_t *len, unsigned tmo):
180           Write data on the connected socket identified by ctx.
181
182           When  called  buf  points to a buffer of length *len containing the
183           data to write on the socket. On success, this callback  should  set
184           *len to the amount of bytes successfully written on the socket.
185
186           If the EI_SCLBK_FLG_FULL_IMPL flag has been set, tmo contains time‐
187           out time in milliseconds.
188
189           This callback is mandatory.
190
191         int (*read)(void *ctx, char *buf, ssize_t *len, unsigned tmo):
192           Read data on the connected socket identified by ctx.
193
194           buf points to a buffer of length *len where the read data should be
195           placed.  On success, this callback should update *len to the amount
196           of bytes successfully read on the socket.
197
198           If the EI_SCLBK_FLG_FULL_IMPL flag has been set, tmo contains time‐
199           out time in milliseconds.
200
201           This callback is mandatory.
202
203         int (*handshake_packet_header_size)(void *ctx, int *sz):
204           Inform  about handshake packet header size to use during the Erlang
205           distribution handshake.
206
207           On success, *sz should be set to the handshake packet  header  size
208           to  use.  Valid  values  are 2 and 4. Erlang TCP distribution use a
209           handshake packet size of 2 and Erlang TLS distribution use a  hand‐
210           shake packet size of 4.
211
212           This callback is mandatory.
213
214         int (*connect_handshake_complete)(void *ctx):
215           Called when a locally started handshake has completed successfully.
216
217           This callback is optional. Set the connect_handshake_complete field
218           in the ei_socket_callbacks structure to NULL if not implemented.
219
220         int (*accept_handshake_complete)(void *ctx):
221           Called when a remotely started  handshake  has  completed  success‐
222           fully.
223
224           This  callback is optional. Set the accept_handshake_complete field
225           in the ei_socket_callbacks structure to NULL if not implemented.
226
227         int (*get_fd)(void *ctx, int *fd):
228           Inform about file descriptor used by the socket which is identified
229           by ctx.
230
231     Note:
232         During  the  lifetime  of a socket, the file descriptor has to remain
233         the same. That is, repeated calls to this callback with the same con‐
234         text should always report the same file descriptor.
235
236         The  file  descriptor  has  to be a real file descriptor. That is, no
237         other operation should be able to get the same file descriptor  until
238         it has been released by the close() callback.
239
240
241           This callback is mandatory.
242

DATA TYPES

244         ei_cnode:
245           Opaque  data  type  representing  a C-node. A ei_cnode structure is
246           initialized by calling ei_connect_init() or friends.
247
248         ei_socket_callbacks:
249
250
251         typedef struct {
252             int flags;
253             int (*socket)(void **ctx, void *setup_ctx);
254             int   (*close)(void *ctx);
255             int (*listen)(void *ctx, void *addr, int *len, int backlog);
256             int (*accept)(void **ctx, void *addr, int *len, unsigned tmo);
257             int (*connect)(void *ctx, void *addr, int len, unsigned tmo);
258             int (*writev)(void *ctx, const void *iov, int iovcnt, ssize_t *len, unsigned tmo);
259             int (*write)(void *ctx, const char *buf, ssize_t *len, unsigned tmo);
260             int (*read)(void *ctx, char *buf, ssize_t *len, unsigned tmo);
261             int (*handshake_packet_header_size)(void *ctx, int *sz);
262             int (*connect_handshake_complete)(void *ctx);
263             int (*accept_handshake_complete)(void *ctx);
264             int (*get_fd)(void *ctx, int *fd);
265         } ei_socket_callbacks;
266
267           Callbacks functions for a User  Supplied  Socket  Implementation  .
268           Documentation  of  each  field  can  be  found in the User Supplied
269           Socket Implementation  section above.
270
271         ErlConnect:
272
273
274         typedef struct {
275             char ipadr[4]; /* Ip v4 address in network byte order */
276             char nodename[MAXNODELEN];
277         } ErlConnect;
278
279           IP v4 address and nodename.
280
281         Erl_IpAddr:
282
283
284         typedef struct {
285             unsigned s_addr; /* Ip v4 address in network byte order */
286         } Erl_IpAddr;
287
288           IP v4 address.
289
290         erlang_msg:
291
292
293         typedef struct {
294             long msgtype;
295             erlang_pid from;
296             erlang_pid to;
297             char toname[MAXATOMLEN+1];
298             char cookie[MAXATOMLEN+1];
299             erlang_trace token;
300         } erlang_msg;
301
302           Information  about  a  message  received  via  ei_receive_msg()  or
303           friends.
304

EXPORTS

306       struct hostent *ei_gethostbyaddr(const char *addr, int len, int type)
307       struct  hostent  *ei_gethostbyaddr_r(const char *addr, int length,  int
308       type,   struct  hostent  *hostp,  char  *buffer,    int  buflen,    int
309       *h_errnop)
310       struct hostent *ei_gethostbyname(const char *name)
311       struct  hostent  *ei_gethostbyname_r(const  char *name,  struct hostent
312       *hostp,  char *buffer,  int buflen,  int *h_errnop)
313
314              Convenience functions for some common name lookup functions.
315
316       int ei_accept(ei_cnode *ec, int listensock, ErlConnect *conp)
317
318              Types:
319
320                 ei_cnode
321                 ErlConnect
322
323              Used by a server process to accept a connection  from  a  client
324              process.
325
326                * ec is the C-node structure.
327
328                * listensock  is  an  open socket descriptor on which listen()
329                  has previously been called.
330
331                * conp is a pointer to an ErlConnect struct.
332
333              On success, conp is filled in with the address and node name  of
334              the  connecting  client  and  a  file descriptor is returned. On
335              failure, ERL_ERROR is returned and erl_errno is set to EIO.
336
337       int  ei_accept_tmo(ei_cnode  *ec,  int  listensock,  ErlConnect  *conp,
338       unsigned timeout_ms)
339
340              Types:
341
342                 ei_cnode
343                 ErlConnect
344
345              Equivalent  to ei_accept with an optional time-out argument, see
346              the description at the beginning of this manual page.
347
348       int ei_close_connection(int fd)
349
350              Closes a previously opened connection or listen socket.
351
352       int ei_connect(ei_cnode* ec, char *nodename)
353       int ei_xconnect(ei_cnode* ec, Erl_IpAddr adr, char *alivename)
354       int ei_connect_host_port(ei_cnode* ec, char *hostname, int port)
355       int ei_xconnect_host_port(ei_cnode* ec, Erl_IpAddr adr, int port)
356
357              Types:
358
359                 ei_cnode
360                 Erl_IpAddr
361
362              Sets up a connection to an Erlang node.
363
364              ei_xconnect() requires the IP address of the remote host and the
365              alive name of the remote node to be specified. ei_connect() pro‐
366              vides an alternative interface and  determines  the  information
367              from  the  node name provided. The ei_xconnect_host_port() func‐
368              tion provides yet another alternative that  will  work  even  if
369              there  is  no EPMD instance on the host where the remote node is
370              running. The ei_xconnect_host_port() function  requires  the  IP
371              address and port of the remote node to be specified. The ei_con‐
372              nect_host_port()  function  is  an   alternative   to   ei_xcon‐
373              nect_host_port()  that  lets the user specify a hostname instead
374              of an IP address.
375
376                * adr is the 32-bit IP address of the remote host.
377
378                * alive is the alivename of the remote node.
379
380                * node is the name of the remote node.
381
382                * port is the port number of the remote node.
383
384              These functions return an open file descriptor on success, or  a
385              negative  value indicating that an error occurred. In the latter
386              case they set erl_errno to one of the following:
387
388                EHOSTUNREACH:
389                  The remote host node is unreachable.
390
391                ENOMEM:
392                  No more memory is available.
393
394                EIO:
395                  I/O error.
396
397              Also, errno values from socket(2) and  connect(2)  system  calls
398              may be propagated into erl_errno.
399
400              Example:
401
402              #define NODE   "madonna@chivas.du.etx.ericsson.se"
403              #define ALIVE  "madonna"
404              #define IP_ADDR "150.236.14.75"
405
406              /*** Variant 1 ***/
407              int fd = ei_connect(&ec, NODE);
408
409              /*** Variant 2 ***/
410              struct in_addr addr;
411              addr.s_addr = inet_addr(IP_ADDR);
412              fd = ei_xconnect(&ec, &addr, ALIVE);
413
414
415       int  ei_connect_init(ei_cnode*  ec,  const  char* this_node_name, const
416       char *cookie, short creation)
417       int  ei_connect_init_ussi(ei_cnode*  ec,  const  char*  this_node_name,
418       const  char  *cookie,  short  creation,  ei_socket_callbacks  *cbs, int
419       cbs_sz, void *setup_context)
420       int ei_connect_xinit(ei_cnode* ec, const char *thishostname, const char
421       *thisalivename,  const char *thisnodename, Erl_IpAddr thisipaddr, const
422       char *cookie, short creation)
423       int ei_connect_xinit_ussi(ei_cnode* ec, const char *thishostname, const
424       char  *thisalivename,  const char *thisnodename, Erl_IpAddr thisipaddr,
425       const char  *cookie,  short  creation,  ei_socket_callbacks  *cbs,  int
426       cbs_sz, void *setup_context)
427
428              Types:
429
430                 ei_cnode
431                 Erl_IpAddr
432                 ei_socket_callbacks
433
434              Initializes  the  ec  structure,  to  identify the node name and
435              cookie of the server. One of them must be  called  before  other
436              functions  that  works on the ei_cnode type or a file descriptor
437              associated with a connection to another node is used.
438
439                * ec is a structure containing information about  the  C-node.
440                  It  is used in other ei functions for connecting and receiv‐
441                  ing data.
442
443                * this_node_name is the name of the C-node  (the  name  before
444                  '@' in the full node name).
445
446                * cookie is the cookie for the node.
447
448                * creation  identifies a specific instance of a C-node. It can
449                  help prevent the node from receiving  messages  sent  to  an
450                  earlier process with the same registered name.
451
452                * thishostname  is  the name of the machine we are running on.
453                  If long names are to be used, they are to be fully qualified
454                  (that is, durin.erix.ericsson.se instead of durin).
455
456                * thisalivename  is  the  name  of  the local C-node (the name
457                  before '@' in the full node name). Can be NULL (from OTP 23)
458                  to get a dynamically assigned name from the peer node.
459
460                * thisnodename  is the full name of the local C-node, that is,
461                  mynode@myhost. Can be NULL if thisalivename is NULL.
462
463                * thispaddr if the IP address of the host.
464
465                * cbs is a pointer to a callback  structure  implementing  and
466                  alternative socket interface.
467
468                * cbs_sz is the size of the structure pointed to by cbs.
469
470                * setup_context  is  a  pointer  to  a  structure that will be
471                  passed as second argument to the socket callback in the  cbs
472                  structure.
473
474              A  C-node  acting as a server is assigned a creation number when
475              it calls ei_publish().
476
477              A connection is closed by simply closing the socket. For  infor‐
478              mation  about how to close the socket gracefully (when there are
479              outgoing packets before close), see the relevant system documen‐
480              tation.
481
482              These functions return a negative value indicating that an error
483              occurred.
484
485              Example 1:
486
487              int n = 0;
488              struct in_addr addr;
489              ei_cnode ec;
490              addr.s_addr = inet_addr("150.236.14.75");
491              if (ei_connect_xinit(&ec,
492                                   "chivas",
493                                   "madonna",
494                                   "madonna@chivas.du.etx.ericsson.se",
495                                   &addr;
496                                   "cookie...",
497                                   n++) < 0) {
498                  fprintf(stderr,"ERROR when initializing: %d",erl_errno);
499                  exit(-1);
500              }
501
502
503              Example 2:
504
505              if (ei_connect_init(&ec, "madonna", "cookie...", n++) < 0) {
506                  fprintf(stderr,"ERROR when initializing: %d",erl_errno);
507                  exit(-1);
508              }
509
510
511       int ei_connect_tmo(ei_cnode* ec, char *nodename, unsigned timeout_ms)
512       int ei_xconnect_tmo(ei_cnode*  ec,  Erl_IpAddr  adr,  char  *alivename,
513       unsigned timeout_ms)
514       int  ei_connect_host_port_tmo(ei_cnode*  ec,  char *hostname, int port,
515       unsigned ms)
516       int ei_xconnect_host_port_tmo(ei_cnode* ec, Erl_IpAddr adr,  int  port,
517       unsigned ms)
518
519              Types:
520
521                 ei_cnode
522                 Erl_IpAddr
523
524              Equivalent  to ei_connect, ei_xconnect, ei_connect_host_port and
525              ei_xconnect_host_port with an optional  time-out  argument,  see
526              the description at the beginning of this manual page.
527
528       int ei_get_tracelevel(void)
529       void ei_set_tracelevel(int level)
530
531              Used  to set tracing on the distribution. The levels are differ‐
532              ent verbosity levels. A higher level means more information. See
533              also section  Debug Information.
534
535              These functions are not thread safe.
536
537       int ei_listen(ei_cnode *ec, int *port, int backlog)
538       int ei_xlisten(ei_cnode *ec, Erl_IpAddr adr, int *port, int backlog)
539
540              Types:
541
542                 ei_cnode
543                 Erl_IpAddr
544
545              Used  by  a  server process to setup a listen socket which later
546              can be used for accepting connections from client processes.
547
548                * ec is the C-node structure.
549
550                * adr is local interface to bind to.
551
552                * port is a pointer to an integer containing the  port  number
553                  to  bind to. If *port equals 0 when calling ei_listen(), the
554                  socket will be bound  to  an  ephemeral  port.  On  success,
555                  ei_listen() will update the value of *port to the port actu‐
556                  ally bound to.
557
558                * backlog is maximum backlog of pending connections.
559
560              ei_listen will create a socket, bind to  a  port  on  the  local
561              interface  identified by adr (or all local interfaces if ei_lis‐
562              ten() is called), and mark the socket as a passive socket  (that
563              is,  a  socket  that will be used for accepting incoming connec‐
564              tions).
565
566              On success, a file descriptor is returned which can be used in a
567              call  to  ei_accept().  On  failure,  ERL_ERROR  is returned and
568              erl_errno is set to EIO.
569
570       int ei_make_pid(ei_cnode *ec, erlang_pid *pid)
571
572              Types:
573
574                 ei_cnode
575                 erlang_pid
576
577              Creates a new process  identifier  in  the  argument  pid.  This
578              process  identifier  refers  to a conseptual process residing on
579              the C-node identified by  the  argument  ec.  On  success  0  is
580              returned. On failure ERL_ERROR is returned and erl_errno is set.
581
582              The  C-node identified by ec must have been initialized and must
583              have received a name prior to the call  to  ei_make_pid().  Ini‐
584              tialization of the C-node is done by a call to ei_connect_init()
585              or friends. If the name is dynamically assigned  from  the  peer
586              node, the C-node also has to be connected.
587
588       int ei_make_ref(ei_cnode *ec, erlang_ref *ref)
589
590              Types:
591
592                 ei_cnode
593                 erlang_ref
594
595              Creates  a  new  reference  in  the argument ref. This reference
596              originates from the C-node identified by  the  argument  ec.  On
597              success  0  is  returned.  On  failure ERL_ERROR is returned and
598              erl_errno is set.
599
600              The C-node identified by ec must have been initialized and  must
601              have  received  a  name prior to the call to ei_make_ref(). Ini‐
602              tialization of the C-node is done by a call to ei_connect_init()
603              or  friends.  If  the name is dynamically assigned from the peer
604              node, the C-node also has to be connected.
605
606       int ei_publish(ei_cnode *ec, int port)
607
608              Types:
609
610                 ei_cnode
611
612              Used by a server process to register with the local name  server
613              EPMD, thereby allowing other processes to send messages by using
614              the registered name. Before calling either of  these  functions,
615              the  process  should  have called bind() and listen() on an open
616              socket.
617
618                * ec is the C-node structure.
619
620                * port is the local name to register, and is to be the same as
621                  the port number that was previously bound to the socket.
622
623                * addr is the 32-bit IP address of the local host.
624
625              To  unregister  with EPMD, simply close the returned descriptor.
626              Do not use ei_unpublish(), which is deprecated anyway.
627
628              On success, the function returns  a  descriptor  connecting  the
629              calling  process  to  EPMD.  On  failure,  -1  is  returned  and
630              erl_errno is set to EIO.
631
632              Also, errno values from socket(2) and  connect(2)  system  calls
633              may be propagated into erl_errno.
634
635       int ei_publish_tmo(ei_cnode *ec, int port, unsigned timeout_ms)
636
637              Types:
638
639                 ei_cnode
640
641              Equivalent to ei_publish with an optional time-out argument, see
642              the description at the beginning of this manual page.
643
644       int ei_receive(int fd, unsigned char* bufp, int bufsize)
645
646              Receives a message consisting of a  sequence  of  bytes  in  the
647              Erlang external format.
648
649                * fd  is  an  open  descriptor  to an Erlang connection. It is
650                  obtained from a previous ei_connect or ei_accept.
651
652                * bufp is a buffer large enough to hold the expected message.
653
654                * bufsize indicates the size of bufp.
655
656              If a tick occurs, that is, the Erlang node on the other  end  of
657              the connection has polled this node to see if it is still alive,
658              the function returns ERL_TICK and no message is  placed  in  the
659              buffer. Also, erl_errno is set to EAGAIN.
660
661              On  success,  the  message is placed in the specified buffer and
662              the function returns the number of bytes actually read. On fail‐
663              ure, the function returns ERL_ERROR and sets erl_errno to one of
664              the following:
665
666                EAGAIN:
667                  Temporary error: Try again.
668
669                EMSGSIZE:
670                  Buffer is too small.
671
672                EIO:
673                  I/O error.
674
675       int ei_receive_encoded(int fd, char **mbufp,  int  *bufsz,   erlang_msg
676       *msg, int *msglen)
677
678              Types:
679
680                 erlang_msg
681
682              This  function is retained for compatibility with code generated
683              by the interface compiler and with code  following  examples  in
684              the same application.
685
686              In  essence, the function performs the same operation as ei_xre‐
687              ceive_msg, but instead  of  using  an  ei_x_buff,  the  function
688              expects  a  pointer  to  a  character pointer (mbufp), where the
689              character pointer is to point to a memory area allocated by mal‐
690              loc.  Argument bufsz is to be a pointer to an integer containing
691              the exact size (in bytes) of the memory area. The  function  may
692              reallocate  the  memory  area and will in such cases put the new
693              size in *bufsz and update *mbufp.
694
695              Returns either ERL_TICK or the msgtype field of  the  erlang_msg
696              *msg.  The  length  of the message is put in *msglen. On error a
697              value < 0 is returned.
698
699              It is recommended to use ei_xreceive_msg instead when  possible,
700              for  the  sake  of  readability.  However,  the function will be
701              retained in the interface for  compatibility  and  will  not  be
702              removed in future releases without prior notice.
703
704       int   ei_receive_encoded_tmo(int   fd,   char   **mbufp,   int  *bufsz,
705       erlang_msg *msg, int *msglen, unsigned timeout_ms)
706
707              Types:
708
709                 erlang_msg
710
711              Equivalent to ei_receive_encoded with an optional time-out argu‐
712              ment, see the description at the beginning of this manual page.
713
714       int ei_receive_msg(int fd, erlang_msg* msg, ei_x_buff* x)
715       int ei_xreceive_msg(int fd, erlang_msg* msg, ei_x_buff* x)
716
717              Types:
718
719                 ei_x_buff
720                 erlang_msg
721
722              Receives  a  message  to the buffer in x. ei_xreceive_msg allows
723              the buffer in x to grow, but ei_receive_msg fails if the message
724              is larger than the pre-allocated buffer in x.
725
726                * fd is an open descriptor to an Erlang connection.
727
728                * msg  is  a  pointer  to an erlang_msg structure and contains
729                  information on the message received.
730
731                * x is buffer obtained from ei_x_new.
732
733              On success, the functions return ERL_MSG and the msg  struct  is
734              initialized.
735
736              msgtype  identifies  the type of message, and is one of the fol‐
737              lowing:
738
739                ERL_SEND:
740                  Indicates that an  ordinary  send  operation  has  occurred.
741                  msg->to contains the pid of the recipient (the C-node).
742
743                ERL_REG_SEND:
744                  A registered send operation occurred. msg->from contains the
745                  pid of the sender.
746
747                ERL_LINK or ERL_UNLINK:
748                  msg->to and msg->from contain the pids  of  the  sender  and
749                  recipient of the link or unlink.
750
751                ERL_EXIT:
752                  Indicates  a  broken link. msg->to and msg->from contain the
753                  pids of the linked processes.
754
755              The return value is the same as for ei_receive.
756
757       int ei_receive_msg_tmo(int fd, erlang_msg* msg, ei_x_buff* x,  unsigned
758       imeout_ms)
759       int ei_xreceive_msg_tmo(int fd, erlang_msg* msg, ei_x_buff* x, unsigned
760       timeout_ms)
761
762              Types:
763
764                 ei_x_buff
765                 erlang_msg
766
767              Equivalent  to  ei_receive_msg  and  ei_xreceive_msg   with   an
768              optional time-out argument, see the description at the beginning
769              of this manual page.
770
771       int ei_receive_tmo(int fd, unsigned char* bufp, int  bufsize,  unsigned
772       timeout_ms)
773
774              Equivalent to ei_receive with an optional time-out argument, see
775              the description at the beginning of this manual page.
776
777       int ei_reg_send(ei_cnode* ec, int fd, char* server_name, char* buf, int
778       len)
779
780              Types:
781
782                 ei_cnode
783
784              Sends an Erlang term to a registered process.
785
786                * fd is an open descriptor to an Erlang connection.
787
788                * server_name  is  the registered name of the intended recipi‐
789                  ent.
790
791                * buf is the buffer containing the term in binary format.
792
793                * len is the length of the message in bytes.
794
795              Returns 0 if successful, otherwise -1. In  the  latter  case  it
796              sets erl_errno to EIO.
797
798              Example:
799
800              Send the atom "ok" to the process "worker":
801
802              ei_x_buff x;
803              ei_x_new_with_version(&x);
804              ei_x_encode_atom(&x, "ok");
805              if (ei_reg_send(&ec, fd, x.buff, x.index) < 0)
806                  handle_error();
807
808
809       int ei_reg_send_tmo(ei_cnode* ec, int fd, char* server_name, char* buf,
810       int len, unsigned timeout_ms)
811
812              Types:
813
814                 ei_cnode
815
816              Equivalent to ei_reg_send with an  optional  time-out  argument,
817              see the description at the beginning of this manual page.
818
819       int ei_rpc(ei_cnode *ec, int fd, char *mod, char *fun, const char *arg‐
820       buf, int argbuflen, ei_x_buff *x)
821       int ei_rpc_to(ei_cnode *ec, int fd, char *mod, char  *fun,  const  char
822       *argbuf, int argbuflen)
823       int  ei_rpc_from(ei_cnode  *ec,  int  fd, int timeout, erlang_msg *msg,
824       ei_x_buff *x)
825
826              Types:
827
828                 ei_cnode
829                 ei_x_buff
830                 erlang_msg
831
832              Supports calling Erlang functions on remote  nodes.  ei_rpc_to()
833              sends an RPC request to a remote node and ei_rpc_from() receives
834              the results of such a call. ei_rpc() combines the  functionality
835              of these two functions by sending an RPC request and waiting for
836              the results. See also rpc:call/4 in Kernel.
837
838                * ec is the C-node structure previously initiated by a call to
839                  ei_connect_init() or ei_connect_xinit().
840
841                * fd is an open descriptor to an Erlang connection.
842
843                * timeout  is  the  maximum time (in milliseconds) to wait for
844                  results. Specify ERL_NO_TIMEOUT to  wait  forever.  ei_rpc()
845                  waits  infinitely  for  the  answer,  that is, the call will
846                  never time out.
847
848                * mod is the name of the module containing the function to  be
849                  run on the remote node.
850
851                * fun is the name of the function to run.
852
853                * argbuf is a pointer to a buffer with an encoded Erlang list,
854                  without a version magic number, containing the arguments  to
855                  be passed to the function.
856
857                * argbuflen is the length of the buffer containing the encoded
858                  Erlang list.
859
860                * msg is structure of type erlang_msg and contains information
861                  on the message received. For a description of the erlang_msg
862                  format, see ei_receive_msg.
863
864                * x points to the dynamic buffer that receives the result. For
865                  ei_rpc()  this  is the result without the version magic num‐
866                  ber. For ei_rpc_from() the result returns  a  version  magic
867                  number and a 2-tuple {rex,Reply}.
868
869              ei_rpc()  returns  the  number of bytes in the result on success
870              and -1 on failure. ei_rpc_from() returns the  number  of  bytes,
871              otherwise  one  of  ERL_TICK,  ERL_TIMEOUT,  and ERL_ERROR. When
872              failing, all three functions set erl_errno to one of the follow‐
873              ing:
874
875                EIO:
876                  I/O error.
877
878                ETIMEDOUT:
879                  Time-out expired.
880
881                EAGAIN:
882                  Temporary error: Try again.
883
884              Example:
885
886              Check to see if an Erlang process is alive:
887
888              int index = 0, is_alive;
889              ei_x_buff args, result;
890
891              ei_x_new(&result);
892              ei_x_new(&args);
893              ei_x_encode_list_header(&args, 1);
894              ei_x_encode_pid(&args, &check_pid);
895              ei_x_encode_empty_list(&args);
896
897              if (ei_rpc(&ec, fd, "erlang", "is_process_alive",
898                         args.buff, args.index, &result) < 0)
899                  handle_error();
900
901              if (ei_decode_version(result.buff, &index) < 0
902                  || ei_decode_bool(result.buff, &index, &is_alive) < 0)
903                  handle_error();
904
905
906       erlang_pid *ei_self(ei_cnode *ec)
907
908              Types:
909
910                 ei_cnode
911                 erlang_pid
912
913              Retrieves  a  generic  pid  of  the  C-node.  Every C-node has a
914              (pseudo) pid used in ei_send_reg, ei_rpc(), and others. This  is
915              contained  in  a  field  in the ec structure. Do not modify this
916              structure.
917
918              On success a pointer to the process identifier is  returned.  On
919              failure NULL is returned and erl_errno is set.
920
921              The  C-node identified by ec must have been initialized and must
922              have received a name prior to the call to ei_self(). Initializa‐
923              tion  of  the  C-node  is done by a call to ei_connect_init() or
924              friends. If the name is dynamically assigned from the peer node,
925              the C-node also has to be connected.
926
927       int ei_send(int fd, erlang_pid* to, char* buf, int len)
928
929              Types:
930
931                 erlang_pid
932
933              Sends an Erlang term to a process.
934
935                * fd is an open descriptor to an Erlang connection.
936
937                * to is the pid of the intended recipient of the message.
938
939                * buf is the buffer containing the term in binary format.
940
941                * len is the length of the message in bytes.
942
943              Returns  0  if  successful,  otherwise -1. In the latter case it
944              sets erl_errno to EIO.
945
946       int ei_send_encoded(int fd, erlang_pid* to, char* buf, int len)
947
948              Types:
949
950                 erlang_pid
951
952              Works exactly as ei_send, the alternative name is  retained  for
953              backward compatibility. The function will not be removed without
954              prior notice.
955
956       int ei_send_encoded_tmo(int fd, erlang_pid* to,  char*  buf,  int  len,
957       unsigned timeout_ms)
958
959              Types:
960
961                 erlang_pid
962
963              Equivalent  to  ei_send_encoded  with an optional time-out argu‐
964              ment, see the description at the beginning of this manual page.
965
966       int ei_send_reg_encoded(int fd, const erlang_pid *from, const char *to,
967       const char *buf, int len)
968
969              Types:
970
971                 erlang_pid
972
973              This  function is retained for compatibility with code generated
974              by the interface compiler and with code  following  examples  in
975              the same application.
976
977              The function works as ei_reg_send with one exception. Instead of
978              taking ei_cnode as first argument, it takes a  second  argument,
979              an  erlang_pid,  which  is  to  be the process identifier of the
980              sending process (in the Erlang distribution protocol).
981
982              A suitable erlang_pid can be retrieved from the ei_cnode  struc‐
983              ture by calling ei_self(cnode_pointer).
984
985       int  ei_send_reg_encoded_tmo(int fd, const erlang_pid *from, const char
986       *to, const char *buf, int len)
987
988              Types:
989
990                 erlang_pid
991
992              Equivalent to  ei_send_reg_encoded  with  an  optional  time-out
993              argument,  see  the  description at the beginning of this manual
994              page.
995
996       int ei_send_tmo(int fd, erlang_pid* to, char* buf,  int  len,  unsigned
997       timeout_ms)
998
999              Types:
1000
1001                 erlang_pid
1002
1003              Equivalent  to  ei_send  with an optional time-out argument, see
1004              the description at the beginning of this manual page.
1005
1006       const char *ei_thisnodename(ei_cnode *ec)
1007       const char *ei_thishostname(ei_cnode *ec)
1008       const char *ei_thisalivename(ei_cnode *ec)
1009
1010              Types:
1011
1012                 ei_cnode
1013
1014              Can be used to retrieve information about the C-node. These val‐
1015              ues   are   initially  set  with  ei_connect_init()  or  ei_con‐
1016              nect_xinit().
1017
1018              These function simply fetch the appropriate field  from  the  ec
1019              structure.  Read  the field directly will probably be safe for a
1020              long time, so these functions are not really needed.
1021
1022       int ei_unpublish(ei_cnode *ec)
1023
1024              Types:
1025
1026                 ei_cnode
1027
1028              Can be called by a process to unregister a specified  node  from
1029              EPMD  on  the local host. This is, however, usually not allowed,
1030              unless EPMD was started with flag -relaxed_command_check,  which
1031              it normally is not.
1032
1033              To  unregister  a  node you have published, you should close the
1034              descriptor that was returned by ei_publish().
1035
1036          Warning:
1037              This function is deprecated and will  be  removed  in  a  future
1038              release.
1039
1040
1041              ec is the node structure of the node to unregister.
1042
1043              If  the  node was successfully unregistered from EPMD, the func‐
1044              tion returns 0. Otherwise, -1 is returned and erl_errno  is  set
1045              to EIO.
1046
1047       int ei_unpublish_tmo(ei_cnode *ec, unsigned timeout_ms)
1048
1049              Types:
1050
1051                 ei_cnode
1052
1053              Equivalent  to  ei_unpublish with an optional time-out argument,
1054              see the description at the beginning of this manual page.
1055

DEBUG INFORMATION

1057       If a connection attempt fails, the following can be checked:
1058
1059         * erl_errno.
1060
1061         * That the correct cookie was used
1062
1063         * That EPMD is running
1064
1065         * That the remote Erlang node on the other side is running  the  same
1066           version of Erlang as the ei library
1067
1068         * That environment variable ERL_EPMD_PORT is set correctly
1069
1070       The connection attempt can be traced by setting a trace level by either
1071       using   ei_set_tracelevel   or   by   setting   environment    variable
1072       EI_TRACELEVEL. The trace levels have the following messages:
1073
1074         * 1: Verbose error messages
1075
1076         * 2: Above messages and verbose warning messages
1077
1078         * 3: Above messages and progress reports for connection handling
1079
1080         * 4: Above messages and progress reports for communication
1081
1082         * 5: Above messages and progress reports for data conversion
1083
1084Ericsson AB                   erl_interface 4.0.2                ei_connect(3)
Impressum