]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/net.cpp
Don't call wxSafeYield() from wxGenericListCtrl::EditLabel().
[wxWidgets.git] / src / unix / net.cpp
index 04369bb929f076aaa0b1ff4b357f22180e006130..268eb46b06bf39b2f21bfb84bd2be7d419eb6cec 100644 (file)
@@ -1,11 +1,11 @@
 // -*- 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
 /////////////////////////////////////////////////////////////////////////////
 
 #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 <stdlib.h>
-
 #include <signal.h>
 #include <fcntl.h>
 #include <unistd.h>
 #define __STRICT_ANSI__
 #include <sys/socket.h>
+#include <sys/types.h>
+#include <sys/stat.h>
 #include <netdb.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
@@ -77,7 +79,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 +95,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 +112,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 +143,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 +180,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 +202,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 +217,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 +236,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 +246,7 @@ wxDialUpManagerImpl::DisableAutoCheckOnlineStatus()
 {
    wxASSERT(m_timer != NULL);
    m_timer->Stop();
-   delete m_timer;
-   m_timer = NULL;
+   wxDELETE(m_timer);
 }
 
 
@@ -255,15 +255,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 +297,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 +315,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;
    }