- 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)