#include "wx/stream.h"
#ifdef HAVE_STATFS
- #include <sys/vfs.h>
+# ifdef __BSD__
+# include <sys/param.h>
+# include <sys/mount.h>
+# else
+# include <sys/vfs.h>
+# endif
#endif // HAVE_STATFS
+#ifdef HAVE_STATVFS
+ #include <sys/statvfs.h>
+
+ #define statfs statvfs
+#endif // HAVE_STATVFS
+
#if wxUSE_GUI
#include "wx/unix/execute.h"
#endif
void wxHandleProcessTermination(wxEndProcessData *proc_data)
{
- int pid = (proc_data->pid > 0) ? proc_data->pid : -(proc_data->pid);
-
- // waitpid is POSIX so should be available everywhere, however on older
- // systems wait() might be used instead in a loop (until the right pid
- // terminates)
- int status = 0;
- int rc;
-
- // wait for child termination and if waitpid() was interrupted, try again
- do
+ // notify user about termination if required
+ if ( proc_data->process )
{
- rc = waitpid(pid, &status, 0);
+ proc_data->process->OnTerminate(proc_data->pid, proc_data->exitcode);
}
- while ( rc == -1 && errno == EINTR );
- 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)))
+ // clean up
+ if ( proc_data->pid > 0 )
{
- 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)
- */
+ delete proc_data;
}
- else if (WIFSIGNALED(status))
+ else
{
- 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)
- {
- proc_data->process->OnTerminate(proc_data->pid,
- WEXITSTATUS(status));
- }
- // clean up
- if ( proc_data->pid > 0 )
- {
- delete proc_data;
- }
- else
- {
- // wxExecute() will know about it
- proc_data->exitcode = status;
-
- proc_data->pid = 0;
- }
+ // let wxExecute() know that the process has terminated
+ proc_data->pid = 0;
}
}
bool wxGetDiskSpace(const wxString& path, wxLongLong *pTotal, wxLongLong *pFree)
{
-#ifdef HAVE_STATFS
-
+#if defined(HAVE_STATFS) || defined(HAVE_STATVFS)
struct statfs fs;
if ( statfs(path, &fs) != 0 )
{
return FALSE;
}
+ // under Solaris we might have to use fs.f_frsize instead as I think it
+ // may be a multiple of the block size in general (TODO)
+
if ( pTotal )
{
*pTotal = wxLongLong(fs.f_blocks) * fs.f_bsize;