#include "wx/stream.h"
+#ifdef HAVE_STATFS
+ #include <sys/vfs.h>
+#endif // HAVE_STATFS
+
#if wxUSE_GUI
#include "wx/unix/execute.h"
#endif
}
while ( rc == -1 && errno == EINTR );
-
- if( rc == -1 || ! (WIFEXITED(status) || WIFSIGNALED(status)) )
+ if (rc == -1)
+ {
+ // JACS: this could happen if the process was terminated and waitpid called,
+ // so commenting out for now.
+ //wxLogSysError(_("Waiting for subprocess termination failed (return code = -1)"));
+ }
+ else if (! (WIFEXITED(status)))
{
- wxLogSysError(_("Waiting for subprocess termination failed"));
+ wxLogSysError(_("Waiting for subprocess termination failed (WIFEXITED returned zero)"));
+
/* AFAIK, this can only happen if something went wrong within
wxGTK, i.e. due to a race condition or some serious bug.
After having fixed the order of statements in
GTK_EndProcessDetector(). (KB)
*/
}
- else
+ else if (WIFSIGNALED(status))
+ {
+ wxLogSysError(_("Waiting for subprocess termination failed (signal not caught)"));
+
+ /* AFAIK, this can only happen if something went wrong within
+ wxGTK, i.e. due to a race condition or some serious bug.
+ After having fixed the order of statements in
+ GTK_EndProcessDetector(). (KB)
+ */
+ }
+ // else
{
// notify user about termination if required
if (proc_data->process)
// wxStream classes to support IO redirection in wxExecute
// ----------------------------------------------------------------------------
+#if wxUSE_STREAMS
+
class wxProcessFileInputStream : public wxInputStream
{
public:
return ret;
}
+#endif // wxUSE_STREAMS
+
long wxExecute(wxChar **argv,
bool sync,
wxProcess *process)
// there is no return after successful exec()
_exit(-1);
+
+ // some compilers complain about missing return - of course, they
+ // should know that exit() doesn't return but what else can we do if
+ // they don't?
+#if defined(__VMS) || defined(__INTEL_COMPILER)
+ return 0;
+#endif
}
else // we're in parent
{
// pipe initialization: construction of the wxStreams
if ( process && process->IsRedirected() )
{
+#if wxUSE_STREAMS
// These two streams are relative to this process.
wxOutputStream *outStream = new wxProcessFileOutputStream(pipeIn[1]);
wxInputStream *inStream = new wxProcessFileInputStream(pipeOut[0]);
wxInputStream *errStream = new wxProcessFileInputStream(pipeErr[0]);
+ process->SetPipeStreams(inStream, outStream, errStream);
+#endif // wxUSE_STREAMS
+
close(pipeIn[0]); // close reading side
close(pipeOut[1]); // close writing side
close(pipeErr[1]); // close writing side
-
- process->SetPipeStreams(inStream, outStream, errStream);
}
-#if wxUSE_GUI
+#if wxUSE_GUI && !defined(__WXMICROWIN__)
wxEndProcessData *data = new wxEndProcessData;
if ( sync )
return exitcode;
#endif // wxUSE_GUI
}
-#ifdef __VMS
- // VMS does not recognise exit as a return and complains about
- // a missing return
- // I think VMS is wrong in this
- // JJ
- return 0;
-#endif
}
#undef ERROR_RETURN_CODE
return -1;
}
+bool wxGetDiskSpace(const wxString& path, wxLongLong *pTotal, wxLongLong *pFree)
+{
+#ifdef HAVE_STATFS
+
+ struct statfs fs;
+ if ( statfs(path, &fs) != 0 )
+ {
+ wxLogSysError("Failed to get file system statistics");
+
+ return FALSE;
+ }
+
+ if ( pTotal )
+ {
+ *pTotal = wxLongLong(fs.f_blocks) * fs.f_bsize;
+ }
+
+ if ( pFree )
+ {
+ *pFree = wxLongLong(fs.f_bavail) * fs.f_bsize;
+ }
+
+ return TRUE;
+#endif // HAVE_STATFS
+
+ return FALSE;
+}
+
// ----------------------------------------------------------------------------
// env vars
// ----------------------------------------------------------------------------