summaryrefslogtreecommitdiff
path: root/indra/llvfs/lldir_solaris.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llvfs/lldir_solaris.cpp')
-rw-r--r--indra/llvfs/lldir_solaris.cpp125
1 files changed, 73 insertions, 52 deletions
diff --git a/indra/llvfs/lldir_solaris.cpp b/indra/llvfs/lldir_solaris.cpp
index b13d3d05ea..4323dfd44a 100644
--- a/indra/llvfs/lldir_solaris.cpp
+++ b/indra/llvfs/lldir_solaris.cpp
@@ -2,30 +2,25 @@
* @file fmodwrapper.cpp
* @brief dummy source file for building a shared library to wrap libfmod.a
*
- * $LicenseInfo:firstyear=2005&license=viewergpl$
- *
- * Copyright (c) 2005-2007, Linden Research, Inc.
- *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
* Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlife.com/developers/opensource/gplv2
+ * Copyright (C) 2010, Linden Research, Inc.
*
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at http://secondlife.com/developers/opensource/flossexception
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
*
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
*
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
@@ -36,14 +31,13 @@
#include "llrand.h"
#include <sys/types.h>
#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/param.h>
#include <unistd.h>
#include <glob.h>
#include <pwd.h>
#include <sys/utsname.h>
#define _STRUCTURED_PROC 1
#include <sys/procfs.h>
+#include <fcntl.h>
static std::string getCurrentUserHome(char* fallback)
{
@@ -82,7 +76,16 @@ LLDir_Solaris::LLDir_Solaris()
mDirp = NULL;
char tmp_str[LL_MAX_PATH]; /* Flawfinder: ignore */
- getcwd(tmp_str, LL_MAX_PATH);
+ if (getcwd(tmp_str, LL_MAX_PATH) == NULL)
+ {
+ strcpy(tmp_str, "/tmp");
+ llwarns << "Could not get current directory; changing to "
+ << tmp_str << llendl;
+ if (chdir(tmp_str) == -1)
+ {
+ llerrs << "Could not change directory to " << tmp_str << llendl;
+ }
+ }
mExecutableFilename = "";
mExecutablePathAndName = "";
@@ -91,7 +94,7 @@ LLDir_Solaris::LLDir_Solaris()
mAppRODataDir = strdup(tmp_str);
mOSUserDir = getCurrentUserHome(tmp_str);
mOSUserAppDir = "";
- mLindenUserDir = tmp_str;
+ mLindenUserDir = "";
char path [LL_MAX_PATH]; /* Flawfinder: ignore */
@@ -121,22 +124,39 @@ LLDir_Solaris::LLDir_Solaris()
return;
}
+ char *p = execpath; // nuke trash in link, if any exists
+ int i = 0;
+ while(*p != NULL && ++i < LL_MAX_PATH && isprint((int)(*p++)));
+ *p = NULL;
+
mExecutablePathAndName = strdup(execpath);
llinfos << "mExecutablePathAndName = [" << mExecutablePathAndName << "]" << llendl;
+ //NOTE: Why force people to cd into the package directory?
+ // Look for SECONDLIFE env variable and use it, if set.
+
+ char *dcf = getenv("SECONDLIFE");
+ if(dcf != NULL){
+ (void)strcpy(path, dcf);
+ (void)strcat(path, "/bin"); //NOTE: make sure we point at the bin
+ mExecutableDir = strdup(path);
+ }else{
// plunk a null at last '/' to get exec dir
- char *s = execpath + strlen(execpath) -1;
- while(*s != '/' && s != execpath){
- --s;
- }
+ char *s = execpath + strlen(execpath) -1;
+ while(*s != '/' && s != execpath){
+ --s;
+ }
- if(s != execpath){
- *s = (char)NULL;
+ if(s != execpath){
+ *s = (char)NULL;
- mExecutableDir = strdup(execpath);
- llinfos << "mExecutableDir = [" << mExecutableDir << "]" << llendl;
+ mExecutableDir = strdup(execpath);
+ llinfos << "mExecutableDir = [" << mExecutableDir << "]" << llendl;
+ }
}
+ mLLPluginDir = mExecutableDir + mDirDelimiter + "llplugin";
+
// *TODO: don't use /tmp, use $HOME/.secondlife/tmp or something.
mTempDir = "/tmp";
}
@@ -148,12 +168,18 @@ LLDir_Solaris::~LLDir_Solaris()
// Implementation
-void LLDir_Solaris::initAppDirs(const std::string &app_name)
+void LLDir_Solaris::initAppDirs(const std::string &app_name,
+ const std::string& app_read_only_data_dir)
{
+ // Allow override so test apps can read newview directory
+ if (!app_read_only_data_dir.empty())
+ {
+ mAppRODataDir = app_read_only_data_dir;
+ }
mAppName = app_name;
- LLString upper_app_name(app_name);
- LLString::toUpper(upper_app_name);
+ std::string upper_app_name(app_name);
+ LLStringUtil::toUpper(upper_app_name);
char* app_home_env = getenv((upper_app_name + "_USER_DIR").c_str()); /* Flawfinder: ignore */
if (app_home_env)
@@ -167,14 +193,14 @@ void LLDir_Solaris::initAppDirs(const std::string &app_name)
mOSUserAppDir = mOSUserDir;
mOSUserAppDir += "/";
mOSUserAppDir += ".";
- LLString lower_app_name(app_name);
- LLString::toLower(lower_app_name);
+ std::string lower_app_name(app_name);
+ LLStringUtil::toLower(lower_app_name);
mOSUserAppDir += lower_app_name;
}
// create any directories we expect to write to.
- int res = LLFile::mkdir(mOSUserAppDir.c_str());
+ int res = LLFile::mkdir(mOSUserAppDir);
if (res == -1)
{
if (errno != EEXIST)
@@ -185,7 +211,7 @@ void LLDir_Solaris::initAppDirs(const std::string &app_name)
}
}
- res = LLFile::mkdir(getExpandedFilename(LL_PATH_LOGS,"").c_str());
+ res = LLFile::mkdir(getExpandedFilename(LL_PATH_LOGS,""));
if (res == -1)
{
if (errno != EEXIST)
@@ -194,7 +220,7 @@ void LLDir_Solaris::initAppDirs(const std::string &app_name)
}
}
- res = LLFile::mkdir(getExpandedFilename(LL_PATH_USER_SETTINGS,"").c_str());
+ res = LLFile::mkdir(getExpandedFilename(LL_PATH_USER_SETTINGS,""));
if (res == -1)
{
if (errno != EEXIST)
@@ -203,7 +229,7 @@ void LLDir_Solaris::initAppDirs(const std::string &app_name)
}
}
- res = LLFile::mkdir(getExpandedFilename(LL_PATH_CACHE,"").c_str());
+ res = LLFile::mkdir(getExpandedFilename(LL_PATH_CACHE,""));
if (res == -1)
{
if (errno != EEXIST)
@@ -212,15 +238,6 @@ void LLDir_Solaris::initAppDirs(const std::string &app_name)
}
}
- res = LLFile::mkdir(getExpandedFilename(LL_PATH_MOZILLA_PROFILE,"").c_str());
- if (res == -1)
- {
- if (errno != EEXIST)
- {
- llwarns << "Couldn't create LL_PATH_MOZILLA_PROFILE dir " << getExpandedFilename(LL_PATH_MOZILLA_PROFILE,"") << llendl;
- }
- }
-
mCAFile = getExpandedFilename(LL_PATH_APP_SETTINGS, "CA.pem");
}
@@ -354,12 +371,16 @@ void LLDir_Solaris::getRandomFileInDir(const std::string &dirname, const std::st
std::string LLDir_Solaris::getCurPath()
{
char tmp_str[LL_MAX_PATH]; /* Flawfinder: ignore */
- getcwd(tmp_str, LL_MAX_PATH);
+ if (getcwd(tmp_str, LL_MAX_PATH) == NULL)
+ {
+ llwarns << "Could not get current directory" << llendl;
+ tmp_str[0] = '\0';
+ }
return tmp_str;
}
-BOOL LLDir_Solaris::fileExists(const std::string &filename)
+BOOL LLDir_Solaris::fileExists(const std::string &filename) const
{
struct stat stat_data;
// Check the age of the file