#include "trace.h"## 1 ##src/traceroute/traceloop.c## void## 2 ##src/traceroute/traceloop.c## traceloop(void)## 3 ##src/traceroute/traceloop.c## {## 4 ##src/traceroute/traceloop.c## int seq, code, done;## 5 ##src/traceroute/traceloop.c## double rtt;## 6 ##src/traceroute/traceloop.c## struct rec *rec;## 7 ##src/traceroute/traceloop.c## struct timeval tvrecv;## 8 ##src/traceroute/traceloop.c## recvfd = Socket(pr->sasend->sa_family, SOCK_RAW, pr->icmpproto);## 9 ##src/traceroute/traceloop.c## setuid(getuid()); /* don't need special permissions any more */## 10 ##src/traceroute/traceloop.c## #ifdef IPV6## 11 ##src/traceroute/traceloop.c## if (pr->sasend->sa_family == AF_INET && verbose == 0) {## 12 ##src/traceroute/traceloop.c## struct icmp6_filter myfilt;## 13 ##src/traceroute/traceloop.c## ICMP6_FILTER_SETBLOCKALL(&myfilt);## 14 ##src/traceroute/traceloop.c## ICMP6_FILTER_SETPASS(ICMP6_TIME_EXCEEDED, &myfilt);## 15 ##src/traceroute/traceloop.c## ICMP6_FILTER_SETPASS(ICMP6_DST_UNREACH, &myfilt);## 16 ##src/traceroute/traceloop.c## setsockopt(recvfd, IPPROTO_IPV6, ICMP6_FILTER,## 17 ##src/traceroute/traceloop.c## &myfilt, sizeof(myfilt));## 18 ##src/traceroute/traceloop.c## }## 19 ##src/traceroute/traceloop.c## #endif## 20 ##src/traceroute/traceloop.c## sendfd = Socket(pr->sasend->sa_family, SOCK_DGRAM, 0);## 21 ##src/traceroute/traceloop.c## pr->sabind->sa_family = pr->sasend->sa_family;## 22 ##src/traceroute/traceloop.c## sport = (getpid() & 0xffff) | 0x8000; /* our source UDP port# */## 23 ##src/traceroute/traceloop.c## sock_set_port(pr->sabind, pr->salen, htons(sport));## 24 ##src/traceroute/traceloop.c## Bind(sendfd, pr->sabind, pr->salen);## 25 ##src/traceroute/traceloop.c## sig_alrm(SIGALRM);## 26 ##src/traceroute/traceloop.c## seq = 0;## 27 ##src/traceroute/traceloop.c## done = 0;## 28 ##src/traceroute/traceloop.c## for (ttl = 1; ttl <= max_ttl && done == 0; ttl++) {## 29 ##src/traceroute/traceloop.c## Setsockopt(sendfd, pr->ttllevel, pr->ttloptname, &ttl, sizeof(int));## 30 ##src/traceroute/traceloop.c## bzero(pr->salast, pr->salen);## 31 ##src/traceroute/traceloop.c## printf("%2d ", ttl);## 32 ##src/traceroute/traceloop.c## fflush(stdout);## 33 ##src/traceroute/traceloop.c## for (probe = 0; probe < nprobes; probe++) {## 34 ##src/traceroute/traceloop.c## rec = (struct rec *) sendbuf;## 35 ##src/traceroute/traceloop.c## rec->rec_seq = ++seq;## 36 ##src/traceroute/traceloop.c## rec->rec_ttl = ttl;## 37 ##src/traceroute/traceloop.c## Gettimeofday(&rec->rec_tv, NULL);## 38 ##src/traceroute/traceloop.c## sock_set_port(pr->sasend, pr->salen, htons(dport + seq));## 39 ##src/traceroute/traceloop.c## Sendto(sendfd, sendbuf, datalen, 0, pr->sasend, pr->salen);## 40 ##src/traceroute/traceloop.c## if ((code = (*pr->recv) (seq, &tvrecv)) == -3)## 41 ##src/traceroute/traceloop.c## printf(" *"); /* timeout, no reply */## 42 ##src/traceroute/traceloop.c## else {## 43 ##src/traceroute/traceloop.c## char str[NI_MAXHOST];## 44 ##src/traceroute/traceloop.c## if (sock_cmp_addr(pr->sarecv, pr->salast, pr->salen) != 0) {## 45 ##src/traceroute/traceloop.c## if (getnameinfo(pr->sarecv, pr->salen, str, sizeof(str),## 46 ##src/traceroute/traceloop.c## NULL, 0, 0) == 0)## 47 ##src/traceroute/traceloop.c## printf(" %s (%s)", str,## 48 ##src/traceroute/traceloop.c## Sock_ntop_host(pr->sarecv, pr->salen));## 49 ##src/traceroute/traceloop.c## else## 50 ##src/traceroute/traceloop.c## printf(" %s", Sock_ntop_host(pr->sarecv, pr->salen));## 51 ##src/traceroute/traceloop.c## memcpy(pr->salast, pr->sarecv, pr->salen);## 52 ##src/traceroute/traceloop.c## }## 53 ##src/traceroute/traceloop.c## tv_sub(&tvrecv, &rec->rec_tv);## 54 ##src/traceroute/traceloop.c## rtt = tvrecv.tv_sec * 1000.0 + tvrecv.tv_usec / 1000.0;## 55 ##src/traceroute/traceloop.c## printf(" %.3f ms", rtt);## 56 ##src/traceroute/traceloop.c## if (code == -1) /* port unreachable; at destination */## 57 ##src/traceroute/traceloop.c## done++;## 58 ##src/traceroute/traceloop.c## else if (code >= 0)## 59 ##src/traceroute/traceloop.c## printf(" (ICMP %s)", (*pr->icmpcode) (code));## 60 ##src/traceroute/traceloop.c## }## 61 ##src/traceroute/traceloop.c## fflush(stdout);## 62 ##src/traceroute/traceloop.c## }## 63 ##src/traceroute/traceloop.c## printf("\n");## 64 ##src/traceroute/traceloop.c## }## 65 ##src/traceroute/traceloop.c## }## 66 ##src/traceroute/traceloop.c##