summaryrefslogtreecommitdiff
path: root/p11p-daemon/src/p11p_rpc.erl
diff options
context:
space:
mode:
Diffstat (limited to 'p11p-daemon/src/p11p_rpc.erl')
-rw-r--r--p11p-daemon/src/p11p_rpc.erl85
1 files changed, 44 insertions, 41 deletions
diff --git a/p11p-daemon/src/p11p_rpc.erl b/p11p-daemon/src/p11p_rpc.erl
index 956cb34..a775d30 100644
--- a/p11p-daemon/src/p11p_rpc.erl
+++ b/p11p-daemon/src/p11p_rpc.erl
@@ -13,28 +13,30 @@ parse(M) ->
parse(M, <<>>).
-spec parse(p11rpc_msg(), binary()) -> {done, p11rpc_msg()} | {needmore, p11rpc_msg()} | {err, term()}.
-parse(#p11rpc_msg{buffer = Buf} = M, Data) when M#p11rpc_msg.state == header ->
- %% NOTE: Does _not_ consume buffer until it has at least 12 octets.
- NewBuf = <<Buf/binary, Data/binary>>,
- Msg = M#p11rpc_msg{buffer = NewBuf},
+parse(#p11rpc_msg{buffer = MsgBuf} = M, DataIn)
+ when M#p11rpc_msg.state == header ->
+ Buf = <<MsgBuf/binary, DataIn/binary>>,
+ Msg = M#p11rpc_msg{buffer = Buf},
if
- size(NewBuf) < 12 ->
+ size(Buf) < 12 ->
{needmore, Msg};
true ->
parse(consume_header(Msg))
end;
-parse(#p11rpc_msg{buffer = Buf} = M, Data) when M#p11rpc_msg.state == opts ->
- NewBuf = <<Buf/binary, Data/binary>>,
- Msg = consume_opts(M#p11rpc_msg{buffer = NewBuf}),
+parse(#p11rpc_msg{buffer = MsgBuf} = M, DataIn)
+ when M#p11rpc_msg.state == opts ->
+ Buf = <<MsgBuf/binary, DataIn/binary>>,
+ Msg = consume_opts(M#p11rpc_msg{buffer = Buf}),
case Msg#p11rpc_msg.state of
opts ->
{needmore, Msg};
data ->
parse(Msg)
end;
-parse(#p11rpc_msg{buffer = Buf} = M, Data) when M#p11rpc_msg.state == data ->
- NewBuf = <<Buf/binary, Data/binary>>,
- Msg = consume_data(M#p11rpc_msg{buffer = NewBuf}),
+parse(#p11rpc_msg{buffer = MsgBuf} = M, DataIn)
+ when M#p11rpc_msg.state == data ->
+ Buf = <<MsgBuf/binary, DataIn/binary>>,
+ Msg = consume_data(M#p11rpc_msg{buffer = Buf}),
case Msg#p11rpc_msg.state of
data ->
{needmore, Msg};
@@ -52,10 +54,11 @@ serialise(M) when M#p11rpc_msg.state == done,
DataLen = M#p11rpc_msg.data_len,
Options = M#p11rpc_msg.options,
Data = M#p11rpc_msg.data,
- <<CallCode:32/integer, OptLen:32/integer, DataLen:32/integer, Options/binary, Data/binary>>.
+ <<CallCode:32/integer,
+ OptLen:32/integer, DataLen:32/integer,
+ Options/binary, Data/binary>>.
%% Private
-
new() ->
new(<<>>).
new(Buffer) ->
@@ -68,34 +71,34 @@ consume_header(#p11rpc_msg{buffer = Buf} = Msg) ->
state = opts,
buffer = binary:part(Buf, 12, size(Buf) - 12)}.
-consume_opts(#p11rpc_msg{opt_len = Len, options = Opts, buffer = Buf} = Msg) ->
- {NewData, NewBuf} = move_between_binaries(Opts, Buf, Len - size(Opts)),
- NewState = case size(NewData) == Len of
- true ->
- data;
- false ->
- opts
- end,
- Msg#p11rpc_msg{options = NewData, buffer = NewBuf, state = NewState}.
-
-consume_data(#p11rpc_msg{data_len = Len, data = Data, buffer = Buf} = Msg) ->
- {NewData, NewBuf} = move_between_binaries(Data, Buf, Len - size(Data)),
- NewState = case size(NewData) == Len of
- true ->
- done;
- false ->
- data
- end,
- Msg#p11rpc_msg{data = NewData, buffer = NewBuf, state = NewState}.
-
-move_between_binaries(Dst, Src, N) when N == 0 ->
- {Dst, Src};
-move_between_binaries(Dst, Src, NAsk) ->
- N = min(NAsk, size(Src)),
- FromSrc = binary:part(Src, 0, N),
- NewDst = <<Dst/binary, FromSrc/binary>>,
- NewSrc = binary:part(Src, N, size(Src) - N),
- {NewDst, NewSrc}.
+consume_opts(#p11rpc_msg{opt_len = Len, options = Opts, buffer = MsgBuf} = M) ->
+ {Data, Buf} = move_between_binaries(Opts, MsgBuf, Len - size(Opts)),
+ State = case size(Data) == Len of
+ true ->
+ data;
+ false ->
+ opts
+ end,
+ M#p11rpc_msg{options = Data, buffer = Buf, state = State}.
+
+consume_data(#p11rpc_msg{data_len = Len, data = DataIn, buffer = MsgBuf} = M) ->
+ {Data, Buf} = move_between_binaries(DataIn, MsgBuf, Len - size(DataIn)),
+ State = case size(Data) == Len of
+ true ->
+ done;
+ false ->
+ data
+ end,
+ M#p11rpc_msg{data = Data, buffer = Buf, state = State}.
+
+move_between_binaries(DstIn, SrcIn, 0) ->
+ {DstIn, SrcIn};
+move_between_binaries(DstIn, SrcIn, NBytes) ->
+ N = min(NBytes, size(SrcIn)),
+ FromSrc = binary:part(SrcIn, 0, N),
+ Dst = <<DstIn/binary, FromSrc/binary>>,
+ Src = binary:part(SrcIn, N, size(SrcIn) - N),
+ {Dst, Src}.
%%%%%%%%%%%%%%
%% Unit tests.