summaryrefslogtreecommitdiff
path: root/p11p-daemon
diff options
context:
space:
mode:
authorLinus Nordberg <linus@sunet.se>2019-06-28 16:18:41 +0200
committerLinus Nordberg <linus@sunet.se>2019-06-28 16:18:41 +0200
commitdb9fa57d1c8858661e85e3ce40cf94de4931e4f9 (patch)
tree95add51271312640952a6972073b628679687b1d /p11p-daemon
parentf829ef06f81d5a8642ebaff7b6bb01c1483a86a7 (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.erl65
-rw-r--r--p11p-daemon/src/p11p_rpc.erl2
-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.erl7
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}