Create is similar to Lookup, but should create a new child. It typically also returns a FileHandle as a reference for future reads/writes. Default is to return EROFS.
(ctx context.Context, name string, flags uint32, mode uint32, out *fuse.EntryOut)
| 348 | // reference for future reads/writes. |
| 349 | // Default is to return EROFS. |
| 350 | func (n *Node) Create(ctx context.Context, name string, flags uint32, mode uint32, out *fuse.EntryOut) (node *fusefs.Inode, fh fusefs.FileHandle, fuseFlags uint32, errno syscall.Errno) { |
| 351 | defer log.Trace(n, "name=%q, flags=%#o, mode=%#o", name, flags, mode)("node=%v, fh=%v, flags=%#o, errno=%v", &node, &fh, &fuseFlags, &errno) |
| 352 | dir, ok := n.node.(*vfs.Dir) |
| 353 | if !ok { |
| 354 | return nil, nil, 0, syscall.ENOTDIR |
| 355 | } |
| 356 | // translate the fuse flags to os flags |
| 357 | osFlags := int(flags) | os.O_CREATE |
| 358 | file, err := dir.Create(name, osFlags) |
| 359 | if err != nil { |
| 360 | return nil, nil, 0, translateError(err) |
| 361 | } |
| 362 | handle, err := file.Open(osFlags) |
| 363 | if err != nil { |
| 364 | return nil, nil, 0, translateError(err) |
| 365 | } |
| 366 | fh = newFileHandle(handle, n.fsys) |
| 367 | // FIXME |
| 368 | // fh = &fusefs.WithFlags{ |
| 369 | // File: fh, |
| 370 | // //FuseFlags: fuse.FOPEN_NONSEEKABLE, |
| 371 | // OpenFlags: flags, |
| 372 | // } |
| 373 | |
| 374 | // Find the created node |
| 375 | vfsNode, errno := n.lookupVfsNodeInDir(name) |
| 376 | if errno != 0 { |
| 377 | return nil, nil, 0, errno |
| 378 | } |
| 379 | n.fsys.setEntryOut(vfsNode, out) |
| 380 | newNode := newNode(n.fsys, vfsNode) |
| 381 | fs.Debugf(nil, "attr=%#v", out.Attr) |
| 382 | newInode := n.NewInode(ctx, newNode, fusefs.StableAttr{Mode: out.Attr.Mode}) |
| 383 | return newInode, fh, 0, 0 |
| 384 | } |
| 385 | |
| 386 | var _ = (fusefs.NodeCreater)((*Node)(nil)) |
| 387 |
nothing calls this directly
no test coverage detected