summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Nordberg <linus@sunet.se>2019-06-30 16:47:56 +0200
committerLinus Nordberg <linus@sunet.se>2019-06-30 16:49:33 +0200
commita0a85e3c0fe9ade9fb3c9171e99e2c8d0308293f (patch)
treec17540f8848d37a4e806acfb35bc969e684ecbe1
parentf0afd846071e20c7a3da7911609e3ba51debd52b (diff)
at p11 client disconnect, server asks manager to kill remote
Also, comment out all debug printouts reporting about octets sent and received, all four types. Missing: Switching remote behind the back of the p11 client, including replaying whatever needs to be replayed.
-rw-r--r--p11p-daemon/src/p11p_remote.erl10
-rw-r--r--p11p-daemon/src/p11p_remote_manager.erl18
-rw-r--r--p11p-daemon/src/p11p_server.erl24
3 files changed, 34 insertions, 18 deletions
diff --git a/p11p-daemon/src/p11p_remote.erl b/p11p-daemon/src/p11p_remote.erl
index e40e2e2..200afdc 100644
--- a/p11p-daemon/src/p11p_remote.erl
+++ b/p11p-daemon/src/p11p_remote.erl
@@ -58,7 +58,7 @@ init([TokName, ModPath]) ->
handle_call({add_to_outbuf, Data}, _From, State) ->
{reply, ok, do_add_to_outbuf(Data, State)};
handle_call({request, Request}, {FromPid, _Tag}, #state{port = Port} = State) ->
- lager:debug("~p: sending request from ~p to remote ~p", [self(), FromPid, Port]),
+ %%lager:debug("~p: sending request from ~p to remote ~p", [self(), FromPid, Port]),
NewState = do_send(do_add_to_outbuf(p11p_rpc:serialise(Request), State)),
{reply, ok, NewState#state{replyto = FromPid, timer = start_timer(Port)}};
handle_call(Request, _From, State) ->
@@ -95,12 +95,12 @@ code_change(_OldVersion, State, _Extra) ->
%% Private
do_add_to_outbuf(Data, #state{outbuf = Buf} = State) ->
- lager:debug("~p: adding ~B octets to outbuf", [self(), size(Data)]),
+ %%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)]),
+ %%lager:debug("~p: sending ~B octets to remote", [self(), size(Buf)]),
port_command(Port, Buf),
State#state{outbuf = <<>>}.
@@ -115,9 +115,9 @@ handle_remote_data(#state{replyto = Pid, timer = Timer} = State, Msg, Data) ->
end.
start_timer(Port) ->
- lager:debug("~p: starting timer", [self()]),
+ %%lager:debug("~p: starting timer", [self()]),
erlang:start_timer(3000, self(), Port).
cancel_timer(Timer) ->
- lager:debug("~p: canceling timer", [self()]),
+ %%lager:debug("~p: canceling timer", [self()]),
erlang:cancel_timer(Timer, [{async, true}, {info, false}]).
diff --git a/p11p-daemon/src/p11p_remote_manager.erl b/p11p-daemon/src/p11p_remote_manager.erl
index 03d43e4..633a4aa 100644
--- a/p11p-daemon/src/p11p_remote_manager.erl
+++ b/p11p-daemon/src/p11p_remote_manager.erl
@@ -12,7 +12,7 @@
%% API.
-export([start_link/0]).
--export([remote_for_token/1]). % For servers.
+-export([remote_for_token/1, kill_remote/2]). % For servers.
-export([timeout/1]). % For remotes.
%% Genserver callbacks.
@@ -44,6 +44,9 @@ start_link() ->
-spec remote_for_token(string()) -> pid().
remote_for_token(TokName) ->
gen_server:call(?MODULE, {remote_for_token, TokName}).
+kill_remote(TokName, Pid) ->
+ gen_server:call(?MODULE, {kill_remote, {TokName, Pid}}).
+
timeout(TokName) ->
gen_server:call(?MODULE, {timeout, TokName}).
@@ -76,6 +79,19 @@ handle_call({timeout, TokName}, _From, #state{tokens = Tokens} = State) ->
NewState = State#state{tokens = Tokens#{TokName := NewToken}},
lager:debug("~p: ~s: updated token: ~p", [self(), TokName, NewToken]),
{reply, ok, NewState};
+handle_call({kill_remote, {TokName, Pid}}, From, #state{tokens = Tokens} = State) ->
+ lager:debug("~p: killing off remote ~p on request from ~p", [self(), Pid, From]),
+ gen_server:stop(Pid),
+ #{TokName := Token} = Tokens,
+ Remotes = Token#token.remotes,
+ NewRemotes = lists:map(fun(E) ->
+ case E#remote.pid of
+ Pid -> E#remote{pid = undefined};
+ _ -> E
+ end end, Remotes),
+ NewToken = Token#token{remotes = NewRemotes},
+ NewState = State#state{tokens = Tokens#{TokName := NewToken}},
+ {reply, ok, NewState};
handle_call(Call, _From, State) ->
lager:debug("Unhandled call: ~p~n", [Call]),
{reply, unhandled, State}.
diff --git a/p11p-daemon/src/p11p_server.erl b/p11p-daemon/src/p11p_server.erl
index 880a8c0..ed2c719 100644
--- a/p11p-daemon/src/p11p_server.erl
+++ b/p11p-daemon/src/p11p_server.erl
@@ -17,6 +17,7 @@
%% Records and types.
-record(state, {
tokname :: string(),
+ remote :: pid() | undefined,
sockpath :: string(), % FIXME: filename(3erl)
socket :: gen_tcp:socket(),
msg :: p11rpc_msg() | undefined,
@@ -49,7 +50,7 @@ handle_call({add_to_clientbuf, Data}, _From, #state{clientbuf = Buf} = State) ->
handle_call({response, Response}, _From, #state{socket = ClientPort, clientbuf = Buf} = State) ->
Data = p11p_rpc:serialise(Response),
NewBuf = <<Buf/binary, Data/binary>>,
- lager:debug("~p: sending ~B octets back to client as reply", [self(), size(NewBuf)]),
+ %%lager:debug("~p: sending ~B octets back to client as reply", [self(), size(NewBuf)]),
ok = gen_tcp:send(ClientPort, NewBuf), % TODO: what about short writes?
{reply, {ok, size(NewBuf)}, State#state{clientbuf = <<>>}};
handle_call(Call, _From, State) ->
@@ -75,18 +76,16 @@ handle_cast(Cast, State) ->
lager:debug("~p: Unhandled cast: ~p~n", [self(), Cast]),
{noreply, State}.
-handle_info({tcp, Port, Data}, #state{tokname = TokName, msg = Msg} = State) when Msg == undefined ->
- lager:debug("~p: received ~B octets from client on socket ~p, from new client",
- [self(), size(Data), Port]),
+handle_info({tcp, _Port, Data}, #state{tokname = TokName, remote = Remote} = State) when Remote == undefined ->
+ %%lager:debug("~p: received ~B octets from client on socket ~p, from new client", [self(), size(Data), Port]),
<<Version:8, NewData/binary>> = Data,
- p11p_remote:add_to_outbuf(p11p_remote_manager:remote_for_token(TokName), <<Version>>), % FIXME: token reference needs to be cached, for consistancy at least across this and the next function head
+ NewRemote = p11p_remote_manager:remote_for_token(TokName),
+ p11p_remote:add_to_outbuf(NewRemote, <<Version>>),
NewState = handle_client_data(State, p11p_rpc:new(), NewData),
- {noreply, NewState};
-handle_info({tcp, Port, Data}, #state{msg = Msg} = State) ->
- lager:debug("~p: received ~B octets from client on socket ~p, with ~B octets already in buffer",
- [self(), size(Data), Port, size(Msg#p11rpc_msg.buffer)]),
- NewState = handle_client_data(State, Msg, Data),
- {noreply, NewState};
+ {noreply, NewState#state{remote = NewRemote}};
+handle_info({tcp, _Port, Data}, #state{msg = Msg} = State) ->
+ %%lager:debug("~p: received ~B octets from client on socket ~p, with ~B octets already in buffer", [self(), size(Data), Port, size(Msg#p11rpc_msg.buffer)]),
+ {noreply, handle_client_data(State, Msg, Data)};
handle_info({tcp_closed, Port}, State) ->
lager:debug("~p: socket ~p closed", [self(), Port]),
{stop, {shutdown, close_by_client}, State};
@@ -94,9 +93,10 @@ handle_info(Info, State) ->
lager:debug("~p: Unhandled info: ~p~n", [self(), Info]),
{noreply, State}.
-terminate(_Reason, #state{sockpath = _SocketPath, socket = Socket}) ->
+terminate(_Reason, #state{socket = Socket, tokname = TokName, remote = Remote}) ->
lager:debug("~p: terminated", [self()]),
gen_tcp:close(Socket),
+ p11p_remote_manager:kill_remote(TokName, Remote),
ok.
code_change(_OldVersion, State, _Extra) ->