Improved tests for networks. Compiles.

PLEASE TEST ON AS MANY PLATFORMS AS POSSIBLE!
I can only test it on Linux, have no dialup running on Solaris, know nothing
about other Unixes. If there's a problem: mailto:karsten@phy.hw.ac.uk


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4338 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Karsten Ballüder 1999-11-03 12:59:59 +00:00
parent 08a43154b4
commit 1bb6398255

View File

@ -44,6 +44,7 @@
#include <netdb.h> #include <netdb.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <errno.h>
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// A class which groups functions dealing with connecting to the network from a // A class which groups functions dealing with connecting to the network from a
@ -170,6 +171,11 @@ private:
/// The path to ifconfig /// The path to ifconfig
wxString m_IfconfigPath; wxString m_IfconfigPath;
/// Can we use ping to find hosts?
int m_CanUsePing;
/// The path to ping program
wxString m_PingPath;
/// beacon host: /// beacon host:
wxString m_BeaconHost; wxString m_BeaconHost;
/// beacon host portnumber for connect: /// beacon host portnumber for connect:
@ -196,6 +202,14 @@ private:
/// real status check /// real status check
void CheckStatusInternal(void); void CheckStatusInternal(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);
}; };
@ -248,16 +262,15 @@ wxDialUpManagerImpl::wxDialUpManagerImpl()
m_DialProcess = NULL; m_DialProcess = NULL;
m_timer = NULL; m_timer = NULL;
m_CanUseIfconfig = -1; // unknown m_CanUseIfconfig = -1; // unknown
m_CanUsePing = -1; // unknown
m_BeaconHost = WXDIALUP_MANAGER_DEFAULT_BEACONHOST; m_BeaconHost = WXDIALUP_MANAGER_DEFAULT_BEACONHOST;
m_BeaconPort = 80; m_BeaconPort = 80;
SetConnectCommand("pon", "poff"); // default values for Debian/GNU linux SetConnectCommand("pon", "poff"); // default values for Debian/GNU linux
#if 0
wxChar * dial = wxGetenv(_T("WXDIALUP_DIALCMD")); wxChar * dial = wxGetenv(_T("WXDIALUP_DIALCMD"));
wxChar * hup = wxGetenv(_T("WXDIALUP_HUPCMD")); wxChar * hup = wxGetenv(_T("WXDIALUP_HUPCMD"));
if(dial || hup) if(dial || hup)
SetConnectCommand(dial ? wxString(dial) : m_ConnectCommand, SetConnectCommand(dial ? wxString(dial) : m_ConnectCommand,
hup ? wxString(hup) : m_HangUpCommand); hup ? wxString(hup) : m_HangUpCommand);
#endif
} }
wxDialUpManagerImpl::~wxDialUpManagerImpl() wxDialUpManagerImpl::~wxDialUpManagerImpl()
@ -410,6 +423,54 @@ wxDialUpManagerImpl::CheckStatusInternal(void)
{ {
m_IsOnline = -1; m_IsOnline = -1;
int testResult;
testResult = CheckConnect();
if(testResult == -1)
testResult = CheckIfconfig();
if(testResult == -1)
testResult = CheckPing();
m_IsOnline = testResult;
}
int
wxDialUpManagerImpl::CheckConnect(void)
{
// second method: try to connect to a well known host:
// This can be used under Win 9x, too!
struct hostent *hp;
struct sockaddr_in serv_addr;
if((hp = gethostbyname(m_BeaconHost.mb_str())) == NULL)
return 0; // no DNS no net
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);
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)
{
close(sockfd);
return 1; // we can connect, so we have a network!
}
//connected!
close(sockfd);
if(errno == ENETUNREACH)
return 0; // network is unreachable
// connect failed, but don't know why
return -1;
}
int
wxDialUpManagerImpl::CheckIfconfig(void)
{
int rc = -1;
// First time check for ifconfig location. We only use the variant // First time check for ifconfig location. We only use the variant
// which does not take arguments, a la GNU. // which does not take arguments, a la GNU.
if(m_CanUseIfconfig == -1) // unknown if(m_CanUseIfconfig == -1) // unknown
@ -428,7 +489,18 @@ wxDialUpManagerImpl::CheckStatusInternal(void)
wxString tmpfile = wxGetTempFileName("_wxdialuptest"); wxString tmpfile = wxGetTempFileName("_wxdialuptest");
wxString cmd = "/bin/sh -c \'"; wxString cmd = "/bin/sh -c \'";
cmd << m_IfconfigPath << " >" << tmpfile << '\''; cmd << m_IfconfigPath;
#if defined(__SOLARIS__) || defined (__SUNOS__)
// need to add -a flag
cmd << " -a";
#elif defined(__LINUX__) || defined (__FREEBSD__)
// nothing to be added to ifconfig
#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, /* I tried to add an option to wxExecute() to not close stdout,
so we could let ifconfig write directly to the tmpfile, but so we could let ifconfig write directly to the tmpfile, but
this does not work. That should be faster, as it doesn´t call this does not work. That should be faster, as it doesn´t call
@ -443,72 +515,73 @@ wxDialUpManagerImpl::CheckStatusInternal(void)
output[file.Length()] = '\0'; output[file.Length()] = '\0';
if(file.Read(output,file.Length()) == file.Length()) if(file.Read(output,file.Length()) == file.Length())
{ {
if(strstr(output,"ppp") // ppp if(
#if defined(__SOLARIS__) || defined (__SUNOS__)
strstr(output,"ipdptp") // dialup device
#elif defined(__LINUX__) || defined (__FREEBSD__)
strstr(output,"ppp") // ppp
|| strstr(output,"sl") // slip || strstr(output,"sl") // slip
|| strstr(output,"pl") // plip || strstr(output,"pl") // plip
#else
wxASSERT(0); // unreachable code
#endif
) )
m_IsOnline = 1; rc = 1;
else else
m_IsOnline = 0; rc = 0;
} }
file.Close(); file.Close();
delete [] output; delete [] output;
} }
// else m_IsOnline remains -1 as we don't know for sure // else rc remains -1 as we don't know for sure
} }
else // could not run ifconfig correctly else // could not run ifconfig correctly
m_CanUseIfconfig = 0; // don´t try again m_CanUseIfconfig = 0; // don´t try again
(void) wxRemoveFile(tmpfile); (void) wxRemoveFile(tmpfile);
if(m_IsOnline != -1) // we are done
return;
} }
return rc;
// this was supposed to work like ping(8), but doesn´t.
// second method: try to connect to a well known host:
// This can be used under Win 9x, too!
struct hostent *hp;
struct sockaddr_in serv_addr;
m_IsOnline = 0; // assume false
if((hp = gethostbyname(m_BeaconHost.mb_str())) == NULL)
return; // no DNS no net
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);
// PING method:
int sockfd;
if( ( sockfd = socket(hp->h_addrtype, SOCK_STREAM, 0)) < 0)
{
// sys_error("cannot create socket for gw");
return;
}
#if 0
// this "ping" method does not work.
if(sendto(sockfd, "hello",
strlen("hello"), /* flags */ 0,
(struct sockaddr *) &serv_addr,
sizeof(serv_addr)) == -1)
{
close(sockfd);
return;
}
#endif
if( connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
{
//sys_error("cannot connect to server");
close(sockfd);
return;
}
//connected!
close(sockfd);
m_IsOnline = TRUE;
} }
int
wxDialUpManagerImpl::CheckPing(void)
{
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
{
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;
return -1;
}
}
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__)
cmd << "-c 1 "; // only ping once
#else
# pragma warning "No Ping information for this OS."
m_CanUsePing = 0;
return -1;
#endif
cmd << m_BeaconHost;
if(wxExecute(cmd, TRUE /* sync */) == 0)
return 1;
else
return 0;
}
/* static */ /* static */
wxDialUpManager * wxDialUpManager *