1 /* cnode_s2.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 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 */
19
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 */
24
25 ETERM *fromp, *tuplep, *fnp, *argp, *resp;
26 int res;
27
28 port = atoi(argv[1]);
29
30 erl_init(NULL, 0);
31
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");
36
37 /* Make a listen socket */
38 if ((listen = my_listen(port)) <= 0)
39 erl_err_quit("my_listen");
40
41 if (erl_publish(port) == -1)
42 erl_err_quit("erl_publish");
43
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);
47
48 while (loop) {
49
50 got = erl_receive_msg(fd, buf, BUFSIZE, &emsg);
51 if (got == ERL_TICK) {
52 /* ignore */
53 } else if (got == ERL_ERROR) {
54 loop = 0;
55 } else {
56
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);
62
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));
67 }
68
69 resp = erl_format("{cnode, ~i}", res);
70 erl_send(fd, fromp, resp);
71
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);
75 erl_free_term(resp);
76 }
77 }
78 }
79 }
80
81
my_listen(int port)82 int my_listen(int port) {
83 int listen_fd;
84 struct sockaddr_in addr;
85 int on = 1;
86
87 if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
88 return (-1);
89
90 setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
91
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);
96
97 if (bind(listen_fd, (struct sockaddr*) &addr, sizeof(addr)) < 0)
98 return (-1);
99
100 listen(listen_fd, 5);
101 return listen_fd;
102 }
103