예제 #1
0
int threads_process(intrace_t * intrace)
{
	int err;
	pthread_attr_t attr;
	pthread_t t;

	if (pthread_mutex_init(&intrace->mutex, NULL) != 0) {
		debug_printf(dlFatal, "threads: Mutex initialization failed\n");
		return errMutex;
	}

	debug_printf(dlDebug, "Resolving '%s'\n", intrace->hostname);
	if (!threads_resolveIP(intrace, intrace->hostname)) {
		debug_printf(dlFatal, "Resolving '%s' failed\n", intrace->hostname);
		return errResolve;
	}

	char haddr[INET6_ADDRSTRLEN];
	if (!inet_ntop(_IT_AF(intrace), _IT_RIP(intrace), haddr, sizeof(haddr))) {
		debug_printf(dlFatal, "Cannot convert IP addr to a text form\n");
		return errResolve;
	}

	debug_printf(dlDebug, "%s for '%s' resolved='%s'\n", _IT_IPSTR(intrace), intrace->hostname,
		     haddr);

	if ((err = listener_init(intrace)) != errNone) {
		debug_printf(dlFatal, "threads: Listener initialization failed, err=%d'\n", err);
		return err;
	}

	if ((err = sender_init(intrace)) != errNone) {
		debug_printf(dlFatal, "threads: Packet sender initialization failed, err=%d\n",
			     err);
		return err;
	}

	if ((err = threads_dropPrivs()) != errNone) {
		debug_printf(dlFatal, "threads: Couldn't drop privileges, err=%d\n", err);
		return err;
	}

	pthread_attr_init(&attr);
	pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
	if (pthread_create(&t, &attr, listener_thr, (void *)intrace) < 0) {
		debug_printf(dlFatal, "threads: Cannot create listener thread\n");
		return errThread;
	}

	pthread_attr_init(&attr);
	pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
	if (pthread_create(&t, &attr, sender_thr, (void *)intrace) < 0) {
		debug_printf(dlFatal, "threads: Cannot create sender thread\n");
		return errThread;
	}

	display_process(intrace);
	return errNone;
}
예제 #2
0
int display_process(intrace_t * intrace)
{
	display_disableScroll();
	display_clr();

	for (;;) {
		display_cursPos(0, 0);

		/* Lock mutex */
		while (pthread_mutex_lock(&intrace->mutex)) ;

		char locAddr[INET6_ADDRSTRLEN], rmtAddr[INET6_ADDRSTRLEN];
		inet_ntop(_IT_AF(intrace), _IT_LIP(intrace), locAddr, sizeof(locAddr));
		inet_ntop(_IT_AF(intrace), _IT_RIP(intrace), rmtAddr, sizeof(rmtAddr));

		printf("=========================[ %s %s ]========================\n", INTRACE_NAME, INTRACE_VERSION);

		printf("Remote: %s/%d (%d)\n", rmtAddr, intrace->rport, intrace->port ? intrace->port : 0);
		printf("Local: %s/%d\n", locAddr, intrace->lport);
		printf("Payload Size: %zu bytes, Seq: 0x%08x, Ack: 0x%08x\n", intrace->paylSz,
		       intrace->seq, intrace->ack);

		if (intrace->cnt >= MAX_HOPS)
			intrace->cnt = 0;

		if (!intrace->seq)
			printf("%-75s", "Status: Sniffing for connection packets");
		else if (!intrace->cnt)
			printf("%-75s", "Status: Press ENTER");
		else
			printf("Status: Packets sent #%-50d", intrace->cnt - 1);

		printf("\n\n");
		if (intrace->isIPv6)
			printf("%3s  %-41s  %-41s  %s\n", "#", "[src addr]", "[icmp src addr]",
			       "[pkt type]");
		else
			printf("%3s  %-17s  %-17s  %s\n", "#", "[src addr]", "[icmp src addr]",
			       "[pkt type]");

		for (int i = 1; i <= intrace->maxhop; i++) {

			const char *pktType = "NO REPLY";

			if (intrace->listener.proto[i] == IPPROTO_TCP)
				pktType = "TCP";
			else if (intrace->listener.proto[i] == IPPROTO_ICMP
				 || intrace->listener.proto[i] == IPPROTO_ICMPV6) {

				if (!_IT_IPCMP(intrace, _IT_TRACE_IP(intrace, i), _IT_RIP(intrace)))
					pktType = "ICMP_TIMXCEED";
				else
					pktType = "ICMP_TIMXCEED NAT";

			} else if (intrace->listener.proto[i] == -1)
				pktType = "TCP_RST";

			char ipPktAddr[] = "  ---                                  ";
			if (!_IT_ISANY(intrace, _IT_TRACE_IP(intrace, i))) {
				inet_ntop(_IT_AF(intrace), _IT_TRACE_IP(intrace, i), ipPktAddr,
					  strlen(ipPktAddr));
			}

			char icmpPktAddr[] = "  ---                                  ";
			if (!_IT_ISANY(intrace, _IT_TRACE_ICMP(intrace, i))) {
				inet_ntop(_IT_AF(intrace), _IT_TRACE_ICMP(intrace, i), icmpPktAddr,
					  strlen(icmpPktAddr));
			}

			if (intrace->isIPv6)
				printf("%2d.  [%-39s]  [%-39s]  [%s]\n", i, ipPktAddr, icmpPktAddr,
				       pktType);
			else
				printf("%2d.  [%-15.15s]  [%-15.15s]  [%s]\n", i, ipPktAddr,
				       icmpPktAddr, pktType);
		}

		if (display_selectInput() > 0) {
			if (!intrace->cnt && intrace->seq) {
				intrace->cnt = 1;
				intrace->maxhop = 0;
				bzero(intrace->listener.ip_trace,
				      sizeof(intrace->listener.ip_trace));
				bzero(intrace->listener.ip_trace6,
				      sizeof(intrace->listener.ip_trace6));
				bzero(intrace->listener.icmp_trace,
				      sizeof(intrace->listener.icmp_trace));
				bzero(intrace->listener.icmp_trace6,
				      sizeof(intrace->listener.icmp_trace6));
				display_clr();
			}
		}

		/* UnLock mutex */
		while (pthread_mutex_unlock(&intrace->mutex)) ;
		usleep(200000);
	}

	return errNone;
}