github.com/Cloud-Foundations/Dominator@v0.3.4/lib/filesystem/encoding.go (about) 1 package filesystem 2 3 import ( 4 "encoding/gob" 5 "io" 6 ) 7 8 type encodedFileSystemType struct { 9 FileSystem 10 InodeTableLength uint64 11 } 12 13 type numberedInode struct { 14 InodeNumber uint64 15 GenericInode 16 } 17 18 func (fs *FileSystem) encode(writer io.Writer) error { 19 // Make a copy of the FileSystem so that the InodeTable can be ripped out 20 // and streamed afterwards. 21 var encodedFileSystem encodedFileSystemType 22 inodeTable := fs.InodeTable 23 encodedFileSystem.FileSystem = *fs 24 encodedFileSystem.FileSystem.InodeTable = nil 25 encodedFileSystem.InodeTableLength = uint64(len(inodeTable)) 26 encoder := gob.NewEncoder(writer) 27 if err := encoder.Encode(encodedFileSystem); err != nil { 28 return err 29 } 30 // Stream out the InodeTable. 31 for inodeNumber, genericInode := range inodeTable { 32 var inode numberedInode 33 inode.InodeNumber = inodeNumber 34 inode.GenericInode = genericInode 35 if err := encoder.Encode(inode); err != nil { 36 return err 37 } 38 } 39 return nil 40 } 41 42 func decode(reader io.Reader) (*FileSystem, error) { 43 decoder := gob.NewDecoder(reader) 44 fs := new(FileSystem) 45 var decodedFileSystem encodedFileSystemType 46 if err := decoder.Decode(&decodedFileSystem); err != nil { 47 return nil, err 48 } 49 *fs = decodedFileSystem.FileSystem 50 // Stream in the InodeTable. 51 numInodes := decodedFileSystem.InodeTableLength 52 fs.InodeTable = make(InodeTable, numInodes) 53 for index := uint64(0); index < numInodes; index++ { 54 var inode numberedInode 55 if err := decoder.Decode(&inode); err != nil { 56 return nil, err 57 } 58 fs.InodeTable[inode.InodeNumber] = inode.GenericInode 59 } 60 return fs, nil 61 }