summaryrefslogtreecommitdiff
path: root/p11p-daemon/src/p11p_remote_manager.erl
diff options
context:
space:
mode:
Diffstat (limited to 'p11p-daemon/src/p11p_remote_manager.erl')
-rw-r--r--p11p-daemon/src/p11p_remote_manager.erl18
1 files changed, 17 insertions, 1 deletions
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}.