@@ -3,6 +3,7 @@ package dmfs
33import (
44 "context"
55 "fmt"
6+ "sync"
67 "syscall"
78
89 "github.com/DataManager-Go/libdatamanager"
@@ -31,6 +32,8 @@ type groupNode struct {
3132 isNoGroupPlaceholder bool
3233
3334 files []libdm.FileResponseItem
35+
36+ mx sync.Mutex
3437}
3538
3639// Create a new group node
@@ -89,6 +92,9 @@ func (groupNode *groupNode) loadfiles() error {
8992}
9093
9194func (groupNode * groupNode ) Lookup (ctx context.Context , name string , out * fuse.EntryOut ) (* fs.Inode , syscall.Errno ) {
95+ groupNode .mx .Lock ()
96+ defer groupNode .mx .Unlock ()
97+
9298 file := groupNode .findFile (name )
9399 if file == nil {
94100 return nil , syscall .ENOENT
@@ -108,16 +114,6 @@ func (groupNode *groupNode) Lookup(ctx context.Context, name string, out *fuse.E
108114 return child , 0
109115}
110116
111- func (groupNode * groupNode ) findFile (name string ) * libdatamanager.FileResponseItem {
112- for i := range groupNode .files {
113- if groupNode .files [i ].Name == name {
114- return & groupNode .files [i ]
115- }
116- }
117-
118- return nil
119- }
120-
121117// Set file attributes for files
122118func (groupNode * groupNode ) setFileAttrs (file * libdatamanager.FileResponseItem , out * fuse.EntryOut ) {
123119 out .Size = uint64 (file .Size )
@@ -139,11 +135,49 @@ func (groupNode *groupNode) setFileAttrs(file *libdatamanager.FileResponseItem,
139135
140136// Delete file
141137func (groupNode * groupNode ) Unlink (ctx context.Context , name string ) syscall.Errno {
142- file := groupNode .findFile (name )
143- if file == nil {
138+ f := groupNode .findFile (name )
139+ if f == nil {
144140 return syscall .ENOENT
145141 }
142+ file := * f
143+
144+ // Remove local
145+ groupNode .removeFile (file )
146+
147+ // Make delete http request
148+ _ , err := data .libdm .DeleteFile ("" , file .ID , false , groupNode .getRequestAttributes ())
149+ if err != nil {
150+ printResponseError (err , "deleting file" )
151+ return syscall .EIO
152+ }
153+
154+ // FIXME delete correctly from slice
146155
147- // TODO delete file remotely
148156 return 0
149157}
158+
159+ // Find file by name
160+ func (groupNode * groupNode ) findFile (name string ) * libdatamanager.FileResponseItem {
161+ for i := range groupNode .files {
162+ if groupNode .files [i ].Name == name {
163+ return & groupNode .files [i ]
164+ }
165+ }
166+
167+ return nil
168+ }
169+
170+ // Remove file from list
171+ func (groupNode * groupNode ) removeFile (file libdatamanager.FileResponseItem ) bool {
172+ groupNode .mx .Lock ()
173+ defer groupNode .mx .Unlock ()
174+
175+ for i := range groupNode .files {
176+ if groupNode .files [i ].ID == file .ID {
177+ groupNode .files = removeFileByIndex (groupNode .files , i )
178+ return true
179+ }
180+ }
181+
182+ return false
183+ }
0 commit comments