@@ -32,10 +32,25 @@ var (
3232// Create a new ns node from nsInfo
3333func newNamespaceNode (nsInfo libdm.Namespaceinfo ) * namespaceNode {
3434 return & namespaceNode {
35- nsInfo : nsInfo ,
35+ nsInfo : libdm.Namespaceinfo {
36+ Name : nsInfo .Name ,
37+ Groups : formatGroups (nsInfo .Groups ),
38+ },
3639 }
3740}
3841
42+ func formatGroups (groups []string ) []string {
43+ if groups == nil || len (groups ) == 0 {
44+ return []string {NoGroupFolder }
45+ }
46+
47+ return append (groups , NoGroupFolder )
48+ }
49+
50+ func (nsNode * namespaceNode ) updateGroups (groups []string ) {
51+ nsNode .nsInfo .Groups = formatGroups (groups )
52+ }
53+
3954// On Namespace dir accessed
4055func (nsNode * namespaceNode ) Readdir (ctx context.Context ) (fs.DirStream , syscall.Errno ) {
4156 // Reload groups if namespace was accessed
@@ -94,6 +109,7 @@ func (nsNode *namespaceNode) Lookup(ctx context.Context, name string, out *fuse.
94109}
95110
96111// Delete group if vfile was removed
112+ // Note: deleting groups doesn't mean the files are deleted!
97113func (nsNode * namespaceNode ) Rmdir (ctx context.Context , name string ) syscall.Errno {
98114 if name == NoGroupFolder {
99115 return 0
@@ -106,6 +122,9 @@ func (nsNode *namespaceNode) Rmdir(ctx context.Context, name string) syscall.Err
106122 return syscall .ENOENT
107123 }
108124
125+ // Remove group from list
126+ nsNode .nsInfo .Groups = removeFromStringSlice (nsNode .nsInfo .Groups , name )
127+
109128 return 0
110129}
111130
@@ -128,14 +147,20 @@ func (nsNode *namespaceNode) Rename(ctx context.Context, name string, newParent
128147
129148// On group created
130149func (nsNode * namespaceNode ) Mkdir (ctx context.Context , name string , mode uint32 , out * fuse.EntryOut ) (* fs.Inode , syscall.Errno ) {
150+ // Create group
151+ _ , err := data .libdm .CreateAttribute (libdm .GroupAttribute , nsNode .nsInfo .Name , name )
152+ if err != nil {
153+ printResponseError (err , "creating group" )
154+ return nil , syscall .EIO
155+ }
156+
157+ nsNode .nsInfo .Groups = append (nsNode .nsInfo .Groups , name )
131158 node := nsNode .NewInode (ctx , & groupInode {
132159 group : name ,
133160 namespace : nsNode .nsInfo .Name ,
134161 }, fs.StableAttr {
135162 Mode : syscall .S_IFDIR ,
136163 })
137164
138- // TODO implement create group
139-
140165 return node , 0
141166}
0 commit comments