diff options
author | Siri Hansen <[email protected]> | 2017-09-07 16:16:01 +0200 |
---|---|---|
committer | Siri Hansen <[email protected]> | 2017-09-07 16:16:01 +0200 |
commit | b569db7fd80de6f6f049797fa7676bdfbe55cc4f (patch) | |
tree | ff24ace33a45b2dc75f9d955a88bc92fdc2f2acc /lib/runtime_tools | |
parent | 8e3baffd206247d3023c3e00d4d0849c23f3fc58 (diff) | |
parent | 87fa9801618397087d6a7b521e370506c5bfff91 (diff) | |
download | otp-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.erl | 31 |
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} -> |