fixed broken code using readlink(): please don't just cast wxChar * to char *, this doesn't risk to ever work

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@36341 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2005-12-04 13:01:50 +00:00
parent 30efba0a9a
commit d5437b854c

View File

@ -53,36 +53,35 @@ void wxStandardPaths::SetInstallPrefix(const wxString& prefix)
wxString wxStandardPaths::GetInstallPrefix() const wxString wxStandardPaths::GetInstallPrefix() const
{ {
if (m_prefix.empty()) if ( m_prefix.empty() )
{ {
wxStandardPaths *pathPtr = wx_const_cast(wxStandardPaths *, this); wxStandardPaths *pathPtr = wx_const_cast(wxStandardPaths *, this);
#ifdef __LINUX__ #ifdef __LINUX__
// under Linux, we can get location of the executable // under Linux, we can try to infer the prefix from the location of the
wxChar buf[4096]; // executable
int result; char buf[4096];
int result = readlink("/proc/self/exe", buf, WXSIZEOF(buf) - sizeof(char));
// FIXME: is readlink() Unicode-aware or not??? if ( result != -1 )
result = readlink( (const char*)wxT("/proc/self/exe"), (char*)buf, WXSIZEOF(buf) - sizeof(wxChar) );
if (result != -1)
{ {
buf[result] = wxChar(0); buf[result] = '\0'; // readlink() doesn't NUL-terminate the buffer
wxString exeStr( buf, wxConvLibc );
wxString exeStr(buf, wxConvLibc);
// consider that we're in the last "bin" subdirectory of our prefix // consider that we're in the last "bin" subdirectory of our prefix
wxString basename( wxString(wxTheApp->argv[0]).AfterLast( wxChar('/')) ); wxString basename(wxString(wxTheApp->argv[0]).AfterLast(_T('/')));
size_t pos = exeStr.find( wxT("/bin/") + basename ); size_t pos = exeStr.find(wxT("/bin/") + basename);
if (pos != wxString::npos) if ( pos != wxString::npos )
pathPtr->m_prefix.assign( exeStr, 0, pos ); pathPtr->m_prefix.assign(exeStr, 0, pos);
} }
#endif // __LINUX__ #endif // __LINUX__
if (m_prefix.empty()) if ( m_prefix.empty() )
{ {
#ifdef __VMS #ifdef __VMS
pathPtr->m_prefix = wxT("/sys$system"); pathPtr->m_prefix = wxT("/sys$system");
#else #else
pathPtr->m_prefix = wxT("/usr/local"); pathPtr->m_prefix = wxT("/usr/local");
#endif #endif
} }
} }