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