diff --git a/src/e9p_msg.erl b/src/e9p_msg.erl index d52ad7d..ba40f53 100644 --- a/src/e9p_msg.erl +++ b/src/e9p_msg.erl @@ -6,7 +6,7 @@ %% @end -module(e9p_msg). --export([parse/1, encode/2, encode_stat/1]). +-export([parse/1, encode/2, encode_stat/1, parse_stat/1]). -export_type([tag/0, message/0, @@ -166,8 +166,7 @@ do_parse(?Rread, <>) -> do_parse(Type, Data) -> {error, {invalid_message, Type, Data}}. -parse_stat(<<_Size:2/?int, - Type:2/?int, +parse_stat(< Dev, qid => binary_to_qid(QID), mode => Mode, - atime => calendar:system_time_to_universal_time(Atime, seconds), - mtime => calendar:system_time_to_universal_time(Mtime, seconds), + atime => Atime, + mtime => Mtime, length => Len, name => Name, uid => Uid, @@ -285,7 +284,7 @@ encode_stat(#{ }) -> Encoded = [<< Type:2/?int, - Dev:2/?int + Dev:4/?int >>, qid_to_binary(QID), <>, @@ -307,11 +306,12 @@ encode_str(Data) -> [<> | Data]. binary_to_qid(<>) -> - #{type => Type, version => Version, path => Path}. + #{type => Type, version => Version, path => Path, state => []}. qid_to_binary(#{type := Type, version := Version, path := Path}) -> <>. +time_to_encoded_sec(Sec) when is_integer(Sec) -> <>; time_to_encoded_sec(Time) -> Sec = calendar:universal_time_to_system_time(Time, [{unit, second}]), <>. diff --git a/test/e9p_msg_SUITE.erl b/test/e9p_msg_SUITE.erl new file mode 100644 index 0000000..5ad933f --- /dev/null +++ b/test/e9p_msg_SUITE.erl @@ -0,0 +1,33 @@ +% SPDX-FileCopyrightText: 2026 Ɓukasz Niemier <~@hauleth.dev> +% +% SPDX-License-Identifier: Apache-2.0 + +-module(e9p_msg_SUITE). + +-compile(export_all). + +-include("e9p_internal.hrl"). + +-include_lib("stdlib/include/assert.hrl"). +-include_lib("common_test/include/ct.hrl"). + +all() -> [stat_encode_decode]. + +stat_encode_decode(_Conf) -> + Stat = #{ + type => 0, + dev => 0, + qid => e9p:make_qid(directory, 0, 0, []), + mode => 0, + atime => 0, + mtime => 0, + length => 0, + name => <<>>, + uid => <<>>, + gid => <<>>, + muid => <<>> + }, + <> = iolist_to_binary(e9p_msg:encode_stat(Stat)), + Decoded = e9p_msg:parse_stat(Out), + ?assertEqual({ok, Stat}, Decoded). +