func cmdread(ns *g9pc.Ns, s []string) { sq, results := seq.NewSequencer() go func() { r := <-results // walk result r = <-results // open result r = <-results // readstream result _, ok := <-results if ok { panic("expected closed") } }() f := ns.SeqWalk(sq, s[0]) sq.Do(f.File(), seq.OpenReq{g9p.OREAD}) rd := f.SeqReadStream(sq, 200, 20) buf := make([]byte, 10) for { n, err := rd.Read(buf) if n == 0 { fmt.Fprintf(os.Stderr, "read error: %v\n", err) break } fmt.Printf("%q\n", buf[0:n]) } rd.Close() sq.Do(f.File(), seq.ClunkReq{}) // strictly speaking unnecessary. sq.Do(nil, nil) sq.Wait() }