summaryrefslogtreecommitdiff
path: root/p11p-daemon/src/p11p_server.erl
diff options
context:
space:
mode:
Diffstat (limited to 'p11p-daemon/src/p11p_server.erl')
-rw-r--r--p11p-daemon/src/p11p_server.erl46
1 files changed, 34 insertions, 12 deletions
diff --git a/p11p-daemon/src/p11p_server.erl b/p11p-daemon/src/p11p_server.erl
index ef8877d..7b05da7 100644
--- a/p11p-daemon/src/p11p_server.erl
+++ b/p11p-daemon/src/p11p_server.erl
@@ -84,14 +84,17 @@ handle_cast({token_gone, Hangup}, State = #state{send_count = Sent}) ->
Resp = p11p_rpc:error(State#state.req_out#p11rpc_msg.call_code,
?CKR_DEVICE_ERROR),
{ok, _} = send_response(State#state.socket, p11p_rpc:serialise(Resp), Sent),
- NewState = State#state{client = undefined,
- req_out = undefined,
+ NewState = State#state{req_out = undefined,
send_count = Sent + 1},
case Hangup of
true ->
- {close, NewState};
+ lager:info("~p: Token reported gone, no more retries, closing.", [self()]),
+ {stop, normal, NewState}; %FIXME: no need to update state, i think
false ->
- {noreply, NewState}
+ lager:info("~p: Token reported gone, retrying with new token.", [self()]),
+ {noreply,
+ NewState#state{client =
+ p11p_manager:client_for_token(State#state.tokname)}}
end;
handle_cast(Cast, State) ->
@@ -101,7 +104,7 @@ handle_cast(Cast, State) ->
%% First packet from P11 client.
handle_info({tcp, Port, DataIn}, #state{tokname = TokName} = S)
when S#state.client == undefined ->
- %%lager:debug("~p: received ~B octets from client on socket ~p, from new client", [self(), size(Data), Port]),
+ lager:debug("~p: received ~B octets from client on socket ~p, from new client", [self(), size(DataIn), Port]),
<<RPCVersion:8, Data/binary>> = DataIn,
case RPCVersion of
?RPC_VERSION ->
@@ -117,8 +120,8 @@ handle_info({tcp, Port, DataIn}, #state{tokname = TokName} = S)
end;
%% Subsequent packages from P11 client.
-handle_info({tcp, _Port, DataIn}, #state{req_in = Msg} = S) ->
- %%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)]),
+handle_info({tcp, Port, DataIn}, #state{req_in = Msg} = S) ->
+ lager:debug("~p: received ~B octets from client on socket ~p, with ~B octets already in buffer", [self(), size(DataIn), Port, size(Msg#p11rpc_msg.buffer)]),
{noreply, p11_app_data(S, Msg, DataIn)};
handle_info({tcp_closed, Port}, S) ->
@@ -151,10 +154,29 @@ p11_app_data(#state{client = Client, recv_count = Recv} = S, MsgIn,
S#state{req_in = Msg};
{done, Msg} ->
lager:debug("~p: -> ~s", [self(), p11p_rpc:dump(Msg)]),
- {ok, _BytesSent} = p11p_client:request(Client, Msg),
- S#state{req_out = Msg,
- req_in = p11p_rpc:new(Msg#p11rpc_msg.buffer),
- recv_count = Recv + 1}
+ case p11p_client:request(Client, Msg) of
+ ack ->
+ lager:debug("~p: acking request", [self()]),
+ Resp = p11p_rpc:ok(Msg#p11rpc_msg.call_code),
+ {ok, _} = send_response(S#state.socket,
+ p11p_rpc:serialise(Resp),
+ S#state.send_count),
+ S#state{req_in = p11p_rpc:new(Msg#p11rpc_msg.buffer),
+ send_count = S#state.send_count + 1};
+ nack ->
+ lager:debug("~p: nacking request", [self()]),
+ Resp = p11p_rpc:error(Msg#p11rpc_msg.call_code,
+ ?CKR_DEVICE_ERROR),
+ {ok, _} = send_response(S#state.socket,
+ p11p_rpc:serialise(Resp),
+ S#state.send_count),
+ S#state{req_in = p11p_rpc:new(Msg#p11rpc_msg.buffer),
+ send_count = S#state.send_count + 1};
+ {ok, _BytesSent} ->
+ S#state{req_out = Msg,
+ req_in = p11p_rpc:new(Msg#p11rpc_msg.buffer),
+ recv_count = Recv + 1}
+ end
end.
send_response(Sock, Inbuf, Sent) ->
@@ -162,6 +184,6 @@ send_response(Sock, Inbuf, Sent) ->
0 -> <<?RPC_VERSION:8, Inbuf/binary>>;
_ -> Inbuf
end,
- %%lager:debug("~p: sending ~B octets as response", [self(), size(Inbuf)]),
+ lager:debug("~p: sending ~B octets as response", [self(), size(Inbuf)]),
ok = gen_tcp:send(Sock, Buf),
{ok, size(Inbuf)}.