diff options
author | Linus Nordberg <linus@sunet.se> | 2019-06-28 16:18:41 +0200 |
---|---|---|
committer | Linus Nordberg <linus@sunet.se> | 2019-06-28 16:18:41 +0200 |
commit | db9fa57d1c8858661e85e3ce40cf94de4931e4f9 (patch) | |
tree | 95add51271312640952a6972073b628679687b1d /p11p-daemon | |
parent | f829ef06f81d5a8642ebaff7b6bb01c1483a86a7 (diff) |
don't send that version octet by itself
Instead, add it to new remote outbuf.
Diffstat (limited to 'p11p-daemon')
-rw-r--r-- | p11p-daemon/src/p11p_remote.erl | 65 | ||||
-rw-r--r-- | p11p-daemon/src/p11p_rpc.erl | 2 | ||||
-rw-r--r-- | p11p-daemon/src/p11p_rpc.hrl (renamed from p11p-daemon/src/p11p-rpc.hrl) | 0 | ||||
-rw-r--r-- | p11p-daemon/src/p11p_server.erl | 7 |
4 files changed, 40 insertions, 34 deletions
diff --git a/p11p-daemon/src/p11p_remote.erl b/p11p-daemon/src/p11p_remote.erl index 784f938..c91f47c 100644 --- a/p11p-daemon/src/p11p_remote.erl +++ b/p11p-daemon/src/p11p_remote.erl @@ -14,7 +14,9 @@ %% API. -export([start_link/3]). --export([send/3]). +-export([request/3, add_to_outbuf/2]). + +-include("p11p_rpc.hrl"). %% Genserver callbacks. -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, @@ -25,7 +27,8 @@ port :: port(), replyto :: pid() | undefined, timer :: reference() | undefined, - token :: string() + token :: string(), % Name + outbuf = <<>> :: binary() }). %% FIXME: move to config @@ -37,9 +40,12 @@ start_link(ServName, TokName, ModPath) -> lager:info("~p: p11p_remote starting for ~s", [ServName, ModPath]), gen_server:start_link({local, ServName}, ?MODULE, [TokName, ModPath], []). --spec send(pid(), pid(), binary()) -> ok. -send(From, Remote, Data) -> - gen_server:cast(Remote, {send, From, Data}). +-spec request(pid(), pid(), p11rpc_msg()) -> ok. +request(From, Remote, Request) -> + gen_server:cast(Remote, {request, From, Request}). + +add_to_outbuf(Remote, Data) -> + gen_server:cast(Remote, {add_to_outbuf, Data}). %% Genserver callbacks. init([TokName, ModPath]) -> @@ -52,36 +58,26 @@ handle_call(Request, _From, State) -> lager:debug("~p: Unhandled call: ~p~n", [self(), Request]), {reply, unhandled, State}. -handle_cast({send, From, Data}, #state{port = Port} = State) -> +handle_cast({add_to_outbuf, Data}, State) -> + {noreply, do_add_to_outbuf(Data, State)}; +handle_cast({request, From, Request}, #state{port = Port} = State) -> lager:debug("~p: sending request to remote ~p", [self(), Port]), - port_command(Port, Data), - Timer = erlang:start_timer(3000, self(), Port), - NewState = State#state{replyto = From, timer = Timer}, - {noreply, NewState}; + NewState = do_add_to_outbuf(p11p_rpc:serialise(Request), State), + NewState2 = do_send(NewState), + Timer = erlang:start_timer(3000, self(), Port), % Keep below gen_server:call timeout (default 5000). + NewState3 = NewState2#state{replyto = From, timer = Timer}, + {noreply, NewState3}; handle_cast(Request, State) -> lager:debug("~p: Unhandled cast: ~p~n", [self(), Request]), {noreply, State}. -handle_info({Port, {data, Data}}, #state{replyto = Pid, timer = Timer} = State) -> - if - Port == State#state.port -> - erlang:cancel_timer(Timer, [{async, true}, {info, false}]), - p11p_server:reply(Pid, Data); - true -> - lager:debug("~p: data from unknown port ~p", [self(), Port]) - end, +handle_info({Port, {data, Data}}, #state{replyto = Pid, timer = Timer} = State) when Port == State#state.port -> + erlang:cancel_timer(Timer, [{async, true}, {info, false}]), + p11p_server:reply(Pid, Data), {noreply, State}; -handle_info({timeout, Timer, Port}, #state{token = TokName} = State) -> - NewState = - if - Port == State#state.port andalso Timer == State#state.timer -> - p11p_remote_manager:timeout(TokName), - State#state{timer = undefined}; - true -> - lager:debug("~p: unknown timer ~p fired for port ~p", - [self(), Timer, Port]), - State - end, +handle_info({timeout, Timer, Port}, #state{token = TokName} = State) when Port == State#state.port andalso Timer == State#state.timer -> + p11p_remote_manager:timeout(TokName), + NewState = State#state{timer = undefined}, {noreply, NewState}; handle_info(Info, State) -> lager:debug("~p: Unhandled info: ~p~n", [self(), Info]), @@ -92,3 +88,14 @@ terminate(_Reason, _State) -> code_change(_OldVersion, State, _Extra) -> {ok, State}. + +%% Private +do_add_to_outbuf(Data, #state{outbuf = Buf} = State) -> + lager:debug("~p: adding ~B octets to outbuf", [self(), size(Data)]), + NewBuf = <<Buf/binary, Data/binary>>, + State#state{outbuf = NewBuf}. + +do_send(#state{port = Port, outbuf = Buf} = State) -> + lager:debug("~p: sending ~B octets to remote", [self(), size(Buf)]), + port_command(Port, Buf), + State#state{outbuf = <<>>}. diff --git a/p11p-daemon/src/p11p_rpc.erl b/p11p-daemon/src/p11p_rpc.erl index 8292ccf..897bb00 100644 --- a/p11p-daemon/src/p11p_rpc.erl +++ b/p11p-daemon/src/p11p_rpc.erl @@ -4,7 +4,7 @@ -export([parse/2, new/0, new/1, serialise/1]). --include("p11p-rpc.hrl"). +-include("p11p_rpc.hrl"). parse(M) -> parse(M, <<>>). diff --git a/p11p-daemon/src/p11p-rpc.hrl b/p11p-daemon/src/p11p_rpc.hrl index 96af9f1..96af9f1 100644 --- a/p11p-daemon/src/p11p-rpc.hrl +++ b/p11p-daemon/src/p11p_rpc.hrl diff --git a/p11p-daemon/src/p11p_server.erl b/p11p-daemon/src/p11p_server.erl index ea49219..accc86a 100644 --- a/p11p-daemon/src/p11p_server.erl +++ b/p11p-daemon/src/p11p_server.erl @@ -4,7 +4,7 @@ -module(p11p_server). -behaviour(gen_server). --include("p11p-rpc.hrl"). +-include("p11p_rpc.hrl"). %% API. -export([start_link/1]). @@ -69,8 +69,7 @@ handle_info({tcp, Port, Data}, #state{tokname = TokName, msg = Msg} = State) whe lager:debug("~p: received ~B octets from client on socket ~p, from new client", [self(), size(Data), Port]), <<Version:8, NewData/binary>> = Data, - %% FIXME: don't send, just add to outbuf - ok = p11p_remote:send(self(), p11p_remote_manager:remote_for_token(TokName), <<Version>>), + p11p_remote:add_to_outbuf(p11p_remote_manager:remote_for_token(TokName), <<Version>>), NewState = handle_client_data(State, p11p_rpc:new(), NewData), {noreply, NewState}; handle_info({tcp, Port, Data}, #state{msg = Msg} = State) -> @@ -98,7 +97,7 @@ handle_client_data(#state{tokname = TokName} = State, Msg, Data) -> case p11p_rpc:parse(Msg, Data) of {done, NewMsg} -> Remote = p11p_remote_manager:remote_for_token(TokName), - ok = p11p_remote:send(self(), Remote, p11p_rpc:serialise(NewMsg)), + ok = p11p_remote:request(self(), Remote, NewMsg), State#state{msg = p11p_rpc:new(NewMsg#p11rpc_msg.buffer)}; {needmore, NewMsg} -> State#state{msg = NewMsg} |