static void test_addr_str(void) { static const unsigned char v6addr[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}; static const unsigned char v4addr[16] = "\0\0\0\0\0\0\0\0\0\0\xff\xff\x01\x02\x03\x04"; char host[64]; bn_address_str(host, sizeof(host), v6addr); assert(strcmp(host, "::1") == 0); bn_address_str(host, sizeof(host), v4addr); assert(strcmp(host, "1.2.3.4") == 0); }
static bool nc_msg_version(struct nc_conn *conn) { if (conn->seen_version){ LOG("version command already seen from:%s", conn->addr_str); return false; } conn->seen_version = true; struct const_buffer buf = { conn->msg.data, conn->msg.hdr.data_len }; struct msg_version mv; bool rc = false; msg_version_init(&mv); if (!deser_msg_version(&mv, &buf)) goto out; if (debugging) { char fromstr[64], tostr[64]; bn_address_str(fromstr, sizeof(fromstr), mv.addrFrom.ip); bn_address_str(tostr, sizeof(tostr), mv.addrTo.ip); fprintf(plog, "net: %s version(%u, 0x%llx, %lld, To:%s, From:%s, %s, %u)\n", conn->addr_str, mv.nVersion, (unsigned long long) mv.nServices, (long long) mv.nTime, tostr, fromstr, mv.strSubVer, mv.nStartingHeight); } if (!(mv.nServices & NODE_NETWORK)) /* require NODE_NETWORK */ goto out; if (mv.nonce == instance_nonce) /* connected to ourselves? */ goto out; conn->protover = MIN(mv.nVersion, PROTO_VERSION); /* acknowledge version receipt */ if (!nc_conn_send(conn, "verack", NULL, 0)) goto out; rc = true; out: msg_version_free(&mv); return rc; }
static struct nc_conn *nc_conn_new(const struct peer *peer) { struct nc_conn *conn; conn = calloc(1, sizeof(*conn)); if (!conn) return NULL; conn->fd = -1; peer_copy(&conn->peer, peer); bn_address_str(conn->addr_str, sizeof(conn->addr_str), conn->peer.addr.ip); return conn; }