diff options
author | Andrew A. de Laix <alain@lindenlab.com> | 2010-11-10 14:30:11 -0800 |
---|---|---|
committer | Andrew A. de Laix <alain@lindenlab.com> | 2010-11-10 14:30:11 -0800 |
commit | 41ec2e01ddf12c7d9fc57a115b1e6047560c7e5e (patch) | |
tree | 0016e7b574e7722e06bdd838df971be1c947fab1 /indra/viewer_components/updater/llupdateinstaller.cpp | |
parent | 9d33a548b636fa739de2aa11ba9ed02b301c53a5 (diff) |
copy script to temp if needed before installing.
Diffstat (limited to 'indra/viewer_components/updater/llupdateinstaller.cpp')
-rw-r--r-- | indra/viewer_components/updater/llupdateinstaller.cpp | 44 |
1 files changed, 41 insertions, 3 deletions
diff --git a/indra/viewer_components/updater/llupdateinstaller.cpp b/indra/viewer_components/updater/llupdateinstaller.cpp index 1bb2101df1..52744b0479 100644 --- a/indra/viewer_components/updater/llupdateinstaller.cpp +++ b/indra/viewer_components/updater/llupdateinstaller.cpp @@ -24,15 +24,53 @@ */ #include "linden_common.h" +#include <apr_file_io.h> +#include "llapr.h" #include "llprocesslauncher.h" #include "llupdateinstaller.h" +#include "lldir.h" -void ll_install_update(std::string const & script, std::string const & updatePath) +namespace { + class RelocateError {}; + + + std::string copy_to_temp(std::string const & path) + { + std::string scriptFile = gDirUtilp->getBaseFileName(path); + std::string newPath = gDirUtilp->getExpandedFilename(LL_PATH_TEMP, scriptFile); + apr_status_t status = apr_file_copy(path.c_str(), newPath.c_str(), APR_FILE_SOURCE_PERMS, gAPRPoolp); + if(status != APR_SUCCESS) throw RelocateError(); + + return newPath; + } +} + + +int ll_install_update(std::string const & script, std::string const & updatePath, LLInstallScriptMode mode) { + std::string finalPath; + switch(mode) { + case LL_COPY_INSTALL_SCRIPT_TO_TEMP: + try { + finalPath = copy_to_temp(updatePath); + } + catch (RelocateError &) { + return -1; + } + break; + case LL_RUN_INSTALL_SCRIPT_IN_PLACE: + finalPath = updatePath; + break; + default: + llassert(!"unpossible copy mode"); + } + LLProcessLauncher launcher; launcher.setExecutable(script); - launcher.addArgument(updatePath); - launcher.launch(); + launcher.addArgument(finalPath); + int result = launcher.launch(); launcher.orphan(); + + return result; } |