summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Sébastien Pédron <jean-sebastien@rabbitmq.com>2015-12-14 13:52:47 +0100
committerJean-Sébastien Pédron <jean-sebastien@rabbitmq.com>2016-01-26 11:29:39 +0100
commit4fdacff37dba18e553c8f37c5c43f87de03b793d (patch)
treebc7d2132ae8401b31060ec136ef94e5a02f2a513
parent6d3636afe1e45b23447e809094c7a7d75240ed0f (diff)
downloadrabbitmq-server-git-4fdacff37dba18e553c8f37c5c43f87de03b793d.tar.gz
Use short filenames in Windows startup scripts
On Windows, cmd.exe and batch scripts do not support Uniode apparently. However, Windows uses UTF-16 to encode filenames one disk. In batch scripts, filenames are converted to some one-byte-wide charset. Once passed to Erlang and RabbitMQ, those filenames are incorrect. In particular, the management UI is unhappy because filenames obviously contain invalid UTF-8 characters. Using short filenames makes sure filename only contain US-ASCII characters. To convert them, we use "for" expansion. At the same time, filenames are made absolute. It works even better than realpath.exe because the latter also converts filenames to another charset again. Fixe #493.
-rw-r--r--scripts/rabbitmq-defaults.bat5
-rw-r--r--scripts/rabbitmq-env.bat62
2 files changed, 50 insertions, 17 deletions
diff --git a/scripts/rabbitmq-defaults.bat b/scripts/rabbitmq-defaults.bat
index 2125af68f1..41f706ef8d 100644
--- a/scripts/rabbitmq-defaults.bat
+++ b/scripts/rabbitmq-defaults.bat
@@ -23,6 +23,9 @@ if "!RABBITMQ_BASE!"=="" (
set RABBITMQ_BASE=!APPDATA!\RabbitMQ
)
+REM Make sure $RABBITMQ_BASE contains no non-ASCII characters.
+for /f "delims=" %%F in ("!RABBITMQ_BASE!") do set RABBITMQ_BASE=%%~sF
+
REM BOOT_MODULE="rabbit"
REM CONFIG_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq
REM LOG_BASE=${SYS_PREFIX}/var/log/rabbitmq
@@ -35,7 +38,7 @@ set MNESIA_BASE=!RABBITMQ_BASE!\db
set ENABLED_PLUGINS_FILE=!RABBITMQ_BASE!\enabled_plugins
REM PLUGINS_DIR="${RABBITMQ_HOME}/plugins"
-set PLUGINS_DIR=!TDP0!..\plugins
+for /f "delims=" %%F in ("!TDP0!..\plugins") do set PLUGINS_DIR=%%~dpsF%%~nF%%~xF
REM CONF_ENV_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq-env.conf
if "!RABBITMQ_CONF_ENV_FILE!"=="" (
diff --git a/scripts/rabbitmq-env.bat b/scripts/rabbitmq-env.bat
index b50468a909..83f354e10b 100644
--- a/scripts/rabbitmq-env.bat
+++ b/scripts/rabbitmq-env.bat
@@ -12,7 +12,7 @@ REM SCRIPT_DIR=`dirname $SCRIPT_PATH`
REM RABBITMQ_HOME="${SCRIPT_DIR}/.."
set SCRIPT_DIR=%TDP0%
set SCRIPT_NAME=%1
-set RABBITMQ_HOME=%SCRIPT_DIR%..
+for /f "delims=" %%F in ("%SCRIPT_DIR%..") do set RABBITMQ_HOME=%%~dpsF%%~nF%%~xF
REM If ERLANG_HOME is not defined, check if "erl.exe" is available in
REM the path and use that.
@@ -20,7 +20,7 @@ if not defined ERLANG_HOME (
for /f "delims=" %%F in ('where.exe erl.exe') do @set ERL_PATH=%%F
if exist "!ERL_PATH!" (
for /f "delims=" %%F in ("!ERL_PATH!") do set ERL_DIRNAME=%%~dpF
- for /f "delims=" %%F in ('realpath "!ERL_DIRNAME!\.."') do @set ERLANG_HOME=%%F
+ for /f "delims=" %%F in ("!ERL_DIRNAME!\..") do @set ERLANG_HOME=%%~dpsF%%~nF%%~xF
)
set ERL_PATH=
set ERL_DIRNAME=
@@ -51,6 +51,9 @@ if exist "!RABBITMQ_CONF_ENV_FILE!" (
call "!RABBITMQ_CONF_ENV_FILE!"
)
+REM Make sure $RABBITMQ_BASE contains no non-ASCII characters.
+for /f "delims=" %%F in ("!RABBITMQ_BASE!") do set RABBITMQ_BASE=%%~sF
+
REM Check for the short names here too
if "!RABBITMQ_USE_LONGNAME!"=="" (
if "!USE_LONGNAME!"=="" (
@@ -226,6 +229,7 @@ if "!RABBITMQ_PLUGINS_DIR!"=="" (
set RABBITMQ_PLUGINS_DIR=!PLUGINS_DIR!
)
) else (
+ for /f "delims=" %%F in ("!RABBITMQ_PLUGINS_DIR!") do set RABBITMQ_PLUGINS_DIR=%%~dpsF%%~nF%%~xF
set RABBITMQ_PLUGINS_DIR_source=environment
)
@@ -301,22 +305,19 @@ if defined RABBITMQ_DEV_ENV (
REM not available under RabbitMQ source tree. We need to look at
REM $DEPS_DIR and default locations.
- if not "!DEPS_DIR!" == "" (
- if exist "!DEPS_DIR!\rabbit_common\ebin" (
- REM $DEPS_DIR is set, and it contains rabbitmq-common, use
- REM this.
- set DEPS_DIR_norm=!DEPS_DIR!
+ if "!DEPS_DIR!" == "" (
+ if exist "!RABBITMQ_HOME!\..\..\deps\rabbit_common\erlang.mk" (
+ REM Dependencies in the Umbrella or a plugin.
+ set DEPS_DIR_norm="!RABBITMQ_HOME!\..\..\deps"
) else (
- if exist "!SCRIPT_DIR!\..\..\..\erlang.mk" (
- if exist "!SCRIPT_DIR!\..\..\rabbit_common\ebin" (
- REM Look at default locations: "deps" subdirectory
- REM inside a plugin or the Umbrella.
- set DEPS_DIR_norm=!SCRIPT_DIR!\..\..
- )
+ if exist "!RABBITMQ_HOME!\deps\rabbit_common\erlang.mk" (
+ REM Dependencies in the broker.
+ set DEPS_DIR_norm="!RABBITMQ_HOME!\deps"
)
)
+ ) else (
+ for /f "delims=" %%F in ("!DEPS_DIR!") do @set DEPS_DIR_norm=%%~dpsF%%~nF%%~xF
)
- for /f "delims=" %%F in ('realpath "!DEPS_DIR_norm!"') do @set DEPS_DIR_norm=%%F
set ERL_LIBS=!DEPS_DIR_norm!;!ERL_LIBS!
)
@@ -328,9 +329,38 @@ if defined RABBITMQ_DEV_ENV (
)
)
-if "!ERL_LIBS!" == ";" (
- set ERL_LIBS=
+REM Ensure all paths in ERL_LIBS do not contains non-ASCII characters.
+set ERL_LIBS_orig=%ERL_LIBS%
+set ERL_LIBS=
+call :filter_paths "%ERL_LIBS_orig%"
+goto :filter_paths_done
+
+:filter_paths
+set paths=%1
+set paths=%paths:"=%
+for /f "tokens=1* delims=;" %%a in ("%paths%") do (
+ if not "%%a" == "" call :filter_path %%a
+ if not "%%b" == "" call :filter_paths %%b
)
+set paths=
+exit /b
+
+:filter_path
+set ERL_LIBS=%ERL_LIBS%;%~dps1%~n1%~x1
+exit /b
+
+:filter_paths_done
+
+REM Environment cleanup
+set BOOT_MODULE=
+set CONFIG_FILE=
+set ENABLED_PLUGINS_FILE=
+set LOG_BASE=
+set MNESIA_BASE=
+set PLUGINS_DIR=
+set SCRIPT_DIR=
+set SCRIPT_NAME=
+set TDP0=
REM ##--- End of overridden <var_name> variables
REM