diff options
Diffstat (limited to 'p11p-daemon/src/p11p_server.erl')
-rw-r--r-- | p11p-daemon/src/p11p_server.erl | 46 |
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)}. |