X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/79066131734040a7d01b87566fc1262e7fbe51ad..5eac771d0949d4696c7c29f2ead81a2d0b0b73c8:/src/unix/utilsunx.cpp diff --git a/src/unix/utilsunx.cpp b/src/unix/utilsunx.cpp index 6fe5a0b5f7..c375770794 100644 --- a/src/unix/utilsunx.cpp +++ b/src/unix/utilsunx.cpp @@ -28,26 +28,32 @@ #include "wx/wfstream.h" +// not only the statfs syscall is called differently depending on platform, but +// one of its incarnations, statvfs(), takes different arguments under +// different platforms and even different versions of the same system (Solaris +// 7 and 8): if you want to test for this, don't forget that the problems only +// appear if the large files support is enabled #ifdef HAVE_STATFS -# ifdef __BSD__ -# include -# include -# else -# include -# endif + #ifdef __BSD__ + #include + #include + #else // !__BSD__ + #include + #endif // __BSD__/!__BSD__ + + #define wxStatfs statfs #endif // HAVE_STATFS -// not only the statfs syscall is called differently depending on platform, but -// we also can't use "struct statvfs" under Solaris because it breaks down if -// HAVE_LARGEFILE_SUPPORT == 1 and we must use statvfs_t instead #ifdef HAVE_STATVFS #include - #define statfs statvfs - #define wxStatFs statvfs_t -#elif HAVE_STATFS - #define wxStatFs struct statfs -#endif // HAVE_STAT[V]FS + #define wxStatfs statvfs +#endif // HAVE_STATVFS + +#if defined(HAVE_STATFS) || defined(HAVE_STATVFS) + // WX_STATFS_T is detected by configure + #define wxStatfs_t WX_STATFS_T +#endif #if wxUSE_GUI #include "wx/unix/execute.h" @@ -253,11 +259,7 @@ long wxExecute( const wxString& command, int flags, wxProcess *process ) argv[argc] = NULL; // do execute the command -#if wxUSE_UNICODE - long lRc = -1; -#else long lRc = wxExecute(argv, flags, process); -#endif // clean up argc = 0; @@ -363,16 +365,16 @@ public: wxPipeInputStream(int fd) : wxFileInputStream(fd) { } // return TRUE if the pipe is still opened - bool IsOpened() const { return TRUE; } // TODO + bool IsOpened() const { return !Eof(); } // return TRUE if we have anything to read, don't block - bool IsAvailable() const; + virtual bool CanRead() const; }; -bool wxPipeInputStream::IsAvailable() const +bool wxPipeInputStream::CanRead() const { if ( m_lasterror == wxSTREAM_EOF ) - return TRUE; + return FALSE; // check if there is any input available struct timeval tv; @@ -391,15 +393,17 @@ bool wxPipeInputStream::IsAvailable() const // fall through case 0: - return TRUE; + return FALSE; default: wxFAIL_MSG(_T("unexpected select() return value")); // still fall through case 1: - // input available - return TRUE; + // input available -- or maybe not, as select() returns 1 when a + // read() will complete without delay, but it could still not read + // anything + return !Eof(); } } @@ -561,13 +565,17 @@ long wxExecute(wxChar **argv, } // fork the process -#ifdef HAVE_VFORK - pid_t pid = vfork(); + // + // NB: do *not* use vfork() here, it completely breaks this code for some + // reason under Solaris (and maybe others, although not under Linux) + // But on OpenVMS we do not have fork so we have to use vfork and + // cross our fingers that it works. +#ifdef __VMS + pid_t pid = vfork(); #else - pid_t pid = fork(); + pid_t pid = fork(); #endif - - if ( pid == -1 ) // error? + if ( pid == -1 ) // error? { wxLogSysError( _("Fork failed") ); @@ -603,7 +611,7 @@ long wxExecute(wxChar **argv, } } -#ifndef __VMS +#if !defined(__VMS) && !defined(__EMX__) if ( flags & wxEXEC_MAKE_GROUP_LEADER ) { // Set process group to child process' pid. Then killing -pid @@ -798,7 +806,12 @@ char *wxGetUserHome( const wxString &user ) if ((ptr = wxGetenv(wxT("HOME"))) != NULL) { +#if wxUSE_UNICODE + wxWCharBuffer buffer( ptr ); + return buffer; +#else return ptr; +#endif } if ((ptr = wxGetenv(wxT("USER"))) != NULL || (ptr = wxGetenv(wxT("LOGNAME"))) != NULL) { @@ -945,7 +958,7 @@ wxString wxGetOsDescription() #ifndef WXWIN_OS_DESCRIPTION #error WXWIN_OS_DESCRIPTION should be defined in config.h by configure #else - return WXWIN_OS_DESCRIPTION; + return wxString::FromAscii( WXWIN_OS_DESCRIPTION ); #endif } #endif @@ -1013,8 +1026,8 @@ bool wxGetDiskSpace(const wxString& path, wxLongLong *pTotal, wxLongLong *pFree) { #if defined(HAVE_STATFS) || defined(HAVE_STATVFS) // the case to "char *" is needed for AIX 4.3 - wxStatFs fs; - if ( statfs((char *)(const char*)path.fn_str(), &fs) != 0 ) + wxStatfs_t fs; + if ( wxStatfs((char *)(const char*)path.fn_str(), &fs) != 0 ) { wxLogSysError( wxT("Failed to get file system statistics") );