aboutsummaryrefslogtreecommitdiffstats
path: root/lib/runtime_tools
diff options
context:
space:
mode:
authorSiri Hansen <[email protected]>2017-09-07 16:16:01 +0200
committerSiri Hansen <[email protected]>2017-09-07 16:16:01 +0200
commitb569db7fd80de6f6f049797fa7676bdfbe55cc4f (patch)
treeff24ace33a45b2dc75f9d955a88bc92fdc2f2acc /lib/runtime_tools
parent8e3baffd206247d3023c3e00d4d0849c23f3fc58 (diff)
parent87fa9801618397087d6a7b521e370506c5bfff91 (diff)
downloadotp-b569db7fd80de6f6f049797fa7676bdfbe55cc4f.tar.gz
otp-b569db7fd80de6f6f049797fa7676bdfbe55cc4f.tar.bz2
otp-b569db7fd80de6f6f049797fa7676bdfbe55cc4f.zip
Merge branch 'siri/unicode-merge' into maint
* siri/unicode-merge: (28 commits) stdlib: use 'unicode' option for regexp in ets ct: use 'unicode' option for regexps syntax_tools: add 'unicode' option to re:run for matching paths kernel: update simple error logger to print Unicode strings stdlib: add Unicode translation modifier in error_logger_tty_h wx: add Unicode translation modifier to wx_object stdlib: add Unicode translation modifier in debug format funs sasl: set encoding of SASL report log stdlib: use Unicode translation modifier in error_logger_file_h observer: Improve handling of Unicode mnesia: Improve handling of Unicode stdlib : Improve handling of Unicode kernel: Improve handling of Unicode hipe: Improve handling of Unicode edoc: Improve handling of Unicode syntax_tools: Improve handling of Unicode dialyzer: Improve handling of Unicode et: Improve handling of Unicode xref: Improve handling of Unicode fprof: Modify handling of Unicode eprof: Improve handling of Unicode eunit: Improve handling of Unicode stdlib: Improve handling of Unicode in escript stdlib: Improve handling of Unicode in edlin_expand stdlib: Modify handling of Unicode in proc_lib sasl: Improve handling of Unicode edoc: Improve handling of Unicode debugger: Improve handling of Unicode OTP-14462 OTP-14464
Diffstat (limited to 'lib/runtime_tools')
-rw-r--r--lib/runtime_tools/src/observer_backend.erl31
1 files changed, 26 insertions, 5 deletions
diff --git a/lib/runtime_tools/src/observer_backend.erl b/lib/runtime_tools/src/observer_backend.erl
index 7f0c1ac6e4..1b075a507d 100644
--- a/lib/runtime_tools/src/observer_backend.erl
+++ b/lib/runtime_tools/src/observer_backend.erl
@@ -36,6 +36,7 @@
ttb_write_binary/2,
ttb_stop/1,
ttb_fetch/2,
+ ttb_fetch/3,
ttb_resume_trace/0,
ttb_get_filenames/1]).
-define(CHUNKSIZE,8191). % 8 kbytes - 1 byte
@@ -658,22 +659,42 @@ stop_seq_trace() ->
%% Fetch ttb logs from remote node
ttb_fetch(MetaFile,{Port,Host}) ->
+ ttb_fetch(MetaFile,{Port,Host},undefined).
+ttb_fetch(MetaFile,{Port,Host},MasterEnc) ->
erlang:process_flag(priority,low),
Files = ttb_get_filenames(MetaFile),
{ok, Sock} = gen_tcp:connect(Host, Port, [binary, {packet, 2}]),
- send_files({Sock,Host},Files),
+ send_files({Sock,Host},Files,MasterEnc,file:native_name_encoding()),
ok = gen_tcp:close(Sock).
-send_files({Sock,Host},[File|Files]) ->
+send_files({Sock,Host},[File|Files],MasterEnc,MyEnc) ->
{ok,Fd} = file:open(File,[raw,read,binary]),
- ok = gen_tcp:send(Sock,<<1,(list_to_binary(filename:basename(File)))/binary>>),
+ Basename = filename:basename(File),
+ {Code,FilenameBin} = encode_filename(Basename,MasterEnc,MyEnc),
+ ok = gen_tcp:send(Sock,<<Code,FilenameBin/binary>>),
send_chunks(Sock,Fd),
ok = file:delete(File),
- send_files({Sock,Host},Files);
-send_files({_Sock,_Host},[]) ->
+ send_files({Sock,Host},Files,MasterEnc,MyEnc);
+send_files({_Sock,_Host},[],_MasterEnc,_MyEnc) ->
done.
+encode_filename(Basename,undefined,MyEnc) ->
+ %% Compatible with old version of ttb.erl, but no longer crashing
+ %% for code points > 255.
+ {1,unicode:characters_to_binary(Basename,MyEnc,MyEnc)};
+encode_filename(Basename,MasterEnc,MyEnc) ->
+ case unicode:characters_to_binary(Basename,MyEnc,MasterEnc) of
+ Bin when is_binary(Bin) ->
+ %% Encoding succeeded
+ {2,Bin};
+ _ ->
+ %% Can't convert Basename from my encoding to the master
+ %% node's encoding. Doing my best and hoping that master
+ %% node can fix it...
+ {3,unicode:characters_to_binary(Basename,MyEnc,MyEnc)}
+ end.
+
send_chunks(Sock,Fd) ->
case file:read(Fd,?CHUNKSIZE) of
{ok,Bin} ->