X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1c8515f9ab86415068e779ce76a7268521e12192..6ba718d7aee2f519d9146b90424ccec9e2243479:/src/unix/net.cpp diff --git a/src/unix/net.cpp b/src/unix/net.cpp index 04369bb929..3125aadc2c 100644 --- a/src/unix/net.cpp +++ b/src/unix/net.cpp @@ -1,11 +1,10 @@ // -*- c++ -*- /////////////////////////////////////////////////////////////// -// Name: unix/net.cpp +// Name: src/unix/net.cpp // Purpose: Network related wxWindows classes and functions -// Author: Karsten Ballüder +// Author: Karsten Ballüder // Modified by: // Created: 03.10.99 -// RCS-ID: $Id$ -// Copyright: (c) Karsten Ballüder +// Copyright: (c) Karsten Ballüder // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -21,17 +20,19 @@ #include "wx/event.h" #include "wx/net.h" #include "wx/timer.h" -#include "wx/filefn.h" +#include "wx/filename.h" #include "wx/utils.h" #include "wx/log.h" +#include "wx/file.h" #include - #include #include #include #define __STRICT_ANSI__ #include +#include +#include #include #include #include @@ -77,7 +78,7 @@ public: wxDialUpManager methods. */ virtual bool IsOk() const - { return TRUE; } + { return true; } /** The simplest way to initiate a dial up: this function dials the given ISP (exact meaning of the parameter depends on the platform), returns @@ -93,7 +94,7 @@ public: /// Hang up the currently active dial up connection. virtual bool HangUp(); - + // returns TRUE if the computer is connected to the network: under Windows, // this just means that a RAS connection exists, under Unix we check that // the "well-known host" (as specified by SetWellKnownHost) is reachable @@ -110,7 +111,7 @@ public: // so, in general, the user should be allowed to override it. This function // allows to forcefully set the online status - whatever our internal // algorithm may think about it. - virtual void SetOnlineStatus(bool isOnline = TRUE) + virtual void SetOnlineStatus(bool isOnline = true) { m_IsOnline = isOnline; } // set misc wxDialUpManager options @@ -141,9 +142,9 @@ public: { m_ConnectCommand = command; m_HangUpCommand = hupcmd; } private: - /// -1: don´t know, 0 = no, 1 = yes + /// -1: don't know, 0 = no, 1 = yes int m_IsOnline; - + /// Can we use ifconfig to list active devices? int m_CanUseIfconfig; /// The path to ifconfig @@ -178,11 +179,11 @@ public: AutoCheckTimer(wxDialUpManagerImpl *dupman) { m_dupman = dupman; - m_started = FALSE; + m_started = false; } virtual bool Start( int millisecs = -1 ) - { m_started = TRUE; return wxTimer::Start(millisecs, FALSE); } + { m_started = true; return wxTimer::Start(millisecs, false); } virtual void Notify() { wxLogTrace("Checking dial up network status."); m_dupman->CheckStatus(); } @@ -200,7 +201,7 @@ wxDialUpManagerImpl::Dial(const wxString &isp, const wxString & WXUNUSED(password)) { if(m_IsOnline == 1) - return FALSE; + return false; m_IsOnline = -1; m_ISPname = isp; wxString cmd; @@ -215,7 +216,7 @@ bool wxDialUpManagerImpl::HangUp(void) { if(m_IsOnline == 0) - return FALSE; + return false; m_IsOnline = -1; wxString cmd; if(m_HangUpCommand.Find("%s")) @@ -234,8 +235,7 @@ wxDialUpManagerImpl::EnableAutoCheckOnlineStatus(size_t nSeconds) bool rc = m_timer->Start(nSeconds*1000); if(! rc) { - delete m_timer; - m_timer = NULL; + wxDELETE(m_timer); } return rc; } @@ -245,8 +245,7 @@ wxDialUpManagerImpl::DisableAutoCheckOnlineStatus() { wxASSERT(m_timer != NULL); m_timer->Stop(); - delete m_timer; - m_timer = NULL; + wxDELETE(m_timer); } @@ -255,15 +254,15 @@ wxDialUpManagerImpl::SetWellKnownHost(const wxString& hostname, int portno) { /// does hostname contain a port number? wxString port = hostname.After(':'); - if(port.Length()) + if(port.empty()) { - m_BeaconHost = hostname.Before(':'); - m_BeaconPort = atoi(port); + m_BeaconHost = hostname; + m_BeaconPort = portno; } else { - m_BeaconHost = hostname; - m_BeaconPort = portno; + m_BeaconHost = hostname.Before(':'); + m_BeaconPort = atoi(port); } } @@ -297,7 +296,7 @@ wxDialUpManagerImpl::CheckStatus(void) const 3. check /proc/net/dev on linux?? This method should be preferred, if possible. Need to do more testing. - + */ void @@ -315,52 +314,93 @@ wxDialUpManagerImpl::CheckStatusInternal(void) m_IfconfigPath = "/usr/sbin/ifconfig"; } - // Let´s try the ifconfig method first, should be fastest: + wxLogNull ln; // suppress all error messages + // Let's try the ifconfig method first, should be fastest: if(m_CanUseIfconfig != 0) // unknown or yes { - wxASSERT(m_IfconfigPath.length()); - - wxString tmpfile = wxGetTempFileName("_wxdialuptest"); - wxString cmd = m_IfconfigPath; - cmd << " >" << tmpfile; - if(wxExecute(m_IfconfigPath,TRUE /* sync */) == 0) + wxASSERT( !m_IfconfigPath.empty() ); + + wxString tmpfile = wxFileName::CreateTempFileName("_wxdialuptest"); + wxString cmd = "/bin/sh -c \'"; + cmd << m_IfconfigPath << " >" << 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 0 + // temporarily redirect stdout/stderr: + int + new_stdout = dup(STDOUT_FILENO), + new_stderr = dup(STDERR_FILENO); + close(STDOUT_FILENO); + close(STDERR_FILENO); + + int + // new stdout: + output_fd = open(tmpfile, O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR), + // new stderr: + null_fd = open("/dev/null", O_CREAT, S_IRUSR|S_IWUSR); + // verify well behaved unix behaviour: + wxASSERT(output_fd == STDOUT_FILENO); + wxASSERT(null_fd == STDERR_FILENO); + int rc = wxExecute(m_IfconfigPath,TRUE /* sync */,NULL ,wxEXECUTE_DONT_CLOSE_FDS); + close(null_fd); close(output_fd); + // restore old stdout, stderr: + int test; + test = dup(new_stdout); close(new_stdout); wxASSERT(test == STDOUT_FILENO); + test = dup(new_stderr); close(new_stderr); wxASSERT(test == STDERR_FILENO); + if(rc == 0) +#endif + if(wxExecute(cmd,TRUE /* sync */) == 0) { m_CanUseIfconfig = 1; - wxString cmd1 = "grep ppp <"+tmpfile; // PPP - wxString cmd2 = "grep sl <"+tmpfile; // SLIP - wxString cmd3 = "grep pl <"+tmpfile; // PLIP - if(wxExecute(cmd1,TRUE) == 0 - || wxExecute(cmd2,TRUE) == 0 - || wxExecute(cmd3,TRUE) == 0 - ) - m_IsOnline = 1; + wxFile file; + if( file.Open(tmpfile) ) + { + char *output = new char [file.Length()+1]; + output[file.Length()] = '\0'; + if(file.Read(output,file.Length()) == file.Length()) + { + if(strstr(output,"ppp") // ppp + || strstr(output,"sl") // slip + || strstr(output,"pl") // plip + ) + m_IsOnline = 1; + else + m_IsOnline = 0; + } + file.Close(); + delete [] output; + } + // else m_IsOnline remains -1 as we don't know for sure } else // could not run ifconfig correctly - m_CanUseIfconfig = 0; // don´t try again - wxRemoveFile(tmpfile); + m_CanUseIfconfig = 0; // don't try again + (void) wxRemoveFile(tmpfile); if(m_IsOnline != -1) // we are done return; } // second method: try to connect to well known host: + // This can be used under Win 9x, too! struct hostent *hp; struct sockaddr_in serv_addr; - int sockfd; + int sockfd; m_IsOnline = 0; // assume false if((hp = gethostbyname(m_BeaconHost)) == NULL) return; // 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); - if( ( sockfd = socket(hp->h_addrtype, SOCK_STREAM, 0)) < 0) - { + serv_addr.sin_port = htons(m_BeaconPort); + if( ( sockfd = socket(hp->h_addrtype, SOCK_STREAM, 0)) < 0) + { // sys_error("cannot create socket for gw"); return; } if( connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) - { + { //sys_error("cannot connect to server"); return; }