// 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!
size_t GetISPNames(class wxArrayString &) const
{ return 0; }
-
+
// sometimes the built-in logic for determining the online status may fail,
// so, in general, the user should be allowed to override it. This function
// allows to forcefully set the online status - whatever our internal
int m_CanUsePing;
/// The path to ping program
wxString m_PingPath;
-
+
/// beacon host:
wxString m_BeaconHost;
/// beacon host portnumber for connect:
/// 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
int CheckPing(void);
/// Check by connecting to host on given port.
int CheckConnect(void);
-
+
};
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
m_CanUsePing = -1; // unknown
m_BeaconHost = WXDIALUP_MANAGER_DEFAULT_BEACONHOST;
m_BeaconPort = 80;
- SetConnectCommand("pon", "poff"); // default values for Debian/GNU linux
+
+#ifdef __SGI__
+ m_ConnectCommand = _T("/usr/etc/ppp");
+#elif defined(__LINUX__)
+ // default values for Debian/GNU linux
+ m_ConnectCommand = _T("pon");
+ m_HangUpCommand = _T("poff");
+#endif
+
wxChar * dial = wxGetenv(_T("WXDIALUP_DIALCMD"));
wxChar * hup = wxGetenv(_T("WXDIALUP_HUPCMD"));
- if(dial || hup)
- SetConnectCommand(dial ? wxString(dial) : m_ConnectCommand,
- hup ? wxString(hup) : m_HangUpCommand);
+ SetConnectCommand(dial ? wxString(dial) : m_ConnectCommand,
+ hup ? wxString(hup) : m_HangUpCommand);
}
wxDialUpManagerImpl::~wxDialUpManagerImpl()
{
if(m_IsOnline == 1)
return FALSE;
- m_IsOnline = -1;
m_ISPname = isp;
wxString cmd;
if(m_ConnectCommand.Find(wxT("%s")))
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;
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);
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())
( /* 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);
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
if((hp = gethostbyname(m_BeaconHost.mb_str())) == NULL)
return 0; // no DNS no net
-
- serv_addr.sin_family = hp->h_addrtype;
+
+ serv_addr.sin_family = hp->h_addrtype;
memcpy(&serv_addr.sin_addr,hp->h_addr, hp->h_length);
- serv_addr.sin_port = htons(m_BeaconPort);
+ serv_addr.sin_port = htons(m_BeaconPort);
- int sockfd;
- if( ( sockfd = socket(hp->h_addrtype, SOCK_STREAM, 0)) < 0)
- {
+ int sockfd;
+ if( ( sockfd = socket(hp->h_addrtype, SOCK_STREAM, 0)) < 0)
+ {
return -1; // no info
}
-
+
if( connect(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr)) >= 0)
{
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)
{
int rc = -1;
- // First time check for ifconfig location. We only use the variant
- // which does not take arguments, a la GNU.
- if(m_CanUseIfconfig == -1) // unknown
+
+ // First time check for ifconfig location. We only use the variant which
+ // does not take arguments, a la GNU.
+ if ( m_CanUseIfconfig == -1 ) // unknown
{
- if(wxFileExists("/sbin/ifconfig"))
- m_IfconfigPath = "/sbin/ifconfig";
- else if(wxFileExists("/usr/sbin/ifconfig"))
- m_IfconfigPath = "/usr/sbin/ifconfig";
+ 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;
+ }
+ }
}
wxLogNull ln; // suppress all error messages
#if defined(__SOLARIS__) || defined (__SUNOS__)
// need to add -a flag
cmd << " -a";
-#elif defined(__LINUX__) || defined (__FREEBSD__)
+#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."
+# pragma warning "No ifconfig information for this OS."
m_CanUseIfconfig = 0;
return -1;
#endif
output[file.Length()] = '\0';
if(file.Read(output,file.Length()) == file.Length())
{
- if(
+ // FIXME shouldn't we grep for "^ppp"? (VZ)
+
#if defined(__SOLARIS__) || defined (__SUNOS__)
- strstr(output,"ipdptp") // dialup device
+ // dialup device under SunOS/Solaris
+ rc = strstr(output,"ipdptp") != (char *)NULL;
#elif defined(__LINUX__) || defined (__FREEBSD__)
- strstr(output,"ppp") // ppp
- || strstr(output,"sl") // slip
- || strstr(output,"pl") // plip
-#else
- wxASSERT(0); // unreachable code
+ rc = strstr(output,"ppp") // ppp
+ || strstr(output,"sl") // slip
+ || strstr(output,"pl"); // plip
+#elif defined(__SGI__) // IRIX
+ rc = (int) strstr(output, "ppp"); // PPP
+#elif defined(__HPUX__)
+ // if could run ifconfig on interface, then it exists
+ rc = TRUE;
#endif
- )
- rc = 1;
- else
- rc = 0;
}
file.Close();
delete [] output;
m_CanUseIfconfig = 0; // donĀ“t try again
(void) wxRemoveFile(tmpfile);
}
- return rc;
+
+ return rc;
}
int
{
if(! m_CanUsePing)
return -1;
-
+
// First time check for ping location. We only use the variant
// which does not take arguments, a la GNU.
if(m_CanUsePing == -1) // unknown
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;