forked from unpbook/unpv13e
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtraceloop.lc
79 lines (66 loc) · 4.97 KB
/
traceloop.lc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#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##