diff options
author | Linus Nordberg <linus@sunet.se> | 2019-06-30 16:47:56 +0200 |
---|---|---|
committer | Linus Nordberg <linus@sunet.se> | 2019-06-30 16:49:33 +0200 |
commit | a0a85e3c0fe9ade9fb3c9171e99e2c8d0308293f (patch) | |
tree | c17540f8848d37a4e806acfb35bc969e684ecbe1 /p11p-daemon | |
parent | f0afd846071e20c7a3da7911609e3ba51debd52b (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.
Diffstat (limited to 'p11p-daemon')
-rw-r--r-- | p11p-daemon/src/p11p_remote.erl | 10 | ||||
-rw-r--r-- | p11p-daemon/src/p11p_remote_manager.erl | 18 | ||||
-rw-r--r-- | p11p-daemon/src/p11p_server.erl | 24 |
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) -> |