5
#include <sys/socket.h>
6
#include <netinet/in.h>
8
#include "erl_interface.h"
13
int main(int argc, char **argv) {
14
struct in_addr addr; /* 32-bit IP number of host */
15
int port; /* Listen port number */
16
int listen; /* Listen socket */
17
int fd; /* fd to Erlang node */
18
ErlConnect conn; /* Connection data */
20
int loop = 1; /* Loop flag */
21
int got; /* Result of receive */
22
unsigned char buf[BUFSIZE]; /* Buffer for incoming message */
23
ErlMessage emsg; /* Incoming message */
25
ETERM *fromp, *tuplep, *fnp, *argp, *resp;
32
addr.s_addr = inet_addr("134.138.177.89");
33
if (erl_connect_xinit("idril", "cnode", "cnode@idril.du.uab.ericsson.se",
34
&addr, "secretcookie", 0) == -1)
35
erl_err_quit("erl_connect_xinit");
37
/* Make a listen socket */
38
if ((listen = my_listen(port)) <= 0)
39
erl_err_quit("my_listen");
41
if (erl_publish(port) == -1)
42
erl_err_quit("erl_publish");
44
if ((fd = erl_accept(listen, &conn)) == ERL_ERROR)
45
erl_err_quit("erl_accept");
46
fprintf(stderr, "Connected to %s\n\r", conn.nodename);
50
got = erl_receive_msg(fd, buf, BUFSIZE, &emsg);
51
if (got == ERL_TICK) {
53
} else if (got == ERL_ERROR) {
57
if (emsg.type == ERL_REG_SEND) {
58
fromp = erl_element(2, emsg.msg);
59
tuplep = erl_element(3, emsg.msg);
60
fnp = erl_element(1, tuplep);
61
argp = erl_element(2, tuplep);
63
if (strncmp(ERL_ATOM_PTR(fnp), "foo", 3) == 0) {
64
res = foo(ERL_INT_VALUE(argp));
65
} else if (strncmp(ERL_ATOM_PTR(fnp), "bar", 3) == 0) {
66
res = bar(ERL_INT_VALUE(argp));
69
resp = erl_format("{cnode, ~i}", res);
70
erl_send(fd, fromp, resp);
72
erl_free_term(emsg.from); erl_free_term(emsg.msg);
73
erl_free_term(fromp); erl_free_term(tuplep);
74
erl_free_term(fnp); erl_free_term(argp);
82
int my_listen(int port) {
84
struct sockaddr_in addr;
87
if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
90
setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
92
memset((void*) &addr, 0, (size_t) sizeof(addr));
93
addr.sin_family = AF_INET;
94
addr.sin_port = htons(port);
95
addr.sin_addr.s_addr = htonl(INADDR_ANY);
97
if (bind(listen_fd, (struct sockaddr*) &addr, sizeof(addr)) < 0)
100
listen(listen_fd, 5);