diff --git a/src/e9p_fs.erl b/src/e9p_fs.erl index 725125a..8ebc860 100644 --- a/src/e9p_fs.erl +++ b/src/e9p_fs.erl @@ -109,7 +109,6 @@ -record(state, { mod, state, - version, fids = #{}, max_packet_size }). @@ -132,9 +131,9 @@ init(Mod, State) -> end. negotiate(#state{} = State, ~"9P2000", MPS) -> - {ok, State#state{version = legacy, max_packet_size = MPS}}; + {ok, legacy, State#state{max_packet_size = MPS}}; negotiate(#state{} = State, ~"9P2000.u", MPS) -> - {ok, State#state{version = unix, max_packet_size = MPS}}; + {ok, unix, State#state{max_packet_size = MPS}}; negotiate(#state{} = State, _Other, _MPS) -> {error, ~"Unsupported version", State}. diff --git a/src/e9p_msg.erl b/src/e9p_msg.erl index 573b7d7..fbe6bd1 100644 --- a/src/e9p_msg.erl +++ b/src/e9p_msg.erl @@ -288,10 +288,10 @@ do_encode(#tclunk{fid = FID}, _Ver) -> {?Tclunk, <>}; do_encode(#rclunk{}, _Ver) -> {?Rclunk, []}; -do_encode(#rerror{msg = Error}, legacy) -> - {?Rerror, encode_str(Error)}; -do_encode(#rerror{msg = Error, errno = Errno}, _Ver) -> +do_encode(#rerror{msg = Error, errno = Errno}, unix) -> {?Rerror, [encode_str(Error), <>]}; +do_encode(#rerror{msg = Error}, _Version) -> + {?Rerror, encode_str(Error)}; do_encode(#tflush{tag = Tag}, _Ver) -> {?Tflush, <>}; do_encode(#rflush{}, _Ver) -> diff --git a/src/e9p_server.erl b/src/e9p_server.erl index b524f56..f601013 100644 --- a/src/e9p_server.erl +++ b/src/e9p_server.erl @@ -22,7 +22,8 @@ -record(state, { socket, % trans_mod = gen_tcp, - handler + handler, + version }). start(Port, Handler) -> @@ -64,10 +65,18 @@ loop(#state{socket = Sock} = State) -> {ok, Tag, Data} -> try handle_message(Data, State) of {ok, Reply, NewState} -> - e9p_transport:send(Sock, Tag, Reply), + ?LOG_DEBUG(#{ + tag => Tag, req => Data, reply => Reply, state => NewState, pid => self() + }), + e9p_transport:send(Sock, Tag, Reply, NewState#state.version), ?MODULE:loop(NewState); {error, Err, RHandler} -> - e9p_transport:send(Sock, Tag, #rerror{msg = Err}), + e9p_transport:send( + Sock, + Tag, + #rerror{msg = Err}, + State#state.version + ), ?MODULE:loop(State#state{handler = RHandler}) catch C:E:S -> @@ -76,9 +85,14 @@ loop(#state{socket = Sock} = State) -> msg => E, stacktrace => S }), - e9p_transport:send(Sock, Tag, #rerror{ - msg = io_lib:format("Caught ~p: ~p", [C, E]) - }), + e9p_transport:send( + Sock, + Tag, + #rerror{ + msg = io_lib:format("Caught ~p: ~p", [C, E]) + }, + State#state.version + ), ?MODULE:loop(State) end; {error, closed} -> @@ -103,8 +117,8 @@ do_cast(#state{handler = Handler} = State, Func, Args) -> handle_message(#tversion{version = Version, max_packet_size = MPS}, State) -> maybe - {ok, NewState} ?= do_cast(State, negotiate, [Version, MPS]), - {ok, #rversion{version = Version, max_packet_size = MPS}, NewState} + {ok, Ver, NewState} ?= do_call(State, negotiate, [Version, MPS]), + {ok, #rversion{version = Version, max_packet_size = MPS}, NewState#state{version = Ver}} end; handle_message(#tflush{}, State) -> % Currently there is no support for parallel messages, so this does simply diff --git a/src/e9p_transport.erl b/src/e9p_transport.erl index 3994a64..2c90803 100644 --- a/src/e9p_transport.erl +++ b/src/e9p_transport.erl @@ -8,10 +8,10 @@ % -include_lib("kernel/include/logger.hrl"). --export([send/3, read/1, read_stream/1]). +-export([send/4, read/1, read_stream/1]). -send(Socket, Tag, Message) -> - Encoded = e9p_msg:encode(Tag, Message), +send(Socket, Tag, Message, Version) -> + Encoded = e9p_msg:encode(Tag, Message, Version), Size = iolist_size(Encoded) + 4, gen_tcp:send(Socket, [<>, Encoded]).