Pure Erlang implementation of 9p2000 protocol
filesystem fs 9p2000 erlang 9p

Make stat encoding more ergonomic

Do not require all fields to be present, as we can have default values
for non-critical ones.

hauleth.dev d863e1f6 7b3a98d3

verified
+29 -21
+28 -15
src/e9p_msg.erl
··· 272 272 {?Tread, <<FID:4/?int, Offset:8/?int, Len:4/?int>>}; 273 273 do_encode(#rread{data = Data}) -> 274 274 Len = iolist_size(Data), 275 - {?Rread, [<<Len:4/?int>>, Data]}. 275 + {?Rread, [<<Len:4/?int>> | Data]}. 276 276 277 - encode_stat(#{ 278 - type := Type, 279 - dev := Dev, 280 - qid := QID, 281 - mode := Mode, 282 - atime := Atime, 283 - mtime := Mtime, 284 - length := Len, 285 - name := Name, 286 - uid := Uid, 287 - gid := Gid, 288 - muid := MUid 289 - }) -> 277 + encode_stat(Stat) -> 278 + #{ 279 + type := Type, 280 + dev := Dev, 281 + qid := QID, 282 + mode := Mode, 283 + atime := Atime, 284 + mtime := Mtime, 285 + length := Len, 286 + name := Name, 287 + uid := Uid, 288 + gid := Gid, 289 + muid := MUid 290 + } = maps:merge( 291 + Stat, 292 + #{ 293 + type => 0, 294 + dev => 0, 295 + mode => 0, 296 + atime => 0, 297 + mtime => 0, 298 + uid => ~"", 299 + gid => ~"", 300 + muid => ~"" 301 + }), 290 302 Encoded = [<< 291 303 Type:2/?int, 292 304 Dev:4/?int ··· 309 321 310 322 encode_str(Data0) -> 311 323 Data = unicode:characters_to_binary(Data0), 324 + true = is_binary(Data), 312 325 Len = iolist_size(Data), 313 - [<<Len:?len>> | Data]. 326 + [<<Len:?len>>, Data]. 314 327 315 328 binary_to_qid(<<Type:1/?int, Version:4/?int, Path:8/?int>>) -> 316 329 #{type => Type, version => Version, path => Path, state => []}.
+1 -6
src/e9p_unfs.erl
··· 106 106 true -> filename:basename(Path) 107 107 end, 108 108 #{ 109 - type => 0, 110 - dev => 0, 111 109 qid => QID, 112 110 mode => Mode, 113 111 atime => Atime, 114 112 mtime => Mtime, 115 113 length => Len, 116 - name => Name, 117 - uid => ~"", 118 - gid => ~"", 119 - muid => ~"" 114 + name => Name 120 115 }.