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