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  }