int gn_start_cnode(char **argv) { extern ei_cnode ec; char rem_node_name[MAXATOMLEN] = ""; /* other node name */ ei_x_buff xbuf; erlang_pid *self = ei_self(&ec); strcat(rem_node_name,REMNODE); strcat(rem_node_name,"@"); strcat(rem_node_name,REMHOST); rem_regname = g_strdup(REMREG); g_print("I am %s, you are %s (%d)\n", NODE_NAME, rem_node_name, ERL_DIST_VSN); ei_set_compat_rel(ERL_DIST_VSN); /* erlnode version of dist. protocol */ if ( ei_connect_init(&ec, NODE_NAME, COOKIE, CREATION) < 0 ) g_critical("ei_connect_init"); if ( (fd = ei_connect(&ec, rem_node_name)) < 0 ) g_critical("ei_connect failed.\nwrong cookie? erl-dist version mismatch?"); self->num = fd; /* bug?? in ei_reg_send_tmo */ ei_x_new_with_version(&xbuf); gn_wrap_ans("handshake", &xbuf); ei_x_encode_empty_list(&xbuf); gn_send(&xbuf); ei_x_free(&xbuf); return fd; }
static switch_status_t create_acceptor() { switch_sockaddr_t *sa; uint16_t port; char ipbuf[25]; const char *ip_addr; /* if the config has specified an erlang release compatibility then pass that along to the erlang interface */ if (globals.ei_compat_rel) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Compatability with OTP R%d requested\n", globals.ei_compat_rel); ei_set_compat_rel(globals.ei_compat_rel); } if (!(globals.acceptor = create_socket_with_port(globals.pool, globals.port))) { return SWITCH_STATUS_SOCKERR; } switch_socket_addr_get(&sa, SWITCH_FALSE, globals.acceptor); port = switch_sockaddr_get_port(sa); ip_addr = switch_get_addr(ipbuf, sizeof (ipbuf), sa); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Erlang connection acceptor listening on %s:%u\n", ip_addr, port); /* try to initialize the erlang interface */ if (create_ei_cnode(ip_addr, globals.ei_nodename, &globals.ei_cnode) != SWITCH_STATUS_SUCCESS) { return SWITCH_STATUS_SOCKERR; } /* tell the erlang port manager where we can be reached. this returns a file descriptor pointing to epmd or -1 */ if ((globals.epmdfd = ei_publish(&globals.ei_cnode, port)) == -1) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to publish port to epmd. Try starting it yourself or run an erl shell with the -sname or -name option.\n"); return SWITCH_STATUS_SOCKERR; } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Connected to epmd and published erlang cnode name %s at port %d\n", globals.ei_cnode.thisnodename, port); return SWITCH_STATUS_SUCCESS; }
void erl_set_compat_rel(unsigned rel) { ei_set_compat_rel(rel); }