コード例 #1
0
ファイル: listener.c プロジェクト: hhatto/tcpeek
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);
}
コード例 #2
0
ファイル: init.c プロジェクト: fchiba/tcpeek
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);
	}
}
コード例 #3
0
ファイル: init.c プロジェクト: fchiba/tcpeek
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++]));
	}
}