]> git.r.bdr.sh - rbdr/mobius/blobdiff - hotline/file_name_with_info.go
Account for the root
[rbdr/mobius] / hotline / file_name_with_info.go
index ac64c74567493646f60357ca4b7e75616c488413..3a4a79563bdbde613e399173b3cec4edc6cfba82 100644 (file)
@@ -8,46 +8,55 @@ import (
 )
 
 type FileNameWithInfo struct {
-       fileNameWithInfoHeader
-       name []byte // File name
+       FileNameWithInfoHeader
+       Name []byte // File Name
+
+       readOffset int // Internal offset to track read progress
 }
 
-// fileNameWithInfoHeader contains the fixed length fields of FileNameWithInfo
-type fileNameWithInfoHeader struct {
+// FileNameWithInfoHeader contains the fixed length fields of FileNameWithInfo
+type FileNameWithInfoHeader struct {
        Type       [4]byte // File type code
        Creator    [4]byte // File creator code
        FileSize   [4]byte // File Size in bytes
        RSVD       [4]byte
        NameScript [2]byte // ??
-       NameSize   [2]byte // Length of name field
+       NameSize   [2]byte // Length of Name field
 }
 
-func (f *fileNameWithInfoHeader) nameLen() int {
+func (f *FileNameWithInfoHeader) nameLen() int {
        return int(binary.BigEndian.Uint16(f.NameSize[:]))
 }
 
 // Read implements io.Reader for FileNameWithInfo
-func (f *FileNameWithInfo) Read(b []byte) (int, error) {
-       return copy(b,
-               slices.Concat(
-                       f.Type[:],
-                       f.Creator[:],
-                       f.FileSize[:],
-                       f.RSVD[:],
-                       f.NameScript[:],
-                       f.NameSize[:],
-                       f.name,
-               ),
-       ), io.EOF
+func (f *FileNameWithInfo) Read(p []byte) (int, error) {
+       buf := slices.Concat(
+               f.Type[:],
+               f.Creator[:],
+               f.FileSize[:],
+               f.RSVD[:],
+               f.NameScript[:],
+               f.NameSize[:],
+               f.Name,
+       )
+
+       if f.readOffset >= len(buf) {
+               return 0, io.EOF // All bytes have been read
+       }
+
+       n := copy(p, buf[f.readOffset:])
+       f.readOffset += n
+
+       return n, nil
 }
 
 func (f *FileNameWithInfo) Write(p []byte) (int, error) {
-       err := binary.Read(bytes.NewReader(p), binary.BigEndian, &f.fileNameWithInfoHeader)
+       err := binary.Read(bytes.NewReader(p), binary.BigEndian, &f.FileNameWithInfoHeader)
        if err != nil {
                return 0, err
        }
-       headerLen := binary.Size(f.fileNameWithInfoHeader)
-       f.name = p[headerLen : headerLen+f.nameLen()]
+       headerLen := binary.Size(f.FileNameWithInfoHeader)
+       f.Name = p[headerLen : headerLen+f.nameLen()]
 
        return len(p), nil
 }