diff options
Diffstat (limited to '')
-rw-r--r-- | gg_sniff/pcap.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/gg_sniff/pcap.c b/gg_sniff/pcap.c index 02735c8..fd9470f 100644 --- a/gg_sniff/pcap.c +++ b/gg_sniff/pcap.c @@ -80,6 +80,7 @@ static void phandler_sll(u_char *, #endif static void cb_pcap(int, short, void *); static void cb_conntimer(int, short, void *); +static void cb_nodename(struct ggnet *, struct ggnet_node *); static struct phandler phandlers[] = { { phandler_ether, DLT_EN10MB }, @@ -97,7 +98,7 @@ static struct _cap_t _cap; int ggsniff_pcap_init(struct event_base *ev_base, struct gg_client *ggcli, - struct ggnet *net, char *iface) + struct ggnet *net, char *iface, int active) { char errbuf[PCAP_ERRBUF_SIZE]; struct bpf_program bprog; @@ -136,6 +137,9 @@ ggsniff_pcap_init(struct event_base *ev_base, struct gg_client *ggcli, if (evtimer_add(_cap.conntimer_ev, &_cap.conntimer_tv) == -1) gg_log_fatal("user: event_add conntimer failed: %s", strerror(errno)); + if (active) + ggnet_set_dns(net, 1, ev_base, cb_nodename); + _cap.ggcli = ggcli; _cap.net = net; @@ -327,6 +331,23 @@ cb_conntimer(int fd, short why, void *data) gg_log_fatal("user: event_add conntimer failed : %s", strerror(errno)); } +static void +cb_nodename(struct ggnet *net, struct ggnet_node *n) +{ + struct gg_packet pkt; + int len; + + len = strnlen(n->fqdn, GGNET_DNSNAME_MAX); + if (len > 0) { + pkt.ver = PACKET_VERSION; + pkt.type = PACKET_NAME; + pkt.name_addr = n->addr.s_addr; + pkt.name_len = len; + strncpy((char *)pkt.name_fqdn, n->fqdn, sizeof(pkt.name_fqdn)); + gg_client_send(_cap.ggcli, &pkt); + } +} + /* * Parse an IP packet and descide what to do with it. * 'ip' is a pointer the the captured IP packet |