func (fi *File) Open(flags int, sync bool) (FileDescriptor, error) { fi.nodelk.Lock() node := fi.node fi.nodelk.Unlock() switch flags { case OpenReadOnly: fi.desclock.RLock() case OpenWriteOnly, OpenReadWrite: fi.desclock.Lock() default: // TODO: support other modes return nil, fmt.Errorf("mode not supported") } dmod, err := mod.NewDagModifier(context.TODO(), node, fi.dserv, chunk.DefaultSplitter) if err != nil { return nil, err } return &fileDescriptor{ inode: fi, perms: flags, sync: sync, mod: dmod, }, nil }
// NewFile returns a NewFile object with the given parameters func NewFile(name string, node *dag.Node, parent childCloser, dserv dag.DAGService) (*File, error) { dmod, err := mod.NewDagModifier(context.Background(), node, dserv, chunk.DefaultSplitter) if err != nil { return nil, err } return &File{ dserv: dserv, parent: parent, name: name, mod: dmod, }, nil }
// NewFile returns a NewFile object with the given parameters func NewFile(name string, node *dag.Node, parent childCloser, fs *Filesystem) (*File, error) { dmod, err := mod.NewDagModifier(context.Background(), node, fs.dserv, fs.pins.GetManual(), chunk.DefaultSplitter) if err != nil { return nil, err } return &File{ fs: fs, parent: parent, name: name, mod: dmod, }, nil }
func (fi *File) Open(flags int, sync bool) (FileDescriptor, error) { fi.nodelk.Lock() node := fi.node fi.nodelk.Unlock() switch node := node.(type) { case *dag.ProtoNode: fsn, err := ft.FSNodeFromBytes(node.Data()) if err != nil { return nil, err } switch fsn.Type { default: return nil, fmt.Errorf("unsupported fsnode type for 'file'") case ft.TSymlink: return nil, fmt.Errorf("symlinks not yet supported") case ft.TFile, ft.TRaw: // OK case } case *dag.RawNode: // Ok as well. } switch flags { case OpenReadOnly: fi.desclock.RLock() case OpenWriteOnly, OpenReadWrite: fi.desclock.Lock() default: // TODO: support other modes return nil, fmt.Errorf("mode not supported") } dmod, err := mod.NewDagModifier(context.TODO(), node, fi.dserv, chunk.DefaultSplitter) if err != nil { return nil, err } return &fileDescriptor{ inode: fi, perms: flags, sync: sync, mod: dmod, }, nil }