Skip to content

Commit

Permalink
Windows: add win attrs support; (#5722)
Browse files Browse the repository at this point in the history
  • Loading branch information
chenjie4255 authored Mar 6, 2025
1 parent ce7f901 commit 3624ac5
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 1 deletion.
5 changes: 4 additions & 1 deletion pkg/meta/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,11 @@ const (
)

const (
FlagImmutable = 1 << iota
FlagImmutable = 1 << iota // same as Windows FILE_ATTRIBUTE_READONLY
FlagAppend
FlagWindowsHidden
FlagWindowsSystem
FlagWindowsArchive
)

const (
Expand Down
3 changes: 3 additions & 0 deletions pkg/vfs/vfs.go
Original file line number Diff line number Diff line change
Expand Up @@ -512,6 +512,9 @@ func (v *VFS) Create(ctx Context, parent Ino, name string, mode uint16, cumask u

var inode Ino
var attr = &Attr{}
if runtime.GOOS == "windows" {
attr.Flags = meta.FlagWindowsArchive
}
err = v.Meta.Create(ctx, parent, name, mode&07777, cumask, flags, &inode, attr)
if runtime.GOOS == "darwin" && err == syscall.ENOENT {
err = syscall.EACCES
Expand Down
28 changes: 28 additions & 0 deletions pkg/vfs/vfs_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,33 @@

package vfs

import (
"syscall"

"github.com/juicedata/juicefs/pkg/meta"
)

const O_ACCMODE = 0xff
const F_UNLCK = 0x01

func (v *VFS) ChFlags(ctx Context, ino Ino, flags uint8) (err syscall.Errno) {
defer func() {
logit(ctx, "chflags", err, "(%d):%d", ino, flags)
}()
if IsSpecialNode(ino) {
err = syscall.EPERM
return
}

err = syscall.EINVAL
var attr = &Attr{Flags: flags}

if ctx.CheckPermission() {
if err = v.Meta.CheckSetAttr(ctx, ino, meta.SetAttrFlag, *attr); err != 0 {
return
}
}

err = v.Meta.SetAttr(ctx, ino, meta.SetAttrFlag, 0, attr)
return
}
45 changes: 45 additions & 0 deletions pkg/winfsp/winfs.go
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,18 @@ func attrToStat(inode Ino, attr *meta.Attr, stat *fuse.Stat_t) {
stat.Size = int64(size)
stat.Blocks = int64(blocks)
stat.Rdev = uint64(rdev)
if attr.Flags&meta.FlagImmutable != 0 {
stat.Flags |= fuse.UF_READONLY
}
if attr.Flags&meta.FlagWindowsHidden != 0 {
stat.Flags |= fuse.UF_HIDDEN
}
if attr.Flags&meta.FlagWindowsSystem != 0 {
stat.Flags |= fuse.UF_SYSTEM
}
if attr.Flags&meta.FlagWindowsArchive != 0 {
stat.Flags |= fuse.UF_ARCHIVE
}
}

func (j *juice) h2i(fh *uint64) meta.Ino {
Expand Down Expand Up @@ -641,6 +653,39 @@ func (j *juice) Releasedir(path string, fh uint64) (e int) {
return
}

func (j *juice) Chflags(path string, flags uint32) (e int) {
defer trace(path, flags)(&e)

ctx := j.newContext()
fi, err := j.fs.Stat(ctx, path)
if err != 0 {
e = -fuse.ENOENT
return
}

var flagSet uint8
if flags&fuse.UF_READONLY != 0 {
flagSet |= meta.FlagImmutable
}
if flags&fuse.UF_HIDDEN != 0 {
flagSet |= meta.FlagWindowsHidden
}
if flags&fuse.UF_SYSTEM != 0 {
flagSet |= meta.FlagWindowsSystem
}
if flags&fuse.UF_ARCHIVE != 0 {
flagSet |= meta.FlagWindowsArchive
}

ino := fi.Inode()
err = j.vfs.ChFlags(ctx, ino, flagSet)
if err != 0 {
e = -int(err)
}

return
}

func Serve(v *vfs.VFS, fuseOpt string, fileCacheTo float64, asRoot bool, delayClose int, showDotFiles bool) {
var jfs juice
conf := v.Conf
Expand Down

0 comments on commit 3624ac5

Please sign in to comment.