1 /* cnode_c.c */
2 
3 #include <stdio.h>
4 #include <sys/types.h>
5 #include <sys/socket.h>
6 #include <netinet/in.h>
7 
8 #include "erl_interface.h"
9 #include "ei.h"
10 
11 #define BUFSIZE 1000
12 
main(int argc,char ** argv)13 int main(int argc, char **argv) {
14   int fd;                                  /* fd to Erlang node */
15 
16   int loop = 1;                            /* Loop flag */
17   int got;                                 /* Result of receive */
18   unsigned char buf[BUFSIZE];              /* Buffer for incoming message */
19   ErlMessage emsg;                         /* Incoming message */
20 
21   ETERM *fromp, *tuplep, *fnp, *argp, *resp;
22   int res;
23 
24   erl_init(NULL, 0);
25 
26   if (erl_connect_init(1, "secretcookie", 0) == -1)
27     erl_err_quit("erl_connect_init");
28 
29   if ((fd = erl_connect("e1@idril")) < 0)
30     erl_err_quit("erl_connect");
31   fprintf(stderr, "Connected to ei@idril\n\r");
32 
33   while (loop) {
34 
35     got = erl_receive_msg(fd, buf, BUFSIZE, &emsg);
36     if (got == ERL_TICK) {
37       /* ignore */
38     } else if (got == ERL_ERROR) {
39       loop = 0;
40     } else {
41 
42       if (emsg.type == ERL_REG_SEND) {
43 	fromp = erl_element(2, emsg.msg);
44 	tuplep = erl_element(3, emsg.msg);
45 	fnp = erl_element(1, tuplep);
46 	argp = erl_element(2, tuplep);
47 
48 	if (strncmp(ERL_ATOM_PTR(fnp), "foo", 3) == 0) {
49 	  res = foo(ERL_INT_VALUE(argp));
50 	} else if (strncmp(ERL_ATOM_PTR(fnp), "bar", 3) == 0) {
51 	  res = bar(ERL_INT_VALUE(argp));
52 	}
53 
54 	resp = erl_format("{cnode, ~i}", res);
55 	erl_send(fd, fromp, resp);
56 
57 	erl_free_term(emsg.from); erl_free_term(emsg.msg);
58 	erl_free_term(fromp); erl_free_term(tuplep);
59 	erl_free_term(fnp); erl_free_term(argp);
60 	erl_free_term(resp);
61       }
62     }
63   }
64 }
65