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; }
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; }