* software for any purpose. It is provided "as is" without express or
* implied warranty.
*
- * $Revision: 1.21 $
+ * $Revision: 1.33 $
*
* Version 1.0 April 27, 1998.
* - Initial version
/*
* The Bogie.
*
- * This represents an object that is visable on the scope.
+ * This represents an object that is visible on the scope.
*/
typedef struct Bogie {
int width, height; /* Window dimensions */
int minx, miny, maxx, maxy, /* Bounds of the scope */
centrex, centrey, radius; /* Parts of the scope circle */
- Bogie *visable; /* List of visable objects */
+ Bogie *visible; /* List of visible objects */
int current; /* Current position of sweep */
int sweepnum; /* The current id of the sweep */
int delay; /* how long between each frame of the anim */
} sonar_info;
static Bool debug_p = False;
+static Bool resolve_p = True;
/*
"*teamBCount: 4",
"*ping: default",
+ "*resolve: true",
".debug: false",
0
};
{"-team-b-count", ".teamBCount", XrmoptionSepArg, 0 },
{"-ping", ".ping", XrmoptionSepArg, 0 },
+ {"-no-dns", ".resolve", XrmoptionNoArg, "False" },
{"-debug", ".debug", XrmoptionNoArg, "True" },
{ 0, 0, 0, 0 }
};
Bogie *new;
+ distance *= 1000;
/* Allocate a bogie and initialize it */
if ((new = (Bogie *) calloc(1, sizeof(Bogie))) == NULL) {
#ifdef HAVE_PING
+/* Packs an IP address quad into bigendian network order. */
+static unsigned long
+pack_addr (unsigned int a, unsigned int b, unsigned int c, unsigned int d)
+{
+ unsigned long i = (((a & 255) << 24) |
+ ((b & 255) << 16) |
+ ((c & 255) << 8) |
+ ((d & 255) ));
+ return htonl (i);
+}
+
+/* Unpacks an IP address quad from bigendian network order. */
+static void
+unpack_addr (unsigned long addr,
+ unsigned int *a, unsigned int *b,
+ unsigned int *c, unsigned int *d)
+{
+ addr = ntohl (addr);
+ *a = (addr >> 24) & 255;
+ *b = (addr >> 16) & 255;
+ *c = (addr >> 8) & 255;
+ *d = (addr ) & 255;
+}
+
+
/*
* Lookup the address for a ping target;
*
struct hostent *hent;
struct sockaddr_in *iaddr;
- int iip[4];
+ unsigned int ip[4];
char c;
iaddr = (struct sockaddr_in *) &(target->address);
iaddr->sin_family = AF_INET;
- if (4 == sscanf(target->name, "%d.%d.%d.%d%c",
- &iip[0], &iip[1], &iip[2], &iip[3], &c))
+ if (4 == sscanf (target->name, " %u.%u.%u.%u %c",
+ &ip[0], &ip[1], &ip[2], &ip[3], &c))
{
/* It's an IP address.
*/
- unsigned char ip[4];
-
- ip[0] = iip[0];
- ip[1] = iip[1];
- ip[2] = iip[2];
- ip[3] = iip[3];
-
if (ip[3] == 0)
{
if (debug_p > 1)
return 0;
}
- iaddr->sin_addr.s_addr = ((ip[3] << 24) |
- (ip[2] << 16) |
- (ip[1] << 8) |
- (ip[0]));
- hent = gethostbyaddr (ip, 4, AF_INET);
+ iaddr->sin_addr.s_addr = pack_addr (ip[0], ip[1], ip[2], ip[3]);
+ if (resolve_p)
+ hent = gethostbyaddr ((const char *) &iaddr->sin_addr.s_addr,
+ sizeof(iaddr->sin_addr.s_addr),
+ AF_INET);
+ else
+ hent = 0;
if (debug_p > 1)
fprintf (stderr, "%s: %s => %s\n",
{
/* It's a host name.
*/
+
+
+ /* don't waste time being confused by non-hostname tokens
+ in .ssh/known_hosts */
+ if (!strcmp (target->name, "ssh-rsa") ||
+ !strcmp (target->name, "ssh-dsa") ||
+ !strcmp (target->name, "ssh-dss") ||
+ strlen (target->name) >= 80)
+ return 0;
+
hent = gethostbyname (target->name);
if (!hent)
{
sizeof(iaddr->sin_addr));
if (debug_p > 1)
- fprintf (stderr, "%s: %s => %d.%d.%d.%d\n",
- progname, target->name,
- iaddr->sin_addr.s_addr & 255,
- iaddr->sin_addr.s_addr >> 8 & 255,
- iaddr->sin_addr.s_addr >> 16 & 255,
- iaddr->sin_addr.s_addr >> 24 & 255);
+ {
+ unsigned int a, b, c, d;
+ unpack_addr (iaddr->sin_addr.s_addr, &a, &b, &c, &d);
+ fprintf (stderr, "%s: %s => %d.%d.%d.%d\n",
+ progname, target->name, a, b, c, d);
+ }
}
return 1;
}
print_host (FILE *out, unsigned long ip, const char *name)
{
char ips[50];
- sprintf (ips, "%d.%d.%d.%d",
- (ip) & 255,
- (ip >> 8) & 255,
- (ip >> 16) & 255,
- (ip >> 24) & 255);
+ unsigned int a, b, c, d;
+ unpack_addr (ip, &a, &b, &c, &d); /* ip is in network order */
+ sprintf (ips, "%u.%u.%u.%u", a, b, c, d);
if (!name || !*name) name = "<unknown>";
fprintf (out, "%-16s %s\n", ips, name);
}
if (! lookupHost(target))
goto target_init_error;
- /* Don't ever use loopback (127.0.0) hosts */
+ /* Don't ever use loopback (127.0.0.x) hosts */
{
struct sockaddr_in *iaddr = (struct sockaddr_in *) &(target->address);
unsigned long ip = iaddr->sin_addr.s_addr;
- if ((ip & 255) == 127 &&
- ((ip >> 8) & 255) == 0 &&
- ((ip >> 16) & 255) == 0)
+
+ if ((ntohl (ip) & 0xFFFFFF00L) == 0x7f000000L) /* 127.0.0 */
{
if (debug_p)
fprintf (stderr, "%s: ignoring loopback host %s\n",
/*
* Generate a list ping targets consisting of all of the entries on
- * the same subnet.
+ * the same subnet. 'base' ip is in network order; 0 means localhost.
*
* Returns:
* A list of all of the hosts on this net.
*/
static ping_target *
-subnetHostsList(int base, int subnet_width)
+subnetHostsList(unsigned long n_base, int subnet_width)
{
- unsigned long mask;
+ unsigned long h_mask; /* host order */
+ unsigned long h_base; /* host order */
/* Local Variables */
if (subnet_width < 24)
{
fprintf (stderr,
- "%s: pinging %u hosts is a bad idea; please use a subnet mask of 24 bits\n"
+ "%s: pinging %lu hosts is a bad idea; please use a subnet mask of 24 bits\n"
" or more (255 hosts max.)\n",
- progname, (1L << (32 - subnet_width)) - 1);
+ progname, (unsigned long) (1L << (32 - subnet_width)) - 1);
exit (1);
}
else if (subnet_width > 30)
/* Construct targets for all addresses in this subnet */
- mask = 0;
+ h_mask = 0;
for (i = 0; i < subnet_width; i++)
- mask |= (1L << (31-i));
+ h_mask |= (1L << (31-i));
/* If no base IP specified, assume localhost. */
- if (base == 0)
- base = ((((unsigned char) hent->h_addr_list[0][0]) << 24) |
- (((unsigned char) hent->h_addr_list[0][1]) << 16) |
- (((unsigned char) hent->h_addr_list[0][2]) << 8) |
- (((unsigned char) hent->h_addr_list[0][3])));
-
- if (base == ((127 << 24) | 1))
+ if (n_base == 0)
+ n_base = pack_addr (hent->h_addr_list[0][0],
+ hent->h_addr_list[0][1],
+ hent->h_addr_list[0][2],
+ hent->h_addr_list[0][3]);
+ h_base = ntohl (n_base);
+
+ if (h_base == 0x7F000001L) /* 127.0.0.1 in host order */
{
+ unsigned int a, b, c, d;
+ unpack_addr (n_base, &a, &b, &c, &d);
fprintf (stderr,
"%s: unable to determine local subnet address: \"%s\"\n"
- " resolves to loopback address %d.%d.%d.%d.\n",
- progname, hostname,
- (base >> 24) & 255, (base >> 16) & 255,
- (base >> 8) & 255, (base ) & 255);
+ " resolves to loopback address %u.%u.%u.%u.\n",
+ progname, hostname, a, b, c, d);
return NULL;
}
for (i = 255; i >= 0; i--) {
- int ip = (base & 0xFFFFFF00) | i;
+ unsigned int a, b, c, d;
+ int ip = (h_base & 0xFFFFFF00L) | i; /* host order */
- if ((ip & mask) != (base & mask)) /* not in the mask range at all */
+ if ((ip & h_mask) != (h_base & h_mask)) /* not in mask range at all */
continue;
- if ((ip & ~mask) == 0) /* broadcast address */
+ if ((ip & ~h_mask) == 0) /* broadcast address */
continue;
- if ((ip & ~mask) == ~mask) /* broadcast address */
+ if ((ip & ~h_mask) == ~h_mask) /* broadcast address */
continue;
- sprintf (address, "%d.%d.%d.%d",
- (ip>>24)&255, (ip>>16)&255, (ip>>8)&255, (ip)&255);
+ unpack_addr (htonl (ip), &a, &b, &c, &d);
+ sprintf (address, "%u.%u.%u.%u", a, b, c, d);
if (debug_p > 1)
- fprintf(stderr, "%s: subnet: %s (%d.%d.%d.%d & %d.%d.%d.%d / %d)\n",
- progname,
- address,
- (base>>24)&255, (base>>16)&255, (base>>8)&255, base&mask&255,
- (mask>>24)&255, (mask>>16)&255, (mask>>8)&255, mask&255,
- subnet_width);
+ {
+ unsigned int aa, ab, ac, ad;
+ unsigned int ma, mb, mc, md;
+ unpack_addr (htonl (h_base & h_mask), &aa, &ab, &ac, &ad);
+ unpack_addr (htonl (h_mask), &ma, &mb, &mc, &md);
+ fprintf (stderr,
+ "%s: subnet: %s (%u.%u.%u.%u & %u.%u.%u.%u / %d)\n",
+ progname, address,
+ aa, ab, ac, ad,
+ ma, mb, mc, md,
+ subnet_width);
+ }
p = address + strlen(address) + 1;
sprintf(p, "%d", i);
ICMP_CHECKSUM(icmph) = 0;
ICMP_ID(icmph) = pi->pid;
ICMP_SEQ(icmph) = pi->seq++;
+# ifdef GETTIMEOFDAY_TWO_ARGS
gettimeofday((struct timeval *) &packet[sizeof(struct ICMP)],
(struct timezone *) 0);
+# else
+ gettimeofday((struct timeval *) &packet[sizeof(struct ICMP)]);
+# endif
+
strcpy((char *) &packet[sizeof(struct ICMP) + sizeof(struct timeval)],
pt->name);
ICMP_CHECKSUM(icmph) = checksum((u_short *)packet, pcktsiz);
/* Local Variables */
struct sockaddr from;
- int fromlen;
+ unsigned int fromlen; /* Posix says socklen_t, but that's not portable */
int result;
u_char packet[1024];
struct timeval now;
/* Check the packet */
+# ifdef GETTIMEOFDAY_TWO_ARGS
gettimeofday(&now, (struct timezone *) 0);
+# else
+ gettimeofday(&now);
+# endif
ip = (struct ip *) packet;
iphdrlen = IP_HDRLEN(ip) << 2;
icmph = (struct ICMP *) &packet[iphdrlen];
if (4 == sscanf(name, " %d.%d.%d.%d %c",
&iip[0], &iip[1], &iip[2], &iip[3], &c))
{
- unsigned char ip[4];
+ struct sockaddr_in iaddr;
struct hostent *h;
- ip[0] = iip[0]; ip[1] = iip[1]; ip[2] = iip[2]; ip[3] = iip[3];
- h = gethostbyaddr ((char *) ip, 4, AF_INET);
+ iaddr.sin_addr.s_addr = pack_addr (iip[0],iip[1],iip[2],iip[3]);
+ if (resolve_p)
+ h = gethostbyaddr ((const char *) &iaddr.sin_addr.s_addr,
+ sizeof(iaddr.sin_addr.s_addr),
+ AF_INET);
+ else
+ h = 0;
+
if (h && h->h_name && *h->h_name)
{
free (name);
return NULL;
}
sprintf(si->teamA[i].name, "%s%03d", si->teamAID, i+1);
- si->teamA[i].nexttick = (int) (90.0 * random() / RAND_MAX);
- si->teamA[i].nextdist = (int) (100.0 * random() / RAND_MAX);
+ si->teamA[i].nexttick = random() % 90;
+ si->teamA[i].nextdist = random() % 100;
si->teamA[i].movedonsweep = -1;
}
return NULL;
}
sprintf(si->teamB[i].name, "%s%03d", si->teamBID, i+1);
- si->teamB[i].nexttick = (int) (90.0 * random() / RAND_MAX);
- si->teamB[i].nextdist = (int) (100.0 * random() / RAND_MAX);
+ si->teamB[i].nexttick = random() % 90;
+ si->teamB[i].nextdist = random() % 100;
si->teamB[i].movedonsweep = -1;
}
return si;
}
+/*
+ * Creates and returns a drawing mask for the scope:
+ * mask out anything outside of the disc.
+ */
+static Pixmap
+scope_mask (Display *dpy, Window win, sonar_info *si)
+{
+ XGCValues gcv;
+ Pixmap mask = XCreatePixmap(dpy, win, si->width, si->height, 1);
+ GC gc = XCreateGC (dpy, mask, 0, &gcv);
+ XSetFunction (dpy, gc, GXclear);
+ XFillRectangle (dpy, mask, gc, 0, 0, si->width, si->height);
+ XSetFunction (dpy, gc, GXset);
+ XFillArc(dpy, mask, gc, si->minx, si->miny,
+ si->maxx - si->minx, si->maxy - si->miny,
+ 0, 360 * 64);
+ return mask;
+}
+
+
/*
* Initialize the Sonar.
*
si->dpy = dpy;
si->win = win;
- si->visable = NULL;
+ si->visible = NULL;
XGetWindowAttributes(dpy, win, &xwa);
si->cmap = xwa.colormap;
si->width = xwa.width;
dpy, si->cmap);
si->grid = XCreateGC (dpy, win, GCForeground, &gcv);
+ /* Install the clip mask... */
+ {
+ Pixmap mask = scope_mask (dpy, win, si);
+ XSetClipMask(dpy, si->text, mask);
+ XSetClipMask(dpy, si->erase, mask);
+ XFreePixmap (dpy, mask); /* it's been copied into the GCs */
+ }
+
/* Compute pixel values for fading text on the display */
XParseColor(dpy, si->cmap,
int xdist, xtick;
- xtick = (int) (3.0 * random() / RAND_MAX) - 1;
- xdist = (int) (11.0 * random() / RAND_MAX) - 5;
+ xtick = (int) (random() % 3) - 1;
+ xdist = (int) (random() % 11) - 5;
if (((t->nexttick + xtick) < 90) && ((t->nexttick + xtick) >= 0))
t->nexttick += xtick;
else
Bogie *bp, *prev;
int i;
- /* Check for expired tagets and remove them from the visable list */
+ /* Check for expired tagets and remove them from the visible list */
prev = NULL;
- for (bp = si->visable; bp != NULL; bp = (bp ? bp->next : 0)) {
+ for (bp = si->visible; bp != NULL; bp = (bp ? bp->next : 0)) {
/*
- * Remove it from the visable list if it's expired or we have
+ * Remove it from the visible list if it's expired or we have
* a new target with the same name.
*/
DrawBogie(si, 0, bp->name, bp->tick,
bp->distance, bp->ttl, bp->age);
if (prev == NULL)
- si->visable = bp->next;
+ si->visible = bp->next;
else
prev->next = bp->next;
freeBogie(bp);
(4 * 64));
}
- /* Move the new targets to the visable list */
+ /* Move the new targets to the visible list */
for (bp = bl; bp != (Bogie *) 0; bp = bl) {
bl = bl->next;
- bp->next = si->visable;
- si->visable = bp;
+ bp->next = si->visible;
+ si->visible = bp;
}
- /* Draw the visable targets */
+ /* Draw the visible targets */
- for (bp = si->visable; bp != NULL; bp = bp->next) {
+ for (bp = si->visible; bp != NULL; bp = bp->next) {
if (bp->age < bp->ttl) /* grins */
DrawBogie(si, 1, bp->name, bp->tick, bp->distance, bp->ttl,bp->age);
}
{
char *source = get_string_resource ("ping", "Ping");
char *token, *end;
+ char dummy;
ping_target *hostlist = 0;
# endif /* HAVE_PING */
for (next = token;
+ *next &&
*next != ',' && *next != ' ' && *next != '\t' && *next != '\n';
next++)
;
}
#ifdef HAVE_PING
- if ((4 == sscanf (token, "%d.%d.%d/%d %c", &n0,&n1,&n2, &m,&d)) ||
- (5 == sscanf (token, "%d.%d.%d.%d/%d %c", &n0,&n1,&n2,&n3,&m,&d)))
+ if ((4 == sscanf (token, "%u.%u.%u/%u %c", &n0,&n1,&n2, &m,&d)) ||
+ (5 == sscanf (token, "%u.%u.%u.%u/%u %c", &n0,&n1,&n2,&n3,&m,&d)))
{
/* subnet: A.B.C.D/M
subnet: A.B.C/M
*/
- unsigned long ip = (n0 << 24) | (n1 << 16) | (n2 << 8) | n3;
+ unsigned long ip = pack_addr (n0, n1, n2, n3);
new = subnetHostsList(ip, m);
}
- else if (4 == sscanf (token, "%d.%d.%d.%d %c", &n0, &n1, &n2, &n3, &d))
+ else if (4 == sscanf (token, "%u.%u.%u.%u %c", &n0, &n1, &n2, &n3, &d))
{
/* IP: A.B.C.D
*/
{
new = subnetHostsList(0, 24);
}
- else if (1 == sscanf (token, "subnet/%d %c", &m))
+ else if (1 == sscanf (token, "subnet/%u %c", &m, &dummy))
{
new = subnetHostsList(0, m);
}
long sleeptime;
debug_p = get_boolean_resource ("debug", "Debug");
+ resolve_p = get_boolean_resource ("resolve", "Resolve");
sensor = 0;
# ifdef HAVE_PING
/* Call the sensor and display the results */
+# ifdef GETTIMEOFDAY_TWO_ARGS
gettimeofday(&start, (struct timezone *) 0);
+# else
+ gettimeofday(&start);
+# endif
bl = sensor(si, sensor_info);
Sonar(si, bl);
if (si->current == 0)
si->sweepnum++;
XSync (dpy, False);
+# ifdef GETTIMEOFDAY_TWO_ARGS
gettimeofday(&finish, (struct timezone *) 0);
+# else
+ gettimeofday(&finish);
+# endif
sleeptime = si->delay - delta(&start, &finish);
screenhack_handle_events (dpy);
if (sleeptime > 0L)