--- /dev/null
+Only in clink.1.0a: .collect.c.swp
+Only in clink.1.0a: clink
+diff -ru clink.1.0/collect.c clink.1.0a/collect.c
+--- clink.1.0/collect.c Sat Aug 14 22:47:04 1999
++++ clink.1.0a/collect.c Sat Jun 24 16:50:19 2000
+@@ -95,13 +95,22 @@
+ the header of the packet that caused the error */
+
+ hip = (struct ip *) (recvbuf + hlen1 + 8);
+- if (hip->ip_p != IPPROTO_UDP) return 0;
++ if (hip->ip_p != IPPROTO_UDP) {
++ if (verbose) printf("Wrong protocol %d != %d\n", hip->ip_p, IPPROTO_UDP);
++ return 0;
++ }
+
+ hlen2 = hip->ip_hl << 2;
+ udp = (struct udphdr *) (recvbuf + hlen1 + 8 + hlen2);
+
+- if (udp->source != htons (sport)) return 0;
+- if (udp->dest != htons (dport)) return 0;
++ if (udp->source != htons (sport)) {
++ if (verbose) printf("Wrong source port %d != %d\n", ntohs(udp->source), (sport));
++ return 0;
++ }
++ if (udp->dest != htons (dport)) {
++ if (verbose) printf("Wrong destination port %d != %d\n", ntohs(udp->dest), (dport));
++ return 0;
++ }
+
+ /* now we know it's an ICMP packet caused by a UDP
+ datagram sent by us and sent to the port we happen to
+@@ -118,7 +127,7 @@
+ }
+
+ if (icmp->icmp_type == ICMP_DEST_UNREACH) {
+- if (icmp->icmp_code == ICMP_PORT_UNREACH) {
++ if ( (icmp->icmp_code == ICMP_PORT_UNREACH) || (icmp->icmp_code == ICMP_PKT_FILTERED) ) {
+ return -1;
+ } else {
+ return 0;
+@@ -344,7 +353,7 @@
+ fill in the timestamps. I am assuming that they don't have
+ any actual effect. */
+
+-void clink_init (char *host, int tos)
++void clink_init (char *host, int sport0, int tos)
+ {
+ int n;
+ struct addrinfo *ai = NULL;
+@@ -403,6 +412,8 @@
+
+ sabind->sa_family = sasend->sa_family;
+ sport = (getpid() & 0xffff) | 0x8000; /* source UDP port # */
++if (sport>=61000) sport -= 10000;
++ if (sport0>0) sport = sport0;
+ sock_set_port (sabind, salen, htons(sport));
+ Bind (sendfd, sabind, salen);
+
+Only in clink.1.0a: collect.o
+diff -ru clink.1.0/process.c clink.1.0a/process.c
+--- clink.1.0/process.c Sat Aug 14 22:47:04 1999
++++ clink.1.0a/process.c Thu Jun 22 19:21:52 2000
+@@ -21,6 +21,8 @@
+ int wait_time = 2; /* how many seconds to wait before timeout */
+ int dns_resolve = 1; /* flag: should we use DNS to resolve addrs? */
+ int verbose = 0; /* flag: should we print verbose output */
++int quiet = 0; /* flag: no messages for each packet */
++int sport0 = 0; /* source port */
+ /* how long should we wait between probes */
+ double inter_sample_ratio = 10.0; /* a multiple of the previous rtt? */
+ double inter_sample_time = 0.0; /* or a fixed interval in microsecs */
+@@ -1073,11 +1075,15 @@
+ printf ("ttl=%d\t%s\tsize= %4d B\trtt= %.3lf ms\n",
+ ttl, Sock_ntop_host (datum->addr, salen), size, datum->rtt);
+ } else {
+- printf (" \r");
+- printf ("n=%5d\t%s\tsize= %4d B\trtt= %.3lf ms\r",
+- probe_count, Sock_ntop_host (datum->addr, salen), size, datum->rtt);
++ if (!quiet) {
++ printf (" \r");
++ printf ("n=%5d\t%s\tsize= %4d B\trtt= %.3lf ms\r",
++ probe_count, Sock_ntop_host (datum->addr, salen), size, datum->rtt);
++ }
++ }
++ if (!quiet) {
++ fflush(stdout);
+ }
+- fflush(stdout);
+
+ add_datum (ttl, size, datum);
+
+@@ -1282,7 +1288,7 @@
+ tos = IPTOS_LOWDELAY | IPTOS_THROUGHPUT | IPTOS_MINCOST;
+ }
+
+- clink_init (host, tos);
++ clink_init (host, sport0, tos);
+
+ sizes = make_sizes (low, high, step);
+
+@@ -1325,7 +1331,7 @@
+ int i, c;
+
+ opterr = 0;
+- while ( (c = getopt (argc, argv, "knvMD:I:f:h:i:l:m:q:r:s:t:w:")) != -1) {
++ while ( (c = getopt (argc, argv, "knvMD:I:f:h:i:l:m:p:q:Qr:s:t:w:")) != -1) {
+ switch (c) {
+ case 'k':
+ kernel_timestamps = 1;
+@@ -1396,6 +1402,15 @@
+ case 'q':
+ if ( (num_probes = atoi(optarg)) < 2) {
+ err_quit ("invalid -q value (num_probes); must be at least 2");
++ }
++ break;
++ case 'Q':
++ quiet = 1;
++ break;
++ case 'p':
++ sport0 = atoi(optarg);
++ if ( (sport0<= 0) || (sport0>=65536) ) {
++ err_quit ("invalid -p (source port); must be in 1..65535 range");
+ }
+ break;
+ case 'w':
+Only in clink.1.0a: process.o
+Only in clink.1.0a: util.o