X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ce52ac88bc9e689db478bbe86c3559ad1edc5959..0b7e6e7da208b6a95fb23cb50286a09dc90d96d2:/src/unix/dialup.cpp?ds=sidebyside diff --git a/src/unix/dialup.cpp b/src/unix/dialup.cpp index 7b4387defb..6641d377b4 100644 --- a/src/unix/dialup.cpp +++ b/src/unix/dialup.cpp @@ -104,11 +104,8 @@ public: // the "well-known host" (as specified by SetWellKnownHost) is reachable virtual bool IsOnline() const { - if( (! m_timer) // we are not polling, so test now: - || m_IsOnline < 0 - ) - CheckStatus(); - return m_IsOnline != 0; + CheckStatus(); + return m_IsOnline > 0; } /// do we have a constant net connection? -- GUESS! @@ -203,6 +200,8 @@ private: /// real status check void CheckStatusInternal(void); + /// Check /proc/net (Linux only) + int CheckProcNet(void); /// Check output of ifconfig command for PPP/SLIP/PLIP devices int CheckIfconfig(void); /// Ping a host: 1 on success, -1 if it cannot be used, 0 if unreachable @@ -258,7 +257,12 @@ private: wxDialUpManagerImpl::wxDialUpManagerImpl() { - m_IsOnline = -2; // -1 or -2, unknown + /* The isOnline flag can have the following values internally: + 0 : not connected + 1 : connected + -1 : unknown/undefined status + */ + m_IsOnline = -1; m_DialProcess = NULL; m_timer = NULL; m_CanUseIfconfig = -1; // unknown @@ -298,7 +302,6 @@ wxDialUpManagerImpl::Dial(const wxString &isp, { if(m_IsOnline == 1) return FALSE; - m_IsOnline = -1; m_ISPname = isp; wxString cmd; if(m_ConnectCommand.Find(wxT("%s"))) @@ -309,7 +312,7 @@ wxDialUpManagerImpl::Dial(const wxString &isp, if ( async ) { m_DialProcess = new wxDialProcess(this); - m_DialPId = wxExecute(cmd, FALSE, m_DialProcess); + m_DialPId = (int)wxExecute(cmd, FALSE, m_DialProcess); if(m_DialPId == 0) { delete m_DialProcess; @@ -333,7 +336,6 @@ wxDialUpManagerImpl::HangUp(void) wxLogError(_("Already dialling ISP.")); return FALSE; } - m_IsOnline = -1; wxString cmd; if(m_HangUpCommand.Find(wxT("%s"))) cmd.Printf(m_HangUpCommand,m_ISPname.c_str(), m_DialProcess); @@ -380,6 +382,13 @@ wxDialUpManagerImpl::DisableAutoCheckOnlineStatus() void wxDialUpManagerImpl::SetWellKnownHost(const wxString& hostname, int portno) { + if(hostname.Length() == 0) + { + m_BeaconHost = WXDIALUP_MANAGER_DEFAULT_BEACONHOST; + m_BeaconPort = 80; + return; + } + /// does hostname contain a port number? wxString port = hostname.After(wxT(':')); if(port.Length()) @@ -405,7 +414,12 @@ wxDialUpManagerImpl::CheckStatus(bool fromAsync) const ( /* non-const */ (wxDialUpManagerImpl *)this)->CheckStatusInternal(); // now send the events as appropriate: - if(m_IsOnline != oldIsOnline && m_IsOnline != -1 && oldIsOnline != -2) // -2: first time! + if(m_IsOnline != oldIsOnline // it changed + && ( m_IsOnline == 1 // and it is a defined status + || m_IsOnline == 0) + // only send events for well defined transitions + && ( oldIsOnline == 1 || oldIsOnline == 0) + ) { wxDialUpEvent event(m_IsOnline, ! fromAsync); (void)wxTheApp->ProcessEvent(event); @@ -432,12 +446,14 @@ wxDialUpManagerImpl::CheckStatusInternal(void) int testResult; - testResult = CheckConnect(); + testResult = CheckProcNet(); if(testResult == -1) testResult = CheckIfconfig(); + if(testResult == -1) + testResult = CheckConnect(); if(testResult == -1) testResult = CheckPing(); - m_IsOnline = testResult; + m_IsOnline = testResult; } int @@ -475,6 +491,39 @@ wxDialUpManagerImpl::CheckConnect(void) return -1; } + +int +wxDialUpManagerImpl::CheckProcNet(void) +{ + int rc = -1; + +#ifdef __LINUX__ + if (wxFileExists(_T("/proc/net/route"))) + { + // NOTE: cannot use wxFile::Length because file doesn't support + // seeking + FILE *f = fopen("/proc/net/route", "rt"); + if (f != NULL) + { + char output[256]; + + while (fgets(output, 256, f) != NULL) + { + if (strstr(output,"ppp") // ppp + || strstr(output,"sl") // slip + || strstr(output,"pl")) // plip + rc = 1; + } + if (rc == -1) rc = 0; + fclose(f); + } + } +#endif + + return rc; +} + + int wxDialUpManagerImpl::CheckIfconfig(void) { @@ -516,8 +565,14 @@ wxDialUpManagerImpl::CheckIfconfig(void) #if defined(__SOLARIS__) || defined (__SUNOS__) // need to add -a flag cmd << " -a"; -#elif defined(__LINUX__) || defined (__FREEBSD__) || defined(__SGI__) +#elif defined(__LINUX__) || defined(__SGI__) // nothing to be added to ifconfig +#elif defined(__FREEBSD__) + // 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; @@ -548,7 +603,10 @@ wxDialUpManagerImpl::CheckIfconfig(void) || strstr(output,"sl") // slip || strstr(output,"pl"); // plip #elif defined(__SGI__) // IRIX - rc = strstr(output, "ppp"); // PPP + rc = (int) strstr(output, "ppp"); // PPP +#elif defined(__HPUX__) + // if could run ifconfig on interface, then it exists + rc = TRUE; #endif } file.Close(); @@ -560,7 +618,8 @@ wxDialUpManagerImpl::CheckIfconfig(void) m_CanUseIfconfig = 0; // donĀ“t try again (void) wxRemoveFile(tmpfile); } - return rc; + + return rc; } int @@ -590,8 +649,10 @@ wxDialUpManagerImpl::CheckPing(void) cmd << m_PingPath << ' '; #if defined(__SOLARIS__) || defined (__SUNOS__) // nothing to add to ping command -#elif defined(__LINUX__) +#elif defined(__LINUX__) || defined ( __FREEBSD__) 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;