]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/net.cpp
don't compare invalid iterators/node pointers
[wxWidgets.git] / src / unix / net.cpp
index 04369bb929f076aaa0b1ff4b357f22180e006130..8fff0bfdd1708b0cdce6dcae452e8e1fcf754ab5 100644 (file)
 #include "wx/filefn.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>
@@ -315,34 +317,75 @@ wxDialUpManagerImpl::CheckStatusInternal(void)
          m_IfconfigPath = "/usr/sbin/ifconfig";
    }
 
+   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)
+      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);
+      (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;