func (n *Node) Mkdir(req *fuse.MkdirRequest, intr fs.Intr) (fs.Node, fuse.Error) { log.Debug("Got mkdir request!") dagnd := &mdag.Node{Data: ft.FolderPBData()} nnode := n.Nd.Copy() nnode.AddNodeLink(req.Name, dagnd) child := &Node{ Ipfs: n.Ipfs, Nd: dagnd, name: req.Name, } if n.nsRoot == nil { child.nsRoot = n } else { child.nsRoot = n.nsRoot } if n.parent != nil { err := n.parent.update(n.name, nnode) if err != nil { log.Criticalf("Error updating node: %s", err) return nil, err } } n.Nd = nnode n.wasChanged() return child, nil }
func addDir(n *core.IpfsNode, dir cmds.File, added *AddOutput) (*dag.Node, error) { log.Infof("adding directory: %s", dir.FileName()) tree := &dag.Node{Data: ft.FolderPBData()} for { file, err := dir.NextFile() if err != nil && err != io.EOF { return nil, err } if file == nil { break } node, err := addFile(n, file, added) if err != nil { return nil, err } _, name := path.Split(file.FileName()) err = tree.AddNodeLink(name, node) if err != nil { return nil, err } } err := addDagnode(added, dir.FileName(), tree) if err != nil { return nil, err } err = addNode(n, tree) if err != nil { return nil, err } return tree, nil }
func CreateRoot(n *core.IpfsNode, keys []ci.PrivKey, ipfsroot string) (*Root, error) { root := new(Root) root.LocalDirs = make(map[string]*Node) root.Ipfs = n abspath, err := filepath.Abs(ipfsroot) if err != nil { return nil, err } root.IpfsRoot = abspath root.Keys = keys if len(keys) == 0 { log.Warning("No keys given for ipns root creation") } else { k := keys[0] pub := k.GetPublic() hash, err := pub.Hash() if err != nil { log.Errorf("Read Root Error: %s", err) return nil, err } root.LocalLink = &Link{u.Key(hash).Pretty()} } for _, k := range keys { hash, err := k.GetPublic().Hash() if err != nil { log.Error("failed to hash public key.") continue } name := u.Key(hash).Pretty() nd := new(Node) nd.Ipfs = n nd.key = k nd.repub = NewRepublisher(nd, shortRepublishTimeout, longRepublishTimeout) go nd.repub.Run() pointsTo, err := n.Namesys.Resolve(name) if err != nil { log.Warning("Could not resolve value for local ipns entry, providing empty dir") nd.Nd = &mdag.Node{Data: ft.FolderPBData()} root.LocalDirs[name] = nd continue } if !u.IsValidHash(pointsTo) { log.Criticalf("Got back bad data from namesys resolve! [%s]", pointsTo) return nil, nil } node, err := n.Resolver.ResolvePath(pointsTo) if err != nil { log.Warning("Failed to resolve value from ipns entry in ipfs") continue } nd.Nd = node root.LocalDirs[name] = nd } return root, nil }