X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/41ee29dfda753c5786bfdbb68cd44a30e5709db4..5d33ed2c6bc3065bf9dc77742da6c924b9e00fa5:/src/unix/dialup.cpp diff --git a/src/unix/dialup.cpp b/src/unix/dialup.cpp index 34a7906ac8..5bbfd306d0 100644 --- a/src/unix/dialup.cpp +++ b/src/unix/dialup.cpp @@ -127,7 +127,7 @@ public: 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 @@ -175,7 +175,7 @@ private: int m_CanUsePing; /// The path to ping program wxString m_PingPath; - + /// beacon host: wxString m_BeaconHost; /// beacon host portnumber for connect: @@ -209,7 +209,7 @@ private: int CheckPing(void); /// Check by connecting to host on given port. int CheckConnect(void); - + }; @@ -258,19 +258,31 @@ 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 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() @@ -291,7 +303,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"))) @@ -302,7 +313,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; @@ -326,7 +337,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); @@ -373,6 +383,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()) @@ -398,7 +415,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); @@ -443,17 +465,17 @@ wxDialUpManagerImpl::CheckConnect(void) 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) { @@ -472,14 +494,29 @@ 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 @@ -494,10 +531,13 @@ wxDialUpManagerImpl::CheckIfconfig(void) #if defined(__SOLARIS__) || defined (__SUNOS__) // need to add -a flag cmd << " -a"; -#elif defined(__LINUX__) || defined (__FREEBSD__) +#elif defined(__LINUX__) || defined (__FREEBSD__) || defined(__SGI__) // nothing to be added to ifconfig +#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 @@ -516,20 +556,21 @@ wxDialUpManagerImpl::CheckIfconfig(void) 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; @@ -540,7 +581,8 @@ wxDialUpManagerImpl::CheckIfconfig(void) m_CanUseIfconfig = 0; // donĀ“t try again (void) wxRemoveFile(tmpfile); } - return rc; + + return rc; } int @@ -548,7 +590,7 @@ 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 @@ -572,6 +614,8 @@ wxDialUpManagerImpl::CheckPing(void) // nothing to add to ping command #elif defined(__LINUX__) 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;