http://packetstormsecurity.org/UNIX/admin/xscreensaver-3.29.tar.gz
[xscreensaver] / hacks / sonar.c
index 5ccbc44c079b4219031f66befd7d4c618a9f1208..0fa608aa5b257fcd59edb3ce3dbd676a72061835 100644 (file)
@@ -28,7 +28,8 @@
  *   - plot the process table, by process size, cpu usage, or total time;
  *   - plot the logged on users by idle time or cpu usage.
  *
- * Copyright (C) 1998 by Stephen Martin (smartin@vanderfleet-martin.net).
+ * Copyright (C) 1998, 2001
+ *  by Stephen Martin (smartin@vanderfleet-martin.net).
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
  * the above copyright notice appear in all copies and that both that
@@ -37,7 +38,7 @@
  * software for any purpose.  It is provided "as is" without express or 
  * implied warranty.
  *
- * $Revision: 1.17 $
+ * $Revision: 1.19 $
  *
  * Version 1.0 April 27, 1998.
  * - Initial version
 # undef HAVE_PING
 #endif
 
+
+#ifdef HAVE_PING
+# if defined(__DECC) || defined(_IP_VHL)
+   /* This is how you do it on DEC C, and possibly some BSD systems. */
+#  define IP_HDRLEN(ip)   ((ip)->ip_vhl & 0x0F)
+# else
+   /* This is how you do it on everything else. */
+#  define IP_HDRLEN(ip)   ((ip)->ip_hl)
+# endif
+#endif /* HAVE_PING */
+
+
 /* Forward References */
 
 #ifdef HAVE_PING
@@ -699,7 +712,7 @@ subnetHostsList(int base, int subnet_width)
         fprintf (stderr,
     "%s: pinging %u 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));
+                 progname, (1L << (32 - subnet_width)) - 1);
         exit (1);
       }
     else if (subnet_width > 30)
@@ -1042,13 +1055,7 @@ getping(sonar_info *si, ping_info *pi)
 
        gettimeofday(&now, (struct timezone *) 0);
        ip = (struct ip *) packet;
-
-       iphdrlen = ip->ip_hl << 2;
-        /* On DEC OSF1 4.0, the preceeding line needs to be
-           iphdrlen = (ip->ip_vhl & 0x0F) << 2;
-           but I don't know how to do this portably.  -- jwz.
-         */
-
+        iphdrlen = IP_HDRLEN(ip) << 2;
        icmph = (struct ICMP *) &packet[iphdrlen];
 
        /* Was the packet a reply?? */
@@ -1644,7 +1651,7 @@ Sonar(sonar_info *si, Bogie *bl)
     /* Check for expired tagets and remove them from the visable list */
 
     prev = NULL;
-    for (bp = si->visable; bp != NULL; bp = bp->next) {
+    for (bp = si->visable; bp != NULL; bp = (bp ? bp->next : 0)) {
 
        /*
         * Remove it from the visable list if it's expired or we have
@@ -1662,6 +1669,7 @@ Sonar(sonar_info *si, Bogie *bl)
            else
                prev->next = bp->next;
            freeBogie(bp);
+            bp = prev;
        } else
            prev = bp;
     }