summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/viewer_components/updater/llupdateinstaller.cpp44
-rw-r--r--indra/viewer_components/updater/llupdateinstaller.h10
2 files changed, 50 insertions, 4 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;
}
diff --git a/indra/viewer_components/updater/llupdateinstaller.h b/indra/viewer_components/updater/llupdateinstaller.h
index 991fe2afe1..310bfe4348 100644
--- a/indra/viewer_components/updater/llupdateinstaller.h
+++ b/indra/viewer_components/updater/llupdateinstaller.h
@@ -30,13 +30,21 @@
#include <string>
+enum LLInstallScriptMode {
+ LL_RUN_INSTALL_SCRIPT_IN_PLACE,
+ LL_COPY_INSTALL_SCRIPT_TO_TEMP
+};
+
//
// Launch the installation script.
//
// The updater will overwrite the current installation, so it is highly recommended
// that the current application terminate once this function is called.
//
-void ll_install_update(std::string const & script, std::string const & updatePath);
+int ll_install_update(
+ std::string const & script, // Script to execute.
+ std::string const & updatePath, // Path to update file.
+ LLInstallScriptMode mode=LL_COPY_INSTALL_SCRIPT_TO_TEMP); // Run in place or copy to temp?
#endif