@@ -19,9 +19,8 @@ import (
19
19
var _ INode = & BillyNode {}
20
20
21
21
const defaultPerms = 0644
22
- const allPerms = 0777
23
22
const maxFileSize = math .MaxUint64
24
- const createFileFlags = os .O_RDWR | os .O_CREATE | os .O_TRUNC
23
+ const createFileFlags = os .O_WRONLY | os .O_CREATE | os .O_TRUNC
25
24
const maxInt = uint64 (int (^ uint (0 ) >> 1 ))
26
25
27
26
type BillyUser struct {
@@ -52,9 +51,8 @@ type BillyNode struct {
52
51
53
52
func (n * BillyNode ) Fsync (ctx context.Context , req * fuse.FsyncRequest ) error {
54
53
n .debug ("Fsync" , req )
55
-
56
- // call flush for now
57
- return n .Flush (ctx , nil )
54
+ // not quite sure what to do here, but it needs to be implemented and return nil.
55
+ return nil
58
56
}
59
57
60
58
// symlink functions
@@ -95,27 +93,29 @@ func (n *BillyNode) Flush(ctx context.Context, req *fuse.FlushRequest) error {
95
93
n .mu .Lock ()
96
94
defer n .mu .Unlock ()
97
95
98
- file , err := n .fs .OpenFile (n .path , os . O_WRONLY , n .mode )
96
+ file , err := n .fs .OpenFile (n .path , createFileFlags , n .mode )
99
97
if err != nil {
98
+ n .error ("Flush" , err )
100
99
return err
101
100
}
102
101
103
102
if err = file .Lock (); err != nil {
104
- n .error ("load " , err )
103
+ n .error ("Flush " , err )
105
104
return fuse .ENOENT
106
105
}
107
106
108
107
defer func () {
109
108
if err := file .Unlock (); err != nil {
110
- n .error ("load " , err )
109
+ n .error ("Flush " , err )
111
110
}
112
111
113
112
if err := file .Close (); err != nil {
114
- n .error ("load " , err )
113
+ n .error ("Flush " , err )
115
114
}
116
115
}()
117
116
118
117
if _ , err := file .Write (n .data ); err != nil {
118
+ n .error ("Flush" , err )
119
119
return err
120
120
}
121
121
@@ -281,17 +281,21 @@ func (n *BillyNode) Create(ctx context.Context, req *fuse.CreateRequest, resp *f
281
281
n .mu .Lock ()
282
282
defer n .mu .Unlock ()
283
283
284
- node , err := n .createOrOpen (req .Name , true , req .Mode )
285
- if err != nil {
286
- n .error ("Create" , err )
287
- return nil , nil , err
288
- }
284
+ fullPath := n .fs .Join (n .path , req .Name )
289
285
290
- // force load the data
291
- // ensure proper file handle
292
- err = node .load ()
286
+ node := & BillyNode {
287
+ repourl : n .repourl ,
288
+ fs : n .fs ,
289
+ path : fullPath ,
290
+ target : "" ,
291
+ user : n .user ,
292
+ mode : req .Mode ,
293
+ size : uint64 (0 ),
294
+ data : make ([]byte , 0 ),
295
+ mu : & sync.Mutex {},
296
+ }
293
297
294
- return node , node , err
298
+ return node , node , nil
295
299
}
296
300
297
301
func (n * BillyNode ) Mkdir (ctx context.Context , req * fuse.MkdirRequest ) (fs.Node , error ) {
@@ -366,13 +370,40 @@ func (n *BillyNode) Lookup(ctx context.Context, name string) (fs.Node, error) {
366
370
n .mu .Lock ()
367
371
defer n .mu .Unlock ()
368
372
369
- node , err := n .createOrOpen ( name , false , defaultPerms )
373
+ fullPath := n .fs . Join ( n . path , name )
370
374
371
- if err != nil {
372
- return nil , fuse .ENOENT
375
+ // symlink
376
+ if target , err := n .fs .Readlink (fullPath ); err == nil {
377
+ node := & BillyNode {
378
+ repourl : n .repourl ,
379
+ fs : n .fs ,
380
+ path : fullPath ,
381
+ target : target ,
382
+ user : n .user ,
383
+ mode : os .ModeSymlink | 0755 ,
384
+ size : uint64 (len (target )),
385
+ data : nil ,
386
+ mu : & sync.Mutex {},
387
+ }
388
+ return node , nil
373
389
}
374
390
375
- return node , nil
391
+ if finfo , err := n .fs .Stat (fullPath ); err != nil {
392
+ // assumed file does not exist
393
+ return nil , fuse .ENOENT
394
+ } else {
395
+ return & BillyNode {
396
+ repourl : n .repourl ,
397
+ fs : n .fs ,
398
+ path : fullPath ,
399
+ target : "" ,
400
+ user : n .user ,
401
+ mode : finfo .Mode (),
402
+ size : uint64 (finfo .Size ()),
403
+ data : nil ,
404
+ mu : & sync.Mutex {},
405
+ }, nil
406
+ }
376
407
}
377
408
378
409
// node functions
@@ -435,76 +466,6 @@ func (n *BillyNode) Attr(ctx context.Context, attr *fuse.Attr) error {
435
466
436
467
// helper functions
437
468
438
- func (n * BillyNode ) createOrOpen (name string , create bool , mode os.FileMode ) (* BillyNode , error ) {
439
- n .debug ("createOrOpen" , name )
440
-
441
- fullPath := n .fs .Join (n .path , name )
442
-
443
- // symlink
444
- if target , err := n .fs .Readlink (fullPath ); err == nil {
445
- node := & BillyNode {
446
- repourl : n .repourl ,
447
- fs : n .fs ,
448
- path : fullPath ,
449
- target : target ,
450
- user : n .user ,
451
- mode : os .ModeSymlink | defaultPerms ,
452
- size : uint64 (len (target )),
453
- data : nil ,
454
- mu : & sync.Mutex {},
455
- }
456
- return node , nil
457
- }
458
-
459
- finfo , err := n .fs .Stat (fullPath )
460
- if err == nil {
461
- // file exists, create reference
462
- node := & BillyNode {
463
- repourl : n .repourl ,
464
- fs : n .fs ,
465
- path : fullPath ,
466
- target : "" ,
467
- user : n .user ,
468
- mode : finfo .Mode (),
469
- size : uint64 (finfo .Size ()),
470
- data : nil ,
471
- mu : & sync.Mutex {},
472
- }
473
-
474
- return node , nil
475
- } else if ! create {
476
- // file does not exist, not creating
477
- return nil , fuse .ENOENT
478
- }
479
-
480
- // don't use bfs.Create since it assigns 666 permissions
481
- file , err := n .fs .OpenFile (fullPath , createFileFlags , mode )
482
- if err != nil {
483
- n .error ("createOrOpen" , err )
484
- // shouldn't really happen but lets just account for it just in case
485
- return nil , fuse .EEXIST
486
- }
487
-
488
- if err := file .Close (); err != nil {
489
- n .error ("createOrOpen" , err )
490
- return nil , fuse .EEXIST
491
- }
492
-
493
- node := & BillyNode {
494
- repourl : n .repourl ,
495
- fs : n .fs ,
496
- path : fullPath ,
497
- target : "" ,
498
- user : n .user ,
499
- mode : mode ,
500
- size : 0 ,
501
- data : make ([]byte , 0 ),
502
- mu : & sync.Mutex {},
503
- }
504
-
505
- return node , nil
506
- }
507
-
508
469
func (n * BillyNode ) load () error {
509
470
if n .data != nil {
510
471
// already loaded, nothing to do
0 commit comments