summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rwxr-xr-xtest/listpermdb.erl53
1 files changed, 43 insertions, 10 deletions
diff --git a/test/listpermdb.erl b/test/listpermdb.erl
index 4000971..526ca98 100755
--- a/test/listpermdb.erl
+++ b/test/listpermdb.erl
@@ -9,7 +9,7 @@
-define(DATA_COMMIT_START_COOKIE, 16#75c2e4b3d5f643a1).
-define(DATA_COMMIT_END_COOKIE, 16#2b05eed61b5af550).
-define(INDEX_COMMIT_END_COOKIE, 16#2fb1778c74a402e4).
--define(DATA_FILE_COOKIE, 16#d53551ba539a4252).
+-define(DATA_FILE_COOKIE, 16#99c99d588b1e7983).
-define(INDEX_FILE_COOKIE, 16#b7e16b02ba8a6d1b).
-define(DATA_ENTRY_COOKIE, 16#e7c1cdc2ba3dc77c).
-define(INDEX_NODE_COOKIE, 16#2e0f555ad73210d1).
@@ -100,12 +100,20 @@ printindex(<<Unknown:16/binary, _Rest/binary>>, FileOffset) ->
error.
printdata(<<>>, FileOffset) ->
+ io:format("reached end of file~n", []),
{ok, FileOffset};
printdata(<<?DATA_ENTRY_COOKIE:64, Key:32/binary, 1:16, Length:16, Rest/binary>>, FileOffset) ->
FileOffset2 = FileOffset + 8 + 32 + 4,
io:format("data ~p key ~p length ~p~n", [FileOffset, Key, Length]),
- <<Data:Length/binary, Rest2/binary>> = Rest,
- printdata(Rest2, FileOffset2 + Length);
+ case Rest of
+ <<Data:Length/binary, Rest2/binary>> ->
+ printdata(Rest2, FileOffset2 + Length);
+ _ ->
+ io:format("data was truncated, remaining bytes: ~p ~p~n",
+ [size(Rest),
+ binary:part(Rest, 0, min(size(Rest), 16))]),
+ error
+ end;
printdata(<<?DATA_COMMIT_START_COOKIE:64, Rest2/binary>> = Rest, FileOffset) ->
Padding = case FileOffset rem 4 of
0 ->
@@ -118,16 +126,41 @@ printdata(<<?DATA_COMMIT_START_COOKIE:64, Rest2/binary>> = Rest, FileOffset) ->
1
end,
io:format("printdata: ~p ~p~n", [Padding, FileOffset]),
- <<0:Padding/unit:8, CommitLength:32, CommitChecksum:32/binary, ?DATA_COMMIT_END_COOKIE:64, Rest3/binary>> = Rest2,
- {{CommitLength, CommitChecksum, Rest3}, FileOffset + 8 + Padding + 4, FileOffset + 8 + Padding + 4 + 32 + 8};
-printdata(<<Unknown:16/binary, _Rest/binary>>, FileOffset) ->
- io:format("unknown byte: ~p at ~p~n", [Unknown, FileOffset]),
- error.
+ case Rest2 of
+ <<0:Padding/unit:8,
+ CommitLength:64,
+ CommitChecksum:32/binary,
+ ?DATA_COMMIT_END_COOKIE:64,
+ Rest3/binary>> ->
+ {{CommitLength, CommitChecksum, Rest3},
+ FileOffset + 8 + Padding + 8, FileOffset +
+ 8 + Padding + 8 + 32 + 8};
+ _ ->
+ io:format("commit trailer was not correctly formed at ~p, "
+ ++ "expected padding ~p, remaining bytes: ~p ~w~n",
+ [FileOffset, Padding, size(Rest),
+ binary:part(Rest, 0, min(size(Rest), 64))]),
+ error
+ end;
+printdata(Data, FileOffset) ->
+ Unknown = binary:part(Data, 0, min(size(Data), 16)),
+ io:format("unknown byte: ~p at ~p~n", [Unknown, FileOffset]),
+ error.
+
+read_whole_file(File, Size) ->
+ case file:read(File, Size) of
+ {ok, Data} ->
+ RestData = read_whole_file(File, Size),
+ <<Data/binary, RestData/binary>>;
+ eof ->
+ <<>>
+ end.
main([Filename]) ->
{ok, FileInfo} = file:read_file_info(Filename),
File = openfile(Filename),
- {ok, Data} = file:read(File, FileInfo#file_info.size),
- io:format("read ~p bytes~n", [size(Data)]),
+ Data = read_whole_file(File, FileInfo#file_info.size),
+ io:format("read ~p bytes, file size ~p~n",
+ [size(Data), FileInfo#file_info.size]),
ok = printfile(Data),
ok.