/** * Collect entropy from host. * * This uses the host's name and its IP addresses. */ static void entropy_collect_host(SHA1Context *ctx) { const char *name; GSList *hosts, *sl; name = local_hostname(); sha1_feed_string(ctx, name); hosts = name_to_host_addr(name, NET_TYPE_NONE); GM_SLIST_FOREACH(hosts, sl) { host_addr_t *addr = sl->data; struct packed_host_addr packed = host_addr_pack(*addr); SHA1Input(ctx, &packed, packed_host_addr_size(packed)); }
/** * Add child to the node, carrying an IP:port. * * @param t the tree node where child must be added * @param name the name of the child * @param addr the IP address * @param port the port address * * @return the added child node */ static g2_tree_t * g2_build_add_host(g2_tree_t *t, const char *name, host_addr_t addr, uint16 port) { struct packed_host_addr packed; uint alen; char payload[18]; /* Large enough for IPv6 as well, one day? */ void *p; g2_tree_t *c; packed = host_addr_pack(addr); alen = packed_host_addr_size(packed) - 1; /* skip network byte */ p = mempcpy(payload, &packed.addr, alen); p = poke_le16(p, port); c = g2_tree_alloc_copy(name, payload, ptr_diff(p, payload)); g2_tree_add_child(t, c); return c; }