func (f File) setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fuse.SetattrResponse) error { iter := f.Fs.Session.Query("SELECT created, modified, access, is_dir FROM fuse.filesystem WHERE filename=? AND entry='!' AND block=0;").Iter() var created uint64 = uint64(time.Now().Unix()) var modified uint64 = created var access uint64 = created var is_dir bool = false var updated = false for iter.Scan(&created, &modified, &access, &is_dir) { if req.Valid&fuse.SetattrAtime != 0 { access = uint64(req.Atime.Unix()) } if req.Valid&fuse.SetattrMtime != 0 { modified = uint64(req.Mtime.Unix()) } if req.Valid&fuse.SetattrAtimeNow != 0 { access = uint64(time.Now().Unix()) } if req.Valid&fuse.SetattrMtimeNow != 0 { modified = uint64(time.Now().Unix()) } err := f.Fs.Session.Query("INSERT INTO fuse.filesystem(filename, entry, created, modified, access, block, data, is_dir) VALUES(?, ?, ?, ?, ?, ?, ?, ?);", f.GetPath(), "!", created, modified, access, 0, make([]byte, 0), is_dir).Exec() if err != nil { log.Error(err.Error()) return err } updated = true break } if !updated { err := f.Fs.Session.Query("INSERT INTO fuse.filesystem(filename, entry, created, modified, access, block, data, is_dir) VALUES(?, ?, ?, ?, ?, ?, ?, ?);", f.GetPath(), "!", created, modified, access, 0, make([]byte, 0), is_dir).Exec() if err != nil { log.Error(err.Error()) return err } } var size = req.Size if req.Valid&fuse.SetattrSize != 0 { err := f.doTruncate(size) if err != nil { log.Error(err.Error()) return err } } else { var err error size, err = f.getSize() if err != nil { return err } } var mode os.FileMode if is_dir { mode = os.ModeDir } else { mode = 0 } resp.Attr = fuse.Attr{Valid: time.Second, Inode: 0, Size: size, Atime: time.Unix(int64(access), 0), Mtime: time.Unix(int64(modified), 0), Ctime: time.Unix(int64(created), 0), Mode: mode} return nil }
// Set file attributes for this node func (node *Node) Setattr(req *fuse.SetattrRequest, resp *fuse.SetattrResponse, intr fs.Intr) fuse.Error { // General if req.Valid.Mode() { node.Attrs.Mode = req.Mode } if req.Valid.Uid() { node.Attrs.Uid = req.Uid } if req.Valid.Gid() { node.Attrs.Gid = req.Gid } if req.Valid.Size() { node.Attrs.Size = req.Size } if req.Valid.Atime() { node.Attrs.Atime = req.Atime } if req.Valid.Mtime() { node.Attrs.Mtime = req.Mtime } // OSX specific if req.Valid.Crtime() { node.Attrs.Crtime = req.Crtime } if req.Valid.Flags() { node.Attrs.Flags = req.Flags } resp.Attr = node.Attrs node.dirty = true return nil }