new files and directories appear to work properly
Jeromy committed
Sep 27, 2014 at 12:38 UTC
ed2fbd0512eb96fe74c641eefcc721b797675207
3 files changed
+96
-46
fuse/ipns/ipns_unix.go
+85
-45
@@ -2,7 +2,6 @@ package ipns
2
3
import (
4
"fmt"
5
- "io"
5
"io/ioutil"
6
"os"
7
"os/exec"
@@ -126,7 +125,7 @@ func (*Root) Attr() fuse.Attr {
125
126
// Lookup performs a lookup under this node.
127
func (s *Root) Lookup(name string, intr fs.Intr) (fs.Node, fuse.Error) {
129
- log.Debug("ipns: Root Lookup: '%s' [intr = %s]", name, intr.String())
128
+ log.Debug("ipns: Root Lookup: '%s'", name)
129
switch name {
130
case "mach_kernel", ".hidden", "._.":
131
// Just quiet some log noise on OS X.
@@ -183,7 +182,9 @@ func (r *Root) ReadDir(intr fs.Intr) ([]fuse.Dirent, fuse.Error) {
182
// Node is the core object representing a filesystem tree node.
183
type Node struct {
184
nsRoot *Node
186
- name string
185
+
186
+ // Name really only for logging purposes
187
+ name string
188
189
// Private keys held by nodes at the root of a keyspace
190
key ci.PrivKey
@@ -205,16 +206,13 @@ func (s *Node) loadData() error {
206
207
// Attr returns the attributes of a given node.
208
func (s *Node) Attr() fuse.Attr {
208
- u.DOut("Node attr.\n")
209
if s.cached == nil {
210
s.loadData()
211
}
212
switch s.cached.GetType() {
213
case mdag.PBData_Directory:
214
- u.DOut("this is a directory.\n")
214
return fuse.Attr{Mode: os.ModeDir | 0555}
215
case mdag.PBData_File, mdag.PBData_Raw:
217
- u.DOut("this is a file.\n")
216
size, _ := s.Nd.Size()
217
return fuse.Attr{
218
Mode: 0666,
@@ -222,14 +220,14 @@ func (s *Node) Attr() fuse.Attr {
220
Blocks: uint64(len(s.Nd.Links)),
221
}
222
default:
225
- u.PErr("Invalid data type.")
223
+ log.Error("Invalid data type.")
224
return fuse.Attr{}
225
}
226
}
227
228
// Lookup performs a lookup under this node.
229
func (s *Node) Lookup(name string, intr fs.Intr) (fs.Node, fuse.Error) {
232
- log.Debug("ipns: node[%s] Lookup '%s' [intr= %s]", s.name, name, intr.String())
230
+ log.Debug("ipns: node[%s] Lookup '%s'", s.name, name)
231
nd, err := s.Ipfs.Resolver.ResolveLinks(s.Nd, []string{name})
232
if err != nil {
233
// todo: make this error more versatile.
@@ -243,7 +241,7 @@ func (n *Node) makeChild(name string, node *mdag.Node) *Node {
241
child := &Node{
242
Ipfs: n.Ipfs,
243
Nd: node,
246
- name: name,
244
+ name: n.name + "/" + name,
245
}
246
247
if n.nsRoot == nil {
@@ -286,10 +284,10 @@ func (s *Node) ReadAll(intr fs.Intr) ([]byte, fuse.Error) {
284
}
285
286
func (n *Node) Write(req *fuse.WriteRequest, resp *fuse.WriteResponse, intr fs.Intr) fuse.Error {
287
+ log.Debug("ipns: Node Write: flags = %s, offset = %d, size = %d", req.Flags.String(), req.Offset, len(req.Data))
288
if n.dataBuf == nil {
289
n.dataBuf = new(bytes.Buffer)
290
}
292
- log.Debug("ipns: Node Write: flags = %s, offset = %d, size = %d", req.Flags.String(), req.Offset, len(req.Data))
291
if req.Offset == 0 {
292
n.dataBuf.Reset()
293
n.dataBuf.Write(req.Data)
@@ -316,46 +314,51 @@ func (n *Node) Flush(req *fuse.FlushRequest, intr fs.Intr) fuse.Error {
314
return fuse.ENODATA
315
}
316
319
- read, err := mdag.NewDagReader(n.Nd, n.Ipfs.DAG)
317
+ err = n.updateTree()
318
if err != nil {
321
- panic(err)
319
+ log.Error("updateTree failed: %s", err)
320
+ return fuse.ENODATA
321
}
322
324
- io.Copy(os.Stdout, read)
323
+ }
324
+ return nil
325
+}
326
326
- var root *Node
327
- if n.nsRoot != nil {
328
- root = n.nsRoot
329
- } else {
330
- root = n
331
- }
327
+func (n *Node) updateTree() error {
328
+ var root *Node
329
+ if n.nsRoot != nil {
330
+ root = n.nsRoot
331
+ } else {
332
+ root = n
333
+ }
334
333
- err = root.Nd.Update()
334
- if err != nil {
335
- log.Error("ipns: dag tree update failed: %s", err)
336
- return fuse.ENODATA
337
- }
335
+ err := root.Nd.Update()
336
+ if err != nil {
337
+ log.Error("ipns: dag tree update failed: %s", err)
338
+ return err
339
+ }
340
339
- err = n.Ipfs.DAG.AddRecursive(root.Nd)
340
- if err != nil {
341
- log.Critical("ipns: Dag Add Error: %s", err)
342
- }
341
+ err = n.Ipfs.DAG.AddRecursive(root.Nd)
342
+ if err != nil {
343
+ log.Critical("ipns: Dag Add Error: %s", err)
344
+ return err
345
+ }
346
344
- n.changed = false
345
- n.dataBuf = nil
347
+ n.changed = false
348
+ n.dataBuf = nil
349
347
- ndkey, err := root.Nd.Key()
348
- if err != nil {
349
- log.Error("getKey error: %s", err)
350
- // return fuse.ETHISREALLYSUCKS
351
- return fuse.ENODATA
352
- }
353
- log.Debug("Publishing changes!")
350
+ ndkey, err := root.Nd.Key()
351
+ if err != nil {
352
+ log.Error("getKey error: %s", err)
353
+ // return fuse.ETHISREALLYSUCKS
354
+ return err
355
+ }
356
+ log.Debug("Publishing changes!")
357
355
- err = n.Ipfs.Publisher.Publish(root.key, ndkey.Pretty())
356
- if err != nil {
357
- log.Error("ipns: Publish Failed: %s", err)
358
- }
358
+ err = n.Ipfs.Publisher.Publish(root.key, ndkey.Pretty())
359
+ if err != nil {
360
+ log.Error("ipns: Publish Failed: %s", err)
361
+ return err
362
}
363
return nil
364
}
@@ -383,6 +386,8 @@ func (n *Node) Mkdir(req *fuse.MkdirRequest, intr fs.Intr) (fs.Node, fuse.Error)
386
child.nsRoot = n.nsRoot
387
}
388
389
+ n.updateTree()
390
+
391
return child, nil
392
}
393
@@ -390,13 +395,15 @@ func (n *Node) Mknod(req *fuse.MknodRequest, intr fs.Intr) (fs.Node, fuse.Error)
395
log.Debug("Got mknod request!")
396
return nil, nil
397
}
398
+
399
func (n *Node) Open(req *fuse.OpenRequest, resp *fuse.OpenResponse, intr fs.Intr) (fs.Handle, fuse.Error) {
400
log.Debug("[%s] Received open request! flags = %s", n.name, req.Flags.String())
401
+ //TODO: check open flags and truncate if necessary
402
return n, nil
403
}
404
405
func (n *Node) Create(req *fuse.CreateRequest, resp *fuse.CreateResponse, intr fs.Intr) (fs.Node, fs.Handle, fuse.Error) {
399
- log.Debug("Got create request!")
406
+ log.Debug("Got create request: %s", req.Name)
407
nd := new(mdag.Node)
408
nd.Data = mdag.FilePBData(nil)
409
child := n.makeChild(req.Name, nd)
@@ -406,12 +413,45 @@ func (n *Node) Create(req *fuse.CreateRequest, resp *fuse.CreateResponse, intr f
413
log.Error("Error adding child to node: %s", err)
414
return nil, nil, fuse.ENOENT
415
}
409
- return child, nil, nil
416
+ return child, child, nil
417
}
418
419
func (n *Node) Remove(req *fuse.RemoveRequest, intr fs.Intr) fuse.Error {
413
- log.Debug("Got Remove request!")
414
- return fuse.EIO
420
+ log.Debug("[%s] Got Remove request: %s", n.name, req.Name)
421
+ err := n.Nd.RemoveNodeLink(req.Name)
422
+ if err != nil {
423
+ log.Error("Remove: No such file.")
424
+ return fuse.ENOENT
425
+ }
426
+ return nil
427
+}
428
+
429
+func (n *Node) Rename(req *fuse.RenameRequest, newDir fs.Node, intr fs.Intr) fuse.Error {
430
+ log.Debug("Got Rename request '%s' -> '%s'", req.OldName, req.NewName)
431
+ var mdn *mdag.Node
432
+ for _, l := range n.Nd.Links {
433
+ if l.Name == req.OldName {
434
+ mdn = l.Node
435
+ }
436
+ }
437
+ if mdn == nil {
438
+ log.Critical("nil Link found on rename!")
439
+ return fuse.ENOENT
440
+ }
441
+ n.Nd.RemoveNodeLink(req.OldName)
442
+
443
+ switch newDir := newDir.(type) {
444
+ case *Node:
445
+ err := newDir.Nd.AddNodeLink(req.NewName, mdn)
446
+ if err != nil {
447
+ log.Error("Error adding node to new dir on rename: %s", err)
448
+ return fuse.ENOENT
449
+ }
450
+ default:
451
+ log.Critical("Unknown node type for rename target dir!")
452
+ return fuse.ENOENT
453
+ }
454
+ return nil
455
}
456
457
// Mount mounts an IpfsNode instance at a particular path. It
merkledag/merkledag.go
+10
@@ -65,6 +65,16 @@ func (n *Node) AddNodeLink(name string, that *Node) error {
65
return nil
66
}
67
68
+func (n *Node) RemoveNodeLink(name string) error {
69
+ for i, l := range n.Links {
70
+ if l.Name == name {
71
+ n.Links = append(n.Links[:i], n.Links[i+1:]...)
72
+ return nil
73
+ }
74
+ }
75
+ return u.ErrNotFound
76
+}
77
+
78
// Size returns the total size of the data addressed by node,
79
// including the total sizes of references.
80
func (n *Node) Size() (uint64, error) {
namesys/dns.go
+1
-1
@@ -15,7 +15,7 @@ type DNSResolver struct {
15
}
16
17
func (r *DNSResolver) Matches(name string) bool {
18
- return strings.Contains(name, ".")
18
+ return strings.Contains(name, ".") && !strings.HasPrefix(name, ".")
19
}
20
21
// TXT records for a given domain name should contain a b58