@cryptotaxi247 / kubo / commits / ed2fbd051

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