func New(name string, lfs zx.RWTree) (*Fs, error) { treeslk.Lock() p := fmt.Sprintf("%d", tpathgen) tpathgen++ treeslk.Unlock() r := &mFile { name: "/", d: zx.Dir{ "name": "/", "path": "/", "spath": "/", "proto": "mfs", "tpath": p, "type": "d", "mode": "0755", "Uid": dbg.Usr, "Gid": dbg.Usr, "Wuid": dbg.Usr, "Sum": zx.Zsum(), "size": "0", }, child: []*mFile{}, } r.d.SetTime("mtime", time.Now()) l := &Fs{ name: name, path: p, root: r, lfs: lfs, Flags: &zx.Flags{}, } l.Flags.Add("debug", &l.Dbg) l.Flags.AddRO("noperm", &l.NoPermCheck) l.Flags.Add("clear", func(...string)error{ l.IOstats.Clear() return nil }) l.reload() treeslk.RLock() trees[p] = l treeslk.RUnlock() return l, nil }
func (t *Fs) Put(rid string, d zx.Dir, off int64, dc <-chan []byte, pred string) chan zx.Dir { d = d.Dup() t.dprintf("put %s %v %d '%s'\n", rid, d, off, pred) cs := t.IOstats.NewCall(zx.Sput) c := make(chan zx.Dir, 1) go func() { cs.Sending() rid, err := zx.AbsPath(rid) var nm, n int64 var nd zx.Dir if err == nil && rid == "/Ctl" { nc, xerr := t.putCtl(dc) if xerr == nil { nd = zx.Dir{"size": "0"} if DoSum { nd["Sum"] = zx.Zsum() } nd.SetTime("mtime", time.Now()) nm = 1 n = int64(nc) } err = xerr } else if err == nil { nd, nm, n, err = t.put(rid, d, off, dc, pred) cs.Sends(nm, n) } if err == nil { rd := zx.Dir{"size": nd["size"], "mtime": nd["mtime"]} if nd["Sum"] != "" { rd["Sum"] = nd["Sum"] } t.dprintf("put %s: %s (wrote %d)\n", rid, rd, n) c <- rd } else { t.dprintf("put %s: %s\n", rid, err) close(dc, err) } close(c, err) cs.End(err != nil) }() return c }
func (t *Fs) Put(rid string, d zx.Dir, off int64, dc <-chan []byte, pred string) chan zx.Dir { d = d.UsrAttrs() t.dprintf("put %s %v %d '%s'\n", rid, d, off, pred) cs := t.IOstats.NewCall(zx.Sput) c := make(chan zx.Dir, 1) go func() { cs.Sending() rid, err := zx.AbsPath(rid) var nd zx.Dir if err == nil && rid == "/" { err = fmt.Errorf("/: %s", dbg.ErrPerm) } if err == nil && rid == "/Ctl" { xerr := t.putCtl(dc) if xerr == nil { nd = zx.Dir{"size": "0", "Sum": zx.Zsum()} nd.SetTime("mtime", time.Now()) } err = xerr } else if err == nil { err = t.put(rid, d, off, dc, pred) if err == nil { nd, err = t.stat(rid) } } if err == nil { rd := zx.Dir{"size": nd["size"], "mtime": nd["mtime"], "Sum": nd["Sum"]} t.dprintf("put %s: %s\n", rid, rd) c <- rd } else { t.dprintf("put %s: %s\n", rid, err) close(dc, err) } close(c, err) cs.End(err != nil) }() return c }
} return f, nil, nil } var ctldir = zx.Dir{ "path": "/Ctl", "spath": "/Ctl", "name": "Ctl", "proto": "mfs", "size": "0", "type": "c", "Uid": dbg.Usr, "Gid": dbg.Usr, "Wuid": dbg.Usr, "mode": "0664", "Sum": zx.Zsum(), } func (t *Fs) stat(rid string) (zx.Dir, error) { rid, err := zx.AbsPath(rid) if err != nil { return nil, err } if rid == "/Ctl" { cd := ctldir.Dup() cd["tpath"] = t.path return cd, nil } f, _, err := t.walk(rid, nil) if err != nil { return nil, err
func (t *Fs) Mkdir(rid string, d zx.Dir) chan error { t.dprintf("mkdir %s %v\n", rid, d) cs := t.IOstats.NewCall(zx.Smkdir) c := make(chan error, 1) rid, err := zx.AbsPath(rid) if rid == "/" || rid=="/Ctl" { err = dbg.ErrExists } var f *mFile var left []string if err == nil { f, left, err = t.walk(rid, nil) } if err == nil { err = fmt.Errorf("'%s': %s", rid, dbg.ErrExists) } else if len(left) == 1 { err = nil } if err != nil { cs.End(true) t.dprintf("mkdir %s: %s\n", rid, err) c <- err close(c, err) return c } ud := d.UsrAttrs() delete(ud, "size") noinherit := false if m := ud["Mode"]; m != "" { ud["mode"] = m delete(ud, "Mode") noinherit = true } if ud["mode"] == "" { ud["mode"] = "0775" } if (!t.WstatAll || t.ai != nil) && !noinherit { f.mlk.Lock() ud["type"] = "d" ud.Inherit(f.d.Mode()) delete(ud, "type") f.mlk.Unlock() } u := dbg.Usr if t.ai != nil { u = t.ai.Uid } nf := &mFile { name: left[0], d: zx.Dir{ "mode": ud["mode"], "name": left[0], "path": rid, "spath": rid, "tpath": f.t.path, "Uid": u, "Gid": f.d["Gid"], "Wuid": u, "type": "d", "size": "0", "proto": "proc", }, child: []*mFile{}, t: t, } if DoSum { nf.d["Sum"] = zx.Zsum() } f.mlk.Lock() if !t.noPerms() && !f.d.CanWrite(t.ai) { err = fmt.Errorf("%s: %s", f, dbg.ErrPerm) } ai := t.ai if t.NoPermCheck { ai = nil } if err == nil && (!t.WstatAll || t.ai != nil) { err = nf.d.CanWstat(ai, ud) } if err != nil { f.mlk.Unlock() cs.End(true) t.dprintf("mkdir %s: %s\n", rid, err) c <- err close(c, err) return c } f.mlk.Unlock() f.mlk.Lock() f.clk.Lock() f.attach(nf) f.clk.Unlock() f.mlk.Unlock() f = nf f.mlk.Lock() if t.WstatAll && t.ai == nil && d["Wuid"] != "" { ud["Wuid"] = d["Wuid"] } err = f.wstat(ud) f.mlk.Unlock() cs.End(err != nil) if err != nil { t.dprintf("mkdir %s: %s\n", rid, err) } c <- err close(c, err) return c }