+int
+wxDialUpManagerImpl::CheckProcNet()
+{
+ // assume that the test doesn't work
+ int netDevice = NetDevice_Unknown;
+
+#ifdef __LINUX__
+ if (wxFileExists(_T("/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)
+ {
+ if ( strstr(output, "eth") ) // network card
+ {
+ 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()
+{
+ // 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 *ifconfigLocations[] =
+ {
+ _T("/sbin"), // Linux, FreeBSD
+ _T("/usr/sbin"), // SunOS, Solaris, AIX, HP-UX
+ _T("/usr/etc"), // IRIX
+ };
+
+ for ( size_t n = 0; n < WXSIZEOF(ifconfigLocations); n++ )
+ {
+ wxString path(ifconfigLocations[n]);
+ path << _T("/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.length(),
+ _T("can't use ifconfig if it wasn't found") );
+
+ wxString tmpfile = wxGetTempFileName("_wxdialuptest");
+ wxString cmd = "/bin/sh -c \'";
+ cmd << m_IfconfigPath;
+#if defined(__SOLARIS__) || defined (__SUNOS__)
+ // need to add -a flag
+ cmd << " -a";
+#elif defined(__LINUX__) || defined(__SGI__)
+ // nothing to be added to ifconfig
+#elif defined(__FREEBSD__) || defined(__WXMAC__)
+ // add -l flag
+ cmd << " -l";
+#elif defined(__HPUX__)
+ // VZ: a wild guess (but without it, ifconfig fails completely)
+ cmd << _T(" ppp0");
+#else
+# pragma warning "No ifconfig information for this OS."
+ m_CanUseIfconfig = 0;
+ return -1;
+#endif
+ cmd << " >" << tmpfile << '\'';
+ /* 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,"ipdptp") != (char *)NULL;
+ hasLAN = strstr(output, "hme") != (char *)NULL;
+#elif defined(__LINUX__) || defined (__FREEBSD__)
+ hasModem = strstr(output,"ppp") // ppp
+ || strstr(output,"sl") // slip
+ || strstr(output,"pl"); // plip
+ hasLAN = strstr(output, "eth") != NULL;
+#elif defined(__SGI__) // IRIX
+ hasModem = strstr(output, "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;
+}
+
+wxDialUpManagerImpl::NetConnection wxDialUpManagerImpl::CheckPing()
+{
+ // First time check for ping location. We only use the variant
+ // which does not take arguments, a la GNU.
+ if(m_CanUsePing == -1) // unknown
+ {
+ if(wxFileExists("/bin/ping"))
+ m_PingPath = "/bin/ping";
+ else if(wxFileExists("/usr/sbin/ping"))
+ m_PingPath = "/usr/sbin/ping";
+ if(! m_PingPath)
+ {
+ m_CanUsePing = 0;
+ }
+ }
+
+ if(! m_CanUsePing)
+ {
+ // we didn't find ping
+ return Net_Unknown;
+ }
+
+ wxLogNull ln; // suppress all error messages
+ wxASSERT(m_PingPath.length());
+ wxString cmd;
+ cmd << m_PingPath << ' ';
+#if defined(__SOLARIS__) || defined (__SUNOS__)
+ // nothing to add to ping command
+#elif defined(__LINUX__) || defined ( __FREEBSD__) || defined(__WXMAC__)
+ cmd << "-c 1 "; // only ping once
+#elif defined(__HPUX__)
+ cmd << "64 1 "; // only ping once (need also specify the packet size)
+#else
+# pragma warning "No Ping information for this OS."
+ m_CanUsePing = 0;
+ return Net_Unknown;
+#endif
+ cmd << m_BeaconHost;
+ if(wxExecute(cmd, TRUE /* sync */) == 0)
+ return Net_Connected;
+ else
+ return Net_No;
+}
+