static void tcpeek_listener_stat_json(int soc, const char *method) { struct tcpeek_filter *filter; struct tcpeek_stat *stat; char success[128], failure[128], buf[512]; int isrefresh = 0, isfirst = 1; pthread_mutex_lock(&g.session.mutex); send(soc, "[", 1, 0); lnklist_iter_init(g.filter); while(lnklist_iter_hasnext(g.filter)) { filter = lnklist_iter_next(g.filter); if(!filter->stat) { continue; } if(strisequal(method, "REFRESH")) { isrefresh = 1; } stat = filter->stat; snprintf(success, sizeof(success), "{\"total\":%u,\"dupsyn\":%u,\"dupsynack\":%u}", stat[0].success.total - (isrefresh ? stat[1].success.total : 0), stat[0].success.dupsyn - (isrefresh ? stat[1].success.dupsyn : 0), stat[0].success.dupsynack - (isrefresh ? stat[1].success.dupsynack : 0) ); if(strisequal(method, "REFRESH")) { snprintf(failure, sizeof(failure), "{\"total\":%u,\"timeout\":%u,\"reject\":%u}", stat[0].failure.total - (isrefresh ? stat[1].failure.total : 0), stat[0].failure.timeout - (isrefresh ? stat[1].failure.timeout : 0), (stat[0].failure.reject - (isrefresh ? stat[1].failure.reject : 0)) + (stat[0].failure.unreach - (isrefresh ? stat[1].failure.unreach : 0)) ); } else { snprintf(failure, sizeof(failure), "{\"total\":%u,\"timeout\":%u,\"reject\":%u, \"unreach\":%u}", stat[0].failure.total - (isrefresh ? stat[1].failure.total : 0), stat[0].failure.timeout - (isrefresh ? stat[1].failure.timeout : 0), stat[0].failure.reject - (isrefresh ? stat[1].failure.reject : 0), stat[0].failure.unreach - (isrefresh ? stat[1].failure.unreach : 0) ); } snprintf(buf, sizeof(buf), "%s{\"%s\":{\"success\":%s,\"failure\":%s}}", isfirst ? "" : ",", filter->name, success, failure); send(soc, buf, strlen(buf), 0); if(strisequal(method, "REFRESH")) { memcpy(&stat[1], &stat[0], sizeof(struct tcpeek_stat)); } if(isfirst) isfirst = 0; } if(!strisequal(method, "REFRESH")) { struct pcap_stat ps; memset(&ps, 0, sizeof(ps)); pcap_stats(g.pcap.pcap, &ps); snprintf(buf, sizeof(buf), ",{\"pcap\":{\"stats\":{\"recv\":%u,\"drop\":%u,\"ifdrop\":%u}}}", ps.ps_recv, ps.ps_drop, ps.ps_ifdrop); send(soc, buf, strlen(buf), 0); } send(soc, "]", 1, 0); pthread_mutex_unlock(&g.session.mutex); }
static void tcpeek_init_addr(void) { struct ifaddrs *ifap, *ifa = NULL; if(getifaddrs(&ifap) != -1) { for(ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) { if(!ifa->ifa_addr) continue; if(strisequal(ifa->ifa_name, g.option.ifname) && ifa->ifa_addr->sa_family == AF_INET) { g.addr.unicast.s_addr = ((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr; break; } } } freeifaddrs(ifap); if(!ifa) { error_abort("'%s' not found", g.option.ifname); } }
static void tcpeek_init_option(int argc, char *argv[]) { int opt; static struct option long_options[] = { {"user", 1, NULL, 'u'}, {"interface", 1, NULL, 'i'}, {"checksum", 1, NULL, 'c'}, {"socket", 1, NULL, 'U'}, {"timeout", 1, NULL, 't'}, {"buffer", 1, NULL, 'B'}, {"loglevel", 1, NULL, 'l'}, {"quiet", 0, NULL, 'q'}, {"promisc", 0, NULL, 500}, {"icmp", 0, NULL, 501}, {"help", 0, NULL, 'h'}, {"version", 0, NULL, 'v'}, { NULL, 0, NULL, 0 } }; while((opt = getopt_long_only(argc, argv, "u:i:c:U:t:B:l:qhv", long_options, NULL)) != -1) { switch(opt) { case 'u': strncpy(g.option.user, optarg, sizeof(g.option.user) - 1); break; case 'i': strncpy(g.option.ifname, optarg, sizeof(g.option.ifname) - 1); break; case 'c': if(!strisequal(optarg, "0") && !strisequal(optarg, "1") && !strisequal(optarg, "2")) { usage(); tcpeek_terminate(0); } g.option.checksum = strtol(optarg, NULL, 10); break; case 'U': strncpy(g.option.socket, optarg, sizeof(g.option.socket) - 1); break; case 'B': if(!strisdigit(optarg)) { usage(); tcpeek_terminate(0); } g.option.buffer = strtol(optarg, NULL, 10); break; case 't': if(!strisdigit(optarg)) { usage(); tcpeek_terminate(0); } g.option.timeout = strtol(optarg, NULL, 10); break; case 'q': g.option.quiet = 1; break; case 500: g.option.promisc = 1; break; case 501: g.option.icmp = 1; break; case 'h': usage(); tcpeek_terminate(0); case 'v': version(); tcpeek_terminate(0); default: usage(); tcpeek_terminate(1); } } while(optind < argc) { lnklist_add_tail(g.option.expression, strdup(argv[optind++])); } }