Home

Erlang Interface

image

Contents

1. Before registering a name you should already have registered your port number with epmd Thisis not strictly necessary but if you neglect to do so then other nodes wishing to communicate with your service will be unable to find or connect to your process Create a pid that Erlang processes can use to communicate with your service 8 Erlang Interface 1 1 The Erl_Interface Library ETERM pid pid erl_mk_pid thisnode 14 0 0 erl_global_register fd servicename pid After registering the name you should use erl_accept O to wait for incoming connections Do not forget to free pid later with erl_free_term To unregister a name erl_global_unregister fd servicename 1 1 11 The Registry This section describes the use of the registry a simple mechanism for storing key value pairs in a C node as well as backing them up or restoring them from a M nesia table on an Erlang node More detailed information about the individual API functions can be found in the Reference M anual Keys are strings i e O terminated arrays of characters and values are arbitrary objects Although integers and floating point numbers are treated specially by the registry you can store strings or binary objects of any type as pointers To start you need to open a registry ei_reg reg reg ei_reg_open 45 The number 45 in the example indicates the approximate number of objects that you expect to store in the registry Internally the registry
2. e int ei_get_type const ei_x_buff x int type int size Fetch the type and size of an encoded term e int ei_decode_version const char buf int index int version Encode an empty list nil e int ei decode long const char buf int index long p D ecode integer e int ei decode ulong const char buf int index unsigned long p D ecode unsigned integer e int ei_decode_double const char buf int index double p D ecode a double e int ei_decode_boolean const char buf int index int p D ecode a boolean e int ei_decode_char const char buf int index char p D ecode a character e int ei_decode_string const char buf int index char p D ecode a string e int ei_decode_atom const char buf int index char p D ecode an atom e int ei_decode_binary const char buf int index void p long len D ecode a binary e int ei_decode_fun const char buf int index erlang fun p D ecode afun e void free fun erlang fun f Decode a fun e int ei decode pid const char buf int index erlangpid p Decode a pid e int ei decode port const char buf int index erlang_port p Decode aport e int ei_decode_ref const char buf int index erlang_ref p Decode a reference e int ei_decode_term const char buf int index void t Decode a ETERM e int ei_decode_trace const char buf int index erlang trace p D ecode a trace token e int ei decode tuple header const char buf int index int arity D ecode
3. 67 erl_global_unregister 2 C function 68 erl global whereis 3 C function 68 erl global names 2 C function erl global 67 erl global register 3 C function erl global 67 erl global unregister 2 C function erl global 68 erl global whereis 3 C function erl global 68 erl hd 1 C function erl_eterm 58 erl init 2 C function Erlang Interface 79 erl_eterm 58 erl iolist length 1 C function erl eterm 59 erl iolist to binary 1 C function erl eterm 58 erl iolist to string 1 C function erl eterm 58 erl_length 1 C function erl eterm 59 erl malloc erl alloc eterm 1 C function 69 erl eterm release 1 C function 69 erl eterm statistics 2 C function 69 erl free 1 C function 70 erl free array 2 C function 70 erl free compound 1 C function 70 erl free term 1 C function 70 erl malloc 1 C function 70 erl_malloc 1 C function erl_malloc 70 erl marshal erl_compare_ext 2 C function 71 erl_decode 1 C function 71 erl_decode_buf 1 C function 71 erl_encode 2 C function 71 erl encode buf 2 C function 71 erl ext size 1 C function 72 erl ext type 1 C function 72 erl peek ext 2 C function 73 erl term len 1 C function 73 erl match 2 C function erl_format 65 erl_mk_atom 1 C function erl_eterm 59 erl_mk_binary 2 C function erl eterm 59 erl_mk_empty_list 0 C function erl_eterm 60 erl mk estring 2 C function erl_eterm 60
4. madonna cookie n lt 0 erl_err_quit lt ERROR gt when initializing int ei_connect ei_cnode ec char nodename int ei_xconnect ei_cnode ec Erl_IpAddr adr char alivename These functions set up a connection to an Erlang node erl xconnect requires the IP address of the remote host and the alive name of the remote node to be specified erl_connect provides an alternative interface and determines the information from the node name provided addr isthe 32 bit IP address of the remote host alive isthe alivename of the remote node node isthe name of the remote node These functionsreturn an open file descriptor on success or a negative value indicating that an error occurred in which case they will set erl_errno to one of EHOSTUNREACH T he remote host node is unreachable ENOMEM No more memory available EIO I O error A dditionally errno values from socket 2 and connect 2 system calls may be propagated into erl_errno Example define NODE madonna chivas du etx ericsson se define ALIVE madonna define IP_ADDR 150 236 14 75 Variant 1 int fd erl_connect amp ec NODE Variant 2 struct in_addr addr addr inet_addr IP_ADDR erl_xconnect amp ec amp addr ALIVE int ei_receive int fd unsigned char bufp int bufsize Erlang Interface 41 ei_connect Erl_Interface Library Reference This function receives a message consisting of a sequence of by
5. ErlMessage Note The definition of ErlMessage has changed since earlier versions of Erl_Interface type identifies the type of message one of ERL_SEND ERL_REG_SEND ERL_LINK ERL_UNLINK and ERL_EXIT If type contains ERL_SEND this indicates that an ordinary send operation has taken place and emsg gt to contains the Pid of the recipient If type contains ERL_REG_SEND then a registered send operation took place and emsg gt from contains the Pid of the sender In both cases the actual message will be in emsg gt msg If type contains one of ERL_LINK Or ERL_UNLINK then emsg gt to and emsg gt from contain the pids of the sender and receipient of the link or unlink emsg gt msg is not used in these cases If type contains ERL_EXIT then this indicates that a link has been broken In this case emsg gt to and emsg gt from contain the pids of the linked processes and emsg gt nsg contains the reason for the exit N ote It is the caller s responsibility to release the memory pointed to by emsg gt msg emsg gt to and emsg gt from If atick occurs i e the Erlang node on the other end of the connection has polled this node to see if it is still alive the function will return ERL_TICK indicating that the tick has been received and responded to but no message will be placed in the buffer In this case you should call erl_receive_msg again On success the function returns ERL_MSG and the Emsg struct will be initialized as de
6. For example ETERM list anAtom anInt anAtom erl_mk_atom madonna anInt erl_mk_int 21 list erl_mk_empty_list list erl_cons anAtom list list erl_cons anInt list do some work erl_free_compound list ETERM erl_copy_term term Types e ETERM term This function creates and returns a copy of the Erlang term term ETERM erl_element position tuple Erlang Interface 57 erl_eterm Erl_Interface Library Reference Types e int position e ETERM tuple This function extracts a specified element from an Erlang tuple position specifies which element to retrieve from tuple The elements are numbered starting from 1 tuple is an Erlang term containing at least position elements The function returns a new Erlang term corresponding to the requested element or NULL if position Was greater than the arity of tuple void erl init NULL 0 Types s void NULL e int 0 This function must be called before any of the others in the erl_interface library in order to initialize the library functions The arguments must be specified as erl init NULL 0 ETERM erl_hd list Types e ETERM list Extracts the first element from a list list is an Erlang term containing a list The function returns an Erlang term corresponding to the head element in the list or a NULL pointer if 1ist was not a list ETERM erl_iolist_to_binary term Types e ETERM list This function co
7. 1 arr 0 SELF sockfd arr 1 erl_mk_atom Hello world emsg erl_mk_tuple arr 2 erl_reg_send sockfd my_server emsg erl_free_term emsg The first element of the tuple that is sent is your own Pid This enables my_server to reply Refer to the Reference M anual the erl_connect module for more information about send primitives 6 Erlang Interface 1 1 The Erl_Interface Library Example of Receiving Messages In this example Pid Something is received The received Pid is then used to return goodbye Pid ETERM arr 2 answer int sockfd rc char buf BUFSIZE ErlMessage emsg if rc erl_receive_msg sockfd buf BUFSIZE amp emsg ERL_MSG arr 0 erl_mk_atom goodbye arr 1 erl_element 1 emsg msg answer erl_mk_tuple arr 2 erl_send sockfd arr 1 answer erl_free_term answer erl_free_term emsg msg erl_free_term emsg to In order to provide robustness a distributed Erlang node occasionally polls all its connected neighbours in an attempt to detect failed nodes or communication links A node which receives such a message is expected to respond immediately with an ERL_TICK message This is done automatically by erl_receive however when this has occurred erl receive returns ERL_TICK to the caller without storing a message into the Er1Message structure W hen a message has been received it is the caller s responsibility to free the received message emsg msg as Well as emsg
8. 1 char cookie MAXATOMLEN 1 erlang_trace token erlang_msg msgtype identifies the type of message and is one of ERL_SEND ERL_REG_SEND ERL_LINK ERL_UNLINK and ERL_EXIT If msgtype is ERL_SEND this indicates that an ordinary send operation has taken place and msg gt to contains the Pid of the recipient the C node If type is ERL_REG_SEND then a registered send operation took place and msg gt from contains the Pid of the sender If msgtype S ERL_LINK or ERL_UNLINK then msg gt to and msg gt from contain the pids of the sender and receipient of the link or unlink If msgtype is ERL_EXIT then this indicates that a link has been broken In this case msg gt to and msg gt from contain the pids of the linked processes Erlang Interface Erl Interface Library Reference ei_connect The return value is the same as for ei_ receive see above int ei_send int fd erlang_ pid to charr buf int len This function sends an Erlang term to a process fd is an open descriptor to an Erlang connection to is the Pid of the intended recipient of the message buf is the buffer containing the term in binary format len is the length of the message in bytes The function returns 0 if successful otherwise 1 in the latter case it will set erl_errno to EIO int erl_reg_send ei_cnode ec int fd char server name chart buf int len This function sends an Erlang term to a registered process This function sends an Erlang ter
9. C function 33 ei x encode string len 3 C function 33 ei_x_encode_term 2 C function 34 ei_x_encode_tuple_header 2 C function 34 ei_x_encode_ulong 2 C function 33 ei x encode version 1 C function 33 ei_x_format 3 C function 37 ei_x_format_wo_ver 3 C function 37 ei_x_free 1 C function 38 ei_x_new 1 C function 38 ei_x_new_with_version 1 C function 38 free_fun 1 C function 36 ei_accept 3 C function ei_connect 44 ei_connect 75 ei_accept 3 C function 44 ei_connect 2 C function 41 ei_connect_init 4 C function 40 ei_connect_xinit 7 C function 40 ei_publish 2 C function 44 ei_receive 3 C function 41 ei_receive_msg 3 C function 42 ei_rpc 7 C function 43 ei_self 1 C function 45 ei_send 4 C function 43 ei_thisalivename 1 C function 45 ei_thishostname 1 C function 45 ei_thisnodename 1 C function 45 ei_unpublish 1 C function 45 ei_xconnect 3 C function 41 ei xreceive msg 3 C function 42 erl reg send 5 C function 43 erl_rpc_from 5 C function 43 erl_rpc_to 6 C function 43 ei_connect 2 C function ei_connect 41 ei_connect_init 4 C function ei_connect 40 ei_connect_xinit 7 C function ei_connect 40 ei_decode_atom 3 C function ei 36 ei_decode_binary 4 C function ei 36 ei_decode_boolean 3 C function ei 36 ei_decode_char 3 C function ei 36 ei_decode_double 3 C function ei 36 ei_decode_ei_term 3
10. C function ei connect 44 ei receive 3 C function ei_connect 41 ei receive msg 3 C function ei_connect 42 ei reg close 1 C function registry 24 ei_reg_delete 2 C function registry 24 ei_reg_dump 4 C function registry 24 ei_reg_getfval 2 C function registry 25 ei_reg_getival 2 C function registry 25 ei_reg_getpval 3 C function registry 26 ei_reg_getsval 2 C function registry 26 ei_reg_getval 5 C function registry 26 ei_reg_markdirty 2 C function registry 27 ei reg open 1 C function registry 27 ei_reg_purge 1 C function registry 27 ei_reg_resize 2 C function registry 27 ei_reg_restore 3 C function registry 28 ei_reg_setfval 3 C function registry 28 ei_reg_setival 3 C function registry 28 ei reg setpval 4 C function registry 29 ei_reg_setsval 3 C function registry 29 ei_reg_setval 5 C function registry 29 ei_reg_stat 3 C function registry 30 ei_reg_tabstat 2 C function registry 30 ei_rpc 7 C function ei_connect 43 ei_s_print_term 3 C function ei 37 ei_self 1 C function ei_connect 45 ei_send 4 C function ei_connect 43 ei_skip_term 2 C function ei 38 ei_thisalivename 1 C function ei_connect 45 ei_thishostname 1 C function ei_connect 45 ei_thisnodename 1 C function ei_connect 45 ei_unpublish 1 C function ei_connect 45 ei_x_append 2 C function ei 38 ei_x_append_bu
11. also possible to pipe an Erlang module to erl call and have it compiled or to pipe a seguence of Erlang expressions to be evaluated similar to the Erlang shell O ptions which cause stdin to be read can be used with advantage as scripts from within Unix shell scripts Another nice use of erl_call could be from http CGI bin scripts Exports erl_call lt options gt 14 Each option flag is described below with its name type and meaning a Mod Fun Args optional pplies the specified function and returns the result Mod must be specified however is assumed for unspecified Fun and Args Args should be in the same format as for erlang apply 3 Note that this flag takes exactly one argument so guoting may be necessary in order to group Mod Fun and Args in a manner dependent on the behavior of your command shell c Cookie optional Use this option to specify a certain cookie If no cookie is specified the erlang cookie file is read and its content are used as cookie The Erlang node we want to communicate with must have the same cookie d optional D ebug mode This causes all IO to be output to thefile erl_call out Nodename where Nodename is the node name of the Erlang node in guestion e optional Reads a sequence of Erlang expressions separated by and ended with a from stdin until EOF Control D Evaluates the expressions and returns the result from the last expression Returns o
12. an array of Erlang terms array is an array of Erlang terms arrsize is the number of elements in array The function creates an Erlang tuple whose arity is size and whose elements are taken from thetermsin array To retrieve the size of a tuple either use the erl_size function which checks the type of the checked term and works for a binary as well as for a tuple or the ERL_TUPLE_SIZE tuple returns the arity of a tuple erl_size will do the same thing but it checks that the argument really is a tuple erl_element index tuple returns the element corresponding to a given position in thetuple ETERM erl mk_uint n Types e unsigned int n Creates an Erlang unsigned integer n isa value to be converted to an Erlang unsigned integer The function returns an Erlang unsigned integer object with the value specified in n ERL_INT_UVALUE t can be used to retrieve the value from an Erlang unsigned integer ETERM erl mk_var name int int Types e_char name This function creates an unbound Erlang variable The variable can later be bound through pattern matching or assignment name specifies a name for the variable The function returns an Erlang variable object with the name name erl_print_term stream term Types e FILE stream e ETERM term This function printsthe specified Erlang term to the given output stream stream indicates where the function should send its output term is the Erlang term to p
13. e the erl_eterm module for creating Erlang terms e the erl_marshal module for encoding and decoding routines 1 1 4 Building Terms and Patterns The previous example can be simplified by using er1 format to create an Erlang term ETERM ep ep erl_format a i tobbe 3928 Refer to the Reference M anual the er1_format module for a full description of the different format directives The following example is more complex ETERM ep ep erl_format name a age i data wJ madonna 21 erl_format fadr s i E street 42 erl_free_compound ep Asin previous examples it is your responsibility to free the memory allocated for Erlang terms In this example erl_free_compound ensures that the complete term pointed to by ep is released This is necessary because the pointer from the second call to erl_format is lost The following example shows a slightly different solution ETERM ep ep2 ep2 erl_format adr s i E street 42 ep erl_format name a age i data w madonna 21 ep2 erl_free_term ep erl_free_term ep2 In this case you free the two terms independently The order in which you free the terms ep and ep2 is not important because the Erl_Interface library uses reference counting to determine when it is safe to actually remove objects If you are not sure whether you have freed the terms properly you can use the following function t
14. have been created and backed up to with ei_reg_dump If the registry was not empty before the operation then the contents of the table are added to the contents of the registry If the table contains objects with the same keys as those already in the registry the registry objects will be overwritten with the new values If the registry contains objects that were not in the table they will be unchanged by this operation After the restore operation the entire contents of the registry is marked as unmodified N ote that this includes any objects that were modified before the restore and not overwritten by the restore The function returns 0 on success or 1 on failure int eireg setfval reg key f Types e ei_reg reg e const char key s doublef Create a key value pair with the specified key and floating point value If an object already existed with the same key the new value replaces the old one If the previous value was a binary or string it is freed with free reg isthe registry where the object should be placed key is the name of the object f is the floating point value to assign The function returns 0 on success or 1 on failure int eireg setival reg key i Types e ei_reg reg e const char key 28 Erlang Interface Erl_Interface Library Reference registry e int i Create a key value pair with the specified key and integer value i If an object already existed with the same key the new
15. information about configuring this behaviour If flags is 0 the backup will include only those objects which have been created modified or deleted since the last backup or restore i e an incremental backup After the backup any objects that were marked dirty are now clean and any objects that had been marked for deletion are deleted Alternatively setting flags to EILFORCE will cause a full backup to be done and EI N O PURGE will cause the deleted objects to be left in the registry afterwards These can be bitwise O Red together if both behaviours are desired If EIN O PURGE was specified you can use ei_reg_purge to explicitly remove the deleted items from the registry later The function returns 0 on success or 1 on failure double ei_reg_getfval reg key Types e ei_reg reg e const char key Get the value associated with key in the registry The value must be a floating point type reg is the registry where the object will be looked up key is the name of the object to look up On success the function returns the value associated with key If the object was not found or it was not a floating point object 1 0 is returned To avoid problems with in band error reporting i e if you cannot distinguish between 1 0 and a valid result use the more general function ei_reg_getval instead int eireg getival reg key Types e ei_reg reg e const char key Get the value associated with key in the registry Th
16. is reached the match succeeds and you can retrieve the contents of the variable ETERM pattern term pattern erl format madonna Age Age term erl_format madonna 21 21 if erl_match pattern term fprintf stderr Yes they matched Age ep erl_var_content pattern Age erl_print_term stderr ep fprintf stderr n erl_free_term ep erl_free_term pattern erl_free_term tern Refer to the Reference M anual the erl_match function for more information 4 Erlang Interface 1 1 The Erl_Interface Library 1 16 Connecting to a Distributed Erlang Node In order to connect to a distributed Erlang node you need to first initialize the connection routine with erl_connect_init which stores information such as the host name node name and IP address for later use int identification number 99 int creation 1 char cookie a secret cookie string An example erl_connect_init identification_number cookie creation Refer to the Reference M anual the erl_connect module for more information After initialization you set up the connection to the Erlang node Use erl_connect to specify the Erlang node you want to connect to The following example sets up the connection and should result in a valid socket file descriptor int sockfd char nodename xyz chivas du etx ericsson se An example if sockfd erl_connect nodename lt 0 erl_err_quit ERROR erl_conn
17. node and will not allow the name to be reused If you use this function to unregister your own process be sure to also close the descriptor that was returned by ei_publish Note C areless use of this function may have unpredictable results if the registered node is in fact still running ec is the node structure of the node to unregister If the node was successfully unregistered from epmd the function returns 0 O therwise it returns 1 and sets erl_errno is to EIO ei_thisnodename ei_cnode ec ei_thishostname ei_cnode ec ei_thisalivename ei_cnode ec These functions can be used to retrieve information about the C N ode These values are initially set with ei_connect_init Or ei connect xinit They simply fetches the appropriate field from the ec structure Read the field directly will probably be safe for a long time so these functions are not really needed ei_self ei_cnode ec This function retrieves the Pid of the C node Every C node has a pseudo pid used in ei_send_reg ei_rpc and others Thisis contained in a field in the ec structure It will be safe for a long time to fetch this field directly from the ei_cnode structure Debug Information If a connection attempt fails the following can be checked e erl_errno s that the right cookie was used s that epmd is running s the remote Erlang node on the other side is running the same version of Erlang as the erl_interface library Erlang Inter
18. point right after the term in the buffer N ote This can be useful when you want to hold arbitrary terms just skip them and copy the binary term data to some buffer The function returns 0 on success and 1 on failure Erlang Interface Erl Interface Library Reference ei Debug Information Some tips on what to check when the emulator doesn t seem to receive the terms that you send e be careful with the version header use eix_new_with_version when appropriate e_turn on distribution tracing on the erlang node e check the result codes from ei_decode_ calls See Also erl_interface 3 Erlang Interface 39 ei_connect Erl_Interface Library Reference ei_connect C Module This module enables C programs to communicate with erlang nodes using the erlang distribution over TCP IP A C node appears to Erlang as a hidden node That is Erlang processes that know the name of the C node are able to communicate with it in a normal manner but the node name will not appear in the listing provided by the Erlang function nodes 0 Exports int ei_connect_init ei_cnode ec const char this node name const char cookie short creation int ei_connect_xinit ei_cnode ec const char thishostname const char 40 thisalivename const char thisnodename Erl_IpAddr thisipaddr const char cookie short creation These function initializes the ec structure to identify the node name and cookie of the server O ne of them ha
19. the name of the function to run args is an Erlang list containing the arguments to be passed to the function Erlang Interface 43 ei_connect Erl_Interface Library Reference emsg is a message containing the result of the function call x pointsto the dynamic buffer that receives the result The actual message returned by the rpc server is a 2 tuple rex Reply erl_rpc returns the number of bytesin the result on success and 1 on failure erl_rpc_from returns number of bytes or one of ERL_TICK ERL_TIMEOUT and ERL_ERROR otherwise When failing all three functions set erl_errno to one of EIO I O error ETIMEDOUT Timeout expired EAGAIN Temporary error Try again Expample check to see if an erlang process is alive int index 0 is_alive ei_x_buff args result ei_x_new amp result ei_x_new_with_version amp args ei_x_encode_pid amp args amp check_pid if ei_rpc amp ec fd erlang is_process_alive args buff args index amp result lt 0 error if ei_decode_version result buff amp index lt 0 ei_decode_bool result buff amp index amp is_alive lt 0 error int ei_publish ei_cnode ec int port These functions are used by a server processto register with the local name server epmd thereby allowing other processesto send messages by using the registered name Before calling either of these functions the process should have called bind and listen on an open socket eci
20. to Or emsg from depending on the type of message received Refer to the Reference M anual for additional information about the following modules e erl_connect e erl_eterm 1 1 9 Remote Procedure Calls An Erlang node acting as a client to another Erlang node typically sends a request and waits for a reply Such a request is included in a function call at a remote node and is called a remote procedure call The following example shows how the Erl_Interface library supports remote procedure calls char modname THE_MODNAME ETERM reply ep ep erl_format a modname if reply erl_rpc fd c c ep erl_err_msg lt ERROR gt when compiling file s erl n modname erl_free_term ep ep erl_format ok _ if erl_match ep reply erl_err_msg lt ERROR gt compiler errors n erl_free_term ep erl_free_term reply Erlang Interface 7 Chapter 1 Erl_Interface User s Guide c c 1 is called to compile the specified module on the remote node erl_match checks that the compilation was successful by testing for the expected ok Refer to the Reference M anual the erl_connect module for more information about erl_rpc and its companions erl_rpc_to and erl_rpc_from 1 1 10 Using Global Names A C node has access to names registered through the Erlang Global module Names can be looked up allowing the C node to send messages to named Erlang services C nodes can also register glo
21. unsigned char erl_peek_ext bufp pos Types e unsigned char bufp e int pos This function is used for stepping over one or more encoded terms in a buffer in order to directly access a later term bufp is a pointer to a buffer containing one or more encoded Erlang terms pos indicates how many terms to step over in the buffer The function returns a pointer to a sub term that can be used in a subsequent call to erl_decode in order to retrieve the term at that position If there is no term or pos would exceed the size of the terms in the buffer NULL is returned int erl_term_len t Types e ETERM t This function determines the buffer space that would be needed by t if it were encoded into Erlang external format by erl_encode The size in bytes is returned Erlang Interface 73 erl_marshal Erl_Interface Library Reference 74 Erlang Interface Index of Modules and Functions Modules are typed in this way Functions are typed in this way ei ei_decode_atom 3 C function 36 ei_decode_binary 4 C function 36 ei_decode_boolean 3 C function 36 ei_decode_char 3 C function 36 ei_decode_double 3 C function 36 ei_decode_ei_term 3 C function 37 ei_decode_fun 3 C function 36 ei_decode_list_header 3 C function 37 ei_decode_long 3 C function 35 ei_decode_pid 3 C function 36 ei_decode_port 3 C function 36 ei decode ref 3 C function 36 ei_decode_string 3 C function 36 ei_decode_term 3 C fun
22. uses hash tables with collision chaining so there is no absolute upper limit on the number of objects that the registry can contain but if performance or memory usage are important then you should choose a number accordingly T he registry can be resized later You can open as many registries as you like if memory permits O bjects are stored and retrieved through set and get functions In the following examples you see how to store integers floats strings and arbitrary binary objects struct bonk b malloc sizeof b char name malloc 7 ei_reg_setival reg age 29 ei_reg_setfval reg height 1 85 strcpy name Martin ei_reg_setsval reg name name b gt l 42 b gt m 12 ei_reg_setpval reg jox b sizeof b Erlang Interface 9 Chapter 1 Erl_Interface User s Guide If you attempt to store an object in the registry and there is an existing object with the same key the new value will replace the old one This is done regardless of whether the new object and the old one have the same type so you can for example replace a string with an integer If the existing value is a string or binary it will be freed before the new value is assigned Stored values are retrieved from the registry as follows long i double f char s struct bonk b int size ei reg getival reg age ei reg getfval reg height ei_reg_getsval reg name ei_reg_getpval reg jox amp size oO Nn M
23. value replaces the old one If the previous value was a binary or string it is freed with free reg is the registry where the object should be placed key is the name of the object i is the integer value to assign The function returns 0 on success or 1 on failure int ei_reg_setpval reg key p size Types e ei_reg reg e const char key e const void Xp e int size Create a key value pair with the specified key whose value is the binary object pointed to by p If an object already existed with the same key the new value replaces the old one If the previous value was a binary or string it is freed with free reg is the registry where the object should be placed key isthe name of the object pis a pointer to the binary object The object itself must have been created through a single call to malloc or similar function so that the registry can later delete it if necessary by calling free size isthe length in bytes of the binary object The function returns 0 on success or 1 on failure int ei_reg_setsval reg key s Types e ei_reg reg e const char key e const char s Create a key value pair with the specified key whose value is the specified string s If an object already existed with the same key the new value replaces the old one If the previous value was a binary or string it is freed with free reg is the registry where the object should be placed key is the name o
24. 7 ei int int int int int int 38 Erl_Interface Library Reference w an ETERM from erl interface ETERM a an atom char s a string char i an integer int 1 a long integer long int u a unsigned long integer unsigned long int f a float float d a double float double float For instance to encode a tuple with some stuff ei_x_format a i 7 d numbers 12 3 14159 encodes the tuple numbers 12 3 14159 The ei_x_format_wo_ver formats into a buffer without the initial version byte ei_x_new ei_x_buff x ei_x_new_with_version ei_x_buff x This function allocates anew ei_x_buff buffer The fields of the structure pointed to by x parameter is filled in and a default buffer is allocated The ei_x_new_with_version also puts an initial version byte that is used in the binary format So that ei_x_encode_version won t be needed ei_x_free ei_x_buff x This function frees an ei_x_buff buffer The memory used by the buffer is returned to the OS eix_append eix_buff x const ei x_buff x2 ei_x_append_buf ei_x_buff x const char buf int len These functions appends data at the end of the buffer x ei_skip_term const char buf int index This function skips a term in the given buffer it recursively skips elements of lists and tuples so that a full term is skipped Thisis a way to get the size of an erlang term buf isthe buffer index is updated to
25. A EIER 69 3 10 serlimarshal 2 2224 em arena BI Keamanan tata ed 71 Erlang Interface iii Erlang Interface Chapter 1 Erl_Interface User s Guide 1 1 The Erl Interface Library The Erl Interface library contains functions which help you integrate programs written in C and Erlang The functions in Eri Interface support the following e manipulation of data represented as Erlang data types e conversion of data between C and Erlang formats s encoding and decoding of Erlang data types for transmission or storage e communication between C nodes and Erlang processes e_backup and restore of C node state to and from M nesia In the following sections these topics are described compiling your code for use with Erl Interface initializing Erl_Interface encoding decoding and sending Erlang terms building terms and patterns pattern matching connecting to a distributed Erlang node using EPM D e sending and receiving Erlang messages e remote procedure calls global names the registry 1 1 1 Compiling and Linking Your Code In order to use any of the Erl_Interface functions include the following lines in your code include erl_interface h include ei h Erlang Interface Chapter 1 Erl_Interface User s Guide Determine where the top directory of your OTP installation is You can find this out by starting Erlang and entering the following command at the Eshell prompt Eshell V4 7 4 abort with G 1 gt cod
26. C function ei 37 ei_decode_fun 3 C function ei 36 ei_decode_list_header 3 C function ei 37 ei_decode_long 3 C function ei 35 ei_decode_pid 3 C function ei 36 ei decode port 3 C function 76 ei 36 ei_decode_ref 3 C function ei 36 ei decode string 3 C function ei 36 ei decode term 3 C function ei 37 ei_decode_trace 3 C function ei 37 ei_decode_tuple_header 3 C function ei 37 ei_decode_ulong 3 C function ei 35 ei_decode_version 3 C function ei 35 ei_encode_atom 3 C function ei 33 ei_encode_atom_len 4 C function ei 33 ei_encode_binary 4 C function ei 33 ei encode boolean 3 C function ei 33 ei_encode_char 3 C function ei 33 ei_encode_double 3 C function ei 33 ei_encode_empty_list 2 C function ei 35 ei_encode_fun 3 C function ei 34 ei_encode_list_header 3 C function ei 34 ei_encode_long 3 C function el 33 ei_encode_pid 3 C function ei 34 ei_encode_port 3 C function ei 34 ei_encode_ref 3 C function ei 34 ei_encode_string 3 C function ei 33 Erlang Interface ei encode string len 4 C function ei 33 ei_encode_term 3 C function ei 34 ei_encode_trace 3 C function ei 34 ei_encode_tuple_header 3 C function ei 34 ei encode ulong 3 C function ei 33 ei encode version 2 C function ei 33 ei get type 3 C function ei 35 ei print term 3 C function ei 37 ei publish 2
27. ETERM freelist void erl_eterm_statistics allocated freed Reports term allocation statistics void erl_free_array array size Frees an array of ETERM structures void erl_free_term t Frees an ETERM structure void erl_free_compound t Frees an array of ETERM structures void erl_malloc size Allocates some memory void erl free ptr Frees some memory erl_marshal The following functions are exported int erl_compare_ext bufp1 bufp2 Compares encoded byte sequences ETERM erl_decode bufp Converts a term from Erlang external format ETERM erl_decode_buf bufpp Converts a term from Erlang external format int erl_encode term bufp Convertsaterm into Erlang external format int erl_encode_buf term bufpp Converts a term into Erlang external format int erl_ext_size bufp Counts elements in encoded term char erl_ext_type bufp Determinestype of an encoded byte sequence unsigned char erl_peek_ext bufp pos Steps over encoded term int erl_term_len t Determines encoded size of term Erlang Interface 23 registry Erl_Interface Library Reference registry C Module This module provides support for storing key value pairs in a table known as a registry backing up registries to M nesia in an atomic manner and later restoring the contents of a registry from M nesia Exports int ei_reg_close reg Types e ei_reg reg A registry that has previously been created with ei_reg_open is closed and all the objects it cont
28. Erlang Interface version 3 3 Typeset in LATEX from SGML source using the DO CBUILD ER 3 2 2 Document System Contents 1 Erl Interface U ser s Guide 1 11 TheErlinterface Library F FFA a 1 1 1 1 Compiling and Linking Your Code 1 1 1 2 Initializingtheerl interface Library 2 1 13 Encoding Decoding and Sending Erlang Terms ll 2 1 1 4 Building Terms and Patterns aaa 3 1 1 5 Pattern Matehing x 44 seer ade DD OU 4 1 16 Connecting to a Distributed ErlangNode 5 1 17 USING 29 0 1 5 a a mia at a AD DD BR a ere 5 1 18 Sending and Receiving Erlang Messages 6 1 1 9 Remote Procedure Calls 7 1 1 10 Using Global Names 8 LLED The ReGIstry o pas aa he ee ee fac LE 9 2 Erl_Interface Command Reference 13 2 1 CRI Calle 245 4 EA YDA E EE Ad re 14 3 Erl Interface Library Reference 16 31 PEGLI eo R A dd Cd O YG RR CR Oe Ser Ze a A IAU 24 3 2 Cl tint ee Dane HA A ydy fre na at dana Laser mie 32 3 3 ei connect 22K ERMA eee GU ANN prie Pe bob ana Sete 40 34 EFLECOMMECE En 2 Gok oa ate dd Me Ne a are er 46 3 5 LOOP ia 2 4 nes a Ronnie ne he Aa arrete ein NN RF ere 54 3 6 PI eterni A i EE A II CY Y IA 56 3 7 A at 2 5 5 5 x Be oko ae eae ey ep REK 65 3 8 C Bs ale oa NENN NAC AC Se Ge Ge aah Rove apa 67 3 9 GIZO 7 568 8 5 A oe co ee
29. Erlang term containing proper list In a proper list all tails except the last point to another list cell and the last tail pointsto an empty list Returns 1 if list is not a proper list ETERM erl_mk_atom string Types e_char string Creates an atom string is the sequence of characters that will be used to create the atom Returns an Erlang term containing an atom Note that it is the callers responsibility to make sure that string contains a valid name for an atom ERL ATOM PTR atom can be used to retrieve the atom name as a string Note that the string is not O terminated in the atom ERL_ATOM SIZE atom returns the length of the atom name ETERM erl mk binary bptr size Types e_char bptr e int size Erlang Interface 59 erl_eterm Erl_Interface Library Reference This function produces an Erlang binary object from a buffer containing a sequence of bytes bptr is a pointer to a buffer containg data to be converted size indicates the length of bptr The function returns an Erlang binary object ERL_BIN_PTR bin retrieves a pointer to the binary data ERL_BIN_SIZE bin retrieves the size ETERM erl_mk_empty_list This function creates and returns an empty Erlang list Note that NULL is not used to represent an empty list U se this function instead ETERM erl_mk_estring string len Types e_char string e int len This function creates a list from a sequence of bytes string is a bu
30. P Il In all of the above examples the object must exist and it must be of the right type for the specified operation If you do not know the type of a given object you can ask struct ei_reg_stat buf ei_reg_stat reg name amp buf Buf will be initialized to contain object attributes O bjects can be removed from the registry ei_reg_delete reg name When you are finished with a registry close it to remove all the objects and free the memory back to the system ei_reg_close reg Backing Up the Registry to Mnesia The contents of a registry can be backed up to Mnesia on a nearby Erlang node You need to provide an open connection to the Erlang node see erl_connect Also M nesia 3 0 or later must be running on the Erlang node before the backup is initiated ei_reg_dump fd reg mtab dumpflags The example above will backup the contents of the registry to the specified M nesia table mtab Once a registry has been backed up to M nesia in this manner additional backups will only affect objects that have been modified since the most recent backup i e objects that have been created changed or deleted The backup operation is done as a single atomic transaction so that the entire backup will be performed or none of it will In the same manner a registry can be restored from a M nesia table ei_reg_restore fd reg mtab 10 Erlang Interface 1 1 The Erl_Interface Library This will read t
31. Routines C Library erl_eterm page 56 Functions for Erlang Term Construction C Library erl format page 65 Create and Match Erlang Terms C Library erl_global page 67 Access globally registered names C Library erl_malloc page 69 M emory Allocation Functions C Library erl_marshal page 71 Encoding and D ecoding of Erlang terms Registry The following functions are exported e int ei_reg_close reg Close a registry int int ei reg delete reg key Delete an object from the registry ei_reg_dump fd reg mntab flags Back up a registry to M nesia double ei_reg_getfval reg key Get a floating point object int ei_reg_getival reg key Get an integer object const void ei_reg getpval reg key size Get a binary object const char ei_reg getsval reg key Get a string object int int eirreg getval reg key flags v Get any object ei_reg markdirty reg key Mark an object as dirty ei_reg ei reg open size Create and open a registry int int int int int int int int int int ei reg purge reg Remove deleted objects ei reg resize reg newsize Resize a registry ei reg restore fd reg mntab Restore a registry from M nesia ei_reg_setfval reg key f Assign a floating point object ei reg setival reg key i Assign an integer object ei_reg_setpval reg key p size Assign a binary object ei reg setsval reg key s Assign a string object ei reg setval reg key flags v Assign a value to any objec
32. _binary 1 even if it was not intended The string is copied to p and enough space must be allocated The space required can be fetched with ei_get_type D on t forget the ending 0 ei_decode_atom const char buf int index char p This function decodes an atom from the binary format The name of the atom is placed at p T here can be at most MAXATOMLEN bytes placed in the buffer ei_decode_binary const char buf int index void p long len This function decodes a binary from the binary format The 1en parameter is set to the actual size of the binary Note that ei_decode_binary assumes that there are enough room for the binary The size required can be fetched by ei_get_type ei_decode fun const char buf int index erlang fun p free fun erlang fun f This function decodes a fun from the binary format The p parameter should be NULL or point to an erlang fun structure This is the only decode function that allocates memory when the erlang_fun is no longer needed it should be freed with free_fun This has to do with the arbitrary size of the environment for a fun ei_decode_pid const char buf int index erlang pid tp D ecodes a pid process identifier from the binary format ei_decode_port const char buf int index erlangport p This function decodes a port identifier from the binary format ei_decode_ ref const char buf int index erlang ref p This function decodes a reference from the binary forma
33. a tuple Erlang Interface 19 Erl_Interface Library Reference int ei_decode_list_header const char buf int index int arity D ecode a list int ei _decode ei term const char buf int index ei_term term D ecode a term without prior knowledge of type int ei_print_term FILE fp const char buf int index Print aterm in clear text int ei_s_print_term char s const char buf int index Print a term in clear text int eixformatleixbuffs x const chart fmt Format a term from a format string and parameters int ei_x_format_wo_ver ei_x_buff x const char fmt Format a term from a format string and parameters int ei_x_new eix_buff x Allocate a new buffer int ei x new_with_version ei x buff x Allocate a new buffer int ei_x_free ei_x_buff x Frees a buffer int ei_x_append ei_x_buff x const ei_x_buff x2 A ppends a buffer at the end int ei_x_append_buf eix_buff x const charr buf int len Appendsa buffer at the end int ei_skip_term const char buf int index skip aterm ei_connect The following functions are exported 20 int ei_connect_init ei_cnode ec const char this node name const char cookie short creation Initialize for a connection int ei_connect_xinit ei_cnode ec const char thishostname const char thisalivename const char thisnodename Erl_IpAddr thisipaddr const char cookie short creation Initialize for a connection int ei_connect ei_cnode ec char node
34. ains are freed reg isthe registry to close The function returns 0 int ei reg delete reg key Types e ei_reg reg e const char key Delete an object from the registry The object is not actually removed from the registry it is only marked for later removal so that on subseguent backups to M nesia the corresponding object can be removed from the M nesia table as well If another object is later created with the same key the object will be reused The object will be removed from the registry after a call to ei_reg_dump or ei reg purge reg is the registry containing key key is the object to remove If the object was found the function returns 0 indicating success O therwise the function returns 1 int ei_reg dump fd reg mntab flags Types e int fd e ei_reg reg e const char mntab 24 Erlang Interface Erl_Interface Library Reference registry e int flags Dump the contents of a registry to a M nesia table in an atomic manner i e either all data will be updated or none of it will If any errors are encountered while backing up the data the entire operation is aborted fd is an open connection to Erlang M nesia 3 0 or later must be running on the Erlang node reg is the registry to back up mntab is the name of the M nesia table where the backed up data should be placed If the table does not exist it will be created automatically using configurable defaults See your Mnesia documentation for
35. amples Patternis an Erlang term possibly containing unbound variables Term is an Erlang term that we wish to match against Pattern Term and Pattern are compared and any unbound variables in Pattern are bound to corresponding values in Term If Term and Pattern can be matched the function returns a non zero value and binds any unbound variables in Pattern If Term Pattern do not match the function returns 0 For example ETERM term pattern pattern2 termi erl_format 14 21 term2 erl_format 19 19 patterni erl_format A B pattern2 erl_format F F if erl match patternl term1 match succeeds gets bound to 14 B gets bound to 21 y if erl_match pattern2 term1 match fails because F cannot be bound to two separate values 14 and 21 y if erl_match pattern2 term2 match succeeds and F gets bound to 19 y erl_var_content can be used to retrieve the content of any variables bound as a result of a call to erl_match Erlang Interface Erl Interface Library Reference erl global erl global C Module This module provides support for registering looking up and unregistering names in the Erlang Global module For more information see the description of Global in the reference manual Exports char erl_global_names fd count int Types e int fd e int count Retrieve a list of all known global names fd is an open descrip
36. ar node fd is an open descriptor to an Erlang connection name is the name that is to be looked up in Global If node isnot NULL it is a pointer to a buffer where the function can fill in the name of the node where name is found node can be passed directly to erl_connect if necessary On success the function returns an Erlang Pid containing the address of the given name and node will be initialized to the nodename where name is found On failure NULL will be returned and node will not be modified Erlang Interface Erl Interface Library Reference erl malloc erl malloc C Module This module provides functions for allocating and deallocating memory Exports ETERM erl_alloc_eterm etype Types e unsigned char etype Thisfunction allocates an ETERM structure Specify etype as one of the following constants ERL_STRING ERL_INTEGER ERL_U_INTEGER unsigned integer ERL_ATOM ERL_PID x Erlang process identifier ERL_PORT ERL_REF Erlang reference ERL_LIST ERL_TUPLE ERL_BINARY ERL_FLOAT ERL_VARIABLE ERL_SMALL_BIG bignum ERL_U_SMALL_BIG bignum ERL_SMALL BIG and ERL_U_SMALL_BIG are for creating Erlang bignums which can contain integers of arbitrary size The size of an integer in Erlang is machine dependent but in general any integer larger than 2728 reguires a bignum void erl_eterm_release void Clears the freelist where blocks are placed when they are released by erl_fr
37. bal names allowing them to provide named services to Erlang processes or other C nodes Erl Interface does not provide a native implementation of the global service Instead it uses the global services provided by a nearby Erlang node In order to use the services described in this section it is necessary to first open a connection to an Erlang node To see what names there are char names int count int i names erl_global_names fd amp count if names for i 0 i lt count i printf 4sAMn names i free names erl global names 7 allocates and returns a buffer containing all the names known to global count will be initialized to indicate how many names are in the array The array of strings in names is terminated by a NULL pointer so it is not necessary to use count to determine when the last name is reached It is the caller s responsibility to free the array erl global names allocates the array and all of the strings using a single call to malloc SO free names is all that is necessary To look up one of the names ETERM pid char node 256 pid erl_global_whereis fd schedule node If schedule is known to global an Erlang pid is returned that can be used to send messages to the schedule service Additionally node will be initialized to contain the name of the node where the service is registered so that you can make a connection to it by simply passing the variable to erl_connect
38. buf int index const char p int len ei_x_encode_atom ei_x_buff x const char p ei_x_encode_atom_len ei_x_buff x const char p int len Encodes an atom in the binary format The p parameter is the name of the atom Only upto MAXATOMLEN bytes are encoded The name should be zero terminated except for the ei_x_encode_atom_len function ei_encode_binary char buf int index const void p long len ei_x_encode_binary ei_x_buff x const void p long len Erlang Interface 33 ei int int int int int int int int int int int int 34 Erl_Interface Library Reference Encodes a binary in the binary format The data is at p Of 1en bytes length ei_encode_pid char buf int index ei x_encode pid eix_buff x const erlangpid p Encodes an erlang process identifier pid in the binary format The p parameter points to an erlang_pid structure which should have been obtained earlier with ei_decode_pid ei_encode fun char buf int index const erlang fun p ei_x_encode_fun ei_x_buff x const erlang_fun fun Encodes a fun in the binary format The p parameter points to an erlang_fun structure The erlang_fun is not freed automatically the free_fun should be called if the fun is not needed after encoding ei_encode_port char buf int index const erlangport p Encodes an erlang port in the binary format The p parameter points to a erlang port structure which should have been ob
39. bufp e_int bufsize This function receives a message consisting of a seguence of bytes in the Erlang external format fd is an open descriptor to an Erlang connection bufp is a buffer large enough to hold the expected message bufsize indicates the size of bufp If a tick occurs i e the Erlang node on the other end of the connection has polled this nodeto see if it is still alive the function will return ERL TICK and no message will be placed in the buffer Also erl_errno will be set to EAGAIN 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 will set erl_errno to one of EAGAIN Temporary error Try again EMSGSIZE Buffer too small EIO I O error int erl_receivemsg fd bufp bufsize emsg Types e int fd e unsigned char bufp 48 Erlang Interface Erl Interface Library Reference erl_connect s int bufsize s ErlM essage emsg This function receives the message into the specified buffer and decodes into the ErlMessage emsg fd is an open descriptor to an Erlang connection bufp is a buffer large enough to hold the expected message bufsize indicates the size of bufp emsg is a pointer to an ErlMessage structure into which the message will be decoded ErlMessage is defined as follows typedef struct int type ETERM msg ETERM to ETERM from char to_name MAXREGLEN
40. calling either of these functions the process should have called bind and listen O on an open socket N ote The use of erl_xpublish is deprecated Use erl publish instead port is the local name to register and should be the same as the port number that was previously bound to the socket addr is the 32 bit IP address of the local host To unregister with epmd simply close the returned descriptor See also erl unpublish On success the functions return a descriptor connecting the calling process to epmd On failure they return 1 and set erl_errno to EIO I O error Additionally errno values from socket 2 and connect 2 system calls may be propagated into erl_errno int erl_accept listensock conp Types e_int listensock e ErlConnect conp This function is used by a server process to accept a connection from a client process listensock is an open socket descriptor on which listen has previously been called conp is a pointer to an ErlConnect struct described as follows typedef struct char ipadr 4 char nodename MAXNODELEN ErlConnect 52 Erlang Interface Erl Interface Library Reference erl connect const const const const short int char char char char On success conp is filled in with the address and node name of the connecting client and a file descriptor is returned On failure ERL_ERROR is returned and erl_errno is set to EIO erl_thiscookie erl_
41. can be used by Erlang processes wishing to communicate with the C node node isthe name of the C node number serial and creation are arbitrary numbers N ote though that these are limited in precision so only the low 15 3 and 2 bits of these numbers are actually used The function returns an Erlang pid object ERL PID NODE pid ERL_PID_NUMBER pid ERL_PID_SERIAL pid and ERL_PID_CREATION pid can be used to retrieve the four values used to create the pid ETERM erl_mk_port node number creation Types e const char node e unsigned int number e unsigned int creation This function creates an Erlang port identifier node isthe name of the C node number and creation are arbitrary numbers Note though that these are limited in precision so only the low 18 and 2 bits of these numbers are actually used The function returns an Erlang port object ERL_PORT_NODE port ERL_PORT NUMBER port and ERL_PORT_CREATION can be used to retrieve the three values used to create the port ETERM erl mk ref node number creation Types e const char node e unsigned int number e unsigned int creation Erlang Interface 61 erl_eterm Erl_Interface Library Reference This function creates an old Erlang reference with only 18 bits use erl_mk_long_ref instead node is the name of the C node number should be chosen uniquely for each reference created for a given C node creation is an arbitrary number Note t
42. cessful encoding 1 on error and 1 if the term seems alright but does not fit in the term structure If it returns 0 the index will be incremented and the term contains the decoded term The term structure will contain the arity for a tuple or list size for a binary string or atom It will contains a term if it s any of the following integer float atom pid port or ref ei print_term FILE fp const char buf int index ei_s_print_term char s const char buf int index This function prints a term in clear text to the file given by fp or the buffer pointed to by s It tries to resemble the term printing in the erlang shell In ei_s_print_term the parameter s should point to a dynamically malloc allocated string of BUFSIZ bytes or a NULL pointer The string can be reallocated and s can be updated if the result is more than BUFSIZ characters The result is zero terminated The return value is the number of characters written to the file or string or 1 if buf index doesn t contain a valid term Unfortunately I O errors on fp is not checked eix_format eix_buff x const char fmt ei_x format wo _ver ei x buff x const char fmt Format a term given as a string to a buffer This functions works like a sprintf for erlang terms The fmt contains a format string with arguments like d to insert terms from variables The following formats are supported with the C types given Erlang Interface 3
43. ction 37 ei_decode_trace 3 C function 37 ei_decode_tuple_header 3 C function 37 ei_decode_ulong 3 C function 35 ei_decode_version 3 C function 35 ei_encode_atom 3 C function 33 ei_encode_atom_len 4 C function 33 ei_encode_binary 4 C function 33 ei_encode_boolean 3 C function 33 ei_encode_char 3 C function 33 ei_encode_double 3 C function 33 ei_encode_empty_list 2 C function 35 ei_encode_fun 3 C function 34 ei_encode_list_header 3 C function 34 ei_encode_long 3 C function 33 ei_encode_pid 3 C function 34 ei_encode_port 3 C function 34 ei_encode_ref 3 C function 34 ei_encode_string 3 C function 33 ei encode string len 4 C function 33 ei encode term 3 C function 34 ei_encode_trace 3 C function 34 Erlang Interface ei_encode_tuple_header 3 C function 34 ei_encode_ulong 3 C function 33 ei encode version 2 C function 33 ei get type 3 C function 35 ei_print_term 3 C function 37 ei_s_print_term 3 C function 37 ei_skip_term 2 C function 38 ei_x_append 2 C function 38 ei_x_append_buf 3 C function 38 ei_x_encode_atom 2 C function 33 ei_x_encode_atom_len 3 C function 33 ei_x_encode_binary 3 C function 33 ei_x_encode_double 2 C function 33 ei_x_encode_empty_list 2 C function 35 ei_x_encode_fun 2 C function 34 ei_x_encode_list_header 2 C function 35 ei x encode long 2 C function 33 ei_x_encode_pid 2 C function 34 ei x encode string 2
44. d If a node has failed in this way epmd will prevent you from registering a new node with the old name since it thinks that the old name is still in use In this case you must unregister the name explicitly erl_unpublish node Erlang Interface 5 Chapter 1 Erl_Interface User s Guide This will cause epmd to close the connection from the far end Note that if the name was in fact still in use by a node the results of this operation are unpredictable Also doing this does not cause the local end of the connection to close so resources may be consumed 1 18 Sending and Receiving Erlang Messages Use one of the following two functions to send messages e erl send e erl_reg_send Asin Erlang it is possible to send messages to a Pid or to a registered name It is easier to send a message to a registered name because it avoids the problem of finding a suitable Pid U se one of the following two functions to receive messages e erl receive e erl receive msg erl_receive receives the message into a buffer while er1 receive msg decodes the message into an Erlang term Example of Sending Messages In the following example Pid hello_ world is sent to a registered process my_server The message is encoded by er1 send extern const char erl_thisnodename void extern short erl_thiscreation void define SELF fd erl_mk_pid erl_thisnodename fd 0 erl_thiscreation ETERM arr 2 emsg int sockfd creation
45. d erl malloc size Types e long size This function calls the standard malloc function void erl_free ptr Types e void ptr This function calls the standard free function 70 Erlang Interface Erl Interface Library Reference erl_marshal erl_marshal C Module This module contains functions for encoding Erlang terms into a sequence of bytes and for decoding Erlang terms from a sequence of bytes Exports int erl_compare_ext bufpi bufp2 Types e unsigned char bufp1 bufp2 This function compares two encoded terms bufp1 is a buffer containing an encoded Erlang term term1 bufp2 is a buffer containing an encoded Erlang term term2 The function returns 0 if the terms are equal 1 if term1 is less than term2 or 1 if term2 is less than term1 ETERM erl_decode bufp ETERM erl_decode_buf bufpp Types e unsigned char bufp e unsigned char bufpp erl_decode and erl_decode_buf decode the contents of a buffer and return the corresponding Erlang term erl_decode_buf provides a simple mechanism for dealing with several encoded terms stored consecutively in the buffer bufp is a pointer to a buffer containing one or more encoded Erlang terms bufpp is the address of a buffer pointer The buffer contains one or more consecutivel y encoded Erlang terms Following a successful call to erl_decode_buf bufpp will be updated so that it points to the next encoded term erl_decode returns an Erlang ter
46. de an atom e int ei_x_encode_atom_len eix_buff x const char p int len Encode an atom e int ei_encode_binary char buf int index const void p long len Encode a binary e int ei_x_encode_binary eix_buff x const void tp long len Encode a binary e int ei_encode_pid char buf int index Encode a pid e int ei_x_encode_pid ei_x_buff x const erlangpid p Encode a pid e int ei _encode fun char buf int index const erlang fun p Encode a fun e int ei_x_encode_fun ei_x_buff x const erlang fun fun Encode a fun e int ei encode port char buf int index const erlangport p Encodes a port e int eiencoderef char buf int index const erlang ref p Encodes a ref e int ei_encode_term char buf int index void t Encode an erl_interface term Erlang Interface Erl_Interface Library Reference e int ei_x_encode_term ei_x_buff x void t Encode an erl_interface term e int ei_encode_trace char buf int index const erlang_trace p Encode a trace token e int ei_encode_tuple_header char buf int index int arity Encode a tuple e int ei_x_encode_tuple_header ei_x_buff x int arity Encode a tuple e int ei_encode_list_header char buf int index int arity Encode a list e int ei_x_encode_list_header ei_x_buff x int arity Encode a list e int ei_encode_empty_list char buf int index Encode an empty list nil e int ei x encode_empty_list char buf int index Encode an empty list nil
47. e ec Retrievethe Pid of the C node erl_connect The following functions are exported int erl_connect_init number cookie creation Initialize communication int erl connect xinit host alive node addr cookie creation Initialize communication int erl_connect node Establishe a connection to an Erlang node int erl_xconnect addr alive Establishe a connection to an Erlang node int erl_close_connection fd Close aconnection to an Erlang node int erl_receive fd bufp bufsize Receive a message int erlreceivemsg fd bufp bufsize emsg Receive and decodes a message int erlxreceivemsg fd bufpp bufsizep emsg Receive and decodes a message int erl_send fd to msg Send a message int erlreg send fd to msg Send a message to a registered name ETERM erl_rpc fd mod fun args Remote Procedure Call int erl_rpc_to fd mod fun args Remote Procedure Call int erl_rpc_from fd timeout emsg Remote Procedure Call int erl_publish port Publish a node name int erl_xpublish port addr Publish a node name int erl_accept listensock conp Accept a connection const char erl_thiscookie Retrieve some values const char erl_thisnodename Retrieve some values const char erl_thishostname Retrieve some values const char erl_thisalivename Retrieve some values short erl_thiscreation Retrieve some values int erl unpublish alive Unpublish a node name Erlang Interface 21 Erl_Interface Library Reference erl_erro
48. e root_dir usr local otp To compile your code make sure that your C compiler knows where to find erl_interface h by specifying an appropriate I argument on the command line or by adding it to the CFLAGS definition in your Makefile The correct value for this path is OTPROOT lib erl interfaceV sn include where OTPROOT is the path reported by code root_dir o in the above example and V sn is the version of the Erl_interface application for example erl_interface 3 2 3 cc c I usr local otp lib erl_interface 3 2 3 include myprog c When linking you will need to specify the path to 1iberl_interface a and libei a with L OTPROOT 1ib erl_interface 3 2 3 1ib and you will need to specify the name of the libraries with lerl_interface lei You can do this on the command line or by adding theflags to the LDFLAGS definition in your Makefile ld L usr local otp lib erl_interface 3 2 3 lib myprog o lerl_interface lei o myprog Also on some systems it may be necessary to link with some additional libraries e g 1ibns1 a and libsocket a on Solaris or wsock32 1ib on Windows in order to use the communication facilities of Erl Interface If you are using Erl_Interface functions in a threaded application based on PO SIX threads or Solaris threads then Erl_Interface needs access to some of the synchronization facilities in your threads package and you will need to specify additional compiler flags in order to indicate which of the packa
49. e value must be an integer reg is the registry where the object will be looked up key is the name of the object to look up On success the function returns the value associated with key If the object was not found or it was not an integer object 1 is returned To avoid problems with in band error reporting i e if you cannot distinguish between 1 and a valid result use the more general function ei_reg getval instead Erlang Interface 25 registry const void const char Erl_Interface Library Reference ei reg getpval reg key size Types e ei_reg reg e const char key e int size Get the value associated with key in the registry The value must be a binary pointer type reg isthe registry where the object will be looked up key is the name of the object to look up size Will beinitialized to contain the length in bytes of the object if it is found On success the function returns the value associated with key and indicates its length in size If the object was not found or it was not a binary object NULL is returned To avoid problems with in band error reporting i e if you cannot distinguish between NULL and a valid result use the more general function ei_reg_getval instead eireg getsval reg key Types e ei_reg reg e const char key Get the value associated with key in the registry The value must be a string reg isthe registry where the object will be looked up key is the
50. ect failed erl_err_quit prints the specified string and terminates the program Refer to the Reference M anual the erl_error function for more information 1 1 7 Using EPMD Epmd isthe Erlang Port Mapper Daemon Distributed Erlang nodes register with epmd on the localhost to indicate to other nodes that they exist and can accept connections Epmd maintains a register of node and port number information and when anode wishesto connect to another node it first contacts epmd in order to find out the correct port number to connect to When you use erl_connect to connect to an Erlang node a connection is first made to epmd and if the node is known a connection is then made to the Erlang node C nodes can also register themselves with epmd if they want other nodes in the system to be able to find and connect to them Before registering with epmd you need to first create a listen socket and bind it to a port Then int pub pub erl_publish port pub is a file descriptor now connected to epmd Epmd monitors the other end of the connection and if it detects that the connection has been closed the node will be unregistered So if you explicitly close the descriptor or if your node fails it will be unregistered from epmd Be aware that on some systems such as VxWorks a failed node will not be detected by this mechanism since the operating system does not automatically close descriptors that were left open when the node faile
51. ee_term and erl free compound void erl_eterm_statistics allocated freed Erlang Interface 69 erl_malloc Erl_Interface Library Reference Types e long allocated long freed allocated and freed are initialized to contain information about the fix allocator used to allocate ETERM components allocated isthe number of blocks currently allocated to ETERM objects freed is the length of the freelist where blocks are placed when they are released by erl_free_term and erl_free_compound void erl_free_array array size Types e ETERM array e int size This function frees an array of Erlang terms array is an array of ETERM objects size is the number of terms in the array void erl free_term t Types e ETERM t Use this function to free an Erlang term void erl_free_compound t Types e ETERM t N ormally it is the programmer s responsibility to free each Erlang term that has been returned from any of the erl_interface functions However since many of the functions that build new Erlang terms in fact share objects with other existing terms it may be difficult for the programmer to maintain pointersto all such terms in order to free them individually erl_free_compound will recursively free all of the sub terms associated with a given Erlang term regardless of whether we are still holding pointers to the sub terms Thereis an example in the User M anual under Building Terms and Patterns voi
52. ence number in pid t int ERL_PID_SERIAL t The serial number in pid t int ERL_PID_CREATION t The creation number in pid t Erlang Interface Erl Interface Library Reference erl_eterm int ERL PORT NUMBER t The sequence number in port int ERL PORT CREATION t The creation number in port ETERM ERL_PORT_NODE t The node in port t int ERL_REF_NUMBER t The first part of the reference number in ref t Use only for compatibility int ERL_REF_NUMBERS t Pointer to the array of reference numbers in ref t int ERL_REF_LEN t The number of used reference numbers in ref t int ERL REF CREATION t The creation number in ref t int ERL_TUPLE_SIZE t The number of elements in tuple t ETERM ERL CONS HEAD t The head element of list ETERM ERL_CONS_TAIL t A List representing the tail elements of list Exports ETERM erl_cons head tail Types e ETERM head e ETERM tail This function concatenates two Erlang terms prepending head onto tail and thereby creating a cons cell To make a proper list tail should always be a list or an empty list N otethat NULL is not a valid list head is the new term to be added tail isthe existing list to which head will be concatenated The function returns a new list ERL CONS HEAD list and ERL_CONS_TAIL list can be used to retrieve the head and tail components from the list er1 hd list and erl tl list will do the same thing but check that the argument really is a list
53. erl mk float 1 C function erl_eterm 60 erl mk int 1 C function erl_eterm 60 erl mk list 2 C function 80 erl_eterm 60 erl_mk_long_ref 5 C function erl_eterm 62 erl mk pid 4 C function erl_eterm 61 erl mk port 3 C function erl eterm 61 erl mk ref 3 C function erl_eterm 61 erl mk string 1 C function erl eterm 62 erl mk tuple 2 C function erl_eterm 62 erl mk uint 1 C function erl_eterm 63 erl mk var 1 C function erl_eterm 63 erl peek ext 2 C function erl marshal 73 erl print term 2 C function erl eterm 63 erl publish 1 C function erl_connect 52 erl receive 3 C function erl_connect 48 erl receive msg 4 C function erl_connect 48 erl reg send 3 C function erl_connect 50 erl reg send 5 C function ei_connect 43 erl rpc 4 C function erl_connect 51 erl rpc from 3 C function erl_connect 51 erl_rpc_from 5 C function ei_connect 43 erl rpc to 4 C function erl connect 51 erl rpc to 6 C function ei_connect 43 erl send 3 C function erl_connect 50 Erlang Interface erl size 1 C function erl eterm 63 erl term len 1 C function erl_marshal 73 erl_thisalivename 0 C function erl_connect 53 erl thiscookie 0 C function erl_connect 53 erl thiscreation O C function erl_connect 53 erl_thishostname 0 C function erl_connect 53 erl_thisnodename 0 C function erl_connect 53 e
54. es the number of unique positions that are occupied in the registry collisions indicates how many elements are sharing positions in the registry On success the function returns 0 and obuf isinitialized to contain table statistics On failure the function returns 1 Erlang Interface 31 ei 32 Erl_Interface Library Reference el C Module Thelibrary ei contains macros and functions to encode and decode the erlang binary term format With ei you can convert atoms lists numbers and binaries to and from the binary format This is useful when writing port programs and drivers ei uses a given buffer and no dynamic memory with the exception of ei_decode_fun and is often quite fast It also handles C nodes C programs that talks erlang distribution with erlang nodes or other C nodes using the erlang distribution format The difference between ei and erl_interface is that ei uses the binary format directly when sending and receiving terms It is also thread safe and using threads one process can handle multiple C nodes The erl_interface library is built on top of ei but of legacy reasons it doesn t allow for multiple C nodes In general ei is the preferred way of doing C nodes The decode and encode functions use a buffer an index into the buffer which points at the point where to encode and decode The index is updated to point right after the term encoded decoded No checking is done whether the term fits in the buffer
55. f 3 C function ei 38 ei_x_encode_atom 2 C function el 33 Erlang Interface 77 ei_x_encode_atom_len 3 C function ei 33 ei_x_encode_binary 3 C function ei 33 ei_x_encode_double 2 C function el 33 ei_x_encode_empty_list 2 C function ei 35 ei_x_encode_fun 2 C function ei 34 ei_x_encode_list_header 2 C function ei 35 ei_x_encode_long 2 C function ei 33 ei_x_encode_pid 2 C function ei 34 ei_x_encode_string 2 C function ei 33 ei_x_encode_string_len 3 C function ei 33 ei_x_encode_term 2 C function ei 34 ei_x_encode_tuple_header 2 C function ei 34 ei_x_encode_ulong 2 C function ei 33 ei_x_encode_version 1 C function ei 33 ei_x_format 3 C function ei 37 ei_x_format_wo_ver 3 C function ei 37 ei_x_free 1 C function ei 38 ei_x_new 1 C function el 38 ei x new with version 1 C function ei 38 ei_xconnect 3 C function ei connect 41 ei_xreceive_msg 3 C function ei_connect 42 erl_accept 2 C function 78 erl connect 52 erl alloc eterm 1 C function erl malloc 69 erl_call Command erl_call 14 erl_call erl_call Command 14 erl close connection 1 C function erl_connect 48 erl_compare_ext 2 C function erl_marshal 71 erl_connect erl_accept 2 C function 52 erl_close_connection 1 C function 48 erl_connect 1 C function 47 erl_connect_init 3 C function 46 erl_connect_xinit 6 C function 46 erl p
56. f the object s is the string to assign The string itself must have been created through a single call to malloc or similar function so that the registry can later delete it if necessary by calling free O The function returns 0 on success or 1 on failure int eireg setval reg key flags v Types e ei_reg reg Erlang Interface 29 registry Erl_Interface Library Reference e const char key e int flags s v see below Create a key value pair with the specified key whose value is specified by v If an object already existed with the same key the new value replaces the old one If the previous value was a binary or string it is freed with free reg is the registry where the object should be placed key is the name of the object flags indicates the type of the object specified by v Flags must be one of ELINT EI FLT EI_STR and El_BIN indicating whether v is int double charr or voidx If flags is El_BIN then a fifth argument size is required indicating the size in bytes of the object pointed to by v If you wish to store an arbitrary pointer in the registry specify a size of 0 In this case the object itself will not be transferred by an ei_reg_dump operation just the pointer value The function returns 0 on success or 1 on failure int eireg stat reg key obuf Types e ei_reg reg e const char key e struct ei_reg_stat obuf Return information about an object reg is the registry conta
57. face 45 erl_connect Erl_Interface Library Reference erl_connect C Module This module provides support for communication between distributed Erlang nodes and C nodes in a manner that istransparent to Erlang processes A C node appears to Erlang as a hidden node That is Erlang processes that know the name of the C node are able to communicate with it in a normal manner but the node name will not appear in the listing provided by the Erlang function nodes 0 Exports int erl_connect_init number cookie creation int erl_connect_xinit host alive node addr cookie creation Types s int number s char cookie s short creation s char host alive node e struct in_addr addr These functions initialize the erl_connect module In particular they are used to identify the name of the C node from which they are called O ne of these functions must be called before any of the other functions in the erl_connect module are used erl connect xinit stores for later use information about the node s host name host alive name alive node name node IP address addr cookie cookie and creation number creation erl_connect_init provides an alternative interface which does not require as much information from the caller Instead erl_connect_init uses gethostbyname to obtain default values If you use erl_connect_init your node will have a short name i e it will not be fully qualified If you need to use fully qual
58. ference ei Exports ei_encode_version char buf int index ei_x_encode_version ei_x_buff x Encodes a version magic number for the binary format M ust be the first token in a binary term ei_encode_long char buf int index long p ei_x_encode_long ei_x_buff x long p Encodes a long 32 bit integer in the binary format ei_encode ulong char buf int index unsigned long p ei_x_encode_ulong ei_x_buff x unsigned long p Encodes an unsigned long 32 bit integer in the binary format ei_encode_double char buf int index double p ei x_encode_double eix_buff x double p Encodes a double precision 64 bit floating point number in the binary format ei_encode_boolean char buf int index int p Encodes a boolean value as the atom true if p is not zero or false if p is zero ei_encode_char char buf int index char p Encodes a char 8 bit as an integer in the binary format ei_encode_string char buf int index const char p ei encode string len char buf int index const char sp int len ei_x_encode_string ei_x_buff x const char p ei_x_encode_string_len ei_x_buff x const char s int len Encodes a string in the binary format A string in erlang is alist but is encoded as a character array in the binary format The string should be zero terminated except for the ei_x_encode_string_len function ei_encode_atom char buf int index const char p ei_encode_atom_len char
59. ffer containing a sequence of bytes The buffer does not need to be zero terminated len isthe length of string The function returns an Erlang list object corresponding to the character sequence in string ETERM erlmk_float f Types e doublef Creates an Erlang float f is a value to be converted to an Erlang float The function returns an Erlang float object with the value specified in ERL_FLOAT_VALUE t can be used to retrieve the value from an Erlang float ETERM erl mk int n Types s intn Creates an Erlang integer n is a value to be converted to an Erlang integer The function returns an Erlang integer object with the value specified in n ERL TNT VALUE t can be used to retrieve the value value from an Erlang integer ETERM erl_mk_list array arrsize Types e ETERM array 60 Erlang Interface Erl Interface Library Reference erl_eterm s int arrsize Creates an Erlang list from an array of Erlang terms such that each element in the list corresponds to one element in the array array is an array of Erlang terms arrsize is the number of elements in array The function creates an Erlang list object whose length arrsize and whose elements are taken from the terms in array ETERM erl mk_pid node number serial creation Types e const char node e unsigned int number e unsigned int serial e unsigned int creation This function creates an Erlang process identifier The resulting pid
60. ges you are using Define_REENTRANT and either STHREADS or PTHREADS The default is to use POSIX threads if _REENTRANT is specified 1 1 2 Initializing the erl_interface Library Before calling any of the other Erl_Interface functions you must call er1_init O exactly once to initialize the library erl_init O takes two arguments however the arguments are no longer used by Erl_Interface and should therefore be specified as er1_init NULL 0 1 13 Encoding Decoding and Sending Erlang Terms Data sent between distributed Erlang nodes is encoded in the Erlang external format C onsequently you have to encode and decode Erlang terms into byte streams if you want to use the distribution protocol to communicate between a C program and Erlang The Erl_Interface library supports this activity It has a number of C functions which create and manipulate Erlang data structures The library also contains an encode and a decode function The example below shows how to create and encode an Erlang tuple tobbe 3928 2 Erlang Interface 1 1 The Erl_Interface Library ETERM arr 2 tuple char buf BUFSIZ int i arr 0 erl_mk_atom tobbe arr 1 erl_mk_integer 3928 tuple erl_mk_tuple arr 2 i erl_encode tuple buf Alternatively you can use erl_send and erl_receive_msg which handle the encoding and decoding of messages transparently Refer to the Reference M anual for a complete description of the following modules
61. guments will not be updated int ei_reg markdirty reg key Types e ei_reg reg e const char key Mark a registry object as dirty This will ensure that it is included in the next backup to M nesia Normally this operation will not be necessary since all of the normal registry set functions do this automatically However if you have retrieved the value of a string or binary object from the registry and modified the contents then the change will be invisible to the registry and the object will be assumed to be unmodified This function allows you to make such modifications and then let the registry know about them reg isthe registry containing the object key is the name of the object to mark The function returns 0 on success or 1 on failure eireg ei_reg_open size Types e int size O pen create a registry The registry will be initially empty Use ei _reg_close to close the registry later size is the approximate number of objects you intend to store in the registry Since the registry uses a hash table with collision chaining there is no absolute upper limit on the number of objects that can be stored in it H owever for reasons of efficiency it is a good idea to choose a number that is appropriate for your needs It is possible to use ei reg resize to change the size later Note that the number you provide will be increased to the nearest larger prime number On success an empty registry will be returned On fail
62. hat number and creation are limited in precision so only the low 18 and 2 bits of these numbers are actually used The function returns an Erlang reference object ERL_REF_NODE ref ERL REE NUMBER ref and ERL_REF_CREATION ref to retrieve the three values used to create the reference ETERM erl mk long ref node ni n2 n3 creation Types e_const char node e unsigned int n1 n2 n3 e unsigned int creation This function creates an Erlang reference with 82 bits node is the name of the C node ni n2 and n3 can be seen as one big number n1 2 64 n2 2 32 n3 which should be chosen uniquely for each reference created for a given C node creation is an arbitrary number N ote that n3 and creation are limited in precision so only the low 18 and 2 bits of these numbers are actually used The function returns an Erlang reference object ERL_REF_NODE ref ERL REF NUMBERS ref ERL REE LEN ref and ERL_REF_CREATION ref to retrieve the values used to create the reference ETERM erl mk_string string Types e_char string This function creates a list from a zero terminated string string is the zero terminated sequence of characters i e aC string from which the list will be created The function returns an Erlang list ETERM erl_mk_tuple array arrsize 62 Types e ETERM array e int arrsize Erlang Interface Erl Interface Library Reference erl_eterm Creates an Erlang tuple from
63. he entire contents of mtab into the specified registry After the restore all of the objects in the registry will be marked as unmodified so a subsequent backup will only affect objects that you have modified since the restore Note that if you restore to a non empty registry objects in the table will overwrite objects in the registry with the same keys Also the entire contents of the registry is marked as unmodified after the restore including any modified obects that were not overwritten by the restore operation This may not be your intention Storing Strings and Binaries W hen string or binary objects are stored in the registry it is important that a number of simple guidelines are followed M ost importantly the object must have been created with a single call to malloc or similar so that it can later be removed by a single call to free Objects will be freed by the registry when it is closed or when you assign a new value to an object that previously contained a string or binary You should also be aware that if you store binary objects that are context dependent e g containing pointers or open file descriptors they will lose their meaning if they are backed up to a M nesia table and subseguently restored in a different context W hen you retrieve a stored string or binary value from the registry the registry maintains a pointer to the object and you are passed a copy of that pointer You should never free an object ret
64. his module contains two routines one general function for creating Erlang terms and one for pattern matching Erlang terms Exports ETERM erl format FormatStr Types s char FormatStr This is a general function for creating Erlang terms using a format specifier and a corresponding set of arguments much in the way printf works FormatStr is a format specification string The set of valid format specifiers is as follows e i Integer e f Floating point e a Atom e s String e w Arbitrary Erlang term For each format specifier that appears in FormatStr there must be a corresponding argument following FormatStr An Erlang term is built according to the FormatStr with values and Erlang terms substituted from the corresponding arguments and according to the individual format specifiers For example erl_format name a age i data w madonna 21 erl_format fadr s i E street 42 This will create an ETERM x structure corresponding to the Erlang term name madonna age 21 data adr E street 42 The function returns an Erlang term or NULL if FormatStr does not describe a valid Erlang term int erl_match Pattern Term Types e ETERM Pattern Term Erlang Interface 65 erl_format 66 Erl_Interface Library Reference This function is used to perform pattern matching similar to that done in Erlang Refer to an Erlang manual for matching rules and more ex
65. ified a k a long names use erl_connect_xinit instead host is the name of the host on which the node is running alive isthe alivename of the node node is the name of the node The nodename should be of the form alivename hostname addr is the 32 bit IP address of host cookie isthe authorization string required for access to the remote node Refer to the auth module for more details 46 Erlang Interface Erl Interface Library Reference erl_connect creation helpsidentify a particular instance of aC node In particular it can help prevent us from receiving messages sent to an earlier process with the same registered name A C node acting as a server will be assigned a creation number when it calls erl_publish or erl_xpublish number is used by erl_connect_init to construct the actual node name In the second example shown below c17 a D N S name will be the resulting node name Example 1 struct in_addr addr addr inet_addr 150 236 14 75 if erl_connect_xinit chivas madonna madonna chivas du etx ericsson se amp addr samplecookiestring 0 erl_err_quit lt ERROR gt when initializing Example 2 if erl_connect_init 17 samplecookiestring 0 erl_err_quit lt ERROR gt when initializing int erl connect node int erl xconnect addr alive Types char node alive e struct in_addr addr These functions set up a connection to an Erlang node e
66. ining the object key is the name of the object obuf is a pointer to an ei_reg_stat structure defined below struct ei_reg_stat int attr int size In attr the object s attributes are stored as the logical OR of its type one of El_INT EI_FLT El_BIN and EI_STR whether it is marked for deletion EI DELET and whether it has been modified since the last backup to M nesia EI DIRTY The size field indicates the size in bytes reguired to store EI STR including the terminating 0 and EI_BIN objects or O for EI INT and EI_FLT The function returns 0 and initializes obuf on success or returns 1 on failure int eireg tabstat reg obuf Types e ei_reg reg e struct ei_reg_tabstat obuf 30 Erlang Interface Erl_Interface Library Reference registry Return information about a registry Using information returned by this function you can see whether the size of the registry is suitable for the amount of data it contains reg is the registry to return information about obuf is a pointer to an ei_reg_tabstat structure defined below struct ei_reg_tabstat int size int nelem int npos int collisions je Thesize field indicates the number of hash positions in the registry This is the number you provided when you created or last resized the registry rounded up to the nearest prime nelem indicates the number of elements stored in the registry It includes objects that are deleted but not purged npos indicat
67. ions should us the macros and functions provided The following macros each take a single ETERM pointer as an argument They return a non zero value if the test is true and 0 otherwise ERL_IS_INTEGER t True if t is an integer ERL_IS_UNSIGNED_INTEGER t True if t is an integer ERL_IS_FLOAT t Trueif t is a floating point number ERL IS ATOM t Trueif t is an atom ERL_IS_PID t Trueif t is a Pid process identifier ERL_IS_PORT t Trueif t isa port ERL_IS_REF t Trueif t is a reference ERL_IS_TUPLE t Trueif t is a tuple ERL_IS_BINARY t Trueif t isa binary ERL_IS_LIST t True if t isa list with zero or more elements ERL_IS_EMPTY_LIST t True if t is an empty list ERL_IS_CONS t Trueif tis a list with at least one element The following macros can be used for retrieving parts of Erlang terms N one of these do any type checking results are undefined if you pass an ETERM containing the wrong type For example passing a tuple to ERL_ATOM_PTR will likely result in garbage char ERL_ATOM_PTR t A string representing atom t int ERL_ATOM_SIZE t The length in characters of atom t void ERL_BIN_PTR t A pointer to the contents of t int ERL BIN SIZE t The length in bytes of binary object int ERL_INT_VALUE t The integer of t unsigned int ERL_INT_UVALUE t The unsigned integer value of t double ERL_FLOAT_VALUE t The floating point value of t ETERM ERL_PID_NODE t TheNodein pid t int ERL_PID_NUMBER t The sequ
68. k Result if successful h HiddenN ame optional Specifies the name of the hidden node that er1_ca11 represents m optional Reads an Erlang module from stdin and compiles it n Node one of n name sname is required Has the same meaning as name and can still be used for backwards compatibility reasons Erlang Interface Erl_Interface Command Reference erl_call name Node one of n name sname is required Node is the name of the node to be started or communicated with It is assumed that Node is started with er1 name which means that fully qualified long node names are used If the s option is given an Erlang node will if necessary be started with er1 name q optional H alts the Erlang node specified with the n switch This switch overrides the s switch r optional G enerates a random name of the hidden node that er1_cal1 represents s optional Starts a distributed Erlang node if necessary This means that in a sequence of calls where the s and n Node are constant only the first call will start the Erlang node This makes the rest of the communication very fast This flag is currently only available on the Unix platform sname Node one of n name sname is required Node is the name of the node to be started or communicated with It is assumed that Node is started with er1 sname which means that short node names are used If s option is given an Erlang node will be started if
69. m corresponding to the contents of bufp on success or NULL on failure erl_decode_buf returns an Erlang term corresponding to the first of the consecutive terms in bufpp and moves buf pp forward to point to the next term in the buffer On failure each of the functions returns NULL int erl_encode term bufp int erl_encode_buf term bufpp Types e ETERM term Erlang Interface 71 erl_marshal Erl_Interface Library Reference e unsigned char bufp e unsigned char bufpp erl_encode and erl_encode_buf encode Erlang terms into external format for storage or transmission erl_encode_buf provides a simple mechanism for encoding several terms consecutively in the same buffer term is an Erlang term to be encoded bufp is a pointer to a buffer containing one or more encoded Erlang terms bufpp is a pointer to a pointer to a buffer containing one or more consecutively encoded Erlang terms Following a successful call to erl_encode_buf bufpp will be updated so that it pointsto the position for the next encoded term These functions return 0 in success or 1 if term was not a valid Erlang term N ote that no bounds checking is done on the buffer It is the caller s responsibility to make sure that the buffer is large enough to hold the encoded terms You can either use a static buffer that is large enough to hold theterms you expect to need in your program or use erl_term_len to determine the exact requirementsfor a gi
70. m to a process fd is an open descriptor to an Erlang connection server_nane is the registered name of the intended recipient buf isthe buffer containing the term in binary format len isthe length of the message in bytes The function returns 0 if successful otherwise 1 in the latter case it will set erl_errno to EIO Example send the atom ok to the process worker ei_x_buff x ei_x_new_with_version amp x ei_x_encode_atom amp x ok if ei_reg_send amp ec fd x buff x index lt 0 handle_error int ei rpc ei cnode ec int fd char mod char fun const char argbuf int argbuflen ei_x buff x int erl_rpc_to ei_cnode ec int fd char mod char fun const char argbu int argbuflen int erl_rpc_from ei_cnode ec int fd int timeout erlamg msg msg eix_buff x These functions support calling Erlang functions on remote nodes erl_rpc_to sends an rpc request to a remote node and erl_rpc_from receives the results of such a call erl_rpc Combines the functionality of these two functions by sending an rpc request and waiting for the results See also rpc ca11 4 ec isthe C node structure fd is an open descriptor to an Erlang connection timeout is the maximum time in ms to wait for results Specify ERL_NO_TIMEOUT to wait forever When erl rpc calls erl_rpc_from the call will never timeout mod is the name of the module containing the function to be run on the remote node fun is
71. me application_controller lt madonna chivas du etx ericsson se 6 0 gt registered_name kernel lt madonna chivas du etx ericsson se 7 0 gt 07 lt madonna chivas du etx ericsson se 8 0 gt registered_name kernel_sup lt madonna chivas du etx ericsson se 9 0 gt registered_name net_sup lt madonna chivas du etx ericsson se 10 0 gt registered_name net_kernel lt madonna chivas du etx ericsson se 11 0 gt 07 lt madonna chivas du etx ericsson se 12 0 gt registered_name global_ name _server lt madonna chivas du etx ericsson se 13 0 gt registered_name auth lt madonna chivas du etx ericsson se 14 0 gt registered_name rex lt madonna chivas du etx ericsson se 15 0 gt 07 lt madonna chivas du etx ericsson se 16 0 gt registered_name file_server lt madonna chivas du etx ericsson se 17 0 gt registered_name code_server lt madonna chivas du etx ericsson se 20 0 gt registered_name user lt madonna chivas du etx ericsson se 38 0 gt 1 Erl_Interface Library Reference 16 Erlang Interface Erl_Interface Library Reference Short Summaries C Library Registry page 24 Store and backup key value pairs C Library ei page 32 routines for handling the erlang binary term format C Library ei_connect page 40 Communicate with distributed erlang C Library erl_connect page 46 Communicate with Distributed Erlang C Library erl_error page 54 Error Print
72. name Establishe a connection to an Erlang node int ei_xconnect ei_cnode ec Erl_IpAddr adr char alivename Establishe a connection to an Erlang node int ei_receive int fd unsigned char bufp int bufsize Receive a message int eireceivemsg int fd erlang msg msg eix buff x Receive a message int ei xreceive msg int fd erlang msg msg eix_buff x Receive a message int ei_send int fd erlang_pid to char buf int len Send a message int erl_reg_send ei_cnode ec int fd char server_name char buf int len Send a message to a registered name int ei_rpc ei_cnode ec int fd char mod char fun const char argbuf int argbuflen ei_x_buff x Remote Procedure Call from C to Erlang Erlang Interface Erl_Interface Library Reference int erl_rpc_to ei_cnode ec int fd char mod char fun const char argbu int argbuflen Remote Procedure Call from C to Erlang int erl_rpc_from ei_cnode ec int fd int timeout erlamgmsg msg eixbuff x Remote Procedure Call from C to Erlang int ei_publish ei_cnode ec int port Publish anode name int ei_accept ei_cnode ec int listensock ErlConnect conp Accept a connection from another node int ei_unpublish ei_cnode ec Unpublish anode name const char ei_thisnodename ei_cnode ec Retrieve some values const char ei_thishostname ei_cnode ec Retrieve some values const char ei_thisalivename ei cnode ec Retrieve some values erlang_pid ei_self ei_cnod
73. name of the object to look up On success the function returns the value associated with key If the object was not found or it was not a string NULL is returned To avoid problems with in band error reporting i e if you cannot distinguish between NULL and a valid result use the more general function ei_reg getval instead int eireg getval reg key flags v 26 Types e ei_reg reg e const char key e int flags e void v see below This is a general function for retrieving any kind of object from the registry reg isthe registry where the object will be looked up key is the name of the object to look up flags indicates the type of object that you are looking for If 1ags is 0 then any kind of object will be returned If flags isone of ELINT EI_FLT EI STR or EI_BIN then only values of that kind will be returned The buffer pointed to by v must be large enough to hold the return data i e it must be a pointer to one of int double char or voidx respectively Also if flags is EI BIN then a fifth argument int size is reguired so that the size of the object can be returned If the function succeeds v and size if the object is binary will be initialized with the value associated with key and the function will return one of ELINT EI_FLT EI STR Erlang Interface Erl_Interface Library Reference registry or EI_BIN indicating the type of object On failure the function will return 1 and the ar
74. ncode list header ei x buff x x int arity This function encodes a list header with a specified arity The next arity 1 terms are the elements actually it s arity cons cells and the tail of the list Lists and tuples are encoded recursively so that a list may contain another list or tuple E g to encodethelist c d e ei_encode_list_header buf amp i 3 ei_encode_atom buf amp i c ei_encode_atom buf amp i d ei_encode_list_header buf amp i 1 ei_encode_atom buf amp i e ei_encode_atom buf amp i f ei_encode_empty_list buf amp i N ote It may seem that there is no way to create a list without knowing the number of elements in advance But indeed there is a way Note that the list a b c canbe written as a b c U sing this alist can be written as conses To encode alist without knowing the arity in advance while something ei_x_encode_list_header amp x 1 ei_x_encode_ulong amp x i just an example ei_x_encode_empty_list amp x ei_encode_empty_list char buf int index ei_x_encode_empty_list char buf int index This function encodes an empty list It s often used at the tail of a list ei_get_type const ei_x_buff x int type int size This function returns the type in type and size in size of the encoded term For strings and atoms size is the number of characters not including the terminating 0 For binaries size is the
75. necessary with er1 sname v optional Prints a lot of verbose information This is only useful for the developer and maintainer of erl_call X ErlScript optional Specifies another name of the Erlang start up script to be used If not specified the standard er1 start up script is used Examples Starts an Erlang node and calls erlang time 0 erl_call s a erlang time n madonna 18 27 34 Terminates an Erlang node by calling erlang halt 0 erl_call s a erlang halt n madonna An apply with several arguments erl call s a lists map math sqrt 1 4 9 16 25 n madonna Evaluates a couple of expressions The input ends with EOF Control D erl_call s e n madonna statistics runtime X 1 Y 2 _ T statistics runtime X Y T D ok 3 0 Compiles a module and runsit Again the input ends with EOF Control D In the example shown the output has been formatted afterwards Erlang Interface 15 erl_call s m a lolita n madonna module lolita compile export_all start gt P processes F fun X gt X process_info X registered_name end lists map F P D lt madonna chivas du etx ericsson se 0 0 gt registered_name init lt madonna chivas du etx ericsson se 2 0 gt registered_name erl_prim_loader lt madonna chivas du etx ericsson se 4 0 gt registered_name error_logger lt madonna chivas du etx ericsson se 5 0 gt registered_na
76. number of bytes For lists and tuples size is the arity of the object For other types size is 0 In all cases index is left unchanged ei_decode_version const char buf int index int version This function decodes the version magic number for the erlang binary term format It must be the first token in a binary term ei_decode_long const char buf int index long p This function decodes a long 32 bit integer from the binary format ei_decode_ulong const char buf int index unsigned long p Erlang Interface 35 ei int int int int int int int void int int int 36 Erl_Interface Library Reference This function decodes an unsigned long 32 bit integer from the binary format ei_decode_double const char buf int index double p This function decodes an double precision 64 bit floating point number from the binary format ei_decode_boolean const char buf int index int p This function decodes a boolean value from the binary format A boolean is actually an atom true decodes 1 and false decodes 0 ei_decode_char const char buf int index char p This function decodes a char 8 bit integer from the binary format ei_decode_string const char buf int index char p This function decodes a string from the binary format A string in erlang is a list of integers between 0 and 255 Note that since the string is just a list sometimes lists are encoded as strings by term_to
77. nverts an 10 list to a binary term list is an Erlang term containing a list This function an Erlang binary term or NULL if list was not an IO list Informally an IO list is a deep list of characters and binaries which can be sent to an Erlang port In BNF an 10 list is formally defined as follows iolist U Binary iohead iolist iohead Binary Byte integer in the range 0 255 iolist 3 char erl_iolist_to_string list 58 Erlang Interface Erl Interface Library Reference erl_eterm Types e ETERM list This function converts an IO list to a 0 terminated C string list is an Erlang term containing an IO list The lO list must not contain the integer 0 since C strings may not contain this value except as a terminating marker This function returns a pointer to adynamically allocated buffer containing a string If list is not an IO list or if List contains the integer 0 NULL is returned It isthe caller s responsibility free the allocated buffer with erl_free Refer to erl_iolist_to_binary for the definition of an IO list int erl_iolist_length list Types e ETERM list Returnsthe length of an IO list list isan Erlang term containing an IO list The function returns the length of list or 1 if list is not an IO list Refer to erl_iolist_to_binary for the definition of an IO list int erl_length list Types e ETERM list D etermines the length of a proper list list isan
78. o see the status of the fixed term allocator Erlang Interface 3 Chapter 1 Erl_Interface User s Guide long allocated freed erl_eterm_statistics amp allocated amp freed printf currently allocated blocks ld n allocated printf length of freelist 1d n freed really free the freelist erl_eterm_release Refer to the Reference M anual the er1 mal1oc module for more information 1 1 5 Pattern Matching An Erlang pattern is aterm that may contain unbound variables or do not care symbols Such a pattern can be matched against a term and if the match is successful any unbound variables in the pattern will be bound as a side effect The content of a bound variable can then be retrieved ETERM pattern pattern erl_format madonna Age _ erl_match is used to perform pattern matching It takes a pattern and a term and tries to match them Asa side effect any unbound variables in the pattern will be bound In the following example we create a pattern with a variable A ge which appears at two positions in the tuple The pattern match is performed as follows 1 erl_match will bind the contents of Age to 21 the first time it reaches the variable 2 the second occurrence of Age will cause a test for equality between the terms since A ge is already bound to 21 Since A ge is bound to 21 the equality test will succeed and the match continues until the end of the pattern 3 if the end of the pattern
79. opy term 1 C function 57 erl element 2 C function 57 erl hd 1 C function 58 erl_init 2 C function 58 erl iolist length 1 C function 59 erl iolist to binary 1 C function 58 erl iolist to string 1 C function 58 erl length 1 C function 59 erl mk atom 1 C function 59 erl mk binary 2 C function 59 erl mk empty list 0 C function 60 erl mk estring 2 C function 60 erl mk float 1 C function 60 erl mk int 1 C function 60 erl mk list 2 C function 60 erl mk long ref 5 C function 62 erl mk pid 4 C function 61 erl mk port 3 C function 61 erl mk ref 3 C function 61 erl mk string 1 C function 62 erl mk tuple 2 C function 62 erl mk uint 1 C function 63 erl mk var 1 C function 63 erl print term 2 C function 63 erl size 1 C function 63 erl t1 1 C function 64 erl var content 2 C function 64 erl eterm release 1 C function erl_malloc 69 erl eterm statistics 2 C function erl_malloc 69 erl ext size 1 C function erl_marshal 72 erl ext type 1 C function erl_marshal 72 erl format erl format 2 C function 65 erl match 2 C function 65 erl format 2 C function erl_format 65 erl free 1 C function erl_malloc 70 erl_free_array 2 C function erl_malloc 70 erl free compound 1 C function erl_malloc 70 erl free term 1 C function erl_malloc 70 erl global erl_global_names 2 C function 67 erl_global_register 3 C function
80. or not If encoding goes outside the buffer the program may crash All functions takes two parameter buf is a pointer to the buffer where the binary data is will be index is a pointer to an index into the buffer This parameter will be incremented with the size of the term decoded encoded The data is thus at buf index when an ei function is called The encode functions all assumes that the buf and index parameters points to a buffer big enough for the data To get the size of an encoded term without encoding it pass NULL instead of a buffer pointer The index parameter will be incremented but nothing will be encoded This is the way in ei to preflight term encoding There are also encode functions that uses a dynamic buffer It is often more convenient to use these to encode data All encode funcions comes in two versions those starting with ei_x uses a dynamic buffer All functions return o if successful and 1 if not For instance if aterm is not of the expected type or the data to decode is not a valid erlang term Some of the decode functions needs a preallocated buffer This buffer must be allocated big enough and the ei_get_type function returns the size required note that for strings an extra byte is needed for the 0 string terminator Erlang Interface int int int int int int int int int int int int int int int int int int int int Erl Interface Library Re
81. ot go well you will have to examine the error code in erl_errno if you want to find out more about the failure Exports erl_errno erl_errno is initially at program startup zero and is then set by many erl_interface functions on failure to a non zero error code to indicate what kind of error it encountered A successful function call might change erl_errno by calling some other function that fails but no function will ever set it to zero This means that you cannot use erl_errno to see if a function call failed Instead each function reports failure in its own way usually by returning a negative number or NULL in which case you can examine erl_errno for details erl_errno uses the error codes defined in your system s lt errno h gt Note Actually erl_errno is a modifiable Ivalue just like ISO C defines errno to be rather than a variable This means it might be implemented as a macro expanding to amp g _erl_errno For reasons of thread or task safety this is exactly what we do on most platforms Erlang Interface 55 erl_eterm 56 Erl_Interface Library Reference erl_eterm C Module This module contains functions for creating and manipulating Erlang terms An Erlang term is represented by a C structure of type ETERM Applications should not reference any fields in this structure directly because it may be changed in future releases to provide faster and more compact term storage Instead applicat
82. r The following functions are exported void erl_err msg FormatStr Non fatal error and not system call error void erl_err_quit FormatStr Fatal error but not system call error void erl_err ret FormatStr Non fatal system call error void erl_err_sys FormatStr Fatal system call error volatile int erl_errno The Variable erl_errno contains the erl_interface error number You can change the value if you wish erl_eterm The following functions are exported 22 ETERM erl_cons head tail Prepends a term to the head of a list ETERM erl_copy_term term Creates a copy of an Erlang term ETERM erl_element position tuple Extracts an element from an Erlang tuple void erl_init NULL 0 Initialization routine ETERM erl_hd list Extracts the first element from a list ETERM erl_iolist_to_binary term Converts an IO list to a binary char erl_iolist_to_string list Converts an IO list to a zero terminated string int erl_iolist_length list Return the length of an IO list int erl_length list Determinesthe length of a list ETERM erl_mk_atom string Creates an atom ETERM erl_mk_binary bptr size Creates a binary object ETERM erl_mk_empty_list Creates an empty Erlang list ETERM erl_mk_estring string len Creates an Erlang string ETERM erl_mk_float f Creates an Erlang float ETERM erl_mk_int n Creates an Erlang integer ETERM erl_mk_list array arrsize Creates a list from an arra
83. rgs is an Erlang list containing the arguments to be passed to the function emsg is a message containing the result of the function call The actual message returned by the rpc server is a 2 tuple rex Reply If you are using erl_rpc_from in your code then this is the message you will need to parse If you are using er1 rpc O then the tuple itself is parsed for you and the message returned to your program is the erlang term containing Reply only Repliesto rpc reguests are always ERL_SEND messages Note It is the caller s responsibility to free the returned ETERM structure as well as the memory pointed to by emsg gt msg and emsg gt to er1 rpc O returns the remote function s return value or NULL if it failed erl_rpc_to returns 0 on success and a negative number on failure erl rcp fron returns ERL_MSG when successful with Emsg now containing the reply tuple and one of ERL TICK ERL TIMEOUT and ERL_ERROR otherwise W hen failing all three functions set erl_errno to one of Erlang Interface 51 erl_connect Erl_Interface Library Reference ENOMEM No more memory available EIO I O error ETIMEDOUT Timeout expired EAGAIN Temporary error Try again int erl_publish port int erl_xpublish port addr Types e int port e struct in addr addr These functions are used by aserver process to register with the local name server epmd thereby allowing other processes to send messages by using the registered name Before
84. rieved in this manner because when the registry later attempts to free it a runtime error will occur that will likely cause the C node to crash You are free to modify the contents of an object retrieved this way However when you do so the registry will not be aware of the changes you make possibily causing it to be missed the next time you make a M nesia backup of the registry contents This can be avoided if you mark the object as dirty after any such changes with ei_reg_markdirty O or pass appropriate flags to ei res dump Erlang Interface 11 Chapter 1 Erl_Interface User s Guide 12 Erlang Interface Erl_Interface Command Reference Short Summaries s Command erl_call page 14 Call Start a Distributed Erlang N ode erl_call The following functions are exported e erl call lt options gt Start Call Erlang Erlang Interface 13 erl_call Erl_Interface Command Reference erl_call Command erl call makes it possible to start and or communicate with a distributed Erlang node It is built upon the erl_interface library as an example application Its purpose is to use an Unix shell script to interact with a distributed Erlang node It performs all communication with the Erlang rex server using the standard Erlang RPC facility It does not require any special software to be run at the Erlang target node The main use is to either start a distributed Erlang node or to make an ordinary function call However it is
85. rint The function returns the number of characters written or a negative value if there was an error erl_size term Types e ETERM term Erlang Interface 63 erl_eterm Erl_Interface Library Reference Returns the arity of an Erlang tuple or the number of bytes in an Erlang binary object term isan Erlang tuple or an Erlang binary object The function returns the size of term as described above or 1 if term is not one of the two supported types ETERM erl_tl list Types e ETERM list Extracts the tail from a list list is an Erlang term containing a list The function returns an Erlang list corresponding to the original list minus the first element or NULL pointer if list was not a list ETERM erl_var_content term name 64 Types e ETERM term e char name This function returns the contents of the specified variable in an Erlang term term is an Erlang term In order for this function to succeed term must be an Erlang variable with the specified name or it must be an Erlang list or tuple containing a variable with the specified name O ther Erlang types cannot contain variables name is the name of an Erlang variable Returns the Erlang object corresponding to the value of name in term If no variable with the name name was found in term or if term is not a valid Erlang term NULL is returned Erlang Interface Erl Interface Library Reference erl format erl format C Module T
86. rl t1 1 C function erl_eterm 64 erl unpublish 1 C function erl_connect 53 erl var content 2 C function erl_eterm 64 erl xconnect 2 C function erl_connect 47 erl xpublish 2 C function erl_connect 52 erl xreceive msg 4 C function erl_connect 50 free_fun 1 C function ei 36 registry ei reg close 1 C function 24 ei reg delete 2 C function 24 ei reg dump 4 C function 24 ei reg getfval 2 C function 25 ei reg getival 2 C function 25 ei reg getpval 3 C function 26 ei reg getsval 2 C function 26 ei reg getval 5 C function 2 oo 6 ei_reg_markdirty 2 C function 2 ei reg open 1 C function 27 ei reg purge 1 C function 27 ei reg resize 2 C function 27 ei reg restore 3 C function 28 ei reg setfval 3 C function 28 ei reg setival 3 C function 28 ei reg setpval 4 C function 29 1 Erlang Interface ei reg setsval 3 C function 29 ei reg setval 5 C function 29 ei reg stat 3 C function 30 ei reg tabstat 2 C function 30 81 82 Erlang Interface
87. rl xconnect requires the IP address of the remote host and the alive name of the remote node to be specified erl_connect provides an alternative interface and determines the information from the node name provided addr is the 32 bit IP address of the remote host alive is the alivename of the remote node node is the name of the remote node These functions return an open file descriptor on success or a negative value indicating that an error occurred in which case they will set er1_errno to one of EHOSTUNREACH T he remote host node is unreachable ENOMEM N o more memory available EIO I O error A dditionally errno values from socket 2 and connect 2 system calls may be propagated into erl_errno Erlang Interface 47 erl_connect Erl_Interface Library Reference 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 amp addr ALIVE int erl_close_connection fd Types e int fd This function closes an open connection to an Erlang node Fd is a file descriptor obtained from er1_connect or erl xconnect On success 0 is returned 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 int erlreceive fd bufp bufsize Types e int fd e_char
88. s not a valid Erlang pid ENOMEM N 0 more memory available EIO I O error int erl_reg_send fd to msg Types e int fd e char to e ETERM msg 50 Erlang Interface Erl Interface Library Reference erl connect This function sends an Erlang term to a registered process fd is an open descriptor to an Erlang connection to is a string containing the registered name of the intended recipient of the message msg is the Erlang term to be sent The function returns 1 if successful otherwise 0 in which case it will set erl_errno to one of ENOMEM N o more memory available EIO I O error ETERM erl rpc fd mod fun args int erlrpcto fd mod fun args int erlrpcfrom fd timeout emsg Types e int fd timeout s Char mod fun e ETERM args e ErlM essage emsg These functions support calling Erlang functions on remote nodes erl_rpc_to sends an rpc request to a remote node and erl_rpc_from receives the results of such a call erl_rpc Combines the functionality of these two functions by sending an rpc request and waiting for the results See also rpc ca11 4 fd is an open descriptor to an Erlang connection timeout is the maximum time in ms to wait for results Specify ERL_NO_TIMEOUT to wait forever When erl_rpc calls erl_rpc_from the call will never timeout mod is the name of the module containing the function to be run on the remote node fun is the name of the function to run a
89. s to be called before other functions in the ei_connect module are used ec is a structure containing information about the C node It is used in other ei functions for connecting and receiving data this_node_name is the registered name of the process the name before cookie is the cookie for the node creation identifies a specific instance of aC node It can help prevent the node from receiving messages sent to an earlier process with the same registered name thishostname is the name of the machine we re running on If long names are to be used it should be fully qualified i e durin erix ericsson se instead of durin thisalivename is the registered name of the process thisnodename is the full name of the node i e einode durin thispaddr if the IP address of the host A C node acting as a server will be assigned a creation number when it calls erl_publish or erl_xpublish A connection is closed by simply closing the socket Refer to system documentation to close the socket gracefully when there are outgoing packets before close Example 1 Erlang Interface Erl Interface Library Reference ei_connect int n 0 struct in_addr addr ei_cnode ec addr inet_addr 150 236 14 75 if ei_connect_xinit amp ec chivas madonna madonna chivas du etx ericsson se amp addr cookie n lt 0 erl_err_quit lt ERROR gt when initializing Example 2 if ei_connect_init amp ec
90. scribed above or ERL_TICK in which case no message is returned On failure the function returns ERL_ERROR and will set erl_errno to one of Erlang Interface 49 erl_connect Erl_Interface Library Reference EMSGSIZE Buffer too small ENOMEM No more memory available EIO I O error int erlxreceivemsg fd bufpp bufsizep emsg Types e int fd e unsigned char bufpp e int bufsizep e ErlM essage emsg This function is similar to erl_receive nsg The difference is that erl_xreceive msg expects the buffer to have been allocated by malloc and reallocates it if the received message does not fit into the original buffer For that reason both buffer and buffer length are given as pointers their values may change by the call On success the function returns ERL_MSG and the Emsg struct will be initialized as described above or ERL_TICK in which case no message is returned On failure the function returns ERL_ERROR and will set er1_errno to one of EMSGSIZE Buffer too small ENOMEM N o more memory available EIO I O error int erl_send fd to msg Types e int fd e ETERM to msg This function sends an Erlang term to a process fd is an open descriptor to an Erlang connection to is an Erlang term containing the Pid of the intended recipient of the message msg is the Erlang term to be sent The function returns 1 if successful otherwise 0 in which case it will set erl_errno to one of EINVAL Invalid argument to i
91. sthe C node structure port isthe local name to register and should be the same as the port number that was previously bound to the socket addr isthe 32 bit IP address of the local host To unregister with epmd simply close the returned descriptor See also ei unpublish On success the functions return a descriptor connecting the calling process to epmd On failure they return 1 and set erl_errno to EIO Additionally errno values from socket 2 and connect 2 system calls may be propagated into erl_errno int ei_accept ei_cnode ec int listensock ErlConnect conp This function is used by a server process to accept a connection from a client process ec is the C node structure listensock is an open socket descriptor on which 1isten has previously been called conp is a pointer to an ErlConnect struct described as follows 44 Erlang Interface Erl Interface Library Reference ei_connect typedef struct char ipadr 4 char nodename MAXNODELEN ErlConnect On success conp is filled in with the address and node name of the connecting client and a file descriptor is returned On failure ERL_ERROR is returned and erl_errno is set to EIO int ei_unpublish ei_cnode ec const char const char const char erlang_pid This function can be called by a process to unregister a specified node from epmd on the localhost This may be useful for example when epmd has not detected the failure of a
92. t Erlang Interface Erl Interface Library Reference ei int int int int int int int int int ei_decode_term const char buf int index void t This function decodes a term from the binary format The term is return int as a ETERMx so t is actually an ETERM See erl_interface 3 The term should later be deallocated ei_decode_trace const char buf int index erlang_trace p D ecodes an erlang trace token from the binary format ei_decode_tuple_header const char buf int index int arity This function decodes a tuple header the number of elements is returned in arity The tuple elements followsin order in the buffer ei_decode_list_header const char buf int index int arity This function decodes a list header from the binary format T he number of elements is returned in arity The arity 1 elements follows the last one is the tail of the list normally an empty list If arity is 0 it s an empty list N ote that lists are encoded as strings if they consist entirely of integers in the range 0 255 This function will not decode such strings use ei_decode_string instead ei_decode_ei_term const char buf int index ei_term term This function decodes any term or at least tries to If the term pointed at by index in buf fits in the term union it is decoded and the appropriate field in term gt value is set and index is incremented by the term size The function returns 0 on suc
93. t type ei reg stat reg key obuf Get object information ei reg tabstat reg obuf Get registry information Erlang Interface 17 Erl Interface Library Reference ei The following functions are exported e int ei_encode_version char buf int index Encode version e int ei_x_encode version ei x _buff x Encode version e int ei_encode_long char buf int index long p Encode integer e int ei_x_encode_long ei_x_buff x long p Encode integer e int ei_encode_ulong char buf int index unsigned long p Encode unsigned integer e int ei_x_encode_ulong ei_x_buff x unsigned long p Encode unsigned integer e int ei_encode_double char buf int index double p Encodea double float e int ei_x_encode_double ei_x_buff x double p Encode a double float e int ei_encode_boolean char buf int index int p Encodea boolean e int ei_encode_char char buf int index char p Encode a character e int ei_encode_string char buf int index const char p Encodea string e int ei_encode_string_len char buf int index const char p int len Encode a string e int ei_x_encode_string eix_buff x const char p Encode a string e int ei_x_encode_string_len ei_x_buff x const chart s int len Encode a string e int ei_encode_atom char buf int index const char p Encode an atom e int ei_encode_atom_len char buf int index const char p int len Encode an atom e int ei_x_encode_atom ei_x_buff x const char p Enco
94. tained earlier with ei_decode_port ei_encoderref char buf int index const erlang ref p Encodes an erlang reference in the binary format The p parameter points to a erlang_ref structure which should have been obtained earlier with ei_decode_ref ei_encode_term char buf int index void t ei_x_encode_term eix_buff x void t This function encodes an ETERM as obtained from erl_interface The t parameter is actually an ETERM pointer This function doesn t free the ETERM ei_encode_trace char buf int index const erlang_trace p This function encodes an erlang trace token in the binary format The p parameter pointsto aerlang_trace structure which should have been obtained earlier with ei_decode_trace ei_encode_tuple_header char buf int index int arity ei_x_encode_tuple_header ei_x_buff x int arity This function encodes a tuple header with a specified arity The next arity terms encoded will be the elements of the tuple Tuples and lists are encoded recursively so that a tuple may contain another tuple or list E g to encode the tuple fa fb ei_encode_tuple_header buf amp i 2 ei_encode_atom buf amp i a ei_encode_tuple_header buf amp i 2 ei_encode_atom buf amp i b ei_encode_tuple_header buf amp i 0 ei_encode_list_header char buf int index int arity Erlang Interface Erl Interface Library Reference ei int int int int int int int ei_x e
95. tes in the Erlang external format fd is an open descriptor to an Erlang connection It is obtained from a previous erl_connect Of erl_accept bufp isa buffer large enough to hold the expected message bufsize indicates the size of bufp If atick occurs i e the Erlang node on the other end of the connection has polled this node to see if it is still alive the function will return ERL_TICK and no message will be placed in the buffer Also erl_errno will be set to EAGAIN On success the message is placed in the specified buffer and the function returnsthe number of bytes actually read On failure the function returns ERL_ERROR and will set erl_errno to one of EAGAIN Temporary error Try again EMSGSIZE Buffer too small EIO I O error int ei receivemmsg int fd erlang msg msg ei_x_buff x int ei_xreceivemsg int fd erlang msg msg ei_x_buffx x 42 These functions receives a message to the buffer in x ei_xreceive_msg allows the buffer in x to grow but ei receive _msg fails if the message is bigger than the preallocated buffer in x fd is an open descriptor to an Erlang connection msg is a pointer to an erlang msg Structure and contains information on the message received x is buffer obtained from ei x new On success the function returns ERL_MSG and the msg struct will be initialized erlang msg is defined as follows typedef struct long msgtype erlang_pid from erlang_pid to char toname MAXATOMLEN
96. tevens These functions are all called in the same manner as printf i e with a string containing format specifiers followed by a list of corresponding arguments All output from these functions isto stderr Exports void erl_errmsg FormatStr Types e const char FormatStr The message provided by the caller is printed This function is simply a wrapper for fprintf O void erlerr guit FormatStr Types e const char FormatStr Use this function when a fatal error has occurred that is not due to a system call The message provided by the caller is printed and the process terminates with an exit value of 1 The function does not return void erl_err_ret FormatStr Types e const char FormatStr Use this function after a failed system call The message provided by the caller is printed followed by a string describing the reason for failure void erlerr sys FormatStr Types e const char FormatStr Use this function after a failed system call The message provided by the caller is printed followed by a string describing the reason for failure and the process terminates with an exit value of 1 The function does not return 54 Erlang Interface Erl Interface Library Reference erl_error volatile int Error Reporting M ost functions in erl_interface report failuresto the caller by returning some otherwise meaningless value typically NULL or a negative number As this only tells you that things did n
97. thisnodenane erl_thishostname erl_thisalivename erl_thiscreation These functions can be used to retrieve information about the C N ode These values are initially set with erl_connect_init Or erl connect xinit erl_unpublish alive Types e Char alive This function can be called by a process to unregister a specified node name from epmd on the localhost This may be useful for example when epmd has not detected the failure of a node and will not allow the name to be reused If you use this function to unregister your own process be sure to also close the descriptor that was returned by erl publish Note C areless use of this function may have unpredictable results if the registered node is in fact still running alive isthe name of the node to unregister i e the first component of the nodename without the hostname If the node was successfully unregistered from epmd the function returns 0 Otherwise it returns 1 and sets erl_errno is to EIO Debug Information If aconnection attempt fails the following can be checked e erl_errno s that the right cookie was used s that epmd is running s the remote Erlang node on the other side is running the same version of Erlang as the erl_interface library Erlang Interface 53 erl_error Erl_Interface Library Reference C Module This module contains some error printing routines taken from A dvanced Programmingin theUN IX Environment by W Richard S
98. tor to an Erlang connection count is the address of an integer or NULL If count isnot NULL it will be set by the function to the number of names found On success the function returns an array of strings each containing a single registered name and sets count to the number of names found The array is terminated by a single N ULL pointer On failure the function returns NULL and count is not modified N ote It is the caller s responsibility to free the array afterwards It has been allocated by the function with a single call to malloc so a single free is all that is necessary erl_global_register fd name pid Types e int fd e const char name e ETERM pid Erlang Interface 67 erl_global Erl_Interface Library Reference This function registers a name in Global fd is an open descriptor to an Erlang connection name isthe name to register in Global pid is the pid that should be associated with name This is the value that Global will return when processes reguest the location of name The function returns 0 on success or 1 on failure int erl global unregister fd name Types e int fd e_const char name This function unregisters a name from Global fd is an open descriptor to an Erlang connection name isthe name to unregister from Global The function returns 0 on success or 1 on failure ETERM erl_global_whereis fd name node 68 Types e int fd e_const char name e_ch
99. ublish 1 C function 52 erl_receive 3 C function 48 erl receive msg 4 C function 48 erl reg send 3 C function 50 erl_rpc 4 C function 51 erl_rpc_from 3 C function 51 erl rpc to 4 C function 51 erl send 3 C function 50 erl_thisalivename 0 C function 53 erl thiscookie 0 C function 53 erl_thiscreation 0 C function 53 erl_thishostname O C function 53 erl_thisnodename 0 C function 53 erl unpublish 1 C function 53 erl xconnect 2 C function 47 erl xpublish 2 C function 52 erl xreceive msg 4 C function 50 erl connect 1 C function erl connect 47 erl connect init 3 C function erl_connect 46 erl_connect_xinit 6 C function erl_connect 46 erl cons 2 C function erl eterm 57 erl copy term 1 C function erl_eterm 57 erl_decode 1 C function erl_marshal 71 Erlang Interface erl_decode_buf 1 C function erl_marshal 71 erl_element 2 C function erl_eterm 57 erl encode 2 C function erl_marshal 71 erl_encode_buf 2 C function erl_marshal 71 erl_err_msg 2 C function erl error 54 erl_err_guit 2 C function erl_error 54 erl_err_ret 2 C function erl error 54 erl err sys 2 C function erl error 54 erl_errno C function erl_error 55 erl_error erl err msg 2 C function 54 erl err guit 2 C function 54 erl err ret 2 C function 54 erl err sys 2 C function 54 erl errno C function 55 erl_eterm erl_cons 2 C function 57 erl c
100. ure NULL will be returned int ei reg purge reg Types e ei_reg reg Remove all objects marked for deletion When objects are deleted with ei_reg_delete they are not actually removed from the registry only marked for later removal This is so that on a subsequent backup to M nesia the objects can also be removed from the M nesia table If you are not backing up to M nesia then you may wish to remove the objects manually with this function reg is a registry containing objects marked for deletion The function returns 0 on success or 1 on failure int ei reg resize reg newsize Types e ei_reg reg s int newsize Erlang Interface 27 registry Erl_Interface Library Reference Change the size of a registry newsize is the new size to make the registry The number will be increased to the nearest larger prime number On success the registry will be resized all contents rehashed and the function will return 0 On failure the registry will be left unchanged and the function will return 1 int ei reg restore fd reg mntab Types e int fd e ei_reg reg s const char mntab The contents of a M nesia table are read into the registry fd is an open connection to Erlang M nesia 3 0 or later must be running on the Erlang node reg isthe registry where the data should be placed mntab is the name of the M nesia table to read data from N ote that only tables of a certain format can be restored i e those that
101. ven term The following can help you estimate the buffer requirements for a term Note that this information is implementation specific and may change in future versions If you are unsure use erl_term_len Erlang terms are encoded with a 1 byte tag that identifies the type of object a 2 or 4 byte length field and then the data itself Specifically Tuples need 5 bytes plus the space for each element Lists need 5 bytes plusthe space for each element and 1 additonal byte for the empty list at the end Strings and atoms need 3 bytes plus 1 byte for each character the terminating 0 is not encoded Really long strings more than 64k characters are encoded as lists Atoms cannot contain more than 256 characters Integers need 5 bytes Characters integers lt 256 need 2 bytes Floating point numbers need 32 bytes Pids need 10 bytes plusthe space for the node name which is an atom Ports and Refs need 6 bytes plus the space for the node name which is an atom The total space required will be the result calculated from the information above plus 1 additional byte for a version identifier int erl_ext_size bufp Types e unsigned char bufp This function returns the number of elements in an encoded term char erl_ext_type bufp 72 Types e unsigned char bufp This function identifies and returns the type of Erlang term encoded in a buffer Erlang Interface Erl Interface Library Reference erl_marshal
102. y ETERM erl mk pid node number serial creation Creates a process identifier ETERM erl_mk_port node number creation Creates a port identifier ETERM erl_mk_ref node number creation Creates an old Erlang reference ETERM erlmklongref node ni n2 n3 creation Creates an Erlang reference ETERM erl_mk_string string Creates a string ETERM erl_mk_tuple array arrsize Creates an Erlang tuple from an array ETERM erl_mk_uint n Creates an unsigned integer ETERM erl mk_var name Creates an Erlang variable int erl_print_term stream term Prints an Erlang term int erl_size term Return the arity of a tuple or binary ETERM erl_tl list Extracts the tail from a list ETERM erl_var content term name Extracts the content of a variable Erlang Interface Erl_Interface Library Reference erl_format The following functions are exported ETERM erl_format FormatStr Creates an Erlang term int erl_match Pattern Term Performs pattern matching erl_global The following functions are exported char erl global names fd count O btain list of Global names int erl_global_register fd name pid Register aname in Global int erl global unregister fd name Unregister a name in Global ETERM erl_global_whereis fd name node Look up a name in global erl_malloc The following functions are exported ETERM erl_alloc_eterm etype Allocates an ETERM structure void erl_eterm release void Clears the

Download Pdf Manuals

image

Related Search

Related Contents

新設770MHz双方向増幅器 - digital  HIP-T100 - 取扱説明書ダウンロード  AVTMTTR320 TTR320 Manual Rev A Oct 2008  MD Building Products 70243 Installation Guide : Free Download, Borrow, and Streaming : Internet Archive  Samsung Máy giặt cửa trước với Thiết kế Pha lê trắng 8,5kg (WW85H5400EW) Hướng dẫn sử dụng    Dell XPS 14Z User's Manual  Uni SP Multi Append iss1.book  Dosimetro di rumore, registratore dati e fonometro Con interfaccia PC  ADMINISTRACION DE LAS OBRAS - Licitaciones y Compras  

Copyright © All rights reserved.
Failed to retrieve file