1+ from __future__ import annotations
2+
13import io
24
35from dissect .target .helpers .nfs .nfs import (
1012 MountStat ,
1113 NfsStat ,
1214 NfsTime3 ,
15+ Read3args ,
16+ Read3resok ,
1317 ReadDirPlusParams ,
1418 ReadDirPlusResult3 ,
1519 SpecData3 ,
2529
2630class MountResultDeserializer (Deserializer [MountOK | MountStat ]):
2731 def deserialize (self , payload : io .BytesIO ) -> MountOK | None :
28- mountStat = self ._read_enum (payload , MountStat )
29- if mountStat != MountStat .MNT3_OK :
30- return mountStat
32+ mount_stat = self ._read_enum (payload , MountStat )
33+ if mount_stat != MountStat .MNT3_OK :
34+ return mount_stat
3135 filehandle_bytes = self ._read_var_length_opaque (payload )
32- authFlavors = self ._read_var_length (payload , Int32Serializer ())
36+ auth_flavors = self ._read_var_length (payload , Int32Serializer ())
3337
34- return MountOK (FileHandle3 (filehandle_bytes ), authFlavors )
38+ return MountOK (FileHandle3 (filehandle_bytes ), auth_flavors )
3539
3640
3741class ReadDirPlusParamsSerializer (Serializer [ReadDirPlusParams ]):
@@ -73,10 +77,10 @@ def deserialize(self, payload: io.BytesIO) -> FileAttributes3:
7377 rdev = SpecDataSerializer ().deserialize (payload )
7478 fsid = self ._read_uint64 (payload )
7579 fileid = self ._read_uint64 (payload )
76- timeDeserializer = NfsTimeSerializer ()
77- atime = timeDeserializer .deserialize (payload )
78- mtime = timeDeserializer .deserialize (payload )
79- ctime = timeDeserializer .deserialize (payload )
80+ time_deserializer = NfsTimeSerializer ()
81+ atime = time_deserializer .deserialize (payload )
82+ mtime = time_deserializer .deserialize (payload )
83+ ctime = time_deserializer .deserialize (payload )
8084
8185 return FileAttributes3 (type , mode , nlink , uid , gid , size , used , rdev , fsid , fileid , atime , mtime , ctime )
8286
@@ -87,8 +91,8 @@ def deserialize(self, payload: io.BytesIO) -> EntryPlus3:
8791 name = self ._read_string (payload )
8892 cookie = self ._read_uint64 (payload )
8993 attributes = self ._read_optional (payload , FileAttributesSerializer ())
90- handleBytes = self ._read_optional (payload , OpaqueVarLengthSerializer ())
91- handle = FileHandle3 (handleBytes ) if handleBytes is not None else None
94+ handle_bytes = self ._read_optional (payload , OpaqueVarLengthSerializer ())
95+ handle = FileHandle3 (handle_bytes ) if handle_bytes is not None else None
9296
9397 return EntryPlus3 (fileid , name , cookie , attributes , handle )
9498
@@ -110,6 +114,27 @@ def deserialize(self, payload: io.BytesIO) -> ReadDirPlusResult3:
110114
111115 entries .append (entry )
112116
113- eof = self ._read_enum (payload , Bool )
117+ eof = self ._read_enum (payload , Bool ) == Bool . TRUE
114118
115119 return ReadDirPlusResult3 (dir_attributes , CookieVerf3 (cookieverf ), entries , eof )
120+
121+
122+ class Read3ArgsSerializer (Serializer [ReadDirPlusParams ]):
123+ def serialize (self , args : Read3args ) -> bytes :
124+ result = self ._write_var_length_opaque (args .file .opaque )
125+ result += self ._write_uint64 (args .offset )
126+ result += self ._write_uint32 (args .count )
127+ return result
128+
129+
130+ class Read3ResultDeserializer (Deserializer [Read3resok ]):
131+ def deserialize (self , payload : io .BytesIO ) -> Read3resok :
132+ stat = self ._read_enum (payload , NfsStat )
133+ if stat != NfsStat .NFS3_OK :
134+ return stat
135+
136+ file_attributes = self ._read_optional (payload , FileAttributesSerializer ())
137+ count = self ._read_uint32 (payload )
138+ eof = self ._read_enum (payload , Bool ) == Bool .TRUE
139+ data = self ._read_var_length_opaque (payload )
140+ return Read3resok (file_attributes , count , eof , data )
0 commit comments