-/* sonar, Copyright (c) 1998-2008 Jamie Zawinski and Stephen Martin
+/* sonar, Copyright (c) 1998-2012 Jamie Zawinski and Stephen Martin
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
#undef usleep /* conflicts with unistd.h on OSX */
+#ifdef USE_IPHONE
+ /* Note: to get this to compile for iPhone, you need to fix Xcode!
+ The icmp headers exist for the simulator build environment, but
+ not for the real-device build environment. This appears to
+ just be an Apple bug, not intentional.
+
+ xc=/Applications/Xcode.app/Contents
+ for path in /Developer/Platforms/iPhone*?/Developer/SDKs/?* \
+ $xc/Developer/Platforms/iPhone*?/Developer/SDKs/?* ; do
+ for file in \
+ /usr/include/netinet/ip.h \
+ /usr/include/netinet/in_systm.h \
+ /usr/include/netinet/ip_icmp.h \
+ /usr/include/netinet/ip_var.h \
+ /usr/include/netinet/udp.h
+ do
+ ln -s "$file" "$path$file"
+ done
+ done
+ */
+#endif
+
#if defined(HAVE_ICMP) || defined(HAVE_ICMPHDR)
# include <unistd.h>
# include <sys/stat.h>
#ifndef HAVE_PING
sonar_sensor_data *
-init_ping (Display *dpy, const char *subnet, int timeout,
+init_ping (Display *dpy, char **error_ret, const char *subnet, int timeout,
Bool resolve_p, Bool times_p, Bool debug_p)
{
if (! (!subnet || !*subnet || !strcmp(subnet, "default")))
strlen (sb->name) >= 80)
return 0;
+ /* .ssh/known_hosts sometimes contains weirdness like "[host]:port".
+ Ignore it. */
+ if (strchr (sb->name, '['))
+ {
+ if (pd->debug_p)
+ fprintf (stderr, "%s: ignoring bogus address \"%s\"\n",
+ progname, sb->name);
+ return 0;
+ }
+
+ /* If the name contains a colon, it's probably IPv6. */
+ if (strchr (sb->name, ':'))
+ {
+ if (pd->debug_p)
+ fprintf (stderr, "%s: ignoring ipv6 address \"%s\"\n",
+ progname, sb->name);
+ return 0;
+ }
+
hent = gethostbyname (sb->name);
if (!hent)
{
if (pd->debug_p)
- fprintf (stderr, "%s: could not resolve host: %s\n",
+ fprintf (stderr, "%s: could not resolve host: %s\n",
progname, sb->name);
return 0;
}
if (!fp)
{
char buf[1024];
- sprintf(buf, "%s: %s", progname, filename);
+ sprintf(buf, "%s: %s", progname, filename);
#ifdef HAVE_COCOA
if (pd->debug_p) /* on OSX don't syslog this */
#endif
/* Get the name and address */
- name = addr = 0;
if ((addr = strtok(buf, " ,;\t\n")))
name = strtok(0, " ,;\t\n");
else
/* Get our IP address and convert it to a string */
- if (! (hent = gethostbyname(hostname)))
+ hent = gethostbyname(hostname);
+ if (! hent)
+ {
+ strcat (hostname, ".local"); /* Necessary on iphone */
+ hent = gethostbyname(hostname);
+ }
+
+ if (! hent)
{
+ /* Without being able to resolve localhost to an IP, we don't know
+ what our local subnet is. I don't know another way to find that,
+ short of running "ifconfig" and parsing the output...
+ */
sprintf(buf,
"Unable to resolve\n"
"local host \"%s\"",
*error_ret = strdup(buf);
return 0;
}
+
strcpy (address, inet_ntoa(*((struct in_addr *)hent->h_addr_list[0])));
/* Construct targets for all addresses in this subnet */
ping_bogie *pb = (ping_bogie *) b->closure;
u_char *packet;
struct ICMP *icmph;
- int result;
const char *token = "org.jwz.xscreensaver.sonar";
int pcktsiz = (sizeof(struct ICMP) + sizeof(struct timeval) +
/* Send it */
- if ((result = sendto(pd->icmpsock, packet, pcktsiz, 0,
- &pb->address, sizeof(pb->address)))
+ if (sendto(pd->icmpsock, packet, pcktsiz, 0,
+ &pb->address, sizeof(pb->address))
!= pcktsiz)
{
#if 0
if (new)
{
sonar_bogie *nn = new;
- while (nn && nn->next)
+ while (nn->next)
nn = nn->next;
nn->next = hostlist;
hostlist = new;