// Makes a directory called req.Name in dir func (dir *Directory) Mkdir(req *fuse.MkdirRequest, intr fs.Intr) (fs.Node, fuse.Error) { filesystem.Lock(dir) defer filesystem.Unlock(dir) util.P_out(req.String()) if strings.Contains(req.Name, "@") { return dir.mkArchive(req.Name) } subdir := new(Directory) subdir.InitDirectory(req.Name, os.ModeDir|req.Mode, dir) dir.setChild(subdir) subdir.dirty = true dir.dirty = true return subdir, nil }
func (sc *serveConn) mkdir(req *fuse.MkdirRequest) { if *readOnly { req.RespondError(fuse.EPERM) return } // TODO: if allow_other, require uid == invoking uid to allow writes pInode := uint64(req.Header.Node) pId, err := sc.db.FileIdForInode(pInode) if err != nil { debug.Printf("failed to get parent fileid: %v", err) req.RespondError(fuse.EIO) return } p := []*drive.ParentReference{&drive.ParentReference{Id: pId}} file := &drive.File{Title: req.Name, MimeType: driveFolderMimeType, Parents: p} file, err = sc.service.Files.Insert(file).Do() if err != nil { debug.Printf("Insert failed: %v", err) req.RespondError(fuse.EIO) return } debug.Printf("Child of %v created in drive: %+v", file.Parents[0].Id, file) f, err := sc.db.UpdateFile(nil, file) if err != nil { debug.Printf("failed to update levelDB for %v: %v", f.Id, err) // The write has happened to drive, but we failed to update the kernel. // The Changes API will update Fuse, and when the kernel metadata for // the parent directory expires, the new dir will become visible. req.RespondError(fuse.EIO) return } sc.db.FlushCachedInode(pInode) resp := &fuse.MkdirResponse{} resp.Node = fuse.NodeID(f.Inode) resp.EntryValid = *driveMetadataLatency resp.Attr.Valid = *driveMetadataLatency resp.Attr = sc.attrFromFile(*f) fuse.Debug(fmt.Sprintf("Mkdir(%v): %+v", req.Name, f)) req.Respond(resp) }
func (f *fs) handleMkdir(r *fuse.MkdirRequest) { log.Println("Inside handleMkdir") log.Println(r) resp := &fuse.MkdirResponse{} m, err := f.rpc.api.MkDir(f.getContext(), &pb.MkDirRequest{Name: r.Name, Parent: uint64(r.Node), Attr: &pb.Attr{Uid: r.Uid, Gid: r.Gid, Mode: uint32(r.Mode)}}) if err != nil { log.Fatalf("Mkdir failed(%s): %v", r.Name, err) } // If the name is empty, then the dir already exists if m.Name != r.Name { log.Printf("EEXIST Mkdir(%s)", r.Name) r.RespondError(fuse.EEXIST) return } resp.Node = fuse.NodeID(m.Attr.Inode) copyAttr(&resp.Attr, m.Attr) resp.Attr.Valid = 5 * time.Second resp.EntryValid = 5 * time.Second log.Println(resp) r.Respond(resp) }