+ else // failed to connect
+ {
+#ifdef ENETUNREACH
+ if(errno == ENETUNREACH)
+ return Net_No; // network is unreachable
+ else
+#endif
+ return Net_Unknown; // connect failed, but don't know why
+ }
+}
+
+
+int
+wxDialUpManagerImpl::CheckProcNet()
+{
+ // assume that the test doesn't work
+ int netDevice = NetDevice_Unknown;
+
+#ifdef __LINUX__
+ if (wxFileExists(wxT("/proc/net/route")))
+ {
+ // cannot use wxFile::Length because file doesn't support seeking, so
+ // use stdio directly
+ FILE *f = fopen("/proc/net/route", "rt");
+ if (f != NULL)
+ {
+ // now we know that we will find all devices we may have
+ netDevice = NetDevice_None;
+
+ char output[256];
+
+ while (fgets(output, 256, f) != NULL)
+ {
+ // Test for the known network interface names
+ if ( strstr(output, "eth")
+ || strstr(output, "wlan")
+ || strstr(output, "ath") )
+ {
+ netDevice |= NetDevice_LAN;
+ }
+ else if (strstr(output,"ppp") // ppp
+ || strstr(output,"sl") // slip
+ || strstr(output,"pl")) // plip
+ {
+ netDevice |= NetDevice_Modem;
+ }
+ }
+
+ fclose(f);
+ }
+ }
+#endif // __LINUX__
+
+ return netDevice;
+}
+
+
+int
+wxDialUpManagerImpl::CheckIfconfig()
+{
+#ifdef __VMS
+ m_CanUseIfconfig = 0;
+ return -1;
+#else
+ // assume that the test doesn't work
+ int netDevice = NetDevice_Unknown;
+
+ // first time check for ifconfig location
+ if ( m_CanUseIfconfig == -1 ) // unknown
+ {
+ static const wxChar *const ifconfigLocations[] =
+ {
+ wxT("/sbin"), // Linux, FreeBSD, Darwin
+ wxT("/usr/sbin"), // SunOS, Solaris, AIX, HP-UX
+ wxT("/usr/etc"), // IRIX
+ wxT("/etc"), // AIX 5
+ };
+
+ for ( size_t n = 0; n < WXSIZEOF(ifconfigLocations); n++ )
+ {
+ wxString path(ifconfigLocations[n]);
+ path << wxT("/ifconfig");
+
+ if ( wxFileExists(path) )
+ {
+ m_IfconfigPath = path;
+ break;
+ }
+ }
+ }
+
+ if ( m_CanUseIfconfig != 0 ) // unknown or yes
+ {
+ wxLogNull ln; // suppress all error messages
+
+ wxASSERT_MSG( !m_IfconfigPath.empty(),
+ wxT("can't use ifconfig if it wasn't found") );
+
+ wxString tmpfile = wxFileName::CreateTempFileName( wxT("_wxdialuptest") );
+ wxString cmd = wxT("/bin/sh -c \'");
+ cmd << m_IfconfigPath;
+#if defined(__AIX__) || \
+ defined(__NETBSD__) || \
+ defined(__OSF__) || \
+ defined(__SOLARIS__) || defined (__SUNOS__)
+ // need to add -a flag
+ cmd << wxT(" -a");
+#elif defined(__LINUX__) || defined(__SGI__) || defined(__OPENBSD__)
+ // nothing to be added to ifconfig
+#elif defined(__FREEBSD__) || defined(__DARWIN__) || defined(__QNX__)
+ // add -l flag
+ cmd << wxT(" -l");
+#elif defined(__HPUX__)
+ // VZ: a wild guess (but without it, ifconfig fails completely)
+ cmd << wxT(" ppp0");
+#else
+ #if defined(__GNUG__)
+ #warning "No ifconfig information for this OS."
+ #else
+ #pragma warning "No ifconfig information for this OS."
+ #endif
+
+ m_CanUseIfconfig = 0;
+ return -1;
+#endif
+ cmd << wxT(" >") << tmpfile << wxT('\'');
+ /* I tried to add an option to wxExecute() to not close stdout,
+ so we could let ifconfig write directly to the tmpfile, but
+ this does not work. That should be faster, as it doesn't call
+ the shell first. I have no idea why. :-( (KB) */
+ if ( wxExecute(cmd,true /* sync */) == 0 )
+ {
+ m_CanUseIfconfig = 1;
+ wxFFile file;
+ if( file.Open(tmpfile) )
+ {
+ wxString output;
+ if ( file.ReadAll(&output) )
+ {
+ // FIXME shouldn't we grep for "^ppp"? (VZ)
+
+ bool hasModem = false,
+ hasLAN = false;
+
+#if defined(__SOLARIS__) || defined (__SUNOS__)
+ // dialup device under SunOS/Solaris
+ hasModem = strstr(output.fn_str(),"ipdptp") != NULL;
+ hasLAN = strstr(output.fn_str(), "hme") != NULL;
+#elif defined(__LINUX__) || defined (__FREEBSD__) || defined (__QNX__) || \
+ defined(__OPENBSD__)
+ hasModem = strstr(output.fn_str(),"ppp") // ppp
+ || strstr(output.fn_str(),"sl") // slip
+ || strstr(output.fn_str(),"pl"); // plip
+ hasLAN = strstr(output.fn_str(), "eth") != NULL;
+#elif defined(__SGI__) // IRIX
+ hasModem = strstr(output.fn_str(), "ppp") != NULL; // PPP
+#elif defined(__HPUX__)
+ // if could run ifconfig on interface, then it exists
+ hasModem = true;
+#endif
+
+ netDevice = NetDevice_None;
+ if ( hasModem )
+ netDevice |= NetDevice_Modem;
+ if ( hasLAN )
+ netDevice |= NetDevice_LAN;
+ }
+ //else: error reading the file
+ }
+ //else: error opening the file
+ }
+ else // could not run ifconfig correctly
+ {
+ m_CanUseIfconfig = 0; // don't try again
+ }
+
+ (void) wxRemoveFile(tmpfile);
+ }
+
+ return netDevice;
+#endif