Browse Source

Update bootstrap.sh for harvey-os.org/cmd/ufs (#953)

* Remove sys/src/go, update bootstrap to point to ufs in go repo

Signed-off-by: Graham MacDonald <grahamamacdonald@gmail.com>

* bootstrap use harvey.org/cmd/ufs

Signed-off-by: Graham MacDonald <grahamamacdonald@gmail.com>
Graham MacDonald 3 years ago
parent
commit
d1061fae65

+ 1 - 2
bootstrap.sh

@@ -2,8 +2,7 @@
 
 echo Building the build tool...
 
-GO111MODULE=on GOBIN="$(pwd)/util" go get -u github.com/Harvey-OS/ninep/cmd/ufs
-# GO111MODULE=on GOBIN="$(pwd)/util" go get -f -u bldy.build/bldy
+GOBIN="$(pwd)/util" go get -u harvey-os.org/cmd/ufs
 GO111MODULE=on GOBIN="$(pwd)/util" go get ./util/src/harvey/cmd/...
 
 

+ 5 - 1
go.mod

@@ -3,6 +3,10 @@ module github.com/Harvey-OS/harvey
 go 1.13
 
 require (
-	github.com/Harvey-OS/ninep v0.0.0-20190302184144-8010cab8eac9 // indirect
+	github.com/google/goexpect v0.0.0-20200703111054-623d5ca06f56 // indirect
+	github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f // indirect
+	github.com/u-root/u-root v6.0.0+incompatible
 	golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc
+	google.golang.org/grpc v1.30.0 // indirect
+	harvey-os.org v0.0.0-20200727215830-5b0d35efdc89 // indirect
 )

+ 56 - 2
go.sum

@@ -1,10 +1,64 @@
-github.com/Harvey-OS/ninep v0.0.0-20190302184144-8010cab8eac9 h1:vcT+syCMklD8M/k/PcNYehmCRYrp8cyO7pjlZC1/vwg=
-github.com/Harvey-OS/ninep v0.0.0-20190302184144-8010cab8eac9/go.mod h1:YmLTajv/R+cjEsJ8/vfGOckeEBbz06tgHlYBSpbe+eo=
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/goexpect v0.0.0-20200703111054-623d5ca06f56 h1:sXtmz0BQBeXxoxCNb376WLx6r9HKVTJvD4PQQ/kL604=
+github.com/google/goexpect v0.0.0-20200703111054-623d5ca06f56/go.mod h1:qtE5aAEkt0vOSA84DBh8aJsz6riL8ONfqfULY7lBjqc=
+github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f h1:5CjVwnuUcp5adK4gmY6i72gpVFVnZDP2h5TmPScB6u4=
+github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/u-root/u-root v6.0.0+incompatible h1:YqPGmRoRyYmeg17KIWFRSyVq6LX5T6GSzawyA6wG6EE=
+github.com/u-root/u-root v6.0.0+incompatible/go.mod h1:RYkpo8pTHrNjW08opNd/U6p/RJE7K0D8fXO0d47+3YY=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc h1:c0o/qxkaO2LF5t6fQrT4b5hzyggAkLLlCUjqfRxd8Q4=
 golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE=
+google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+harvey-os.org v0.0.0-20200727215830-5b0d35efdc89 h1:SoXYkGtBs+F1uLdGh7BL9W3oNYSlcQtljEMfty7yVco=
+harvey-os.org v0.0.0-20200727215830-5b0d35efdc89/go.mod h1:/HMTYlPsfQz7ekcuJuh28eeYCI6ZUQ7pdj6iaUZdyHU=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

+ 0 - 1
sys/src/go/README.md

@@ -1 +0,0 @@
-# Go Packages

+ 0 - 344
sys/src/go/cmd/tmpfs/tmpfs.go

@@ -1,344 +0,0 @@
-package main
-
-import (
-	"bytes"
-	"flag"
-	"fmt"
-	"log"
-	"net"
-	"os"
-	"sync"
-
-	"harvey-os.org/internal/tmpfs"
-	"harvey-os.org/pkg/ninep"
-	"harvey-os.org/pkg/ninep/protocol"
-)
-
-var (
-	networktype = flag.String("ntype", "tcp4", "Default network type")
-	netaddr     = flag.String("addr", ":5641", "Network address")
-	debug       = flag.Int("debug", 0, "Print debug messages")
-	pkg         = flag.String("package", "", "tar.gz package to open")
-)
-
-type fileServer struct {
-	sync.Mutex
-
-	Versioned bool
-
-	ioUnit  protocol.MaxSize
-	archive *tmpfs.Archive
-	files   map[protocol.FID]*FidEntry
-}
-
-// FidEntry wraps an Entry with the instance data required for a fid reference
-type FidEntry struct {
-	tmpfs.Entry
-
-	// Username to be used for all entries in this hierarchy
-	uname string
-
-	// We can't know how big a serialized dentry is until we serialize it.
-	// At that point it might be too big. We save it here if that happens,
-	// and on the next directory read we start with that.
-	oflow []byte
-
-	// Index of next child to return when reading a directory
-	nextChildIdx int
-}
-
-func newFidEntry(entry tmpfs.Entry, uname string) *FidEntry {
-	return &FidEntry{Entry: entry, uname: uname, oflow: nil, nextChildIdx: -1}
-}
-
-// Rversion initiates the session
-func (fs *fileServer) Rversion(msize protocol.MaxSize, version string) (protocol.MaxSize, string, error) {
-	if version != "9P2000" {
-		return 0, "", fmt.Errorf("%v not supported; only 9P2000", version)
-	}
-	return msize, version, nil
-}
-
-// Rattach attaches a fid to the root for the given user.  aname and afid are not used.
-func (fs *fileServer) Rattach(fid protocol.FID, afid protocol.FID, uname string, aname string) (protocol.QID, error) {
-	if afid != protocol.NOFID {
-		return protocol.QID{}, fmt.Errorf("We don't do auth attach")
-	}
-
-	root := fs.archive.Root()
-	fs.setFile(fid, root, uname)
-
-	return root.Qid(), nil
-}
-
-// Rflush does nothing in tmpfs
-func (fs *fileServer) Rflush(o protocol.Tag) error {
-	return nil
-}
-
-// Rwalk walks the hierarchy from fid, with the walk path determined by paths
-func (fs *fileServer) Rwalk(fid protocol.FID, newfid protocol.FID, paths []string) ([]protocol.QID, error) {
-	// Lookup the parent fid
-	parentEntry, err := fs.getFile(fid)
-	if err != nil {
-		return nil, fmt.Errorf("does not exist")
-	}
-
-	if len(paths) == 0 {
-		// Clone fid - point to same entry
-		fs.setFile(newfid, parentEntry.Entry, parentEntry.uname)
-		return []protocol.QID{}, nil
-	}
-
-	walkQids := make([]protocol.QID, len(paths))
-
-	currEntry := parentEntry.Entry
-	for i, pathcmp := range paths {
-		var ok bool
-		var dir *tmpfs.Directory
-		if dir, ok = currEntry.(*tmpfs.Directory); ok {
-			if pathcmp == ".." {
-				currEntry = dir.Parent()
-			} else {
-				currEntry, ok = dir.ChildByName(pathcmp)
-				if !ok {
-					// From the RFC: If the first element cannot be walked for any
-					// reason, Rerror is returned. Otherwise, the walk will return an
-					// Rwalk message containing nwqid qids corresponding, in order, to
-					// the files that are visited by the nwqid successful elementwise
-					// walks; nwqid is therefore either nwname or the index of the
-					// first elementwise walk that failed. The value of nwqid cannot be
-					// zero unless nwname is zero. Also, nwqid will always be less than
-					// or equal to nwname. Only if it is equal, however, will newfid be
-					// affected, in which case newfid will represent the file reached
-					// by the final elementwise walk requested in the message.
-					//
-					// to sum up: if any walks have succeeded, you return the QIDS for
-					// one more than the last successful walk
-					if i == 0 {
-						return nil, fmt.Errorf("file does not exist")
-					}
-					// we only get here if i is > 0 and less than nwname,
-					// so the i should be safe.
-					return walkQids[:i], nil
-				}
-			}
-		}
-		walkQids[i] = currEntry.Qid()
-	}
-
-	fs.setFile(newfid, currEntry, parentEntry.uname)
-	return walkQids, nil
-}
-
-// Ropen opens the file associated with fid
-func (fs *fileServer) Ropen(fid protocol.FID, mode protocol.Mode) (protocol.QID, protocol.MaxSize, error) {
-	if mode&(protocol.OWRITE|protocol.ORDWR|protocol.OTRUNC|protocol.ORCLOSE|protocol.OAPPEND) != 0 {
-		return protocol.QID{}, 0, fmt.Errorf("filesystem is read-only")
-	}
-
-	// Lookup the parent fid
-	f, err := fs.getFile(fid)
-	if err != nil {
-		return protocol.QID{}, 0, fmt.Errorf("does not exist")
-	}
-
-	// TODO Check executable
-
-	return f.Qid(), fs.ioUnit, nil
-}
-
-// Rcreate not supported since it's a read-only filesystem
-func (fs *fileServer) Rcreate(fid protocol.FID, name string, perm protocol.Perm, mode protocol.Mode) (protocol.QID, protocol.MaxSize, error) {
-	return protocol.QID{}, 0, fmt.Errorf("filesystem is read-only")
-}
-
-// Rclunk drops the fid association in the file system
-func (fs *fileServer) Rclunk(fid protocol.FID) error {
-	_, err := fs.clunk(fid)
-	return err
-}
-
-// Rstat returns stat message for the file associated with fid
-func (fs *fileServer) Rstat(fid protocol.FID) ([]byte, error) {
-	f, err := fs.getFile(fid)
-	if err != nil {
-		return []byte{}, err
-	}
-
-	d := f.P9Dir(f.uname)
-
-	var b bytes.Buffer
-	protocol.Marshaldir(&b, *d)
-	return b.Bytes(), nil
-}
-
-// Rwstat not supported since it's a read-only filesystem
-func (fs *fileServer) Rwstat(fid protocol.FID, b []byte) error {
-	return fmt.Errorf("filesystem is read-only")
-}
-
-// Rremove not supported since it's a read-only filesystem
-func (fs *fileServer) Rremove(fid protocol.FID) error {
-	return fmt.Errorf("filesystem is read-only")
-}
-
-// Rread returns up to c bytes from file fid starting at offset o
-func (fs *fileServer) Rread(fid protocol.FID, o protocol.Offset, c protocol.Count) ([]byte, error) {
-	f, err := fs.getFile(fid)
-	if err != nil {
-		return nil, err
-	}
-
-	if dir, ok := f.Entry.(*tmpfs.Directory); ok {
-		if o == 0 {
-			f.oflow = nil
-		}
-
-		// We make the assumption that they can always fit at least one
-		// directory entry into a read. If that assumption does not hold
-		// so many things are broken that we can't fix them here.
-		// But we'll drop out of the loop below having returned nothing
-		// anyway.
-		b := bytes.NewBuffer(f.oflow)
-		f.oflow = nil
-		pos := 0
-
-		for {
-			if b.Len() > int(c) {
-				f.oflow = b.Bytes()[pos:]
-				return b.Bytes()[:pos], nil
-			}
-
-			f.nextChildIdx++
-			pos += b.Len()
-
-			if f.nextChildIdx >= dir.NumChildren() {
-				return b.Bytes(), nil
-			}
-			d9p := dir.Child(f.nextChildIdx).P9Dir(f.uname)
-			protocol.Marshaldir(b, *d9p)
-
-			// Seen on linux clients: sometimes the math is wrong and
-			// they end up asking for the last element with not enough data.
-			// Linux bug or bug with this server? Not sure yet.
-			if b.Len() > int(c) {
-				log.Printf("Warning: Server bug? %v, need %d bytes;count is %d: skipping", d9p, b.Len(), c)
-				return nil, nil
-			}
-			// TODO handle more than one entry at a time
-			// We're not quite doing the array right.
-			// What does work is returning one thing so, for now, do that.
-			return b.Bytes(), nil
-		}
-
-	} else if file, ok := f.Entry.(*tmpfs.File); ok {
-		end := int(o) + int(c)
-		maxEnd := len(file.Data())
-		if end > maxEnd {
-			end = maxEnd
-		}
-		return file.Data()[o:end], nil
-	}
-	log.Fatalf("Unrecognised FidEntry")
-	return nil, nil
-}
-
-// Rwrite not supported since it's a read-only filesystem
-func (fs *fileServer) Rwrite(fid protocol.FID, o protocol.Offset, b []byte) (protocol.Count, error) {
-	return -1, fmt.Errorf("filesystem is read-only")
-}
-
-func (fs *fileServer) getFile(fid protocol.FID) (*FidEntry, error) {
-	fs.Lock()
-	defer fs.Unlock()
-
-	f, ok := fs.files[fid]
-	if !ok {
-		return nil, fmt.Errorf("does not exist")
-	}
-	return f, nil
-}
-
-// Associate newfid with the entry, assuming newfid isn't already in use
-func (fs *fileServer) setFile(newfid protocol.FID, entry tmpfs.Entry, uname string) error {
-	fs.Lock()
-	defer fs.Unlock()
-	if _, ok := fs.files[newfid]; ok {
-		return fmt.Errorf("FID in use: newfid %v", newfid)
-	}
-	fs.files[newfid] = newFidEntry(entry, uname)
-	return nil
-}
-
-func (fs *fileServer) clunk(fid protocol.FID) (tmpfs.Entry, error) {
-	fs.Lock()
-	defer fs.Unlock()
-
-	f, ok := fs.files[fid]
-	if !ok {
-		return nil, fmt.Errorf("clunk: FID does not exist: fid %v", fid)
-	}
-	delete(fs.files, fid)
-
-	return f, nil
-}
-
-func newTmpfs(arch *tmpfs.Archive, opts ...protocol.ListenerOpt) (*protocol.Listener, error) {
-	if arch == nil {
-		return nil, fmt.Errorf("No archive")
-	}
-
-	nsCreator := func() protocol.NineServer {
-		fs := &fileServer{archive: arch}
-		fs.files = make(map[protocol.FID]*FidEntry)
-		fs.ioUnit = 1 * 1024 * 1024
-
-		var ns protocol.NineServer = fs
-		if *debug != 0 {
-			ns = &ninep.DebugFileServer{FileServer: fs}
-		}
-		return ns
-	}
-
-	l, err := protocol.NewListener(nsCreator, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return l, nil
-}
-
-func main() {
-	flag.Parse()
-
-	if *pkg == "" {
-		flag.Usage()
-		os.Exit(1)
-	}
-
-	pkfFile, err := os.Open(*pkg)
-	if err != nil {
-		log.Fatalf("Couldn't open package %v error %v", *pkg, err)
-	}
-	defer pkfFile.Close()
-
-	arch := tmpfs.ReadImage(pkfFile)
-	if *debug > 0 {
-		arch.DumpArchive()
-	}
-
-	// Bind and listen on the socket.
-	listener, err := net.Listen(*networktype, *netaddr)
-	if err != nil {
-		log.Fatalf("Listen failed: %v", err)
-	}
-
-	ufslistener, err := newTmpfs(arch, func(l *protocol.Listener) error {
-		l.Trace = nil // log.Printf
-		return nil
-	})
-
-	if err := ufslistener.Serve(listener); err != nil {
-		log.Fatal(err)
-	}
-}

+ 0 - 235
sys/src/go/cmd/tmpfs/tmpfs_test.go

@@ -1,235 +0,0 @@
-package main
-
-import (
-	"archive/tar"
-	"bytes"
-	"compress/gzip"
-	"fmt"
-	"log"
-	"net"
-	"testing"
-
-	"harvey-os.org/internal/tmpfs"
-	"harvey-os.org/pkg/ninep/protocol"
-)
-
-// Lots of tests shamelessly lifted from the ninep/ufs code
-
-func print(f string, args ...interface{}) {
-	fmt.Printf(f+"\n", args...)
-}
-
-// Create and add some files to the archive.
-func createTestImage() *bytes.Buffer {
-	var buf bytes.Buffer
-
-	gztw := gzip.NewWriter(&buf)
-	defer func() {
-		if err := gztw.Close(); err != nil {
-			log.Fatal(err)
-		}
-	}()
-
-	tw := tar.NewWriter(gztw)
-	defer func() {
-		if err := tw.Close(); err != nil {
-			log.Fatal(err)
-		}
-	}()
-
-	var files = []struct {
-		Name, Body string
-	}{
-		{"readme.txt", "This archive contains some text files."},
-		{"foo/gopher.txt", "Gopher names:\nGeorge\nGeoffrey\nGonzo"},
-		{"bar/todo.txt", "Get animal handling license."},
-		{"foo/todo2.txt", "harvey lalal"},
-		{"abc/123/sean.txt", "lorem ipshum."},
-		{"foo/bar/hello.txt", "hello world!"},
-	}
-	for _, file := range files {
-		hdr := &tar.Header{
-			Name: file.Name,
-			Mode: 0600,
-			Size: int64(len(file.Body)),
-		}
-		if err := tw.WriteHeader(hdr); err != nil {
-			log.Fatal(err)
-		}
-		if _, err := tw.Write([]byte(file.Body)); err != nil {
-			log.Fatal(err)
-		}
-	}
-
-	return &buf
-}
-
-func TestNwTmpfs(t *testing.T) {
-	fs, err := newTmpfs(nil)
-	if fs != nil || err == nil {
-		t.Fatal("no archive - should have failed")
-	}
-
-	arch := tmpfs.ReadImage(createTestImage())
-
-	fs, err = newTmpfs(arch)
-	if fs == nil || err != nil {
-		t.Fatal("should not have failed")
-	}
-}
-
-func TestMount(t *testing.T) {
-	p, p2 := net.Pipe()
-
-	c, err := protocol.NewClient(func(c *protocol.Client) error {
-		c.FromNet, c.ToNet = p, p
-		return nil
-	},
-		func(c *protocol.Client) error {
-			c.Msize = 8192
-			c.Trace = print //t.Logf
-			return nil
-		})
-	if err != nil {
-		t.Fatalf("%v", err)
-	}
-	t.Logf("Client is %v", c.String())
-
-	arch := tmpfs.ReadImage(createTestImage())
-	n, err := newTmpfs(arch, func(l *protocol.Listener) error {
-		l.Trace = print //t.Logf
-		return nil
-	})
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	if err := n.Accept(p2); err != nil {
-		t.Fatalf("Accept: want nil, got %v", err)
-	}
-
-	t.Logf("n is %v", n)
-
-	m, v, err := c.CallTversion(8000, "9P2000")
-	if err != nil {
-		t.Fatalf("CallTversion: want nil, got %v", err)
-	}
-	t.Logf("CallTversion: msize %v version %v", m, v)
-
-	t.Logf("Server is %v", n.String())
-
-	a, err := c.CallTattach(0, protocol.NOFID, "/", "")
-	if err != nil {
-		t.Fatalf("CallTattach: want nil, got %v", err)
-	}
-
-	t.Logf("Attach is %v", a)
-	w, err := c.CallTwalk(0, 1, []string{"hi", "there"})
-	if err == nil {
-		t.Fatalf("CallTwalk(0,1,[\"hi\", \"there\"]): want err, got nil")
-	}
-	if len(w) > 0 {
-		t.Fatalf("CallTwalk(0,1,[\"hi\", \"there\"]): want 0 QIDs, got %v", w)
-	}
-	t.Logf("Walk is %v", w)
-
-	reqPath := []string{"readme.txt"}
-	w, err = c.CallTwalk(0, 1, reqPath)
-	if err != nil {
-		t.Fatalf("CallTwalk(0,1,%v): want nil, got %v", reqPath, err)
-	}
-	t.Logf("Walk is %v", w)
-
-	// Read readme.txt
-	b, err := c.CallTread(1, 0, 8192)
-	if err != nil {
-		t.Fatalf("CallTread(1, 0, 8192): want nil, got %v", err)
-	}
-	expectedData := "This archive contains some text files."
-	if string(b[:]) != expectedData {
-		t.Fatalf("CallTread(1, 0, 8192): expected '%s', found '%s'", expectedData, string(b))
-	}
-
-	reqPath = []string{"foo", "gopher.txt"}
-	w, err = c.CallTwalk(0, 2, reqPath)
-	if err != nil {
-		t.Fatalf("CallTwalk(0,2,%v): want nil, got %v", reqPath, err)
-	}
-	t.Logf("Walk is %v", w)
-
-	// readdir test
-	w, err = c.CallTwalk(0, 3, []string{"foo"})
-	if err != nil {
-		t.Fatalf("CallTwalk(0, 3, []string{\"foo\"}): want nil, got %v", err)
-	}
-	t.Logf("Walk is %v", w)
-	_, _, err = c.CallTopen(3, protocol.OWRITE)
-	if err == nil {
-		t.Fatalf("CallTopen(3, protocol.OWRITE) on /: want err, got nil")
-	}
-	_, _, err = c.CallTopen(3, protocol.ORDWR)
-	if err == nil {
-		t.Fatalf("CallTopen(3, protocol.ORDWR) on /: want err, got nil")
-	}
-	_, _, err = c.CallTopen(3, protocol.OREAD)
-	if err != nil {
-		t.Fatalf("CallTopen(3, protocol.OREAD): want nil, got %v", err)
-	}
-
-	// Read folder 'foo'
-	var o protocol.Offset
-	var iter int
-	for iter < 10 {
-		iter++
-		b, err := c.CallTread(3, o, 256)
-		// EOF is indicated by a zero length read, not an actual error
-		if len(b) == 0 {
-			break
-		}
-		if err != nil {
-			t.Fatalf("CallTread(3, 0, 256): want nil, got %v", err)
-		}
-
-		dent, err := protocol.Unmarshaldir(bytes.NewBuffer(b))
-		if err != nil {
-			t.Errorf("Unmarshalldir: want nil, got %v", err)
-		}
-		t.Logf("dir read is %v", dent)
-		o += protocol.Offset(len(b))
-	}
-
-	if iter > 4 {
-		t.Errorf("Too many reads from the directory: want 3, got %v", iter)
-	}
-	if err := c.CallTclunk(3); err != nil {
-		t.Fatalf("CallTclunk(3): want nil, got %v", err)
-	}
-
-	// Read cloned root folder
-	w, err = c.CallTwalk(0, 4, []string{})
-	if err != nil {
-		t.Fatalf("CallTwalk(0,4,%v): want nil, got %v", reqPath, err)
-	}
-
-	_, err = c.CallTread(4, 0, 256)
-	if err != nil {
-		t.Fatalf("CallTread(0, 0, 256): want nil, got %v", err)
-	}
-
-	// readdir test (bar)
-	w, err = c.CallTwalk(0, 5, []string{"bar"})
-	if err != nil {
-		t.Fatalf("CallTwalk(0, 3, []string{\"bar\"}): want nil, got %v", err)
-	}
-	barRawDir, err := c.CallTread(5, 0, 256)
-	if err != nil {
-		t.Fatalf("CallTread(5, 0, 256): want nil, got %v", err)
-	}
-	barDir, err := protocol.Unmarshaldir(bytes.NewBuffer(barRawDir))
-	if err != nil {
-		t.Errorf("Unmarshalldir: want nil, got %v", err)
-	}
-	t.Logf("dir read is %v", barDir)
-
-	//t.Fail()
-}

+ 0 - 37
sys/src/go/cmd/ufs/ufs.go

@@ -1,37 +0,0 @@
-// UFS is a userspace server which exports a filesystem over 9p2000.
-//
-// By default, it will export / over a TCP on port 5640 under the username
-// of "harvey".
-package main
-
-import (
-	"flag"
-	"log"
-	"net"
-
-	"harvey-os.org/internal/ufs"
-	"harvey-os.org/pkg/ninep/protocol"
-)
-
-var (
-	ntype = flag.String("ntype", "tcp4", "Default network type")
-	naddr = flag.String("addr", ":5640", "Network address")
-)
-
-func main() {
-	flag.Parse()
-
-	ln, err := net.Listen(*ntype, *naddr)
-	if err != nil {
-		log.Fatalf("Listen failed: %v", err)
-	}
-
-	ufslistener, err := ufs.NewUFS(func(l *protocol.Listener) error {
-		l.Trace = nil // log.Printf
-		return nil
-	})
-
-	if err := ufslistener.Serve(ln); err != nil {
-		log.Fatal(err)
-	}
-}

+ 0 - 3
sys/src/go/go.mod

@@ -1,3 +0,0 @@
-module harvey-os.org
-
-go 1.14

+ 0 - 0
sys/src/go/go.sum


+ 0 - 272
sys/src/go/internal/tmpfs/archive.go

@@ -1,272 +0,0 @@
-package tmpfs
-
-import (
-	"archive/tar"
-	"compress/gzip"
-	"fmt"
-	"io"
-	"log"
-	"path"
-	"strings"
-	"time"
-
-	"harvey-os.org/pkg/ninep/protocol"
-)
-
-// Archive contains the directories and files from a decompressed archive
-type Archive struct {
-	root     *Directory   // root directory
-	dirs     []*Directory // array of all directories (idx is qid)
-	files    []*File      // array of all files (idx is qid)
-	openTime time.Time
-}
-
-// Entry is a common interface for file and directorys
-type Entry interface {
-	Name() string
-
-	// p9 server qid
-	Qid() protocol.QID
-
-	// p9 dir structure (stat)
-	P9Dir(uname string) *protocol.Dir
-}
-
-// File describes a file from a tar archive
-type File struct {
-	name    string
-	hdr     *tar.Header
-	data    []byte
-	fileQid protocol.QID
-}
-
-func newFile(hdr *tar.Header, id uint64, dataSize uint64) *File {
-	return &File{
-		name:    path.Base(hdr.Name),
-		hdr:     hdr,
-		data:    make([]byte, dataSize),
-		fileQid: protocol.QID{Type: protocol.QTFILE, Version: 0, Path: id},
-	}
-}
-
-// Name of the file (no path)
-func (f *File) Name() string {
-	return f.name
-}
-
-// Qid for file
-func (f *File) Qid() protocol.QID {
-	return f.fileQid
-}
-
-// P9Dir generates the Dir message for this file
-func (f *File) P9Dir(uname string) *protocol.Dir {
-	d := &protocol.Dir{}
-	d.QID = f.fileQid
-	d.Mode = 0444
-	d.Atime = uint32(f.hdr.AccessTime.Unix())
-	d.Mtime = uint32(f.hdr.ModTime.Unix())
-	d.Length = uint64(f.hdr.Size)
-	d.Name = f.Name()
-	d.User = uname
-	d.Group = uname
-	return d
-}
-
-// Data returns the data for the given file
-func (f *File) Data() []byte {
-	return f.data
-}
-
-// Directory describes a directory from a tar
-type Directory struct {
-	name           string
-	nameToEntryMap map[string]Entry
-	entries        []Entry
-	parent         Entry
-	dirQid         protocol.QID
-	openTime       time.Time
-}
-
-func newDirectory(name string, parent Entry, openTime time.Time, id uint64) *Directory {
-	return &Directory{
-		name:           name,
-		nameToEntryMap: map[string]Entry{},
-		entries:        []Entry{},
-		parent:         parent,
-		dirQid:         protocol.QID{Type: protocol.QTDIR, Version: 0, Path: id},
-		openTime:       openTime,
-	}
-}
-
-// Name of the directory (no path)
-func (d *Directory) Name() string {
-	return d.name
-}
-
-// ChildByName looks up the child in the given directory by name
-func (d *Directory) ChildByName(name string) (Entry, bool) {
-	e, ok := d.nameToEntryMap[name]
-	return e, ok
-}
-
-// Child looks up the child in the given directory by index
-func (d *Directory) Child(i int) Entry {
-	return d.entries[i]
-}
-
-// Parent returns the parent entry
-func (d *Directory) Parent() Entry {
-	return d.parent
-}
-
-// NumChildren returns the number of children in this directory
-func (d *Directory) NumChildren() int {
-	return len(d.entries)
-}
-
-// Qid returns the Qid for this directory
-func (d *Directory) Qid() protocol.QID {
-	return d.dirQid
-}
-
-// P9Dir generates the Dir message for this directory
-func (d *Directory) P9Dir(uname string) *protocol.Dir {
-	pd := &protocol.Dir{}
-	pd.QID = d.dirQid
-	pd.Mode = 0444 | protocol.DMDIR
-	pd.Atime = uint32(d.openTime.Unix())
-	pd.Mtime = uint32(d.openTime.Unix())
-	pd.Length = 0
-	pd.Name = d.Name()
-	pd.User = uname
-	pd.Group = uname
-	return pd
-}
-
-// Root returns the root directory for the archive
-func (a *Archive) Root() *Directory {
-	return a.root
-}
-
-func (a *Archive) addFile(filepath string, file *File) error {
-	filecmps := strings.Split(filepath, "/")
-
-	isFile := !file.hdr.FileInfo().IsDir()
-	var dirCmps []string
-	if isFile {
-		dirCmps = filecmps[:len(filecmps)-1]
-	} else {
-		dirCmps = filecmps
-	}
-
-	dir, err := a.getOrCreateDir(a.root, dirCmps)
-	if err != nil {
-		return err
-	}
-
-	if isFile {
-		return a.createFile(dir, filecmps[len(filecmps)-1], file)
-	}
-	return nil
-}
-
-func (a *Archive) getOrCreateDir(d *Directory, cmps []string) (*Directory, error) {
-	if len(cmps) == 0 {
-		return d, nil
-	}
-
-	cmpname := cmps[0]
-	if cmpname == "" {
-		return d, nil
-	}
-
-	if entry, exists := d.nameToEntryMap[cmpname]; exists {
-		// this component already exists, so try to walk down the tree
-		if dir, ok := entry.(*Directory); ok {
-			return a.getOrCreateDir(dir, cmps[1:])
-		}
-		return nil, fmt.Errorf("File already exists with name %s", cmpname)
-	}
-
-	// Create a new directory
-	newDir := newDirectory(cmpname, d, a.openTime, uint64(len(a.dirs)))
-
-	a.dirs = append(a.dirs, newDir)
-
-	// Add the child dir to the parent
-	// Also serialize in p9 marshalled form so we don't need to faff around in Rread
-	d.nameToEntryMap[cmpname] = newDir
-	d.entries = append(d.entries, newDir)
-
-	return a.getOrCreateDir(newDir, cmps[1:])
-}
-
-func (a *Archive) createFile(d *Directory, filename string, file *File) error {
-	if _, exists := d.nameToEntryMap[filename]; exists {
-		return fmt.Errorf("File or directory already exists with name %s", filename)
-	}
-	d.nameToEntryMap[filename] = file
-	d.entries = append(d.entries, file)
-
-	file.fileQid.Type = protocol.QTFILE
-	file.fileQid.Path = uint64(len(a.files) + 1)
-
-	a.files = append(a.files, file)
-
-	return nil
-}
-
-// DumpEntry will write out the archive hierarchy from the given entry and parentPath
-func (a *Archive) DumpEntry(e Entry, parentPath string) {
-	if dir, isDir := e.(*Directory); isDir {
-		parentPath = path.Join(parentPath, dir.name)
-		for _, child := range dir.entries {
-			a.DumpEntry(child, parentPath)
-		}
-	} else if file, isFile := e.(*File); isFile {
-		log.Printf("%v\n", path.Join(parentPath, file.name))
-	}
-}
-
-// DumpArchive will write out the archive hierarchy
-func (a *Archive) DumpArchive() {
-	a.DumpEntry(a.root, "")
-}
-
-// ReadImage reads a compressed tar to produce a file hierarchy
-func ReadImage(r io.Reader) *Archive {
-	gzr, err := gzip.NewReader(r)
-	if err != nil {
-		log.Fatal(err)
-	}
-	defer func() {
-		if err := gzr.Close(); err != nil {
-			log.Fatal(err)
-		}
-	}()
-
-	openTime := time.Now()
-	fs := &Archive{newDirectory("/", nil, openTime, 0), []*Directory{}, []*File{}, openTime}
-	tr := tar.NewReader(gzr)
-	for id := 0; ; id++ {
-		hdr, err := tr.Next()
-		if err == io.EOF {
-			break // End of archive
-		}
-		if err != nil {
-			log.Fatal(err)
-		}
-
-		file := newFile(hdr, uint64(id), uint64(hdr.Size))
-		if _, err := io.ReadFull(tr, file.data); err != nil {
-			log.Fatal(err)
-		}
-
-		if err = fs.addFile(hdr.Name, file); err != nil {
-			log.Fatal(err)
-		}
-	}
-
-	return fs
-}

+ 0 - 127
sys/src/go/internal/tmpfs/archive_test.go

@@ -1,127 +0,0 @@
-package tmpfs
-
-import (
-	"archive/tar"
-	"bytes"
-	"compress/gzip"
-	"log"
-	"os"
-	"strings"
-	"testing"
-)
-
-// Create and add some files to the archive.
-func createTestImage() *bytes.Buffer {
-	var buf bytes.Buffer
-
-	gztw := gzip.NewWriter(&buf)
-	defer func() {
-		if err := gztw.Close(); err != nil {
-			log.Fatal(err)
-		}
-	}()
-
-	tw := tar.NewWriter(gztw)
-	defer func() {
-		if err := tw.Close(); err != nil {
-			log.Fatal(err)
-		}
-	}()
-
-	var files = []struct {
-		Name, Body string
-	}{
-		{"emptyDir/", ""},
-		{"emptyFile", ""},
-		{"readme.txt", "This archive contains some text files."},
-		{"foo/gopher.txt", "Gopher names:\nGeorge\nGeoffrey\nGonzo"},
-		{"bar/todo.txt", "Get animal handling license."},
-		{"foo/todo2.txt", "harvey lalal"},
-		{"abc/123/sean.txt", "lorem ipshum."},
-	}
-	for _, file := range files {
-		hdr := &tar.Header{}
-		if strings.HasSuffix(file.Name, "/") {
-			hdr.Name = file.Name[:len(file.Name)-1]
-			hdr.Mode = int64(0777 | os.ModeDir)
-			hdr.Size = 0
-			hdr.Typeflag = tar.TypeDir
-		} else {
-			hdr.Name = file.Name
-			hdr.Mode = 0600
-			hdr.Size = int64(len(file.Body))
-			hdr.Typeflag = tar.TypeReg
-		}
-		if err := tw.WriteHeader(hdr); err != nil {
-			log.Fatal(err)
-		}
-
-		if _, err := tw.Write([]byte(file.Body)); err != nil {
-			log.Fatal(err)
-		}
-	}
-
-	return &buf
-}
-
-func TestReadArchive(t *testing.T) {
-	arch := ReadImage(createTestImage())
-
-	// Read root
-	root := arch.Root()
-	if root.Name() != "/" {
-		t.Fatal("incorrect root name")
-	}
-
-	// Read readme.txt
-	readme, ok := root.ChildByName("readme.txt")
-	if !ok {
-		t.Fatal("couldn't open readme.txt")
-	}
-	readmeFile := readme.(*File)
-	readmeData := string(readmeFile.Data())
-	if readmeData != "This archive contains some text files." {
-		t.Fatalf("readme.txt didn't contain expected string - found '%s'\n", readmeData)
-	}
-
-	// Read abc/123/sean.txt
-	abc, ok := root.ChildByName("abc")
-	if !ok {
-		t.Fatal("couldn't open abc")
-	}
-	abcDir := abc.(*Directory)
-	oneTwoThree, ok := abcDir.ChildByName("123")
-	if !ok {
-		t.Fatal("couldn't open 123")
-	}
-	oneTwoThreeDir := oneTwoThree.(*Directory)
-	sean, ok := oneTwoThreeDir.ChildByName("sean.txt")
-	if !ok {
-		t.Fatal("couldn't open sean.txt")
-	}
-	seanFile := sean.(*File)
-	seanData := string(seanFile.Data())
-	expectedData := "lorem ipshum."
-	if seanData != expectedData {
-		t.Fatalf("sean.txt didn't contain expected string. expected '%s', found '%s'\n", expectedData, seanData)
-	}
-
-	// Test that there are the expected children in a directory
-	foo, ok := root.ChildByName("foo")
-	if !ok {
-		t.Fatal("couldn't open foo")
-	}
-	fooDir := foo.(*Directory)
-	numFooChildren := fooDir.NumChildren()
-	if numFooChildren != 2 {
-		t.Fatalf("expected 2 children, found %v\n", numFooChildren)
-	}
-	_, ok = fooDir.ChildByName("gopher.txt")
-	if !ok {
-		t.Fatal("couldn't get gopher.txt")
-	}
-	_, ok = fooDir.ChildByName("todo2.txt")
-	if !ok {
-		t.Fatal("couldn't get todo2.txt")
-	}
-}

+ 0 - 468
sys/src/go/internal/ufs/filesystem.go

@@ -1,468 +0,0 @@
-// Copyright 2009 The Ninep Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ufs
-
-import (
-	"bytes"
-	"flag"
-	"fmt"
-	"io"
-	"log"
-	"os"
-	"path"
-	"path/filepath"
-	"sync"
-	"time"
-
-	"harvey-os.org/pkg/ninep"
-	"harvey-os.org/pkg/ninep/protocol"
-)
-
-type file struct {
-	protocol.QID
-	fullName string
-	file     *os.File
-	// We can't know how big a serialized dentry is until we serialize it.
-	// At that point it might be too big. We save it here if that happens,
-	// and on the next directory read we start with that.
-	oflow []byte
-}
-
-type FileServer struct {
-	root      *file
-	rootPath  string
-	Versioned bool
-	IOunit    protocol.MaxSize
-
-	// mu guards below
-	mu    sync.Mutex
-	files map[protocol.FID]*file
-}
-
-var (
-	debug = flag.Int("debug", 0, "print debug messages")
-	root  = flag.String("root", "/", "Set the root for all attaches")
-)
-
-func stat(s string) (*protocol.Dir, protocol.QID, error) {
-	var q protocol.QID
-	st, err := os.Lstat(s)
-	if err != nil {
-		return nil, q, fmt.Errorf("does not exist")
-	}
-	d, err := dirTo9p2000Dir(st)
-	if err != nil {
-		return nil, q, nil
-	}
-	q = fileInfoToQID(st)
-	return d, q, nil
-}
-
-func (e *FileServer) Rversion(msize protocol.MaxSize, version string) (protocol.MaxSize, string, error) {
-	if version != "9P2000" {
-		return 0, "", fmt.Errorf("%v not supported; only 9P2000", version)
-	}
-	e.Versioned = true
-	return msize, version, nil
-}
-
-func (e *FileServer) getFile(fid protocol.FID) (*file, error) {
-	e.mu.Lock()
-	defer e.mu.Unlock()
-	f, ok := e.files[fid]
-	if !ok {
-		return nil, fmt.Errorf("does not exist")
-	}
-
-	return f, nil
-}
-
-func (e *FileServer) Rattach(fid protocol.FID, afid protocol.FID, uname string, aname string) (protocol.QID, error) {
-	if afid != protocol.NOFID {
-		return protocol.QID{}, fmt.Errorf("We don't do auth attach")
-	}
-	// There should be no .. or other such junk in the Aname. Clean it up anyway.
-	aname = path.Join("/", aname)
-	aname = path.Join(e.rootPath, aname)
-	st, err := os.Stat(aname)
-	if err != nil {
-		return protocol.QID{}, err
-	}
-	r := &file{fullName: aname}
-	r.QID = fileInfoToQID(st)
-	e.files[fid] = r
-	e.root = r
-	return r.QID, nil
-}
-
-func (e *FileServer) Rflush(o protocol.Tag) error {
-	return nil
-}
-
-func (e *FileServer) Rwalk(fid protocol.FID, newfid protocol.FID, paths []string) ([]protocol.QID, error) {
-	e.mu.Lock()
-	f, ok := e.files[fid]
-	e.mu.Unlock()
-	if !ok {
-		return nil, fmt.Errorf("does not exist")
-	}
-	if len(paths) == 0 {
-		e.mu.Lock()
-		defer e.mu.Unlock()
-		_, ok := e.files[newfid]
-		if ok {
-			return nil, fmt.Errorf("FID in use: clone walk, fid %d newfid %d", fid, newfid)
-		}
-		nf := *f
-		e.files[newfid] = &nf
-		return []protocol.QID{}, nil
-	}
-	p := f.fullName
-	q := make([]protocol.QID, len(paths))
-
-	var i int
-	for i = range paths {
-		p = path.Join(p, paths[i])
-		st, err := os.Lstat(p)
-		if err != nil {
-			// From the RFC: If the first element cannot be walked for any
-			// reason, Rerror is returned. Otherwise, the walk will return an
-			// Rwalk message containing nwqid qids corresponding, in order, to
-			// the files that are visited by the nwqid successful elementwise
-			// walks; nwqid is therefore either nwname or the index of the
-			// first elementwise walk that failed. The value of nwqid cannot be
-			// zero unless nwname is zero. Also, nwqid will always be less than
-			// or equal to nwname. Only if it is equal, however, will newfid be
-			// affected, in which case newfid will represent the file reached
-			// by the final elementwise walk requested in the message.
-			//
-			// to sum up: if any walks have succeeded, you return the QIDS for
-			// one more than the last successful walk
-			if i == 0 {
-				return nil, fmt.Errorf("file does not exist")
-			}
-			// we only get here if i is > 0 and less than nwname,
-			// so the i should be safe.
-			return q[:i], nil
-		}
-		q[i] = fileInfoToQID(st)
-	}
-	e.mu.Lock()
-	defer e.mu.Unlock()
-	// this is quite unlikely, which is why we don't bother checking for it first.
-	if fid != newfid {
-		if _, ok := e.files[newfid]; ok {
-			return nil, fmt.Errorf("FID in use: walk to %v, fid %v, newfid %v", paths, fid, newfid)
-		}
-	}
-	e.files[newfid] = &file{fullName: p, QID: q[i]}
-	return q, nil
-}
-
-func (e *FileServer) Ropen(fid protocol.FID, mode protocol.Mode) (protocol.QID, protocol.MaxSize, error) {
-	e.mu.Lock()
-	f, ok := e.files[fid]
-	e.mu.Unlock()
-	if !ok {
-		return protocol.QID{}, 0, fmt.Errorf("does not exist")
-	}
-
-	var err error
-	f.file, err = os.OpenFile(f.fullName, modeToUnixFlags(mode), 0)
-	if err != nil {
-		return protocol.QID{}, 0, err
-	}
-
-	return f.QID, e.IOunit, nil
-}
-func (e *FileServer) Rcreate(fid protocol.FID, name string, perm protocol.Perm, mode protocol.Mode) (protocol.QID, protocol.MaxSize, error) {
-	f, err := e.getFile(fid)
-	if err != nil {
-		return protocol.QID{}, 0, err
-	}
-	if f.file != nil {
-		return protocol.QID{}, 0, fmt.Errorf("FID already open")
-	}
-	n := path.Join(f.fullName, name)
-	if perm&protocol.Perm(protocol.DMDIR) != 0 {
-		p := os.FileMode(int(perm) & 0777)
-		err := os.Mkdir(n, p)
-		_, q, err := stat(n)
-		if err != nil {
-			return protocol.QID{}, 0, err
-		}
-		f.fullName = n
-		f.QID = q
-		return q, 8000, err
-	}
-
-	m := modeToUnixFlags(mode) | os.O_CREATE | os.O_TRUNC
-	p := os.FileMode(perm) & 0777
-	of, err := os.OpenFile(n, m, p)
-	if err != nil {
-		return protocol.QID{}, 0, err
-	}
-	_, q, err := stat(n)
-	if err != nil {
-		return protocol.QID{}, 0, err
-	}
-	f.fullName = n
-	f.QID = q
-	f.file = of
-	return q, 8000, err
-}
-func (e *FileServer) Rclunk(fid protocol.FID) error {
-	_, err := e.clunk(fid)
-	return err
-}
-
-func (e *FileServer) Rstat(fid protocol.FID) ([]byte, error) {
-	f, err := e.getFile(fid)
-	if err != nil {
-		return []byte{}, err
-	}
-	st, err := os.Lstat(f.fullName)
-	if err != nil {
-		return []byte{}, fmt.Errorf("ENOENT")
-	}
-	d, err := dirTo9p2000Dir(st)
-	if err != nil {
-		return []byte{}, nil
-	}
-	var b bytes.Buffer
-	protocol.Marshaldir(&b, *d)
-	return b.Bytes(), nil
-}
-func (e *FileServer) Rwstat(fid protocol.FID, b []byte) error {
-	var changed bool
-	f, err := e.getFile(fid)
-	if err != nil {
-		return err
-	}
-	dir, err := protocol.Unmarshaldir(bytes.NewBuffer(b))
-	if err != nil {
-		return err
-	}
-	if dir.Mode != 0xFFFFFFFF {
-		changed = true
-		mode := dir.Mode & 0777
-		if err := os.Chmod(f.fullName, os.FileMode(mode)); err != nil {
-			return err
-		}
-	}
-
-	// Try to find local uid, gid by name.
-	if dir.User != "" || dir.Group != "" {
-		return fmt.Errorf("Permission denied")
-		changed = true
-	}
-
-	/*
-		if uid != ninep.NOUID || gid != ninep.NOUID {
-			changed = true
-			e := os.Chown(fid.path, int(uid), int(gid))
-			if e != nil {
-				req.RespondError(toError(e))
-				return
-			}
-		}
-	*/
-
-	if dir.Name != "" {
-		changed = true
-		// If we path.Join dir.Name to / before adding it to
-		// the fid path, that ensures nobody gets to walk out of the
-		// root of this server.
-		newname := path.Join(path.Dir(f.fullName), path.Join("/", dir.Name))
-
-		// absolute renaming. Ufs can do this, so let's support it.
-		// We'll allow an absolute path in the Name and, if it is,
-		// we will make it relative to root. This is a gigantic performance
-		// improvement in systems that allow it.
-		if filepath.IsAbs(dir.Name) {
-			newname = path.Join(e.rootPath, dir.Name)
-		}
-
-		// If to exists, and to is a directory, we can't do the
-		// rename, since os.Rename will move from into to.
-
-		st, err := os.Stat(newname)
-		if err == nil && st.IsDir() {
-			return fmt.Errorf("is a directory")
-		}
-		if err := os.Rename(f.fullName, newname); err != nil {
-			return err
-		}
-		f.fullName = newname
-	}
-
-	if dir.Length != 0xFFFFFFFFFFFFFFFF {
-		changed = true
-		if err := os.Truncate(f.fullName, int64(dir.Length)); err != nil {
-			return err
-		}
-	}
-
-	// If either mtime or atime need to be changed, then
-	// we must change both.
-	if dir.Mtime != ^uint32(0) || dir.Atime != ^uint32(0) {
-		changed = true
-		mt, at := time.Unix(int64(dir.Mtime), 0), time.Unix(int64(dir.Atime), 0)
-		if cmt, cat := (dir.Mtime == ^uint32(0)), (dir.Atime == ^uint32(0)); cmt || cat {
-			st, err := os.Stat(f.fullName)
-			if err != nil {
-				return err
-			}
-			switch cmt {
-			case true:
-				mt = st.ModTime()
-			default:
-				//at = atime(st.Sys().(*syscall.Stat_t))
-			}
-		}
-		if err := os.Chtimes(f.fullName, at, mt); err != nil {
-			return err
-		}
-	}
-
-	if !changed && f.file != nil {
-		f.file.Sync()
-	}
-	return nil
-}
-
-func (e *FileServer) clunk(fid protocol.FID) (*file, error) {
-	e.mu.Lock()
-	defer e.mu.Unlock()
-	f, ok := e.files[fid]
-	if !ok {
-		return nil, fmt.Errorf("does not exist")
-	}
-	delete(e.files, fid)
-	// What do we do if we can't close it?
-	// All I can think of is to log it.
-	if f.file != nil {
-		if err := f.file.Close(); err != nil {
-			log.Printf("Close of %v failed: %v", f.fullName, err)
-		}
-	}
-	return f, nil
-}
-
-// Rremove removes the file. The question of whether the file continues to be accessible
-// is system dependent.
-func (e *FileServer) Rremove(fid protocol.FID) error {
-	f, err := e.clunk(fid)
-	if err != nil {
-		return err
-	}
-	return os.Remove(f.fullName)
-}
-
-func (e *FileServer) Rread(fid protocol.FID, o protocol.Offset, c protocol.Count) ([]byte, error) {
-	f, err := e.getFile(fid)
-	if err != nil {
-		return nil, err
-	}
-	if f.file == nil {
-		return nil, fmt.Errorf("FID not open")
-	}
-	if f.QID.Type&protocol.QTDIR != 0 {
-		if o == 0 {
-			f.oflow = nil
-			if err := resetDir(f); err != nil {
-				return nil, err
-			}
-		}
-
-		// We make the assumption that they can always fit at least one
-		// directory entry into a read. If that assumption does not hold
-		// so many things are broken that we can't fix them here.
-		// But we'll drop out of the loop below having returned nothing
-		// anyway.
-		b := bytes.NewBuffer(f.oflow)
-		f.oflow = nil
-		pos := 0
-
-		for {
-			if b.Len() > int(c) {
-				f.oflow = b.Bytes()[pos:]
-				return b.Bytes()[:pos], nil
-			}
-			pos += b.Len()
-			st, err := f.file.Readdir(1)
-			if err == io.EOF {
-				return b.Bytes(), nil
-			}
-			if err != nil {
-				return nil, err
-			}
-
-			d9p, err := dirTo9p2000Dir(st[0])
-			if err != nil {
-				return nil, err
-			}
-			protocol.Marshaldir(b, *d9p)
-			// Seen on linux clients: sometimes the math is wrong and
-			// they end up asking for the last element with not enough data.
-			// Linux bug or bug with this server? Not sure yet.
-			if b.Len() > int(c) {
-				log.Printf("Warning: Server bug? %v, need %d bytes;count is %d: skipping", d9p, b.Len(), c)
-				return nil, nil
-			}
-			// We're not quite doing the array right.
-			// What does work is returning one thing so, for now, do that.
-			return b.Bytes(), nil
-		}
-		return b.Bytes(), nil
-	}
-
-	// N.B. even if they ask for 0 bytes on some file systems it is important to pass
-	// through a zero byte read (not Unix, of course).
-	b := make([]byte, c)
-	n, err := f.file.ReadAt(b, int64(o))
-	if err != nil && err != io.EOF {
-		return nil, err
-	}
-	return b[:n], nil
-}
-
-func (e *FileServer) Rwrite(fid protocol.FID, o protocol.Offset, b []byte) (protocol.Count, error) {
-	f, err := e.getFile(fid)
-	if err != nil {
-		return -1, err
-	}
-	if f.file == nil {
-		return -1, fmt.Errorf("FID not open")
-	}
-
-	// N.B. even if they ask for 0 bytes on some file systems it is important to pass
-	// through a zero byte write (not Unix, of course). Also, let the underlying file system
-	// manage the error if the open mode was wrong. No need to duplicate the logic.
-
-	n, err := f.file.WriteAt(b, int64(o))
-	return protocol.Count(n), err
-}
-
-func NewUFS(opts ...protocol.ListenerOpt) (*protocol.Listener, error) {
-	nsCreator := func() protocol.NineServer {
-		f := &FileServer{}
-		f.files = make(map[protocol.FID]*file)
-		f.rootPath = *root // for now.
-		f.IOunit = 8192
-		// any opts for the ufs layer can be added here too ...
-		var d protocol.NineServer = f
-		if *debug != 0 {
-			d = &ninep.DebugFileServer{FileServer: f}
-		}
-		return d
-	}
-
-	l, err := protocol.NewListener(nsCreator, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return l, nil
-}

+ 0 - 317
sys/src/go/internal/ufs/filesystem_test.go

@@ -1,317 +0,0 @@
-package ufs
-
-import (
-	"bytes"
-	"fmt"
-	"io/ioutil"
-	"net"
-	"os"
-	"path"
-	"strings"
-	"testing"
-
-	"harvey-os.org/pkg/ninep/protocol"
-)
-
-func print(f string, args ...interface{}) {
-	fmt.Printf(f+"\n", args...)
-}
-
-func TestNew(t *testing.T) {
-	n, err := NewUFS()
-	if err != nil {
-		t.Fatal(err)
-	}
-	t.Logf("n is %v", n)
-}
-
-// a simple prototype file system.
-type makeit struct {
-	n string      // name
-	m os.FileMode // mode
-	s string      // for symlinks or content
-}
-
-var tests = []makeit{
-	{
-		n: "ro",
-		m: 0444,
-		s: "",
-	},
-	{
-		n: "rw",
-		m: 0666,
-		s: "",
-	},
-	{
-		n: "wo",
-		m: 0222,
-		s: "",
-	},
-}
-
-func TestMount(t *testing.T) {
-	/* Create the simple file system. */
-	tmpdir, err := ioutil.TempDir(os.TempDir(), "hi.dir")
-	if err != nil {
-		t.Fatalf("%v", err)
-	}
-
-	for i := range tests {
-		if err := ioutil.WriteFile(path.Join(tmpdir, tests[i].n), []byte("hi"), tests[i].m); err != nil {
-			t.Fatalf("%v", err)
-		}
-	}
-
-	p, p2 := net.Pipe()
-
-	c, err := protocol.NewClient(func(c *protocol.Client) error {
-		c.FromNet, c.ToNet = p, p
-		return nil
-	},
-		func(c *protocol.Client) error {
-			c.Msize = 8192
-			c.Trace = print //t.Logf
-			return nil
-		})
-	if err != nil {
-		t.Fatalf("%v", err)
-	}
-	t.Logf("Client is %v", c.String())
-
-	n, err := NewUFS(func(l *protocol.Listener) error {
-		l.Trace = print //t.Logf
-		return nil
-	})
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	if err := n.Accept(p2); err != nil {
-		t.Fatalf("Accept: want nil, got %v", err)
-	}
-
-	t.Logf("n is %v", n)
-
-	m, v, err := c.CallTversion(8000, "9P2000")
-	if err != nil {
-		t.Fatalf("CallTversion: want nil, got %v", err)
-	}
-	t.Logf("CallTversion: msize %v version %v", m, v)
-
-	t.Logf("Server is %v", n.String())
-
-	a, err := c.CallTattach(0, protocol.NOFID, "/", "")
-	if err != nil {
-		t.Fatalf("CallTattach: want nil, got %v", err)
-	}
-
-	t.Logf("Attach is %v", a)
-	w, err := c.CallTwalk(0, 1, []string{"hi", "there"})
-	if err == nil {
-		t.Fatalf("CallTwalk(0,1,[\"hi\", \"there\"]): want err, got nil")
-	}
-	if len(w) > 0 {
-		t.Fatalf("CallTwalk(0,1,[\"hi\", \"there\"]): want 0 QIDs, got %v", w)
-	}
-	t.Logf("Walk is %v", w)
-	ro := strings.Split(path.Join(tmpdir, "ro"), "/")
-
-	w, err = c.CallTwalk(0, 1, ro)
-	if err != nil {
-		t.Fatalf("CallTwalk(0,1,%v): want nil, got %v", ro, err)
-	}
-	t.Logf("Walk is %v", w)
-
-	of, _, err := c.CallTopen(22, protocol.OREAD)
-	if err == nil {
-		t.Fatalf("CallTopen(22, protocol.OREAD): want err, got nil")
-	}
-	of, _, err = c.CallTopen(1, protocol.OWRITE)
-	if err == nil {
-		t.Fatalf("CallTopen(0, protocol.OWRITE): want err, got nil")
-	}
-	of, _, err = c.CallTopen(1, protocol.OREAD)
-	if err != nil {
-		t.Fatalf("CallTopen(1, protocol.OREAD): want nil, got %v", nil)
-	}
-	t.Logf("Open is %v", of)
-
-	b, err := c.CallTread(22, 0, 0)
-	if err == nil {
-		t.Fatalf("CallTread(22, 0, 0): want err, got nil")
-	}
-	b, err = c.CallTread(1, 1, 1)
-	if err != nil {
-		t.Fatalf("CallTread(1, 1, 1): want nil, got %v", err)
-	}
-	t.Logf("read is %v", string(b))
-
-	/* make sure Twrite fails */
-	if _, err = c.CallTwrite(1, 0, b); err == nil {
-		t.Fatalf("CallTwrite(1, 0, b): want err, got nil")
-	}
-
-	d, err := c.CallTstat(1)
-	if err != nil {
-		t.Fatalf("CallTstat(1): want nil, got %v", err)
-	}
-	t.Logf("stat is %v", d)
-
-	d, err = c.CallTstat(22)
-	if err == nil {
-		t.Fatalf("CallTstat(22): want err, got nil)")
-	}
-	t.Logf("stat is %v", d)
-
-	if err := c.CallTclunk(22); err == nil {
-		t.Fatalf("CallTclunk(22): want err, got nil")
-	}
-	if err := c.CallTclunk(1); err != nil {
-		t.Fatalf("CallTclunk(1): want nil, got %v", err)
-	}
-	if _, err := c.CallTread(1, 1, 22); err == nil {
-		t.Fatalf("CallTread(1, 1, 22) after clunk: want err, got nil")
-	}
-
-	d, err = c.CallTstat(1)
-	if err == nil {
-		t.Fatalf("CallTstat(1): after clunk: want err, got nil")
-	}
-	t.Logf("stat is %v", d)
-
-	// fun with write
-	rw := strings.Split(path.Join(tmpdir, "rw"), "/")
-	w, err = c.CallTwalk(0, 1, rw)
-	if err != nil {
-		t.Fatalf("CallTwalk(0,1,%v): want nil, got %v", rw, err)
-	}
-	t.Logf("Walk is %v", w)
-
-	of, _, err = c.CallTopen(1, protocol.OREAD)
-	if err != nil {
-		t.Fatalf("CallTopen(1, protocol.OREAD): want nil, got %v", nil)
-	}
-	if err := c.CallTclunk(1); err != nil {
-		t.Fatalf("CallTclunk(1): want nil, got %v", err)
-	}
-	w, err = c.CallTwalk(0, 1, rw)
-	if err != nil {
-		t.Fatalf("CallTwalk(0,1,%v): want nil, got %v", rw, err)
-	}
-	t.Logf("Walk is %v", w)
-
-	of, _, err = c.CallTopen(1, protocol.OWRITE)
-	if err != nil {
-		t.Fatalf("CallTopen(0, protocol.OWRITE): want nil, got %v", err)
-	}
-	t.Logf("open OWRITE of is %v", of)
-	if _, err = c.CallTwrite(1, 1, []byte("there")); err != nil {
-		t.Fatalf("CallTwrite(1, 0, \"there\"): want nil, got %v", err)
-	}
-	if _, err = c.CallTwrite(22, 1, []byte("there")); err == nil {
-		t.Fatalf("CallTwrite(22, 1, \"there\"): want err, got nil")
-	}
-
-	// readdir test.
-	w, err = c.CallTwalk(0, 2, strings.Split(tmpdir, "/"))
-	if err != nil {
-		t.Fatalf("CallTwalk(0,2,strings.Split(tmpdir, \"/\")): want nil, got %v", err)
-	}
-	t.Logf("Walk is %v", w)
-	of, _, err = c.CallTopen(2, protocol.OWRITE)
-	if err == nil {
-		t.Fatalf("CallTopen(2, protocol.OWRITE) on /: want err, got nil")
-	}
-	of, _, err = c.CallTopen(2, protocol.ORDWR)
-	if err == nil {
-		t.Fatalf("CallTopen(2, protocol.ORDWR) on /: want err, got nil")
-	}
-	of, _, err = c.CallTopen(2, protocol.OREAD)
-	if err != nil {
-		t.Fatalf("CallTopen(1, protocol.OREAD): want nil, got %v", nil)
-	}
-	var o protocol.Offset
-	var iter int
-	for iter < 10 {
-		iter++
-		b, err = c.CallTread(2, o, 256)
-		// EOF is indicated by a zero length read, not an actual error
-		if len(b) == 0 {
-			break
-		}
-		if err != nil {
-			t.Fatalf("CallTread(2, 0, 256): want nil, got %v", err)
-		}
-
-		dent, err := protocol.Unmarshaldir(bytes.NewBuffer(b))
-		if err != nil {
-			t.Errorf("Unmarshalldir: want nil, got %v", err)
-		}
-		t.Logf("dir read is %v", dent)
-		o += protocol.Offset(len(b))
-	}
-
-	if iter > 9 {
-		t.Errorf("Too many reads from the directory: want 3, got %v", iter)
-	}
-	if err := c.CallTclunk(2); err != nil {
-		t.Fatalf("CallTclunk(1): want nil, got %v", err)
-	}
-	// Create tests
-	w, err = c.CallTwalk(0, 3, []string{})
-	if err != nil {
-		t.Fatalf("CallTwalk(0,3,[]string{}): want nil, got %v", err)
-	}
-	w, err = c.CallTwalk(3, 3, strings.Split(tmpdir, "/"))
-	if err != nil {
-		t.Fatalf("CallTwalk(0,3,[]string{}): want nil, got %v", err)
-	}
-	t.Logf("Walk is %v", w)
-	of, _, err = c.CallTcreate(3, "xxx", 077, 0)
-	if err != nil {
-		t.Fatalf("CallTcreate(\"xxx\", 077, 0): want nil, got %v", err)
-	}
-	xxx := path.Join(tmpdir, "xxx")
-	fi, err := os.Stat(xxx)
-	if err != nil {
-		t.Fatalf("After create, check %v: want nil, got %v", xxx, err)
-	}
-	t.Logf("Stat of created file: %v", fi)
-
-	// Test mkdir
-	w, err = c.CallTwalk(0, 4, strings.Split(tmpdir, "/"))
-	if err != nil {
-		t.Fatalf("CallTwalk(0,4,%v): want nil, got %v", tmpdir, err)
-	}
-	of, _, err = c.CallTcreate(4, "yyy", protocol.DMDIR|0777, 0)
-	if err != nil {
-		t.Fatalf("CallTcreate(\"yyy\", 0777, 0): want nil, got %v", err)
-	}
-	yyy := path.Join(tmpdir, "yyy")
-	fi, err = os.Stat(yyy)
-	if err != nil {
-		t.Fatalf("After create, check %v: want nil, got %v", yyy, err)
-	}
-	if !fi.IsDir() {
-		t.Fatalf("After mkdir, %v, not a directory", yyy)
-	}
-	t.Logf("Stat of created file: %v", fi)
-
-	// test remove
-	if err = c.CallTremove(3); err != nil {
-		t.Fatalf("CallTremove(3) failed: want nil, got %v", err)
-	}
-	if err = c.CallTclunk(3); err == nil {
-		t.Errorf("CallTclunk(3) failed: want err, got nil")
-	}
-	if _, err := os.Stat(xxx); err == nil {
-		t.Fatalf("After remove(%v); stat returns nil, not err", xxx)
-	}
-	if err = c.CallTremove(4); err != nil {
-		t.Fatalf("CallTremove(4) failed: want nil, got %v", err)
-	}
-	if _, err := os.Stat(yyy); err == nil {
-		t.Fatalf("After remove(%v); stat returns nil, not err", yyy)
-	}
-}

+ 0 - 18
sys/src/go/internal/ufs/filesystem_unix.go

@@ -1,18 +0,0 @@
-// Copyright 2012 The Ninep Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-// This code is imported from the old ninep repo,
-// with some changes.
-
-// +build !windows
-
-package ufs
-
-import "io"
-
-// resetDir seeks to the beginning of the file so that the file list can be
-// read again.
-func resetDir(f *file) error {
-	_, err := f.file.Seek(0, io.SeekStart)
-	return err
-}

+ 0 - 25
sys/src/go/internal/ufs/filesystem_windows.go

@@ -1,25 +0,0 @@
-// Copyright 2012 The Ninep Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-// This code is imported from the old ninep repo,
-// with some changes.
-
-// +build windows
-
-package ufs
-
-import "os"
-
-// resetDir closes the underlying file and reopens it so it can be read again.
-// This is because Windows doesn't seem to support calling Seek on a directory
-// handle.
-func resetDir(f *File) error {
-	f2, err := os.OpenFile(f.fullName, os.O_RDONLY, 0)
-	if err != nil {
-		return err
-	}
-
-	f.File.Close()
-	f.File = f2
-	return nil
-}

+ 0 - 81
sys/src/go/internal/ufs/ninep.go

@@ -1,81 +0,0 @@
-// Copyright 2012 The Ninep Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-// This code is imported from the old ninep repo,
-// with some changes.
-
-package ufs
-
-import (
-	"flag"
-	"os"
-
-	"harvey-os.org/pkg/ninep/protocol"
-)
-
-var (
-	user = flag.String("user", "harvey", "Default user name")
-)
-
-func modeToUnixFlags(mode protocol.Mode) int {
-	ret := int(0)
-	switch mode & 3 {
-	case protocol.OREAD:
-		ret = os.O_RDONLY
-		break
-
-	case protocol.ORDWR:
-		ret = os.O_RDWR
-		break
-
-	case protocol.OWRITE:
-		ret = os.O_WRONLY
-		break
-
-	case protocol.OEXEC:
-		ret = os.O_RDONLY
-		break
-	}
-
-	if mode&protocol.OTRUNC != 0 {
-		ret |= os.O_TRUNC
-	}
-
-	return ret
-}
-
-func dirToQIDType(d os.FileInfo) uint8 {
-	ret := uint8(0)
-	if d.IsDir() {
-		ret |= protocol.QTDIR
-	}
-
-	if d.Mode()&os.ModeSymlink != 0 {
-		ret |= protocol.QTSYMLINK
-	}
-
-	return ret
-}
-
-func dirTo9p2000Mode(d os.FileInfo) uint32 {
-	ret := uint32(d.Mode() & 0777)
-	if d.IsDir() {
-		ret |= protocol.DMDIR
-	}
-	return ret
-}
-
-func dirTo9p2000Dir(fi os.FileInfo) (*protocol.Dir, error) {
-	d := &protocol.Dir{}
-	d.QID = fileInfoToQID(fi)
-	d.Mode = dirTo9p2000Mode(fi)
-	// TODO: use info on systems that have it.
-	d.Atime = uint32(fi.ModTime().Unix()) // uint32(atime(sysMode).Unix())
-	d.Mtime = uint32(fi.ModTime().Unix())
-	d.Length = uint64(fi.Size())
-	d.Name = fi.Name()
-	d.User = *user
-	d.Group = *user
-
-	return d, nil
-}

+ 0 - 34
sys/src/go/internal/ufs/ninep_unix.go

@@ -1,34 +0,0 @@
-// Copyright 2012 The Ninep Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-// This code is imported from the old ninep repo,
-// with some changes.
-
-// +build !windows
-
-package ufs
-
-import (
-	"os"
-	"syscall"
-
-	"harvey-os.org/pkg/ninep/protocol"
-)
-
-func fileInfoToQID(d os.FileInfo) protocol.QID {
-	var qid protocol.QID
-	sysif := d.Sys()
-
-	// on systems with inodes, use it.
-	if sysif != nil {
-		stat := sysif.(*syscall.Stat_t)
-		qid.Path = uint64(stat.Ino)
-	} else {
-		qid.Path = uint64(d.ModTime().UnixNano())
-	}
-
-	qid.Version = uint32(d.ModTime().UnixNano() / 1000000)
-	qid.Type = dirToQIDType(d)
-
-	return qid
-}

+ 0 - 25
sys/src/go/internal/ufs/ninep_windows.go

@@ -1,25 +0,0 @@
-// Copyright 2012 The Ninep Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-// This code is imported from the old ninep repo,
-// with some changes.
-
-// +build windows
-
-package ufs
-
-import (
-	"os"
-
-	"harvey-os.org/pkg/ninep/protocol"
-)
-
-func fileInfoToQID(d os.FileInfo) protocol.QID {
-	var qid protocol.QID
-
-	qid.Path = uint64(d.ModTime().UnixNano())
-	qid.Version = uint32(d.ModTime().UnixNano() / 1000000)
-	qid.Type = dirToQIDType(d)
-
-	return qid
-}

+ 0 - 152
sys/src/go/pkg/ninep/debug.go

@@ -1,152 +0,0 @@
-// Copyright 2009 The Ninep Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ninep
-
-import (
-	"bytes"
-	"log"
-
-	"harvey-os.org/pkg/ninep/protocol"
-)
-
-type DebugFileServer struct {
-	FileServer protocol.NineServer
-}
-
-func (dfs *DebugFileServer) Rversion(msize protocol.MaxSize, version string) (protocol.MaxSize, string, error) {
-	log.Printf(">>> Tversion %v %v\n", msize, version)
-	msize, version, err := dfs.FileServer.Rversion(msize, version)
-	if err == nil {
-		log.Printf("<<< Rversion %v %v\n", msize, version)
-	} else {
-		log.Printf("<<< Error %v\n", err)
-	}
-	return msize, version, err
-}
-
-func (dfs *DebugFileServer) Rattach(fid protocol.FID, afid protocol.FID, uname string, aname string) (protocol.QID, error) {
-	log.Printf(">>> Tattach fid %v,  afid %v, uname %v, aname %v\n", fid, afid,
-		uname, aname)
-	qid, err := dfs.FileServer.Rattach(fid, afid, uname, aname)
-	if err == nil {
-		log.Printf("<<< Rattach %v\n", qid)
-	} else {
-		log.Printf("<<< Error %v\n", err)
-	}
-	return qid, err
-}
-
-func (dfs *DebugFileServer) Rflush(o protocol.Tag) error {
-	log.Printf(">>> Tflush tag %v\n", o)
-	err := dfs.FileServer.Rflush(o)
-	if err == nil {
-		log.Printf("<<< Rflush\n")
-	} else {
-		log.Printf("<<< Error %v\n", err)
-	}
-	return err
-}
-
-func (dfs *DebugFileServer) Rwalk(fid protocol.FID, newfid protocol.FID, paths []string) ([]protocol.QID, error) {
-	log.Printf(">>> Twalk fid %v, newfid %v, paths %v\n", fid, newfid, paths)
-	qid, err := dfs.FileServer.Rwalk(fid, newfid, paths)
-	if err == nil {
-		log.Printf("<<< Rwalk %v\n", qid)
-	} else {
-		log.Printf("<<< Error %v\n", err)
-	}
-	return qid, err
-}
-
-func (dfs *DebugFileServer) Ropen(fid protocol.FID, mode protocol.Mode) (protocol.QID, protocol.MaxSize, error) {
-	log.Printf(">>> Topen fid %v, mode %v\n", fid, mode)
-	qid, iounit, err := dfs.FileServer.Ropen(fid, mode)
-	if err == nil {
-		log.Printf("<<< Ropen %v %v\n", qid, iounit)
-	} else {
-		log.Printf("<<< Error %v\n", err)
-	}
-	return qid, iounit, err
-}
-
-func (dfs *DebugFileServer) Rcreate(fid protocol.FID, name string, perm protocol.Perm, mode protocol.Mode) (protocol.QID, protocol.MaxSize, error) {
-	log.Printf(">>> Tcreate fid %v, name %v, perm %v, mode %v\n", fid, name,
-		perm, mode)
-	qid, iounit, err := dfs.FileServer.Rcreate(fid, name, perm, mode)
-	if err == nil {
-		log.Printf("<<< Rcreate %v %v\n", qid, iounit)
-	} else {
-		log.Printf("<<< Error %v\n", err)
-	}
-	return qid, iounit, err
-}
-
-func (dfs *DebugFileServer) Rclunk(fid protocol.FID) error {
-	log.Printf(">>> Tclunk fid %v\n", fid)
-	err := dfs.FileServer.Rclunk(fid)
-	if err == nil {
-		log.Printf("<<< Rclunk\n")
-	} else {
-		log.Printf("<<< Error %v\n", err)
-	}
-	return err
-}
-
-func (dfs *DebugFileServer) Rstat(fid protocol.FID) ([]byte, error) {
-	log.Printf(">>> Tstat fid %v\n", fid)
-	b, err := dfs.FileServer.Rstat(fid)
-	if err == nil {
-		dir, _ := protocol.Unmarshaldir(bytes.NewBuffer(b))
-		log.Printf("<<< Rstat %v\n", dir)
-	} else {
-		log.Printf("<<< Error %v\n", err)
-	}
-	return b, err
-}
-
-func (dfs *DebugFileServer) Rwstat(fid protocol.FID, b []byte) error {
-	dir, _ := protocol.Unmarshaldir(bytes.NewBuffer(b))
-	log.Printf(">>> Twstat fid %v, %v\n", fid, dir)
-	err := dfs.FileServer.Rwstat(fid, b)
-	if err == nil {
-		log.Printf("<<< Rwstat\n")
-	} else {
-		log.Printf("<<< Error %v\n", err)
-	}
-	return err
-}
-
-func (dfs *DebugFileServer) Rremove(fid protocol.FID) error {
-	log.Printf(">>> Tremove fid %v\n", fid)
-	err := dfs.FileServer.Rremove(fid)
-	if err == nil {
-		log.Printf("<<< Rremove\n")
-	} else {
-		log.Printf("<<< Error %v\n", err)
-	}
-	return err
-}
-
-func (dfs *DebugFileServer) Rread(fid protocol.FID, o protocol.Offset, c protocol.Count) ([]byte, error) {
-	log.Printf(">>> Tread fid %v, off %v, count %v\n", fid, o, c)
-	b, err := dfs.FileServer.Rread(fid, o, c)
-	if err == nil {
-		log.Printf("<<< Rread %v\n", len(b))
-	} else {
-		log.Printf("<<< Error %v\n", err)
-	}
-	return b, err
-}
-
-func (dfs *DebugFileServer) Rwrite(fid protocol.FID, o protocol.Offset, b []byte) (protocol.Count, error) {
-	log.Printf(">>> Twrite fid %v, off %v, count %v\n", fid, o, len(b))
-	c, err := dfs.FileServer.Rwrite(fid, o, b)
-	if err == nil {
-		log.Printf("<<< Rwrite %v\n", c)
-	} else {
-		log.Printf("<<< Error %v\n", err)
-	}
-	return c, err
-}

+ 0 - 175
sys/src/go/pkg/ninep/protocol/client.go

@@ -1,175 +0,0 @@
-// Copyright 2012 The Ninep Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-// This code is imported from the old ninep repo,
-// with some changes.
-
-package protocol
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"log"
-	"runtime"
-	"sync/atomic"
-)
-
-// Client implements a 9p client. It has a chan containing all tags,
-// a scalar FID which is incremented to provide new FIDS (all FIDS for a given
-// client are unique), an array of MaxTag-2 RPC structs, a ReadWriteCloser
-// for IO, and two channels for a server goroutine: one down which RPCalls are
-// pushed and another from which RPCReplys return.
-// Once a client is marked Dead all further requests to it will fail.
-// The ToNet/FromNet are separate so we can use io.Pipe for testing.
-type Client struct {
-	Tags       chan Tag
-	FID        uint64
-	RPC        []*RPCCall
-	ToNet      io.WriteCloser
-	FromNet    io.ReadCloser
-	FromClient chan *RPCCall
-	FromServer chan *RPCReply
-	Msize      uint32
-	Dead       bool
-	Trace      Tracer
-}
-
-func NewClient(opts ...ClientOpt) (*Client, error) {
-	var c = &Client{}
-
-	c.Tags = make(chan Tag, NumTags)
-	for i := 1; i < int(NOTAG); i++ {
-		c.Tags <- Tag(i)
-	}
-	c.FID = 1
-	c.RPC = make([]*RPCCall, NumTags)
-	for _, o := range opts {
-		if err := o(c); err != nil {
-			return nil, err
-		}
-	}
-	c.FromClient = make(chan *RPCCall, NumTags)
-	c.FromServer = make(chan *RPCReply)
-	go c.IO()
-	go c.readNetPackets()
-	return c, nil
-}
-
-// GetTag gets a tag to be used to identify a message.
-func (c *Client) GetTag() Tag {
-	t := <-c.Tags
-	if false {
-		runtime.SetFinalizer(&t, func(t *Tag) {
-			c.Tags <- *t
-		})
-	}
-	return t
-}
-
-// GetFID gets a fid to be used to identify a resource for a 9p client.
-// For a given lifetime of a 9p client, FIDS are unique (i.e. not reused as in
-// many 9p client libraries).
-func (c *Client) GetFID() FID {
-	return FID(atomic.AddUint64(&c.FID, 1))
-}
-
-func (c *Client) readNetPackets() {
-	if c.FromNet == nil {
-		if c.Trace != nil {
-			c.Trace("c.FromNet is nil, marking dead")
-		}
-		c.Dead = true
-		return
-	}
-	defer c.FromNet.Close()
-	defer close(c.FromServer)
-	if c.Trace != nil {
-		c.Trace("Starting readNetPackets")
-	}
-	for !c.Dead {
-		l := make([]byte, 7)
-		if c.Trace != nil {
-			c.Trace("Before read")
-		}
-
-		if n, err := c.FromNet.Read(l); err != nil || n < 7 {
-			log.Printf("readNetPackets: short read: %v", err)
-			c.Dead = true
-			return
-		}
-		if c.Trace != nil {
-			c.Trace("Server reads %v", l)
-		}
-		s := int64(l[0]) + int64(l[1])<<8 + int64(l[2])<<16 + int64(l[3])<<24
-		b := bytes.NewBuffer(l)
-		r := io.LimitReader(c.FromNet, s-7)
-		if _, err := io.Copy(b, r); err != nil {
-			log.Printf("readNetPackets: short read: %v", err)
-			c.Dead = true
-			return
-		}
-		if c.Trace != nil {
-			c.Trace("readNetPackets: got %v, len %d, sending to IO", RPCNames[MType(l[4])], b.Len())
-		}
-		c.FromServer <- &RPCReply{b: b.Bytes()}
-	}
-	if c.Trace != nil {
-		c.Trace("Client %v is all done", c)
-	}
-
-}
-
-func (c *Client) IO() {
-	go func() {
-		for {
-			r := <-c.FromClient
-			t := <-c.Tags
-			if c.Trace != nil {
-				c.Trace(fmt.Sprintf("Tag for request is %v", t))
-			}
-			r.b[5] = uint8(t)
-			r.b[6] = uint8(t >> 8)
-			if c.Trace != nil {
-				c.Trace(fmt.Sprintf("Tag for request is %v", t))
-			}
-			c.RPC[int(t)-1] = r
-			if c.Trace != nil {
-				c.Trace("Write %v to ToNet", r.b)
-			}
-			if _, err := c.ToNet.Write(r.b); err != nil {
-				c.Dead = true
-				log.Fatalf("Write to server: %v", err)
-				return
-			}
-		}
-	}()
-
-	for {
-		r := <-c.FromServer
-		if c.Trace != nil {
-			c.Trace("Read %v FromServer", r.b)
-		}
-		t := Tag(r.b[5]) | Tag(r.b[6])<<8
-		if c.Trace != nil {
-			c.Trace(fmt.Sprintf("Tag for reply is %v", t))
-		}
-		if t < 1 {
-			panic(fmt.Sprintf("tag %d < 1", t))
-		}
-		if int(t-1) >= len(c.RPC) {
-			panic(fmt.Sprintf("tag %d >= len(c.RPC) %d", t, len(c.RPC)))
-		}
-		c.Trace("RPC %v ", c.RPC[t-1])
-		rrr := c.RPC[t-1]
-		c.Trace("rrr %v ", rrr)
-		rrr.Reply <- r.b
-		c.Tags <- t
-	}
-}
-
-func (c *Client) String() string {
-	z := map[bool]string{false: "Alive", true: "Dead"}
-	return fmt.Sprintf("%v tags available, Msize %v, %v FromNet %v ToNet %v", len(c.Tags), c.Msize, z[c.Dead],
-		c.FromNet, c.ToNet)
-}

+ 0 - 556
sys/src/go/pkg/ninep/protocol/gen.go

@@ -1,556 +0,0 @@
-// Copyright 2015 The Ninep Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// gen is an rpc generator for the Plan 9 style XDR. It uses the types and structs
-// defined in types. go. A core function, gen, creates the needed lists of
-// parameters, code, and variable list for calling a Marshall function; and the
-// return declaration, code, and return value list for an unmarshall function.
-// You can think of an RPC as a pipline:
-// marshal(parms) -> b[]byte over a network -> unmarshal -> dispatch -> reply(parms) -> unmarshal
-// Since we have T messages and R messages in 9p, we adopt the following naming convention for, e.g., Version:
-// MarshalTPktVersion
-// UnmarshalTpktVersion
-// MarshalRPktVersion
-// UnmarshalRPktVersion
-//
-// A caller uses the MarshalT* and UnmarshallR* information. A dispatcher
-// uses the  UnmarshalT* and MarshalR* information.
-// Hence the caller needs the call MarshalT params, and UnmarshalR* returns;
-// a dispatcher needs the UnmarshalT returns, and the MarshalR params.
-package main
-
-import (
-	"bytes"
-	"flag"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"log"
-	"reflect"
-	"text/template"
-
-	"harvey-os.org/pkg/ninep/protocol"
-)
-
-const (
-	header = `
-package protocol
-import (
-"bytes"
-"fmt"
-_ "log"
-)
-`
-)
-
-type emitter struct {
-	Name  string
-	MFunc string
-	// Encoders always return []byte
-	MParms *bytes.Buffer
-	MList  *bytes.Buffer
-	MLsep  string
-	MCode  *bytes.Buffer
-
-	// Decoders always take []byte as parms.
-	UFunc    string
-	UList    *bytes.Buffer
-	UCode    *bytes.Buffer
-	URet     *bytes.Buffer
-	inBWrite bool
-}
-
-type call struct {
-	T *emitter
-	R *emitter
-}
-
-type pack struct {
-	n  string
-	t  interface{}
-	tn string
-	r  interface{}
-	rn string
-}
-
-const (
-	serverError = `func ServerError (b *bytes.Buffer, s string) {
-	var u [8]byte
-	// This can't really happen. 
-	if _, err := b.Read(u[:2]); err != nil {
-		return
-	}
-	t := Tag(uint16(u[0])|uint16(u[1])<<8)
-	MarshalRerrorPkt (b, t, s)
-}
-`
-)
-
-var (
-	doDebug  = flag.Bool("d", false, "Debug prints")
-	debug    = nodebug //log.Printf
-	packages = []*pack{
-		{n: "error", t: protocol.RerrorPkt{}, tn: "Rerror", r: protocol.RerrorPkt{}, rn: "Rerror"},
-		{n: "version", t: protocol.TversionPkt{}, tn: "Tversion", r: protocol.RversionPkt{}, rn: "Rversion"},
-		{n: "attach", t: protocol.TattachPkt{}, tn: "Tattach", r: protocol.RattachPkt{}, rn: "Rattach"},
-		{n: "flush", t: protocol.TflushPkt{}, tn: "Tflush", r: protocol.RflushPkt{}, rn: "Rflush"},
-		{n: "walk", t: protocol.TwalkPkt{}, tn: "Twalk", r: protocol.RwalkPkt{}, rn: "Rwalk"},
-		{n: "open", t: protocol.TopenPkt{}, tn: "Topen", r: protocol.RopenPkt{}, rn: "Ropen"},
-		{n: "create", t: protocol.TcreatePkt{}, tn: "Tcreate", r: protocol.RcreatePkt{}, rn: "Rcreate"},
-		{n: "stat", t: protocol.TstatPkt{}, tn: "Tstat", r: protocol.RstatPkt{}, rn: "Rstat"},
-		{n: "wstat", t: protocol.TwstatPkt{}, tn: "Twstat", r: protocol.RwstatPkt{}, rn: "Rwstat"},
-		{n: "clunk", t: protocol.TclunkPkt{}, tn: "Tclunk", r: protocol.RclunkPkt{}, rn: "Rclunk"},
-		{n: "remove", t: protocol.TremovePkt{}, tn: "Tremove", r: protocol.RremovePkt{}, rn: "Rremove"},
-		{n: "read", t: protocol.TreadPkt{}, tn: "Tread", r: protocol.RreadPkt{}, rn: "Rread"},
-		{n: "write", t: protocol.TwritePkt{}, tn: "Twrite", r: protocol.RwritePkt{}, rn: "Rwrite"},
-	}
-	msfunc = template.Must(template.New("ms").Parse(`func Marshal{{.MFunc}} (b *bytes.Buffer, {{.MParms}}) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,})
-{{.MCode}}
-l = uint64(b.Len()) - 2
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8)})
-return
-}
-`))
-	usfunc = template.Must(template.New("us").Parse(`func Unmarshal{{.UFunc}} (b *bytes.Buffer) ({{.URet}} err error) {
-var u [8]uint8
-var l uint64
-_ = b.Next(2) // eat the length too
-{{.UCode}}
-return
-}
-`))
-
-	mfunc = template.Must(template.New("mt").Parse(`func Marshal{{.MFunc}}Pkt (b *bytes.Buffer, t Tag, {{.MParms}}) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8({{.Name}}),
-byte(t), byte(t>>8),
-{{.MCode}}
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-`))
-	ufunc = template.Must(template.New("mr").Parse(`func Unmarshal{{.UFunc}}Pkt (b *bytes.Buffer) ({{.URet}} t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-{{.UCode}}
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-`))
-	sfunc = template.Must(template.New("s").Parse(`func (s *Server) Srv{{.R.UFunc}}(b*bytes.Buffer) (err error) {
-	{{.T.MList}}{{.T.MLsep}} t, err := Unmarshal{{.T.MFunc}}Pkt(b)
-	//if err != nil {
-	//}
-	if {{.R.MList}}{{.R.MLsep}} err := s.NS.{{.R.MFunc}}({{.T.MList}}); err != nil {
-	MarshalRerrorPkt(b, t, fmt.Sprintf("%v", err))
-} else {
-	Marshal{{.R.MFunc}}Pkt(b, t, {{.R.MList}})
-}
-	return nil
-}
-`))
-	cfunc = template.Must(template.New("s").Parse(`
-func (c *Client)Call{{.T.MFunc}} ({{.T.MParms}}) ({{.R.URet}} err error) {
-var b = bytes.Buffer{}
-if c.Trace != nil {c.Trace("%v", {{.T.MFunc}})}
-t := Tag(0)
-r := make (chan []byte)
-if c.Trace != nil { c.Trace(":tag %v, FID %v", t, c.FID)}
-Marshal{{.T.MFunc}}Pkt(&b, t, {{.T.MList}})
-c.FromClient <- &RPCCall{b: b.Bytes(), Reply: r}
-bb := <-r
-if MType(bb[4]) == Rerror {
-	s, _, err := UnmarshalRerrorPkt(bytes.NewBuffer(bb[5:]))
-	if err != nil {
-		return {{.R.UList}} err
-	}
-	return {{.R.UList}} fmt.Errorf("%v", s)
-} else {
-	{{.R.MList}}{{.R.MLsep}} _, err = Unmarshal{{.R.UFunc}}Pkt(bytes.NewBuffer(bb[5:]))
-}
-return {{.R.UList}} err
-}
-`))
-)
-
-func nodebug(string, ...interface{}) {
-}
-
-func newCall(p *pack) *call {
-	c := &call{}
-	// We set inBWrite to true because the prologue marshal code sets up some default writes to b
-	c.T = &emitter{"T" + p.n, p.tn, &bytes.Buffer{}, &bytes.Buffer{}, "", &bytes.Buffer{}, p.tn, &bytes.Buffer{}, &bytes.Buffer{}, &bytes.Buffer{}, true}
-	c.R = &emitter{"R" + p.n, p.rn, &bytes.Buffer{}, &bytes.Buffer{}, "", &bytes.Buffer{}, p.rn, &bytes.Buffer{}, &bytes.Buffer{}, &bytes.Buffer{}, true}
-	return c
-}
-
-func emitEncodeInt(v interface{}, n string, l int, e *emitter) {
-	debug("emit %v, %v", n, l)
-	for i := 0; i < l; i++ {
-		if !e.inBWrite {
-			e.MCode.WriteString("\tb.Write([]byte{")
-			e.inBWrite = true
-		}
-		e.MCode.WriteString(fmt.Sprintf("\tuint8(%v>>%v),\n", n, i*8))
-	}
-}
-
-func emitDecodeInt(v interface{}, n string, l int, e *emitter) {
-	t := reflect.ValueOf(v).Type().Name()
-	debug("emit reflect.ValueOf(v) %s %v, %v", t, n, l)
-	e.UCode.WriteString(fmt.Sprintf("\tif _, err = b.Read(u[:%v]); err != nil {\n\t\terr = fmt.Errorf(\"pkt too short for uint%v: need %v, have %%d\", b.Len())\n\treturn\n\t}\n", l, l*8, l))
-	e.UCode.WriteString(fmt.Sprintf("\t%v = %s(u[0])\n", n, t))
-	for i := 1; i < l; i++ {
-		e.UCode.WriteString(fmt.Sprintf("\t%v |= %s(u[%d])<<%v\n", n, t, i, i*8))
-	}
-}
-
-// TODO: templates.
-func emitEncodeString(v interface{}, n string, e *emitter) {
-	if !e.inBWrite {
-		e.MCode.WriteString("\tb.Write([]byte{")
-		e.inBWrite = true
-	}
-	e.MCode.WriteString(fmt.Sprintf("\tuint8(len(%v)),uint8(len(%v)>>8),\n", n, n))
-	e.MCode.WriteString("\t})\n")
-	e.inBWrite = false
-	e.MCode.WriteString(fmt.Sprintf("\tb.Write([]byte(%v))\n", n))
-}
-
-func emitDecodeString(n string, e *emitter) {
-	var l uint64
-	emitDecodeInt(l, "l", 2, e)
-	e.UCode.WriteString(fmt.Sprintf("\tif b.Len() < int(l) {\n\t\terr = fmt.Errorf(\"pkt too short for string: need %%d, have %%d\", l, b.Len())\n\treturn\n\t}\n"))
-	e.UCode.WriteString(fmt.Sprintf("\t%v = string(b.Bytes()[:l])\n", n))
-	e.UCode.WriteString("\t_ = b.Next(int(l))\n")
-}
-
-func genEncodeStruct(v interface{}, n string, e *emitter) error {
-	debug("genEncodeStruct(%T, %v, %v)", v, n, e)
-	t := reflect.ValueOf(v)
-	for i := 0; i < t.NumField(); i++ {
-		f := t.Field(i)
-		fn := t.Type().Field(i).Name
-		debug("genEncodeStruct %T n %v field %d %v %v\n", t, n, i, f.Type(), f.Type().Name())
-		genEncodeData(f.Interface(), n+fn, e)
-	}
-	return nil
-}
-
-func genDecodeStruct(v interface{}, n string, e *emitter) error {
-	debug("genDecodeStruct(%T, %v, %v)", v, n, "")
-	t := reflect.ValueOf(v)
-	for i := 0; i < t.NumField(); i++ {
-		f := t.Field(i)
-		fn := t.Type().Field(i).Name
-		debug("genDecodeStruct %T n %v field %d %v %v\n", t, n, i, f.Type(), f.Type().Name())
-		genDecodeData(f.Interface(), n+fn, e)
-	}
-	return nil
-}
-
-// TODO: there has to be a smarter way to do slices.
-func genEncodeSlice(v interface{}, n string, e *emitter) error {
-	t := fmt.Sprintf("%T", v)
-	switch t {
-	case "[]string":
-		var u uint16
-		emitEncodeInt(u, fmt.Sprintf("len(%v)", n), 2, e)
-		if e.inBWrite {
-			e.MCode.WriteString("\t})\n")
-			e.inBWrite = false
-		}
-		e.MCode.WriteString(fmt.Sprintf("for i := range %v {\n", n))
-		var s string
-		genEncodeData(s, n+"[i]", e)
-		e.MCode.WriteString("}\n")
-	case "[]protocol.QID":
-		var u uint16
-		emitEncodeInt(u, fmt.Sprintf("len(%v)", n), 2, e)
-		if e.inBWrite {
-			e.MCode.WriteString("\t})\n")
-			e.inBWrite = false
-		}
-		e.MCode.WriteString(fmt.Sprintf("for i := range %v {\n", n))
-		genEncodeData(protocol.QID{}, n+"[i]", e)
-		e.MCode.WriteString("\t})\n")
-		e.inBWrite = false
-		e.MCode.WriteString("}\n")
-	case "[]byte", "[]uint8":
-		var u uint32
-		emitEncodeInt(u, fmt.Sprintf("len(%v)", n), 4, e)
-		if e.inBWrite {
-			e.MCode.WriteString("\t})\n")
-			e.inBWrite = false
-		}
-		e.MCode.WriteString(fmt.Sprintf("\tb.Write(%v)\n", n))
-	case "[]protocol.DataCnt16":
-		var u uint16
-		emitEncodeInt(u, fmt.Sprintf("len(%v)", n), 2, e)
-		if e.inBWrite {
-			e.MCode.WriteString("\t})\n")
-			e.inBWrite = false
-		}
-		e.MCode.WriteString(fmt.Sprintf("\tb.Write(%v)\n", n))
-	default:
-		log.Printf("genEncodeSlice: Can't handle slice of %s", t)
-	}
-	return nil
-}
-
-func genDecodeSlice(v interface{}, n string, e *emitter) error {
-	// Sadly, []byte is not encoded like []everything else.
-	t := fmt.Sprintf("%T", v)
-	switch t {
-	case "[]string":
-		var u uint64
-		emitDecodeInt(u, "l", 2, e)
-		e.UCode.WriteString(fmt.Sprintf("\t%v = make([]string, l)\n", n))
-		e.UCode.WriteString(fmt.Sprintf("for i := range %v {\n", n))
-		var s string
-		genDecodeData(s, n+"[i]", e)
-		e.UCode.WriteString("}\n")
-	case "[]protocol.QID":
-		var u uint64
-		emitDecodeInt(u, "l", 2, e)
-		e.UCode.WriteString(fmt.Sprintf("\t%v = make([]QID, l)\n", n))
-		e.UCode.WriteString(fmt.Sprintf("for i := range %v {\n", n))
-		genDecodeData(protocol.QID{}, n+"[i]", e)
-		e.UCode.WriteString("}\n")
-	case "[]byte", "[]uint8":
-		var u uint64
-		emitDecodeInt(u, "l", 4, e)
-		e.UCode.WriteString(fmt.Sprintf("\t%v = b.Bytes()[:l]\n", n))
-		e.UCode.WriteString("\t_ = b.Next(int(l))\n")
-	case "[]protocol.DataCnt16":
-		var u uint64
-		emitDecodeInt(u, "l", 2, e)
-		e.UCode.WriteString(fmt.Sprintf("\t%v = b.Bytes()[:l]\n", n))
-		e.UCode.WriteString("\t_ = b.Next(int(l))\n")
-	default:
-		log.Printf("genDecodeSlice: Can't handle slice of %v", t)
-	}
-	return nil
-}
-
-func genEncodeData(v interface{}, n string, e *emitter) error {
-	debug("genEncodeData(%T, %v, %v)", v, n, e)
-	s := reflect.ValueOf(v).Kind()
-	switch s {
-	case reflect.Uint8:
-		emitEncodeInt(v, n, 1, e)
-	case reflect.Uint16:
-		emitEncodeInt(v, n, 2, e)
-	case reflect.Uint32, reflect.Int32:
-		emitEncodeInt(v, n, 4, e)
-	case reflect.Uint64:
-		emitEncodeInt(v, n, 8, e)
-	case reflect.String:
-		emitEncodeString(v, n, e)
-	case reflect.Struct:
-		if n != "" {
-			n = n + "."
-		}
-		return genEncodeStruct(v, n, e)
-	case reflect.Slice:
-		return genEncodeSlice(v, n, e)
-	default:
-		log.Printf("genEncodeData: Can't handle type %T", v)
-	}
-	return nil
-}
-
-func genDecodeData(v interface{}, n string, e *emitter) error {
-	debug("genEncodeData(%T, %v, %v)", v, n, "") //e)
-	s := reflect.ValueOf(v).Kind()
-	switch s {
-	case reflect.Uint8:
-		emitDecodeInt(v, n, 1, e)
-	case reflect.Uint16:
-		emitDecodeInt(v, n, 2, e)
-	case reflect.Uint32, reflect.Int32:
-		emitDecodeInt(v, n, 4, e)
-	case reflect.Uint64:
-		emitDecodeInt(v, n, 8, e)
-	case reflect.String:
-		emitDecodeString(n, e)
-	case reflect.Struct:
-		if n != "" {
-			n = n + "."
-		}
-		debug("----------> call gendecodstruct(%v, %v, e)", v, n)
-		return genDecodeStruct(v, n, e)
-	case reflect.Slice:
-		return genDecodeSlice(v, n, e)
-	default:
-		log.Printf("genDecodeData: Can't handle type %T", v)
-	}
-	return nil
-}
-
-// Well, it's odd, but Name sometimes comes back empty.
-// I don't know why.
-func tn(f reflect.Value) string {
-	n := f.Type().Name()
-	if n == "" {
-		t := f.Type().String()
-		switch t {
-		case "[]protocol.QID":
-			n = "[]QID"
-		case "[]protocol.DataCnt16":
-			n = "[]byte"
-		default:
-			n = t
-		}
-	}
-	return n
-}
-
-// genParms writes the parameters for declarations (name and type)
-// a list of names (for calling the encoder)
-func genParms(v interface{}, n string, e *emitter) error {
-	t := reflect.ValueOf(v)
-	for i := 0; i < t.NumField(); i++ {
-		f := t.Field(i)
-		fn := t.Type().Field(i).Name
-		e.MList.WriteString(e.MLsep + fn)
-		e.MParms.WriteString(e.MLsep + fn + " " + tn(f))
-		e.MLsep = ", "
-	}
-	return nil
-}
-
-// genRets writes the rets for declarations (name and type)
-// a list of names
-func genRets(v interface{}, n string, e *emitter) error {
-	t := reflect.ValueOf(v)
-	for i := 0; i < t.NumField(); i++ {
-		f := t.Field(i)
-		fn := t.Type().Field(i).Name
-		e.UList.WriteString(fn + ", ")
-		e.URet.WriteString(fn + " " + tn(f) + ", ")
-	}
-	return nil
-}
-
-// genMsgRPC generates the call and reply declarations and marshalers. We don't think of encoders as too separate
-// because the 9p encoding is so simple.
-func genMsgRPC(b io.Writer, p *pack) (*call, error) {
-
-	c := newCall(p)
-
-	if err := genEncodeStruct(p.r, "", c.R); err != nil {
-		log.Fatalf("%v", err)
-	}
-	if c.R.inBWrite {
-		c.R.MCode.WriteString("\t})\n")
-		c.R.inBWrite = false
-	}
-	if err := genDecodeStruct(p.r, "", c.R); err != nil {
-		log.Fatalf("%v", err)
-	}
-
-	if err := genEncodeStruct(p.t, "", c.T); err != nil {
-		log.Fatalf("%v", err)
-	}
-	if c.T.inBWrite {
-		c.T.MCode.WriteString("\t})\n")
-		c.T.inBWrite = false
-	}
-
-	if err := genDecodeStruct(p.t, "", c.T); err != nil {
-		log.Fatalf("%v", err)
-	}
-
-	if err := genParms(p.t, p.tn, c.T); err != nil {
-		log.Fatalf("%v", err)
-	}
-
-	if err := genRets(p.t, p.tn, c.T); err != nil {
-		log.Fatalf("%v", err)
-	}
-
-	if err := genParms(p.r, p.rn, c.R); err != nil {
-		log.Fatalf("%v", err)
-	}
-
-	if err := genRets(p.r, p.rn, c.R); err != nil {
-		log.Fatalf("%v", err)
-	}
-
-	//log.Print("e %v d %v", c.T, c.R)
-
-	//	log.Print("------------------", c.T.MParms, "0", c.T.MList, "1", c.R.URet, "2", c.R.UList)
-	//	log.Print("------------------", c.T.MCode)
-	mfunc.Execute(b, c.R)
-	ufunc.Execute(b, c.R)
-
-	if p.n == "error" {
-		return c, nil
-	}
-
-	mfunc.Execute(b, c.T)
-	ufunc.Execute(b, c.T)
-	sfunc.Execute(b, c)
-	cfunc.Execute(b, c)
-	return nil, nil
-
-}
-
-func main() {
-	flag.Parse()
-	if *doDebug {
-		debug = log.Printf
-	}
-	var b = bytes.NewBufferString(header)
-	for _, p := range packages {
-		_, err := genMsgRPC(b, p)
-		if err != nil {
-			log.Fatalf("%v", err)
-		}
-	}
-	b.WriteString(serverError)
-
-	// yeah, it's a hack.
-	dir := &emitter{"dir", "dir", &bytes.Buffer{}, &bytes.Buffer{}, "", &bytes.Buffer{}, "dir", &bytes.Buffer{}, &bytes.Buffer{}, &bytes.Buffer{}, false}
-	if err := genEncodeStruct(protocol.DirPkt{}, "", dir); err != nil {
-		log.Fatalf("%v", err)
-	}
-	if err := genDecodeStruct(protocol.DirPkt{}, "", dir); err != nil {
-		log.Fatalf("%v", err)
-	}
-	if err := genParms(protocol.DirPkt{}, "dir", dir); err != nil {
-		log.Fatalf("%v", err)
-	}
-
-	if err := genRets(protocol.DirPkt{}, "dir", dir); err != nil {
-		log.Fatalf("%v", err)
-	}
-
-	msfunc.Execute(b, dir)
-	usfunc.Execute(b, dir)
-
-	if err := ioutil.WriteFile("genout.go", b.Bytes(), 0600); err != nil {
-		log.Fatalf("%v", err)
-	}
-
-}

+ 0 - 1935
sys/src/go/pkg/ninep/protocol/genout.go

@@ -1,1935 +0,0 @@
-
-package protocol
-import (
-"bytes"
-"fmt"
-_ "log"
-)
-func MarshalRerrorPkt (b *bytes.Buffer, t Tag, Error string) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Rerror),
-byte(t), byte(t>>8),
-	uint8(len(Error)),uint8(len(Error)>>8),
-	})
-	b.Write([]byte(Error))
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalRerrorPkt (b *bytes.Buffer) (Error string,  t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-	if _, err = b.Read(u[:2]); err != nil {
-		err = fmt.Errorf("pkt too short for uint16: need 2, have %d", b.Len())
-	return
-	}
-	l = uint64(u[0])
-	l |= uint64(u[1])<<8
-	if b.Len() < int(l) {
-		err = fmt.Errorf("pkt too short for string: need %d, have %d", l, b.Len())
-	return
-	}
-	Error = string(b.Bytes()[:l])
-	_ = b.Next(int(l))
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func MarshalRversionPkt (b *bytes.Buffer, t Tag, RMsize MaxSize, RVersion string) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Rversion),
-byte(t), byte(t>>8),
-	uint8(RMsize>>0),
-	uint8(RMsize>>8),
-	uint8(RMsize>>16),
-	uint8(RMsize>>24),
-	uint8(len(RVersion)),uint8(len(RVersion)>>8),
-	})
-	b.Write([]byte(RVersion))
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalRversionPkt (b *bytes.Buffer) (RMsize MaxSize, RVersion string,  t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	RMsize = MaxSize(u[0])
-	RMsize |= MaxSize(u[1])<<8
-	RMsize |= MaxSize(u[2])<<16
-	RMsize |= MaxSize(u[3])<<24
-	if _, err = b.Read(u[:2]); err != nil {
-		err = fmt.Errorf("pkt too short for uint16: need 2, have %d", b.Len())
-	return
-	}
-	l = uint64(u[0])
-	l |= uint64(u[1])<<8
-	if b.Len() < int(l) {
-		err = fmt.Errorf("pkt too short for string: need %d, have %d", l, b.Len())
-	return
-	}
-	RVersion = string(b.Bytes()[:l])
-	_ = b.Next(int(l))
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func MarshalTversionPkt (b *bytes.Buffer, t Tag, TMsize MaxSize, TVersion string) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Tversion),
-byte(t), byte(t>>8),
-	uint8(TMsize>>0),
-	uint8(TMsize>>8),
-	uint8(TMsize>>16),
-	uint8(TMsize>>24),
-	uint8(len(TVersion)),uint8(len(TVersion)>>8),
-	})
-	b.Write([]byte(TVersion))
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalTversionPkt (b *bytes.Buffer) (TMsize MaxSize, TVersion string,  t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	TMsize = MaxSize(u[0])
-	TMsize |= MaxSize(u[1])<<8
-	TMsize |= MaxSize(u[2])<<16
-	TMsize |= MaxSize(u[3])<<24
-	if _, err = b.Read(u[:2]); err != nil {
-		err = fmt.Errorf("pkt too short for uint16: need 2, have %d", b.Len())
-	return
-	}
-	l = uint64(u[0])
-	l |= uint64(u[1])<<8
-	if b.Len() < int(l) {
-		err = fmt.Errorf("pkt too short for string: need %d, have %d", l, b.Len())
-	return
-	}
-	TVersion = string(b.Bytes()[:l])
-	_ = b.Next(int(l))
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func (s *Server) SrvRversion(b*bytes.Buffer) (err error) {
-	TMsize, TVersion,  t, err := UnmarshalTversionPkt(b)
-	//if err != nil {
-	//}
-	if RMsize, RVersion,  err := s.NS.Rversion(TMsize, TVersion); err != nil {
-	MarshalRerrorPkt(b, t, fmt.Sprintf("%v", err))
-} else {
-	MarshalRversionPkt(b, t, RMsize, RVersion)
-}
-	return nil
-}
-
-func (c *Client)CallTversion (TMsize MaxSize, TVersion string) (RMsize MaxSize, RVersion string,  err error) {
-var b = bytes.Buffer{}
-if c.Trace != nil {c.Trace("%v", Tversion)}
-t := Tag(0)
-r := make (chan []byte)
-if c.Trace != nil { c.Trace(":tag %v, FID %v", t, c.FID)}
-MarshalTversionPkt(&b, t, TMsize, TVersion)
-c.FromClient <- &RPCCall{b: b.Bytes(), Reply: r}
-bb := <-r
-if MType(bb[4]) == Rerror {
-	s, _, err := UnmarshalRerrorPkt(bytes.NewBuffer(bb[5:]))
-	if err != nil {
-		return RMsize, RVersion,  err
-	}
-	return RMsize, RVersion,  fmt.Errorf("%v", s)
-} else {
-	RMsize, RVersion,  _, err = UnmarshalRversionPkt(bytes.NewBuffer(bb[5:]))
-}
-return RMsize, RVersion,  err
-}
-func MarshalRattachPkt (b *bytes.Buffer, t Tag, QID QID) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Rattach),
-byte(t), byte(t>>8),
-	uint8(QID.Type>>0),
-	uint8(QID.Version>>0),
-	uint8(QID.Version>>8),
-	uint8(QID.Version>>16),
-	uint8(QID.Version>>24),
-	uint8(QID.Path>>0),
-	uint8(QID.Path>>8),
-	uint8(QID.Path>>16),
-	uint8(QID.Path>>24),
-	uint8(QID.Path>>32),
-	uint8(QID.Path>>40),
-	uint8(QID.Path>>48),
-	uint8(QID.Path>>56),
-	})
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalRattachPkt (b *bytes.Buffer) (QID QID,  t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-	if _, err = b.Read(u[:1]); err != nil {
-		err = fmt.Errorf("pkt too short for uint8: need 1, have %d", b.Len())
-	return
-	}
-	QID.Type = uint8(u[0])
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	QID.Version = uint32(u[0])
-	QID.Version |= uint32(u[1])<<8
-	QID.Version |= uint32(u[2])<<16
-	QID.Version |= uint32(u[3])<<24
-	if _, err = b.Read(u[:8]); err != nil {
-		err = fmt.Errorf("pkt too short for uint64: need 8, have %d", b.Len())
-	return
-	}
-	QID.Path = uint64(u[0])
-	QID.Path |= uint64(u[1])<<8
-	QID.Path |= uint64(u[2])<<16
-	QID.Path |= uint64(u[3])<<24
-	QID.Path |= uint64(u[4])<<32
-	QID.Path |= uint64(u[5])<<40
-	QID.Path |= uint64(u[6])<<48
-	QID.Path |= uint64(u[7])<<56
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func MarshalTattachPkt (b *bytes.Buffer, t Tag, SFID FID, AFID FID, Uname string, Aname string) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Tattach),
-byte(t), byte(t>>8),
-	uint8(SFID>>0),
-	uint8(SFID>>8),
-	uint8(SFID>>16),
-	uint8(SFID>>24),
-	uint8(AFID>>0),
-	uint8(AFID>>8),
-	uint8(AFID>>16),
-	uint8(AFID>>24),
-	uint8(len(Uname)),uint8(len(Uname)>>8),
-	})
-	b.Write([]byte(Uname))
-	b.Write([]byte{	uint8(len(Aname)),uint8(len(Aname)>>8),
-	})
-	b.Write([]byte(Aname))
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalTattachPkt (b *bytes.Buffer) (SFID FID, AFID FID, Uname string, Aname string,  t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	SFID = FID(u[0])
-	SFID |= FID(u[1])<<8
-	SFID |= FID(u[2])<<16
-	SFID |= FID(u[3])<<24
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	AFID = FID(u[0])
-	AFID |= FID(u[1])<<8
-	AFID |= FID(u[2])<<16
-	AFID |= FID(u[3])<<24
-	if _, err = b.Read(u[:2]); err != nil {
-		err = fmt.Errorf("pkt too short for uint16: need 2, have %d", b.Len())
-	return
-	}
-	l = uint64(u[0])
-	l |= uint64(u[1])<<8
-	if b.Len() < int(l) {
-		err = fmt.Errorf("pkt too short for string: need %d, have %d", l, b.Len())
-	return
-	}
-	Uname = string(b.Bytes()[:l])
-	_ = b.Next(int(l))
-	if _, err = b.Read(u[:2]); err != nil {
-		err = fmt.Errorf("pkt too short for uint16: need 2, have %d", b.Len())
-	return
-	}
-	l = uint64(u[0])
-	l |= uint64(u[1])<<8
-	if b.Len() < int(l) {
-		err = fmt.Errorf("pkt too short for string: need %d, have %d", l, b.Len())
-	return
-	}
-	Aname = string(b.Bytes()[:l])
-	_ = b.Next(int(l))
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func (s *Server) SrvRattach(b*bytes.Buffer) (err error) {
-	SFID, AFID, Uname, Aname,  t, err := UnmarshalTattachPkt(b)
-	//if err != nil {
-	//}
-	if QID,  err := s.NS.Rattach(SFID, AFID, Uname, Aname); err != nil {
-	MarshalRerrorPkt(b, t, fmt.Sprintf("%v", err))
-} else {
-	MarshalRattachPkt(b, t, QID)
-}
-	return nil
-}
-
-func (c *Client)CallTattach (SFID FID, AFID FID, Uname string, Aname string) (QID QID,  err error) {
-var b = bytes.Buffer{}
-if c.Trace != nil {c.Trace("%v", Tattach)}
-t := Tag(0)
-r := make (chan []byte)
-if c.Trace != nil { c.Trace(":tag %v, FID %v", t, c.FID)}
-MarshalTattachPkt(&b, t, SFID, AFID, Uname, Aname)
-c.FromClient <- &RPCCall{b: b.Bytes(), Reply: r}
-bb := <-r
-if MType(bb[4]) == Rerror {
-	s, _, err := UnmarshalRerrorPkt(bytes.NewBuffer(bb[5:]))
-	if err != nil {
-		return QID,  err
-	}
-	return QID,  fmt.Errorf("%v", s)
-} else {
-	QID,  _, err = UnmarshalRattachPkt(bytes.NewBuffer(bb[5:]))
-}
-return QID,  err
-}
-func MarshalRflushPkt (b *bytes.Buffer, t Tag, ) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Rflush),
-byte(t), byte(t>>8),
-	})
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalRflushPkt (b *bytes.Buffer) ( t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func MarshalTflushPkt (b *bytes.Buffer, t Tag, OTag Tag) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Tflush),
-byte(t), byte(t>>8),
-	uint8(OTag>>0),
-	uint8(OTag>>8),
-	})
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalTflushPkt (b *bytes.Buffer) (OTag Tag,  t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-	if _, err = b.Read(u[:2]); err != nil {
-		err = fmt.Errorf("pkt too short for uint16: need 2, have %d", b.Len())
-	return
-	}
-	OTag = Tag(u[0])
-	OTag |= Tag(u[1])<<8
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func (s *Server) SrvRflush(b*bytes.Buffer) (err error) {
-	OTag,  t, err := UnmarshalTflushPkt(b)
-	//if err != nil {
-	//}
-	if  err := s.NS.Rflush(OTag); err != nil {
-	MarshalRerrorPkt(b, t, fmt.Sprintf("%v", err))
-} else {
-	MarshalRflushPkt(b, t, )
-}
-	return nil
-}
-
-func (c *Client)CallTflush (OTag Tag) ( err error) {
-var b = bytes.Buffer{}
-if c.Trace != nil {c.Trace("%v", Tflush)}
-t := Tag(0)
-r := make (chan []byte)
-if c.Trace != nil { c.Trace(":tag %v, FID %v", t, c.FID)}
-MarshalTflushPkt(&b, t, OTag)
-c.FromClient <- &RPCCall{b: b.Bytes(), Reply: r}
-bb := <-r
-if MType(bb[4]) == Rerror {
-	s, _, err := UnmarshalRerrorPkt(bytes.NewBuffer(bb[5:]))
-	if err != nil {
-		return  err
-	}
-	return  fmt.Errorf("%v", s)
-} else {
-	 _, err = UnmarshalRflushPkt(bytes.NewBuffer(bb[5:]))
-}
-return  err
-}
-func MarshalRwalkPkt (b *bytes.Buffer, t Tag, QIDs []QID) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Rwalk),
-byte(t), byte(t>>8),
-	uint8(len(QIDs)>>0),
-	uint8(len(QIDs)>>8),
-	})
-for i := range QIDs {
-	b.Write([]byte{	uint8(QIDs[i].Type>>0),
-	uint8(QIDs[i].Version>>0),
-	uint8(QIDs[i].Version>>8),
-	uint8(QIDs[i].Version>>16),
-	uint8(QIDs[i].Version>>24),
-	uint8(QIDs[i].Path>>0),
-	uint8(QIDs[i].Path>>8),
-	uint8(QIDs[i].Path>>16),
-	uint8(QIDs[i].Path>>24),
-	uint8(QIDs[i].Path>>32),
-	uint8(QIDs[i].Path>>40),
-	uint8(QIDs[i].Path>>48),
-	uint8(QIDs[i].Path>>56),
-	})
-}
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalRwalkPkt (b *bytes.Buffer) (QIDs []QID,  t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-	if _, err = b.Read(u[:2]); err != nil {
-		err = fmt.Errorf("pkt too short for uint16: need 2, have %d", b.Len())
-	return
-	}
-	l = uint64(u[0])
-	l |= uint64(u[1])<<8
-	QIDs = make([]QID, l)
-for i := range QIDs {
-	if _, err = b.Read(u[:1]); err != nil {
-		err = fmt.Errorf("pkt too short for uint8: need 1, have %d", b.Len())
-	return
-	}
-	QIDs[i].Type = uint8(u[0])
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	QIDs[i].Version = uint32(u[0])
-	QIDs[i].Version |= uint32(u[1])<<8
-	QIDs[i].Version |= uint32(u[2])<<16
-	QIDs[i].Version |= uint32(u[3])<<24
-	if _, err = b.Read(u[:8]); err != nil {
-		err = fmt.Errorf("pkt too short for uint64: need 8, have %d", b.Len())
-	return
-	}
-	QIDs[i].Path = uint64(u[0])
-	QIDs[i].Path |= uint64(u[1])<<8
-	QIDs[i].Path |= uint64(u[2])<<16
-	QIDs[i].Path |= uint64(u[3])<<24
-	QIDs[i].Path |= uint64(u[4])<<32
-	QIDs[i].Path |= uint64(u[5])<<40
-	QIDs[i].Path |= uint64(u[6])<<48
-	QIDs[i].Path |= uint64(u[7])<<56
-}
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func MarshalTwalkPkt (b *bytes.Buffer, t Tag, SFID FID, NewFID FID, Paths []string) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Twalk),
-byte(t), byte(t>>8),
-	uint8(SFID>>0),
-	uint8(SFID>>8),
-	uint8(SFID>>16),
-	uint8(SFID>>24),
-	uint8(NewFID>>0),
-	uint8(NewFID>>8),
-	uint8(NewFID>>16),
-	uint8(NewFID>>24),
-	uint8(len(Paths)>>0),
-	uint8(len(Paths)>>8),
-	})
-for i := range Paths {
-	b.Write([]byte{	uint8(len(Paths[i])),uint8(len(Paths[i])>>8),
-	})
-	b.Write([]byte(Paths[i]))
-}
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalTwalkPkt (b *bytes.Buffer) (SFID FID, NewFID FID, Paths []string,  t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	SFID = FID(u[0])
-	SFID |= FID(u[1])<<8
-	SFID |= FID(u[2])<<16
-	SFID |= FID(u[3])<<24
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	NewFID = FID(u[0])
-	NewFID |= FID(u[1])<<8
-	NewFID |= FID(u[2])<<16
-	NewFID |= FID(u[3])<<24
-	if _, err = b.Read(u[:2]); err != nil {
-		err = fmt.Errorf("pkt too short for uint16: need 2, have %d", b.Len())
-	return
-	}
-	l = uint64(u[0])
-	l |= uint64(u[1])<<8
-	Paths = make([]string, l)
-for i := range Paths {
-	if _, err = b.Read(u[:2]); err != nil {
-		err = fmt.Errorf("pkt too short for uint16: need 2, have %d", b.Len())
-	return
-	}
-	l = uint64(u[0])
-	l |= uint64(u[1])<<8
-	if b.Len() < int(l) {
-		err = fmt.Errorf("pkt too short for string: need %d, have %d", l, b.Len())
-	return
-	}
-	Paths[i] = string(b.Bytes()[:l])
-	_ = b.Next(int(l))
-}
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func (s *Server) SrvRwalk(b*bytes.Buffer) (err error) {
-	SFID, NewFID, Paths,  t, err := UnmarshalTwalkPkt(b)
-	//if err != nil {
-	//}
-	if QIDs,  err := s.NS.Rwalk(SFID, NewFID, Paths); err != nil {
-	MarshalRerrorPkt(b, t, fmt.Sprintf("%v", err))
-} else {
-	MarshalRwalkPkt(b, t, QIDs)
-}
-	return nil
-}
-
-func (c *Client)CallTwalk (SFID FID, NewFID FID, Paths []string) (QIDs []QID,  err error) {
-var b = bytes.Buffer{}
-if c.Trace != nil {c.Trace("%v", Twalk)}
-t := Tag(0)
-r := make (chan []byte)
-if c.Trace != nil { c.Trace(":tag %v, FID %v", t, c.FID)}
-MarshalTwalkPkt(&b, t, SFID, NewFID, Paths)
-c.FromClient <- &RPCCall{b: b.Bytes(), Reply: r}
-bb := <-r
-if MType(bb[4]) == Rerror {
-	s, _, err := UnmarshalRerrorPkt(bytes.NewBuffer(bb[5:]))
-	if err != nil {
-		return QIDs,  err
-	}
-	return QIDs,  fmt.Errorf("%v", s)
-} else {
-	QIDs,  _, err = UnmarshalRwalkPkt(bytes.NewBuffer(bb[5:]))
-}
-return QIDs,  err
-}
-func MarshalRopenPkt (b *bytes.Buffer, t Tag, OQID QID, IOUnit MaxSize) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Ropen),
-byte(t), byte(t>>8),
-	uint8(OQID.Type>>0),
-	uint8(OQID.Version>>0),
-	uint8(OQID.Version>>8),
-	uint8(OQID.Version>>16),
-	uint8(OQID.Version>>24),
-	uint8(OQID.Path>>0),
-	uint8(OQID.Path>>8),
-	uint8(OQID.Path>>16),
-	uint8(OQID.Path>>24),
-	uint8(OQID.Path>>32),
-	uint8(OQID.Path>>40),
-	uint8(OQID.Path>>48),
-	uint8(OQID.Path>>56),
-	uint8(IOUnit>>0),
-	uint8(IOUnit>>8),
-	uint8(IOUnit>>16),
-	uint8(IOUnit>>24),
-	})
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalRopenPkt (b *bytes.Buffer) (OQID QID, IOUnit MaxSize,  t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-	if _, err = b.Read(u[:1]); err != nil {
-		err = fmt.Errorf("pkt too short for uint8: need 1, have %d", b.Len())
-	return
-	}
-	OQID.Type = uint8(u[0])
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	OQID.Version = uint32(u[0])
-	OQID.Version |= uint32(u[1])<<8
-	OQID.Version |= uint32(u[2])<<16
-	OQID.Version |= uint32(u[3])<<24
-	if _, err = b.Read(u[:8]); err != nil {
-		err = fmt.Errorf("pkt too short for uint64: need 8, have %d", b.Len())
-	return
-	}
-	OQID.Path = uint64(u[0])
-	OQID.Path |= uint64(u[1])<<8
-	OQID.Path |= uint64(u[2])<<16
-	OQID.Path |= uint64(u[3])<<24
-	OQID.Path |= uint64(u[4])<<32
-	OQID.Path |= uint64(u[5])<<40
-	OQID.Path |= uint64(u[6])<<48
-	OQID.Path |= uint64(u[7])<<56
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	IOUnit = MaxSize(u[0])
-	IOUnit |= MaxSize(u[1])<<8
-	IOUnit |= MaxSize(u[2])<<16
-	IOUnit |= MaxSize(u[3])<<24
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func MarshalTopenPkt (b *bytes.Buffer, t Tag, OFID FID, Omode Mode) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Topen),
-byte(t), byte(t>>8),
-	uint8(OFID>>0),
-	uint8(OFID>>8),
-	uint8(OFID>>16),
-	uint8(OFID>>24),
-	uint8(Omode>>0),
-	})
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalTopenPkt (b *bytes.Buffer) (OFID FID, Omode Mode,  t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	OFID = FID(u[0])
-	OFID |= FID(u[1])<<8
-	OFID |= FID(u[2])<<16
-	OFID |= FID(u[3])<<24
-	if _, err = b.Read(u[:1]); err != nil {
-		err = fmt.Errorf("pkt too short for uint8: need 1, have %d", b.Len())
-	return
-	}
-	Omode = Mode(u[0])
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func (s *Server) SrvRopen(b*bytes.Buffer) (err error) {
-	OFID, Omode,  t, err := UnmarshalTopenPkt(b)
-	//if err != nil {
-	//}
-	if OQID, IOUnit,  err := s.NS.Ropen(OFID, Omode); err != nil {
-	MarshalRerrorPkt(b, t, fmt.Sprintf("%v", err))
-} else {
-	MarshalRopenPkt(b, t, OQID, IOUnit)
-}
-	return nil
-}
-
-func (c *Client)CallTopen (OFID FID, Omode Mode) (OQID QID, IOUnit MaxSize,  err error) {
-var b = bytes.Buffer{}
-if c.Trace != nil {c.Trace("%v", Topen)}
-t := Tag(0)
-r := make (chan []byte)
-if c.Trace != nil { c.Trace(":tag %v, FID %v", t, c.FID)}
-MarshalTopenPkt(&b, t, OFID, Omode)
-c.FromClient <- &RPCCall{b: b.Bytes(), Reply: r}
-bb := <-r
-if MType(bb[4]) == Rerror {
-	s, _, err := UnmarshalRerrorPkt(bytes.NewBuffer(bb[5:]))
-	if err != nil {
-		return OQID, IOUnit,  err
-	}
-	return OQID, IOUnit,  fmt.Errorf("%v", s)
-} else {
-	OQID, IOUnit,  _, err = UnmarshalRopenPkt(bytes.NewBuffer(bb[5:]))
-}
-return OQID, IOUnit,  err
-}
-func MarshalRcreatePkt (b *bytes.Buffer, t Tag, OQID QID, IOUnit MaxSize) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Rcreate),
-byte(t), byte(t>>8),
-	uint8(OQID.Type>>0),
-	uint8(OQID.Version>>0),
-	uint8(OQID.Version>>8),
-	uint8(OQID.Version>>16),
-	uint8(OQID.Version>>24),
-	uint8(OQID.Path>>0),
-	uint8(OQID.Path>>8),
-	uint8(OQID.Path>>16),
-	uint8(OQID.Path>>24),
-	uint8(OQID.Path>>32),
-	uint8(OQID.Path>>40),
-	uint8(OQID.Path>>48),
-	uint8(OQID.Path>>56),
-	uint8(IOUnit>>0),
-	uint8(IOUnit>>8),
-	uint8(IOUnit>>16),
-	uint8(IOUnit>>24),
-	})
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalRcreatePkt (b *bytes.Buffer) (OQID QID, IOUnit MaxSize,  t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-	if _, err = b.Read(u[:1]); err != nil {
-		err = fmt.Errorf("pkt too short for uint8: need 1, have %d", b.Len())
-	return
-	}
-	OQID.Type = uint8(u[0])
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	OQID.Version = uint32(u[0])
-	OQID.Version |= uint32(u[1])<<8
-	OQID.Version |= uint32(u[2])<<16
-	OQID.Version |= uint32(u[3])<<24
-	if _, err = b.Read(u[:8]); err != nil {
-		err = fmt.Errorf("pkt too short for uint64: need 8, have %d", b.Len())
-	return
-	}
-	OQID.Path = uint64(u[0])
-	OQID.Path |= uint64(u[1])<<8
-	OQID.Path |= uint64(u[2])<<16
-	OQID.Path |= uint64(u[3])<<24
-	OQID.Path |= uint64(u[4])<<32
-	OQID.Path |= uint64(u[5])<<40
-	OQID.Path |= uint64(u[6])<<48
-	OQID.Path |= uint64(u[7])<<56
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	IOUnit = MaxSize(u[0])
-	IOUnit |= MaxSize(u[1])<<8
-	IOUnit |= MaxSize(u[2])<<16
-	IOUnit |= MaxSize(u[3])<<24
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func MarshalTcreatePkt (b *bytes.Buffer, t Tag, OFID FID, Name string, CreatePerm Perm, Omode Mode) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Tcreate),
-byte(t), byte(t>>8),
-	uint8(OFID>>0),
-	uint8(OFID>>8),
-	uint8(OFID>>16),
-	uint8(OFID>>24),
-	uint8(len(Name)),uint8(len(Name)>>8),
-	})
-	b.Write([]byte(Name))
-	b.Write([]byte{	uint8(CreatePerm>>0),
-	uint8(CreatePerm>>8),
-	uint8(CreatePerm>>16),
-	uint8(CreatePerm>>24),
-	uint8(Omode>>0),
-	})
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalTcreatePkt (b *bytes.Buffer) (OFID FID, Name string, CreatePerm Perm, Omode Mode,  t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	OFID = FID(u[0])
-	OFID |= FID(u[1])<<8
-	OFID |= FID(u[2])<<16
-	OFID |= FID(u[3])<<24
-	if _, err = b.Read(u[:2]); err != nil {
-		err = fmt.Errorf("pkt too short for uint16: need 2, have %d", b.Len())
-	return
-	}
-	l = uint64(u[0])
-	l |= uint64(u[1])<<8
-	if b.Len() < int(l) {
-		err = fmt.Errorf("pkt too short for string: need %d, have %d", l, b.Len())
-	return
-	}
-	Name = string(b.Bytes()[:l])
-	_ = b.Next(int(l))
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	CreatePerm = Perm(u[0])
-	CreatePerm |= Perm(u[1])<<8
-	CreatePerm |= Perm(u[2])<<16
-	CreatePerm |= Perm(u[3])<<24
-	if _, err = b.Read(u[:1]); err != nil {
-		err = fmt.Errorf("pkt too short for uint8: need 1, have %d", b.Len())
-	return
-	}
-	Omode = Mode(u[0])
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func (s *Server) SrvRcreate(b*bytes.Buffer) (err error) {
-	OFID, Name, CreatePerm, Omode,  t, err := UnmarshalTcreatePkt(b)
-	//if err != nil {
-	//}
-	if OQID, IOUnit,  err := s.NS.Rcreate(OFID, Name, CreatePerm, Omode); err != nil {
-	MarshalRerrorPkt(b, t, fmt.Sprintf("%v", err))
-} else {
-	MarshalRcreatePkt(b, t, OQID, IOUnit)
-}
-	return nil
-}
-
-func (c *Client)CallTcreate (OFID FID, Name string, CreatePerm Perm, Omode Mode) (OQID QID, IOUnit MaxSize,  err error) {
-var b = bytes.Buffer{}
-if c.Trace != nil {c.Trace("%v", Tcreate)}
-t := Tag(0)
-r := make (chan []byte)
-if c.Trace != nil { c.Trace(":tag %v, FID %v", t, c.FID)}
-MarshalTcreatePkt(&b, t, OFID, Name, CreatePerm, Omode)
-c.FromClient <- &RPCCall{b: b.Bytes(), Reply: r}
-bb := <-r
-if MType(bb[4]) == Rerror {
-	s, _, err := UnmarshalRerrorPkt(bytes.NewBuffer(bb[5:]))
-	if err != nil {
-		return OQID, IOUnit,  err
-	}
-	return OQID, IOUnit,  fmt.Errorf("%v", s)
-} else {
-	OQID, IOUnit,  _, err = UnmarshalRcreatePkt(bytes.NewBuffer(bb[5:]))
-}
-return OQID, IOUnit,  err
-}
-func MarshalRstatPkt (b *bytes.Buffer, t Tag, B []byte) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Rstat),
-byte(t), byte(t>>8),
-	uint8(len(B)>>0),
-	uint8(len(B)>>8),
-	})
-	b.Write(B)
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalRstatPkt (b *bytes.Buffer) (B []byte,  t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-	if _, err = b.Read(u[:2]); err != nil {
-		err = fmt.Errorf("pkt too short for uint16: need 2, have %d", b.Len())
-	return
-	}
-	l = uint64(u[0])
-	l |= uint64(u[1])<<8
-	B = b.Bytes()[:l]
-	_ = b.Next(int(l))
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func MarshalTstatPkt (b *bytes.Buffer, t Tag, OFID FID) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Tstat),
-byte(t), byte(t>>8),
-	uint8(OFID>>0),
-	uint8(OFID>>8),
-	uint8(OFID>>16),
-	uint8(OFID>>24),
-	})
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalTstatPkt (b *bytes.Buffer) (OFID FID,  t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	OFID = FID(u[0])
-	OFID |= FID(u[1])<<8
-	OFID |= FID(u[2])<<16
-	OFID |= FID(u[3])<<24
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func (s *Server) SrvRstat(b*bytes.Buffer) (err error) {
-	OFID,  t, err := UnmarshalTstatPkt(b)
-	//if err != nil {
-	//}
-	if B,  err := s.NS.Rstat(OFID); err != nil {
-	MarshalRerrorPkt(b, t, fmt.Sprintf("%v", err))
-} else {
-	MarshalRstatPkt(b, t, B)
-}
-	return nil
-}
-
-func (c *Client)CallTstat (OFID FID) (B []byte,  err error) {
-var b = bytes.Buffer{}
-if c.Trace != nil {c.Trace("%v", Tstat)}
-t := Tag(0)
-r := make (chan []byte)
-if c.Trace != nil { c.Trace(":tag %v, FID %v", t, c.FID)}
-MarshalTstatPkt(&b, t, OFID)
-c.FromClient <- &RPCCall{b: b.Bytes(), Reply: r}
-bb := <-r
-if MType(bb[4]) == Rerror {
-	s, _, err := UnmarshalRerrorPkt(bytes.NewBuffer(bb[5:]))
-	if err != nil {
-		return B,  err
-	}
-	return B,  fmt.Errorf("%v", s)
-} else {
-	B,  _, err = UnmarshalRstatPkt(bytes.NewBuffer(bb[5:]))
-}
-return B,  err
-}
-func MarshalRwstatPkt (b *bytes.Buffer, t Tag, ) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Rwstat),
-byte(t), byte(t>>8),
-	})
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalRwstatPkt (b *bytes.Buffer) ( t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func MarshalTwstatPkt (b *bytes.Buffer, t Tag, OFID FID, B []byte) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Twstat),
-byte(t), byte(t>>8),
-	uint8(OFID>>0),
-	uint8(OFID>>8),
-	uint8(OFID>>16),
-	uint8(OFID>>24),
-	uint8(len(B)>>0),
-	uint8(len(B)>>8),
-	})
-	b.Write(B)
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalTwstatPkt (b *bytes.Buffer) (OFID FID, B []byte,  t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	OFID = FID(u[0])
-	OFID |= FID(u[1])<<8
-	OFID |= FID(u[2])<<16
-	OFID |= FID(u[3])<<24
-	if _, err = b.Read(u[:2]); err != nil {
-		err = fmt.Errorf("pkt too short for uint16: need 2, have %d", b.Len())
-	return
-	}
-	l = uint64(u[0])
-	l |= uint64(u[1])<<8
-	B = b.Bytes()[:l]
-	_ = b.Next(int(l))
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func (s *Server) SrvRwstat(b*bytes.Buffer) (err error) {
-	OFID, B,  t, err := UnmarshalTwstatPkt(b)
-	//if err != nil {
-	//}
-	if  err := s.NS.Rwstat(OFID, B); err != nil {
-	MarshalRerrorPkt(b, t, fmt.Sprintf("%v", err))
-} else {
-	MarshalRwstatPkt(b, t, )
-}
-	return nil
-}
-
-func (c *Client)CallTwstat (OFID FID, B []byte) ( err error) {
-var b = bytes.Buffer{}
-if c.Trace != nil {c.Trace("%v", Twstat)}
-t := Tag(0)
-r := make (chan []byte)
-if c.Trace != nil { c.Trace(":tag %v, FID %v", t, c.FID)}
-MarshalTwstatPkt(&b, t, OFID, B)
-c.FromClient <- &RPCCall{b: b.Bytes(), Reply: r}
-bb := <-r
-if MType(bb[4]) == Rerror {
-	s, _, err := UnmarshalRerrorPkt(bytes.NewBuffer(bb[5:]))
-	if err != nil {
-		return  err
-	}
-	return  fmt.Errorf("%v", s)
-} else {
-	 _, err = UnmarshalRwstatPkt(bytes.NewBuffer(bb[5:]))
-}
-return  err
-}
-func MarshalRclunkPkt (b *bytes.Buffer, t Tag, ) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Rclunk),
-byte(t), byte(t>>8),
-	})
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalRclunkPkt (b *bytes.Buffer) ( t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func MarshalTclunkPkt (b *bytes.Buffer, t Tag, OFID FID) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Tclunk),
-byte(t), byte(t>>8),
-	uint8(OFID>>0),
-	uint8(OFID>>8),
-	uint8(OFID>>16),
-	uint8(OFID>>24),
-	})
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalTclunkPkt (b *bytes.Buffer) (OFID FID,  t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	OFID = FID(u[0])
-	OFID |= FID(u[1])<<8
-	OFID |= FID(u[2])<<16
-	OFID |= FID(u[3])<<24
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func (s *Server) SrvRclunk(b*bytes.Buffer) (err error) {
-	OFID,  t, err := UnmarshalTclunkPkt(b)
-	//if err != nil {
-	//}
-	if  err := s.NS.Rclunk(OFID); err != nil {
-	MarshalRerrorPkt(b, t, fmt.Sprintf("%v", err))
-} else {
-	MarshalRclunkPkt(b, t, )
-}
-	return nil
-}
-
-func (c *Client)CallTclunk (OFID FID) ( err error) {
-var b = bytes.Buffer{}
-if c.Trace != nil {c.Trace("%v", Tclunk)}
-t := Tag(0)
-r := make (chan []byte)
-if c.Trace != nil { c.Trace(":tag %v, FID %v", t, c.FID)}
-MarshalTclunkPkt(&b, t, OFID)
-c.FromClient <- &RPCCall{b: b.Bytes(), Reply: r}
-bb := <-r
-if MType(bb[4]) == Rerror {
-	s, _, err := UnmarshalRerrorPkt(bytes.NewBuffer(bb[5:]))
-	if err != nil {
-		return  err
-	}
-	return  fmt.Errorf("%v", s)
-} else {
-	 _, err = UnmarshalRclunkPkt(bytes.NewBuffer(bb[5:]))
-}
-return  err
-}
-func MarshalRremovePkt (b *bytes.Buffer, t Tag, ) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Rremove),
-byte(t), byte(t>>8),
-	})
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalRremovePkt (b *bytes.Buffer) ( t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func MarshalTremovePkt (b *bytes.Buffer, t Tag, OFID FID) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Tremove),
-byte(t), byte(t>>8),
-	uint8(OFID>>0),
-	uint8(OFID>>8),
-	uint8(OFID>>16),
-	uint8(OFID>>24),
-	})
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalTremovePkt (b *bytes.Buffer) (OFID FID,  t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	OFID = FID(u[0])
-	OFID |= FID(u[1])<<8
-	OFID |= FID(u[2])<<16
-	OFID |= FID(u[3])<<24
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func (s *Server) SrvRremove(b*bytes.Buffer) (err error) {
-	OFID,  t, err := UnmarshalTremovePkt(b)
-	//if err != nil {
-	//}
-	if  err := s.NS.Rremove(OFID); err != nil {
-	MarshalRerrorPkt(b, t, fmt.Sprintf("%v", err))
-} else {
-	MarshalRremovePkt(b, t, )
-}
-	return nil
-}
-
-func (c *Client)CallTremove (OFID FID) ( err error) {
-var b = bytes.Buffer{}
-if c.Trace != nil {c.Trace("%v", Tremove)}
-t := Tag(0)
-r := make (chan []byte)
-if c.Trace != nil { c.Trace(":tag %v, FID %v", t, c.FID)}
-MarshalTremovePkt(&b, t, OFID)
-c.FromClient <- &RPCCall{b: b.Bytes(), Reply: r}
-bb := <-r
-if MType(bb[4]) == Rerror {
-	s, _, err := UnmarshalRerrorPkt(bytes.NewBuffer(bb[5:]))
-	if err != nil {
-		return  err
-	}
-	return  fmt.Errorf("%v", s)
-} else {
-	 _, err = UnmarshalRremovePkt(bytes.NewBuffer(bb[5:]))
-}
-return  err
-}
-func MarshalRreadPkt (b *bytes.Buffer, t Tag, Data []uint8) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Rread),
-byte(t), byte(t>>8),
-	uint8(len(Data)>>0),
-	uint8(len(Data)>>8),
-	uint8(len(Data)>>16),
-	uint8(len(Data)>>24),
-	})
-	b.Write(Data)
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalRreadPkt (b *bytes.Buffer) (Data []uint8,  t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	l = uint64(u[0])
-	l |= uint64(u[1])<<8
-	l |= uint64(u[2])<<16
-	l |= uint64(u[3])<<24
-	Data = b.Bytes()[:l]
-	_ = b.Next(int(l))
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func MarshalTreadPkt (b *bytes.Buffer, t Tag, OFID FID, Off Offset, Len Count) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Tread),
-byte(t), byte(t>>8),
-	uint8(OFID>>0),
-	uint8(OFID>>8),
-	uint8(OFID>>16),
-	uint8(OFID>>24),
-	uint8(Off>>0),
-	uint8(Off>>8),
-	uint8(Off>>16),
-	uint8(Off>>24),
-	uint8(Off>>32),
-	uint8(Off>>40),
-	uint8(Off>>48),
-	uint8(Off>>56),
-	uint8(Len>>0),
-	uint8(Len>>8),
-	uint8(Len>>16),
-	uint8(Len>>24),
-	})
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalTreadPkt (b *bytes.Buffer) (OFID FID, Off Offset, Len Count,  t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	OFID = FID(u[0])
-	OFID |= FID(u[1])<<8
-	OFID |= FID(u[2])<<16
-	OFID |= FID(u[3])<<24
-	if _, err = b.Read(u[:8]); err != nil {
-		err = fmt.Errorf("pkt too short for uint64: need 8, have %d", b.Len())
-	return
-	}
-	Off = Offset(u[0])
-	Off |= Offset(u[1])<<8
-	Off |= Offset(u[2])<<16
-	Off |= Offset(u[3])<<24
-	Off |= Offset(u[4])<<32
-	Off |= Offset(u[5])<<40
-	Off |= Offset(u[6])<<48
-	Off |= Offset(u[7])<<56
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	Len = Count(u[0])
-	Len |= Count(u[1])<<8
-	Len |= Count(u[2])<<16
-	Len |= Count(u[3])<<24
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func (s *Server) SrvRread(b*bytes.Buffer) (err error) {
-	OFID, Off, Len,  t, err := UnmarshalTreadPkt(b)
-	//if err != nil {
-	//}
-	if Data,  err := s.NS.Rread(OFID, Off, Len); err != nil {
-	MarshalRerrorPkt(b, t, fmt.Sprintf("%v", err))
-} else {
-	MarshalRreadPkt(b, t, Data)
-}
-	return nil
-}
-
-func (c *Client)CallTread (OFID FID, Off Offset, Len Count) (Data []uint8,  err error) {
-var b = bytes.Buffer{}
-if c.Trace != nil {c.Trace("%v", Tread)}
-t := Tag(0)
-r := make (chan []byte)
-if c.Trace != nil { c.Trace(":tag %v, FID %v", t, c.FID)}
-MarshalTreadPkt(&b, t, OFID, Off, Len)
-c.FromClient <- &RPCCall{b: b.Bytes(), Reply: r}
-bb := <-r
-if MType(bb[4]) == Rerror {
-	s, _, err := UnmarshalRerrorPkt(bytes.NewBuffer(bb[5:]))
-	if err != nil {
-		return Data,  err
-	}
-	return Data,  fmt.Errorf("%v", s)
-} else {
-	Data,  _, err = UnmarshalRreadPkt(bytes.NewBuffer(bb[5:]))
-}
-return Data,  err
-}
-func MarshalRwritePkt (b *bytes.Buffer, t Tag, RLen Count) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Rwrite),
-byte(t), byte(t>>8),
-	uint8(RLen>>0),
-	uint8(RLen>>8),
-	uint8(RLen>>16),
-	uint8(RLen>>24),
-	})
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalRwritePkt (b *bytes.Buffer) (RLen Count,  t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	RLen = Count(u[0])
-	RLen |= Count(u[1])<<8
-	RLen |= Count(u[2])<<16
-	RLen |= Count(u[3])<<24
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func MarshalTwritePkt (b *bytes.Buffer, t Tag, OFID FID, Off Offset, Data []uint8) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,0,0,
-uint8(Twrite),
-byte(t), byte(t>>8),
-	uint8(OFID>>0),
-	uint8(OFID>>8),
-	uint8(OFID>>16),
-	uint8(OFID>>24),
-	uint8(Off>>0),
-	uint8(Off>>8),
-	uint8(Off>>16),
-	uint8(Off>>24),
-	uint8(Off>>32),
-	uint8(Off>>40),
-	uint8(Off>>48),
-	uint8(Off>>56),
-	uint8(len(Data)>>0),
-	uint8(len(Data)>>8),
-	uint8(len(Data)>>16),
-	uint8(len(Data)>>24),
-	})
-	b.Write(Data)
-
-{
-l = uint64(b.Len())
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8), uint8(l>>16), uint8(l>>24)})
-}
-return
-}
-func UnmarshalTwritePkt (b *bytes.Buffer) (OFID FID, Off Offset, Data []uint8,  t Tag, err error) {
-var u [8]uint8
-var l uint64
-if _, err = b.Read(u[:2]); err != nil {
-err = fmt.Errorf("pkt too short for Tag; need 2, have %d", b.Len())
-return
-}
-l = uint64(u[0]) | uint64(u[1])<<8
-t = Tag(l)
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	OFID = FID(u[0])
-	OFID |= FID(u[1])<<8
-	OFID |= FID(u[2])<<16
-	OFID |= FID(u[3])<<24
-	if _, err = b.Read(u[:8]); err != nil {
-		err = fmt.Errorf("pkt too short for uint64: need 8, have %d", b.Len())
-	return
-	}
-	Off = Offset(u[0])
-	Off |= Offset(u[1])<<8
-	Off |= Offset(u[2])<<16
-	Off |= Offset(u[3])<<24
-	Off |= Offset(u[4])<<32
-	Off |= Offset(u[5])<<40
-	Off |= Offset(u[6])<<48
-	Off |= Offset(u[7])<<56
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	l = uint64(u[0])
-	l |= uint64(u[1])<<8
-	l |= uint64(u[2])<<16
-	l |= uint64(u[3])<<24
-	Data = b.Bytes()[:l]
-	_ = b.Next(int(l))
-
-if b.Len() > 0 {
-err = fmt.Errorf("Packet too long: %d bytes left over after decode", b.Len())
-}
-return
-}
-func (s *Server) SrvRwrite(b*bytes.Buffer) (err error) {
-	OFID, Off, Data,  t, err := UnmarshalTwritePkt(b)
-	//if err != nil {
-	//}
-	if RLen,  err := s.NS.Rwrite(OFID, Off, Data); err != nil {
-	MarshalRerrorPkt(b, t, fmt.Sprintf("%v", err))
-} else {
-	MarshalRwritePkt(b, t, RLen)
-}
-	return nil
-}
-
-func (c *Client)CallTwrite (OFID FID, Off Offset, Data []uint8) (RLen Count,  err error) {
-var b = bytes.Buffer{}
-if c.Trace != nil {c.Trace("%v", Twrite)}
-t := Tag(0)
-r := make (chan []byte)
-if c.Trace != nil { c.Trace(":tag %v, FID %v", t, c.FID)}
-MarshalTwritePkt(&b, t, OFID, Off, Data)
-c.FromClient <- &RPCCall{b: b.Bytes(), Reply: r}
-bb := <-r
-if MType(bb[4]) == Rerror {
-	s, _, err := UnmarshalRerrorPkt(bytes.NewBuffer(bb[5:]))
-	if err != nil {
-		return RLen,  err
-	}
-	return RLen,  fmt.Errorf("%v", s)
-} else {
-	RLen,  _, err = UnmarshalRwritePkt(bytes.NewBuffer(bb[5:]))
-}
-return RLen,  err
-}
-func ServerError (b *bytes.Buffer, s string) {
-	var u [8]byte
-	// This can't really happen. 
-	if _, err := b.Read(u[:2]); err != nil {
-		return
-	}
-	t := Tag(uint16(u[0])|uint16(u[1])<<8)
-	MarshalRerrorPkt (b, t, s)
-}
-func Marshaldir (b *bytes.Buffer, D Dir) {
-var l uint64
-b.Reset()
-b.Write([]byte{0,0,})
-	b.Write([]byte{	uint8(D.Type>>0),
-	uint8(D.Type>>8),
-	uint8(D.Dev>>0),
-	uint8(D.Dev>>8),
-	uint8(D.Dev>>16),
-	uint8(D.Dev>>24),
-	uint8(D.QID.Type>>0),
-	uint8(D.QID.Version>>0),
-	uint8(D.QID.Version>>8),
-	uint8(D.QID.Version>>16),
-	uint8(D.QID.Version>>24),
-	uint8(D.QID.Path>>0),
-	uint8(D.QID.Path>>8),
-	uint8(D.QID.Path>>16),
-	uint8(D.QID.Path>>24),
-	uint8(D.QID.Path>>32),
-	uint8(D.QID.Path>>40),
-	uint8(D.QID.Path>>48),
-	uint8(D.QID.Path>>56),
-	uint8(D.Mode>>0),
-	uint8(D.Mode>>8),
-	uint8(D.Mode>>16),
-	uint8(D.Mode>>24),
-	uint8(D.Atime>>0),
-	uint8(D.Atime>>8),
-	uint8(D.Atime>>16),
-	uint8(D.Atime>>24),
-	uint8(D.Mtime>>0),
-	uint8(D.Mtime>>8),
-	uint8(D.Mtime>>16),
-	uint8(D.Mtime>>24),
-	uint8(D.Length>>0),
-	uint8(D.Length>>8),
-	uint8(D.Length>>16),
-	uint8(D.Length>>24),
-	uint8(D.Length>>32),
-	uint8(D.Length>>40),
-	uint8(D.Length>>48),
-	uint8(D.Length>>56),
-	uint8(len(D.Name)),uint8(len(D.Name)>>8),
-	})
-	b.Write([]byte(D.Name))
-	b.Write([]byte{	uint8(len(D.User)),uint8(len(D.User)>>8),
-	})
-	b.Write([]byte(D.User))
-	b.Write([]byte{	uint8(len(D.Group)),uint8(len(D.Group)>>8),
-	})
-	b.Write([]byte(D.Group))
-	b.Write([]byte{	uint8(len(D.ModUser)),uint8(len(D.ModUser)>>8),
-	})
-	b.Write([]byte(D.ModUser))
-
-l = uint64(b.Len()) - 2
-copy(b.Bytes(), []byte{uint8(l), uint8(l>>8)})
-return
-}
-func Unmarshaldir (b *bytes.Buffer) (D Dir,  err error) {
-var u [8]uint8
-var l uint64
-_ = b.Next(2) // eat the length too
-	if _, err = b.Read(u[:2]); err != nil {
-		err = fmt.Errorf("pkt too short for uint16: need 2, have %d", b.Len())
-	return
-	}
-	D.Type = uint16(u[0])
-	D.Type |= uint16(u[1])<<8
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	D.Dev = uint32(u[0])
-	D.Dev |= uint32(u[1])<<8
-	D.Dev |= uint32(u[2])<<16
-	D.Dev |= uint32(u[3])<<24
-	if _, err = b.Read(u[:1]); err != nil {
-		err = fmt.Errorf("pkt too short for uint8: need 1, have %d", b.Len())
-	return
-	}
-	D.QID.Type = uint8(u[0])
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	D.QID.Version = uint32(u[0])
-	D.QID.Version |= uint32(u[1])<<8
-	D.QID.Version |= uint32(u[2])<<16
-	D.QID.Version |= uint32(u[3])<<24
-	if _, err = b.Read(u[:8]); err != nil {
-		err = fmt.Errorf("pkt too short for uint64: need 8, have %d", b.Len())
-	return
-	}
-	D.QID.Path = uint64(u[0])
-	D.QID.Path |= uint64(u[1])<<8
-	D.QID.Path |= uint64(u[2])<<16
-	D.QID.Path |= uint64(u[3])<<24
-	D.QID.Path |= uint64(u[4])<<32
-	D.QID.Path |= uint64(u[5])<<40
-	D.QID.Path |= uint64(u[6])<<48
-	D.QID.Path |= uint64(u[7])<<56
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	D.Mode = uint32(u[0])
-	D.Mode |= uint32(u[1])<<8
-	D.Mode |= uint32(u[2])<<16
-	D.Mode |= uint32(u[3])<<24
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	D.Atime = uint32(u[0])
-	D.Atime |= uint32(u[1])<<8
-	D.Atime |= uint32(u[2])<<16
-	D.Atime |= uint32(u[3])<<24
-	if _, err = b.Read(u[:4]); err != nil {
-		err = fmt.Errorf("pkt too short for uint32: need 4, have %d", b.Len())
-	return
-	}
-	D.Mtime = uint32(u[0])
-	D.Mtime |= uint32(u[1])<<8
-	D.Mtime |= uint32(u[2])<<16
-	D.Mtime |= uint32(u[3])<<24
-	if _, err = b.Read(u[:8]); err != nil {
-		err = fmt.Errorf("pkt too short for uint64: need 8, have %d", b.Len())
-	return
-	}
-	D.Length = uint64(u[0])
-	D.Length |= uint64(u[1])<<8
-	D.Length |= uint64(u[2])<<16
-	D.Length |= uint64(u[3])<<24
-	D.Length |= uint64(u[4])<<32
-	D.Length |= uint64(u[5])<<40
-	D.Length |= uint64(u[6])<<48
-	D.Length |= uint64(u[7])<<56
-	if _, err = b.Read(u[:2]); err != nil {
-		err = fmt.Errorf("pkt too short for uint16: need 2, have %d", b.Len())
-	return
-	}
-	l = uint64(u[0])
-	l |= uint64(u[1])<<8
-	if b.Len() < int(l) {
-		err = fmt.Errorf("pkt too short for string: need %d, have %d", l, b.Len())
-	return
-	}
-	D.Name = string(b.Bytes()[:l])
-	_ = b.Next(int(l))
-	if _, err = b.Read(u[:2]); err != nil {
-		err = fmt.Errorf("pkt too short for uint16: need 2, have %d", b.Len())
-	return
-	}
-	l = uint64(u[0])
-	l |= uint64(u[1])<<8
-	if b.Len() < int(l) {
-		err = fmt.Errorf("pkt too short for string: need %d, have %d", l, b.Len())
-	return
-	}
-	D.User = string(b.Bytes()[:l])
-	_ = b.Next(int(l))
-	if _, err = b.Read(u[:2]); err != nil {
-		err = fmt.Errorf("pkt too short for uint16: need 2, have %d", b.Len())
-	return
-	}
-	l = uint64(u[0])
-	l |= uint64(u[1])<<8
-	if b.Len() < int(l) {
-		err = fmt.Errorf("pkt too short for string: need %d, have %d", l, b.Len())
-	return
-	}
-	D.Group = string(b.Bytes()[:l])
-	_ = b.Next(int(l))
-	if _, err = b.Read(u[:2]); err != nil {
-		err = fmt.Errorf("pkt too short for uint16: need 2, have %d", b.Len())
-	return
-	}
-	l = uint64(u[0])
-	l |= uint64(u[1])<<8
-	if b.Len() < int(l) {
-		err = fmt.Errorf("pkt too short for string: need %d, have %d", l, b.Len())
-	return
-	}
-	D.ModUser = string(b.Bytes()[:l])
-	_ = b.Next(int(l))
-
-return
-}

+ 0 - 17
sys/src/go/pkg/ninep/protocol/pprof.go

@@ -1,17 +0,0 @@
-// +build pprof
-
-package protocol
-
-import (
-	"log"
-	"net/http"
-	_ "net/http/pprof"
-
-)
-
-
-func init() {
-	go func() {
-		log.Println(http.ListenAndServe(":6060", nil))
-	}()
-}

+ 0 - 343
sys/src/go/pkg/ninep/protocol/protocol.go

@@ -1,343 +0,0 @@
-// Package protocol implements the 9p protocol using the stubs.
-
-//go:generate go run gen.go
-
-package protocol
-
-import "bytes"
-
-// 9P2000 message types
-const (
-	Tversion MType = 100 + iota
-	Rversion
-	Tauth
-	Rauth
-	Tattach
-	Rattach
-	Terror
-	Rerror
-	Tflush
-	Rflush
-	Twalk
-	Rwalk
-	Topen
-	Ropen
-	Tcreate
-	Rcreate
-	Tread
-	Rread
-	Twrite
-	Rwrite
-	Tclunk
-	Rclunk
-	Tremove
-	Rremove
-	Tstat
-	Rstat
-	Twstat
-	Rwstat
-	Tlast
-)
-
-const (
-	MSIZE   = 2*1048576 + IOHDRSZ // default message size (1048576+IOHdrSz)
-	IOHDRSZ = 24                  // the non-data size of the Twrite messages
-	PORT    = 564                 // default port for 9P file servers
-	NumFID  = 1 << 16
-	QIDLen  = 13
-)
-
-// QID types
-const (
-	QTDIR     = 0x80 // directories
-	QTAPPEND  = 0x40 // append only files
-	QTEXCL    = 0x20 // exclusive use files
-	QTMOUNT   = 0x10 // mounted channel
-	QTAUTH    = 0x08 // authentication file
-	QTTMP     = 0x04 // non-backed-up file
-	QTSYMLINK = 0x02 // symbolic link (Unix, 9P2000.u)
-	QTLINK    = 0x01 // hard link (Unix, 9P2000.u)
-	QTFILE    = 0x00
-)
-
-// Flags for the mode field in Topen and Tcreate messages
-const (
-	OREAD   = 0x0    // open read-only
-	OWRITE  = 0x1    // open write-only
-	ORDWR   = 0x2    // open read-write
-	OEXEC   = 0x3    // execute (== read but check execute permission)
-	OTRUNC  = 0x10   // or'ed in (except for exec), truncate file first
-	OCEXEC  = 0x20   // or'ed in, close on exec
-	ORCLOSE = 0x40   // or'ed in, remove on close
-	OAPPEND = 0x80   // or'ed in, append only
-	OEXCL   = 0x1000 // or'ed in, exclusive client use
-)
-
-// File modes
-const (
-	DMDIR    = 0x80000000 // mode bit for directories
-	DMAPPEND = 0x40000000 // mode bit for append only files
-	DMEXCL   = 0x20000000 // mode bit for exclusive use files
-	DMMOUNT  = 0x10000000 // mode bit for mounted channel
-	DMAUTH   = 0x08000000 // mode bit for authentication file
-	DMTMP    = 0x04000000 // mode bit for non-backed-up file
-	DMREAD   = 0x4        // mode bit for read permission
-	DMWRITE  = 0x2        // mode bit for write permission
-	DMEXEC   = 0x1        // mode bit for execute permission
-)
-
-const (
-	NOTAG Tag = 0xFFFF     // no tag specified
-	NOFID FID = 0xFFFFFFFF // no fid specified
-	// We reserve tag NOTAG and tag 0. 0 is a troublesome value to pass
-	// around, since it is also a default value and using it can hide errors
-	// in the code.
-	NumTags = 1<<16 - 2
-)
-
-// Error values
-const (
-	EPERM   = 1
-	ENOENT  = 2
-	EIO     = 5
-	EACCES  = 13
-	EEXIST  = 17
-	ENOTDIR = 20
-	EINVAL  = 22
-)
-
-// Types contained in 9p messages.
-type (
-	MType      uint8
-	Mode       uint8
-	NumEntries uint16
-	Tag        uint16
-	FID        uint32
-	MaxSize    uint32
-	Count      int32
-	Perm       uint32
-	Offset     uint64
-	Data       []byte
-	// Some []byte fields are encoded with a 16-bit length, e.g. stat data.
-	// We use this type to tag such fields. The parameters are still []byte,
-	// this was just the only way I could think of to make the stub generator do the right
-	// thing.
-	DataCnt16 byte // []byte with a 16-bit count.
-)
-
-// Error represents a 9P2000 error
-type Error struct {
-	Err string
-}
-
-// File identifier
-type QID struct {
-	Type    uint8  // type of the file (high 8 bits of the mode)
-	Version uint32 // version number for the path
-	Path    uint64 // server's unique identification of the file
-}
-
-// Dir describes a file
-type Dir struct {
-	Type    uint16
-	Dev     uint32
-	QID     QID    // file's QID
-	Mode    uint32 // permissions and flags
-	Atime   uint32 // last access time in seconds
-	Mtime   uint32 // last modified time in seconds
-	Length  uint64 // file length in bytes
-	Name    string // file name
-	User    string // owner name
-	Group   string // group name
-	ModUser string // name of the last user that modified the file
-}
-
-type Dispatcher func(s *Server, b *bytes.Buffer, t MType) error
-
-// N.B. In all packets, the wire order is assumed to be the order in which you
-// put struct members.
-// In an earlier version of this code we got really fancy and made it so you
-// could have identically named fields in the R and T packets. It's only an issue
-// in a trivial number of packets so we place the burden on you, the user, to make
-// the names different. Also, you can't name struct members with the same names as the
-// type. Sorry. But it keeps gen.go so much simpler.
-
-type TversionPkt struct {
-	TMsize   MaxSize
-	TVersion string
-}
-
-type RversionPkt struct {
-	RMsize   MaxSize
-	RVersion string
-}
-
-type TattachPkt struct {
-	SFID  FID
-	AFID  FID
-	Uname string
-	Aname string
-}
-
-type RattachPkt struct {
-	QID QID
-}
-
-type TflushPkt struct {
-	OTag Tag
-}
-
-type RflushPkt struct {
-}
-
-type TwalkPkt struct {
-	SFID   FID
-	NewFID FID
-	Paths  []string
-}
-
-type RwalkPkt struct {
-	QIDs []QID
-}
-
-type TopenPkt struct {
-	OFID  FID
-	Omode Mode
-}
-
-type RopenPkt struct {
-	OQID   QID
-	IOUnit MaxSize
-}
-
-type TcreatePkt struct {
-	OFID       FID
-	Name       string
-	CreatePerm Perm
-	Omode      Mode
-}
-
-type RcreatePkt struct {
-	OQID   QID
-	IOUnit MaxSize
-}
-
-type TclunkPkt struct {
-	OFID FID
-}
-
-type RclunkPkt struct {
-}
-
-type TremovePkt struct {
-	OFID FID
-}
-
-type RremovePkt struct {
-}
-
-type TstatPkt struct {
-	OFID FID
-}
-
-type RstatPkt struct {
-	B []DataCnt16
-}
-
-type TwstatPkt struct {
-	OFID FID
-	B    []DataCnt16
-}
-
-type RwstatPkt struct {
-}
-
-type TreadPkt struct {
-	OFID FID
-	Off  Offset
-	Len  Count
-}
-
-type RreadPkt struct {
-	Data []byte
-}
-
-type TwritePkt struct {
-	OFID FID
-	Off  Offset
-	Data []byte
-}
-
-type RwritePkt struct {
-	RLen Count
-}
-
-type RerrorPkt struct {
-	Error string
-}
-
-type DirPkt struct {
-	D Dir
-}
-
-type RPCCall struct {
-	b     []byte
-	Reply chan []byte
-}
-
-type RPCReply struct {
-	b []byte
-}
-
-/* rpc servers */
-type ClientOpt func(*Client) error
-type ListenerOpt func(*Listener) error
-type Tracer func(string, ...interface{})
-
-type NineServer interface {
-	Rversion(MaxSize, string) (MaxSize, string, error)
-	Rattach(FID, FID, string, string) (QID, error)
-	Rwalk(FID, FID, []string) ([]QID, error)
-	Ropen(FID, Mode) (QID, MaxSize, error)
-	Rcreate(FID, string, Perm, Mode) (QID, MaxSize, error)
-	Rstat(FID) ([]byte, error)
-	Rwstat(FID, []byte) error
-	Rclunk(FID) error
-	Rremove(FID) error
-	Rread(FID, Offset, Count) ([]byte, error)
-	Rwrite(FID, Offset, []byte) (Count, error)
-	Rflush(Otag Tag) error
-}
-
-var (
-	RPCNames = map[MType]string{
-		Tversion: "Tversion",
-		Rversion: "Rversion",
-		Tauth:    "Tauth",
-		Rauth:    "Rauth",
-		Tattach:  "Tattach",
-		Rattach:  "Rattach",
-		Terror:   "Terror",
-		Rerror:   "Rerror",
-		Tflush:   "Tflush",
-		Rflush:   "Rflush",
-		Twalk:    "Twalk",
-		Rwalk:    "Rwalk",
-		Topen:    "Topen",
-		Ropen:    "Ropen",
-		Tcreate:  "Tcreate",
-		Rcreate:  "Rcreate",
-		Tread:    "Tread",
-		Rread:    "Rread",
-		Twrite:   "Twrite",
-		Rwrite:   "Rwrite",
-		Tclunk:   "Tclunk",
-		Rclunk:   "Rclunk",
-		Tremove:  "Tremove",
-		Rremove:  "Rremove",
-		Tstat:    "Tstat",
-		Rstat:    "Rstat",
-		Twstat:   "Twstat",
-		Rwstat:   "Rwstat",
-	}
-)

+ 0 - 535
sys/src/go/pkg/ninep/protocol/protocol_test.go

@@ -1,535 +0,0 @@
-// Copyright 2009 The Ninep Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package protocol
-
-import (
-	"bytes"
-	"fmt"
-	"net"
-	"os"
-	"reflect"
-	"testing"
-)
-
-var (
-	removedFID2 bool
-)
-
-func print(f string, args ...interface{}) {
-	fmt.Fprintf(os.Stderr, f+"\n", args...)
-}
-
-func newEcho() *echo {
-	return &echo{
-		qids: make(map[FID]QID),
-	}
-}
-
-// Two files, dotu was true.
-var testunpackbytes = []byte{
-	79, 0, 0, 0, 0, 0, 0, 0, 0, 228, 193, 233, 248, 44, 145, 3, 0, 0, 0, 0, 0, 164, 1, 0, 0, 0, 0, 0, 0, 47, 117, 180, 83, 102, 3, 0, 0, 0, 0, 0, 0, 6, 0, 112, 97, 115, 115, 119, 100, 4, 0, 110, 111, 110, 101, 4, 0, 110, 111, 110, 101, 4, 0, 110, 111, 110, 101, 0, 0, 232, 3, 0, 0, 232, 3, 0, 0, 255, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 123, 171, 233, 248, 42, 145, 3, 0, 0, 0, 0, 0, 164, 1, 0, 0, 0, 0, 0, 0, 41, 117, 180, 83, 195, 0, 0, 0, 0, 0, 0, 0, 5, 0, 104, 111, 115, 116, 115, 4, 0, 110, 111, 110, 101, 4, 0, 110, 111, 110, 101, 4, 0, 110, 111, 110, 101, 0, 0, 232, 3, 0, 0, 232, 3, 0, 0, 255, 255, 255, 255,
-}
-
-/*
-func testUnpackDir(t *testing.T) {
-	b := testunpackbytes
-	for len(b) > 0 {
-		var err error
-		if _, b, _, err = UnpackDir(b, true); err != nil {
-			t.Fatalf("Unpackdir: %v", err)
-		}
-	}
-}
-*/
-func TestEncode(t *testing.T) {
-	// The traces used in this array came from running 9p servers and clients.
-	// Except for flush, which we made up.
-	// TODO: put the replies in, then the decode testing when we get decode done.
-	var tests = []struct {
-		n string
-		b []byte
-		f func(b *bytes.Buffer)
-	}{
-		{
-			"TVersion test with 8192 byte msize and 9P2000",
-			[]byte{19, 0, 0, 0, 100, 0x55, 0xaa, 0, 32, 0, 0, 6, 0, 57, 80, 50, 48, 48, 48},
-			func(b *bytes.Buffer) { MarshalTversionPkt(b, Tag(0xaa55), 8192, "9P2000") },
-		},
-		{
-			"RVersion test with 8192 byte msize and 9P2000",
-			[]byte{19, 0, 0, 0, 101, 0xaa, 0x55, 0, 32, 0, 0, 6, 0, 57, 80, 50, 48, 48, 48},
-			func(b *bytes.Buffer) { MarshalRversionPkt(b, Tag(0x55aa), 8192, "9P2000") },
-		},
-		/*
-			{
-				"Twalk tag 0 fid 0 newfid 1 to null",
-				[]byte{23, 0, 0, 0, 110, 0xaa, 0x55, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4, 0, 110, 117, 108, 108},
-				func(b *bytes.Buffer) { MarshalTwalkPkt(b, Tag(0x55aa), 0, 1, []string{"null",}) },
-			},
-			{
-				"Flush test with tag 1 and oldtag 2",
-				[]byte{9, 0, 0, 0, 108, 1, 0, 2, 0},
-				[]interface{}{Tflush, Tag(1), Tag(2)},
-			},
-			{
-				"Auth test with tag 0, fid 0,uname rminnich",
-				[]byte{21, 0, 0, 0, 102, 0, 0, 0, 0, 0, 0, 8, 0, 114, 109, 105, 110, 110, 105, 99, 104},
-				[]interface{}{Tauth, Tag(0), FID(0), "rminnich"},
-			},
-			{
-				"Attach test with tag 0, fid 0, afid -1, uname rminnich",
-				[]byte{28, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 8, 0, 114, 109, 105, 110, 110, 105, 99, 104, 1, 0, 47},
-				[]interface{}{Tattach, Tag(0), FID(0), NOFID, "rminnich", "/"},
-			},
-			{
-				"Tauth with an rerror of no user required",
-				//Tauth tag 1 afid 45 uname 'rminnich' nuname 4294967295 aname ''
-				[]byte{23,0,0,0,102,1,0,45,0,0,0,8,0,114,109,105,110,110,105,99,104,0,0},
-				[]interface{}{Tauth, Tag(1), FID(45), "rminnich", ""},
-				// [39 0 0 0 107 1 0 30 0 110 111 32 97 117 116 104 101 110 116 105 99 97 116 105 111 110 32 114 101 113 117 105 114 101 100 58 32 50 50]
-				//Rerror tag 1 ename 'no authentication required: 22' ecode 0
-			},
-			{
-				"Tattach from Harvey to ninep: Tattach tag 1 fid 48 afid 4294967295 uname 'rminnich' nuname 4294967295 aname ''",
-				[]byte{27,0,0,0,104,1,0,48,0,0,0,255,255,255,255,8,0,114,109,105,110,110,105,99,104,0,0},
-				[]interface{}{Tattach, Tag(1), FID(48), NOFID, "rminnich", ""},
-				// 20 0 0 0 105 1 0 128 99 207 44 145 115 221 96 0 0 0 0 0]
-				// Rattach tag 1 aqid (60dd73 912ccf63 'd')
-			},
-			{
-				"Topen tag 0 fid 1 mode 2",
-				[]byte{12, 0, 0, 0, 112, 0, 0, 1, 0, 0, 0, 2},
-				[]interface{}{Topen, Tag(0), FID(1), Mode(2)},
-			},
-			{
-				"Tread tag 0 fid 1 offset 0 count 8192",
-				[]byte{23, 0, 0, 0, 116, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0},
-				[]interface{}{Tread, Tag(0), FID(1), Offset(0), Count(8192)},
-			},
-			{
-				"Tstat tag 1 fid 49",
-				[]byte{11, 0, 0, 0, 124, 1, 0, 49, 0, 0, 0},
-				// Rstat
-				//
-				//[84,0,0,0,125,1,0,75,0,73,0,0,0,0,0,0,0,128,99,207,44,145,115,221,96,0,0,0,0,0,253,1,0,128,109,185,47,86,196,66,41,86,0,16,0,0,0,0,0,0,6,0,104,97,114,118,101,121,8,0,114,109,105,110,110,105,99,104,8,0,114,109,105,110,110,105,99,104,4,0,110,111,110,101]
-
-				//Rstat tag 1 st ('harvey' 'rminnich' 'rminnich' 'none' q (60dd73 912ccf63 'd') m d775 at 1445968237 mt 1445544644 l 4096 t 0 d 0 ext )
-				[]interface{}{Tstat, Tag(1), FID(49)},
-			},
-			{
-				"Twrite tag 3 fid 139 offset 0 count 3",
-				[]byte{26, 0, 0, 0, 118, 3, 0, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 104, 105, 10},
-				// rwrite []byte{11,0,0,0,119,3,0,3,0,0,0}
-				[]interface{}{Twrite, Tag(3), FID(139), Offset(0), Count(3), []byte("hi\n")},
-			},
-			{
-				"Tclunk tag 1 fid 49",
-				[]byte{11, 0, 0, 0, 120, 1, 0, 49, 0, 0, 0},
-				// rclunk 7 0 0 0 121 1 0]
-				[]interface{}{Tclunk, Tag(1), FID(49)},
-			},
-			{
-				"Tremove tag 1 fid 49",
-				[]byte{11, 0, 0, 0, 122, 1, 0, 49, 0, 0, 0},
-				// rclunk 7 0 0 0 121 1 0]
-				[]interface{}{Tremove, Tag(1), FID(49)},
-			},
-			{
-				"Twstat tag 3 fid 49 ",
-				//Twstat tag 3 fid 49 st ('' '' '' '' q (ffffffffffffffff ffffffff 'daAltL') m daAltDSPL777 at 4294967295 mt 1445968327 l 18446744073709551615 t 65535 d 4294967295 ext )
-				[]byte{62, 0, 0, 0, 126, 3, 0, 49, 0, 0, 0, 49, 0, 47, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 199, 185, 47, 86, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0},
-				// Rwstat [11 0 0 0 120 3 0 49 0 0 0]
-				[]interface{}{Twstat, Tag(3), FID(49), &Dir{ /* TODO: remove this size
-					Size:   47,
-					Type:   math.MaxUint16,
-					Dev:    math.MaxUint32,
-					Qid:    Qid{Type: math.MaxUint8, Version: math.MaxUint32, Path: math.MaxUint64},
-					Mode:   math.MaxUint32,
-					Atime:  4294967295,
-					Mtime:  1445968327,
-					Length: 18446744073709551615,
-					Name:   "",
-					Uid:    "",
-					Gid:    "",
-					Muid:   "",
-				},
-				},
-			},
-			{
-				"Tcreate tag 3 fid 74 name 'y' perm 666 mode 0",
-				[]byte{19,0,0,0,114,3,0,74,0,0,0,1,0,121,182,1,0,0,0},
-				[]interface{}{Tcreate, Tag(3), FID(74), "y", Perm(0666), Mode(0)},
-				/// rcreate [24 0 0 0 115 3 0 0 226 200 71 172 45 166 98 0 0 0 0 0 0 0 0 0]
-				// Rcreate tag 3 qid (62a62d ac47c8e2 '') iounit 0
-			},*/
-	}
-
-	for _, v := range tests {
-		var b bytes.Buffer
-		v.f(&b)
-		if !reflect.DeepEqual(v.b, b.Bytes()) {
-			t.Errorf("Mismatch on %v: Got\n%v[%v], want\n%v[%v]", v.n, b.Bytes(), len(b.Bytes()), v.b, len(v.b))
-		}
-	}
-
-}
-
-/*
-func testDecode(t *testing.T) {
-	var tests = []struct {
-		n string
-		b []byte
-		f func(b *bytes.Buffer) error
-	}{
-		{
-			"TVersion test with 8192 byte msize and 9P2000",
-			[]byte{19, 0, 0, 0, 100, 255, 255, 0, 32, 0, 0, 6, 0, 57, 80, 50, 48, 48, 48},
-			func (b *bytes.Buffer){ MarshalTversionPkt(b, NOTAG, 8192, "9P2000")},
-		},
-
-	for _, v := range tests {
-		var b bytes.Buffer
-		v.f(&b)
-		if !reflect.DeepEqual(v.b, b.Bytes()) {
-			t.Errorf("Mismatch on %v: Got %v[%v], want %v[%v]", v.n, b.Bytes(), len(b.Bytes()), v.b, len(v.b))
-		}
-	}
-
-}
-*/
-
-func TestTags(t *testing.T) {
-	c, err := NewClient()
-	if err != nil {
-		t.Fatalf("%v", err)
-	}
-	_ = c.GetTag()
-	if len(c.Tags) != NumTags-1 {
-		t.Errorf("Got one tag, len(tags) is %d, want %d", len(c.Tags), NumTags-1)
-	}
-}
-
-type echo struct {
-	qids map[FID]QID
-}
-
-func (e *echo) Rversion(msize MaxSize, version string) (MaxSize, string, error) {
-	if version != "9P2000" {
-		return 0, "", fmt.Errorf("%v not supported; only 9P2000", version)
-	}
-	return msize, version, nil
-}
-
-func (e *echo) Rattach(FID, FID, string, string) (QID, error) {
-	return QID{}, nil
-}
-
-func (e *echo) Rflush(o Tag) error {
-	switch o {
-	case 3:
-		// Make it fancier, later.
-		return nil
-	}
-	return fmt.Errorf("Rflush: bad Tag %v", o)
-}
-
-func (e *echo) Rwalk(fid FID, newfid FID, paths []string) ([]QID, error) {
-	//fmt.Printf("walk(%d, %d, %d, %v\n", fid, newfid, len(paths), paths)
-	if len(paths) > 1 {
-		return nil, nil
-	}
-	switch paths[0] {
-	case "null":
-		return []QID{{Type: 0, Version: 0, Path: 0xaa55}}, nil
-	}
-	return nil, nil
-}
-
-func (e *echo) Ropen(fid FID, mode Mode) (QID, MaxSize, error) {
-	//fmt.Printf("open(%v, %v\n", fid, mode)
-	return QID{}, 4000, nil
-}
-func (e *echo) Rcreate(fid FID, name string, perm Perm, mode Mode) (QID, MaxSize, error) {
-	//fmt.Printf("open(%v, %v\n", fid, mode)
-	return QID{}, 5000, nil
-}
-func (e *echo) Rclunk(f FID) error {
-	switch int(f) {
-	case 2:
-		// Make it fancier, later.
-		if removedFID2 {
-			return fmt.Errorf("Clunk: bad FID %v", f)
-		}
-		return nil
-	}
-	//fmt.Printf("clunk(%v)\n", f)
-	return fmt.Errorf("Clunk: bad FID %v", f)
-}
-func (e *echo) Rstat(f FID) ([]byte, error) {
-	switch int(f) {
-	case 2:
-		// Make it fancier, later.
-		return []byte{}, nil
-	}
-	//fmt.Printf("stat(%v)\n", f)
-	return []byte{}, fmt.Errorf("Stat: bad FID %v", f)
-}
-func (e *echo) Rwstat(f FID, s []byte) error {
-	switch int(f) {
-	case 2:
-		// Make it fancier, later.
-		return nil
-	}
-	//fmt.Printf("stat(%v)\n", f)y
-	return fmt.Errorf("Wstat: bad FID %v", f)
-}
-func (e *echo) Rremove(f FID) error {
-	switch int(f) {
-	case 2:
-		// Make it fancier, later.
-		removedFID2 = true
-		return nil
-	}
-	//fmt.Printf("remove(%v)\n", f)
-	return fmt.Errorf("Remove: bad FID %v", f)
-}
-func (e *echo) Rread(f FID, o Offset, c Count) ([]byte, error) {
-	switch int(f) {
-	case 2:
-		// Make it fancier, later.
-		return []byte("HI"), nil
-	}
-	return nil, fmt.Errorf("Read: bad FID %v", f)
-}
-
-func (e *echo) Rwrite(f FID, o Offset, b []byte) (Count, error) {
-	switch int(f) {
-	case 2:
-		// Make it fancier, later.
-		return Count(len(b)), nil
-	}
-	return -1, fmt.Errorf("Write: bad FID %v", f)
-}
-func TestTManyRPCs(t *testing.T) {
-	p, p2 := net.Pipe()
-
-	c, err := NewClient(func(c *Client) error {
-		c.FromNet, c.ToNet = p, p
-		return nil
-	},
-		func(c *Client) error {
-			c.Msize = 8192
-			c.Trace = print // t.Logf
-			return nil
-		})
-	if err != nil {
-		t.Fatalf("%v", err)
-	}
-	t.Logf("Client is %v", c.String())
-
-	s, err := NewListener(
-		func() NineServer { return newEcho() },
-		func(l *Listener) error {
-			l.Trace = print
-			return nil
-		})
-	if err != nil {
-		t.Fatalf("NewServer: want nil, got %v", err)
-	}
-
-	if err := s.Accept(p2); err != nil {
-		t.Fatalf("Accept: want nil, got %v", err)
-	}
-
-	for i := 0; i < 256*1024; i++ {
-		_, _, err := c.CallTversion(8000, "9P2000")
-		if err != nil {
-			t.Fatalf("CallTversion: want nil, got %v", err)
-		}
-	}
-}
-
-func TestTMessages(t *testing.T) {
-	p, p2 := net.Pipe()
-
-	c, err := NewClient(func(c *Client) error {
-		c.FromNet, c.ToNet = p, p
-		return nil
-	},
-		func(c *Client) error {
-			c.Msize = 8192
-			c.Trace = print // t.Logf
-			return nil
-		})
-	if err != nil {
-		t.Fatalf("%v", err)
-	}
-	t.Logf("Client is %v", c.String())
-
-	s, err := NewListener(
-		func() NineServer { return newEcho() },
-		func(l *Listener) error {
-			l.Trace = print // t.Logf
-			return nil
-		})
-
-	if err != nil {
-		t.Fatalf("NewServer: want nil, got %v", err)
-	}
-
-	if err := s.Accept(p2); err != nil {
-		t.Fatalf("Accept: want nil, got %v", err)
-	}
-
-	// If things really go to hell, change this to true.
-	if false {
-		m, v, err := c.CallTversion(8000, "9P2000")
-		if err != nil {
-			t.Fatalf("CallTversion: want nil, got %v", err)
-		}
-		t.Logf("CallTversion: msize %v version %v", m, v)
-		t.Fatalf("Quit early")
-	}
-
-	// make sure server rejects requests until the first Tversion
-	t.Logf("Server is %v", s.String())
-	if _, err = c.CallTattach(0, 0, "", ""); err == nil {
-		t.Fatalf("CallTattach: want err, got nil")
-	}
-	t.Logf("CallTattach: wanted an error and got %v", err)
-
-	m, v, err := c.CallTversion(8000, "9p3000")
-	if err == nil {
-		t.Fatalf("CallTversion: want err, got nil")
-	}
-	t.Logf("CallTversion: wanted an error and got %v", err)
-
-	m, v, err = c.CallTversion(8000, "9P2000")
-	if err != nil {
-		t.Fatalf("CallTversion: want nil, got %v", err)
-	}
-	t.Logf("CallTversion: msize %v version %v", m, v)
-
-	t.Logf("Server is %v", s.String())
-	a, err := c.CallTattach(0, 0, "", "")
-	if err != nil {
-		t.Fatalf("CallTattach: want nil, got %v", err)
-	}
-	t.Logf("Attach is %v", a)
-	w, err := c.CallTwalk(0, 1, []string{"hi", "there"})
-	// There should never be an error. The indication of a failed walk is that
-	// the number of QIDS does not match.
-	if err != nil {
-		t.Fatalf("CallTwalk(0,1,[\"hi\", \"there\"]): want nil, got %v", err)
-	}
-	if len(w) != 0 {
-		t.Fatalf("CallTwalk(0,1,[\"hi\", \"there\"]): want 0 QIDS, got  back %d", len(w))
-	}
-	t.Logf("Walk is %v", w)
-
-	w, err = c.CallTwalk(0, 1, []string{"null"})
-	if err != nil {
-		t.Errorf("CallTwalk(0,1,\"null\"): want nil, got err %v", err)
-	}
-	if len(w) != 1 {
-		t.Errorf("CallTwalk(0,1,\"null\"): want 1 QIDs, got back %d", len(w))
-	}
-	t.Logf("Walk is %v", w)
-
-	q, iounit, err := c.CallTopen(1, 1)
-	if err != nil {
-		t.Fatalf("CallTopen: want nil, got %v", err)
-	}
-	t.Logf("Open is %v %v", q, iounit)
-
-	d, err := c.CallTread(FID(2), 0, 5)
-	if err != nil {
-		t.Fatalf("CallTread: want nil, got %v", err)
-	}
-	t.Logf("Read is %v", d)
-
-	_, err = c.CallTwrite(FID(2), 0, d)
-	if err != nil {
-		t.Fatalf("CallTread: want nil, got %v", err)
-	}
-	t.Logf("Read is %v", s)
-
-	if err := c.CallTclunk(FID(2)); err != nil {
-		t.Fatalf("CallTclunk: want nil, got %v", err)
-	}
-	if err := c.CallTremove(FID(1)); err == nil {
-		t.Fatalf("CallTremove: want err, got nil")
-	}
-	if err := c.CallTremove(FID(2)); err != nil {
-		t.Fatalf("CallTremove: want nil, got %v", err)
-	}
-	if err := c.CallTclunk(FID(2)); err == nil {
-		t.Fatalf("Callclunk on removed file: want err, got nil")
-	}
-	if err := c.CallTremove(FID(1)); err == nil {
-		t.Fatalf("CallTremove: want err, got nil")
-	}
-	st, err := c.CallTstat(FID(2))
-	if err != nil {
-		t.Fatalf("CallTstat: want nil, got %v", err)
-	}
-	t.Logf("Stat: Got %v", st)
-
-	if _, err := c.CallTstat(FID(1)); err == nil {
-		t.Fatalf("CallTstat: want err, got nil")
-	}
-	if err := c.CallTwstat(FID(2), []byte{}); err != nil {
-		t.Fatalf("CallTwstat: want nil, got %v", err)
-	}
-
-	if err := c.CallTwstat(FID(1), []byte{}); err == nil {
-		t.Fatalf("CallTwstat: want err, got nil")
-	}
-	if err := c.CallTflush(3); err != nil {
-		t.Fatalf("CallTflush: want nil, got %v", err)
-	}
-
-	if err := c.CallTflush(2); err == nil {
-		t.Fatalf("CallTflush: want err, got nil")
-	}
-}
-
-func BenchmarkNull(b *testing.B) {
-	p, p2 := net.Pipe()
-
-	c, err := NewClient(func(c *Client) error {
-		c.FromNet, c.ToNet = p, p
-		return nil
-	},
-		func(c *Client) error {
-			c.Msize = 8192
-			return nil
-		})
-	if err != nil {
-		b.Fatalf("%v", err)
-	}
-	b.Logf("Client is %v", c.String())
-
-	s, err := NewListener(
-		func() NineServer {
-			return newEcho()
-		})
-
-	if err != nil {
-		b.Fatalf("NewServer: want nil, got %v", err)
-	}
-
-	if err := s.Accept(p2); err != nil {
-		b.Fatalf("Accept: want nil, got %v", err)
-	}
-
-	b.Logf("%d iterations", b.N)
-	for i := 0; i < b.N; i++ {
-		if _, err := c.CallTread(FID(2), 0, 5); err != nil {
-			b.Fatalf("CallTread: want nil, got %v", err)
-		}
-	}
-
-}

+ 0 - 295
sys/src/go/pkg/ninep/protocol/server.go

@@ -1,295 +0,0 @@
-// Copyright 2012 The Ninep Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-// This code is imported from the old ninep repo,
-// with some changes.
-
-package protocol
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"net"
-	"sync"
-	"time"
-)
-
-const DefaultAddr = ":5640"
-
-type NsCreator func() NineServer
-
-type Listener struct {
-	nsCreator NsCreator
-
-	// TCP address to listen on, default is DefaultAddr
-	Addr string
-
-	// Trace function for logging
-	Trace Tracer
-
-	// mu guards below
-	mu sync.Mutex
-
-	listeners map[net.Listener]struct{}
-}
-
-// Server is a 9p server.
-// For now it's extremely serial. But we will use a chan for replies to ensure that
-// we can go to a more concurrent one later.
-type Server struct {
-	NS NineServer
-	D  Dispatcher
-
-	// Versioned is set to true on the first call to Tversion
-	Versioned bool
-}
-
-type conn struct {
-	listener *Listener
-
-	// server on which the connection arrived.
-	server *Server
-
-	// rwc is the underlying network connection.
-	rwc net.Conn
-
-	// remoteAddr is rwc.RemoteAddr().String(). See note in net/http/server.go.
-	remoteAddr string
-
-	// replies
-	replies chan RPCReply
-
-	// dead is set to true when we finish reading packets.
-	dead bool
-}
-
-func NewListener(nsCreator NsCreator, opts ...ListenerOpt) (*Listener, error) {
-	l := &Listener{
-		nsCreator: nsCreator,
-	}
-
-	for _, o := range opts {
-		if err := o(l); err != nil {
-			return nil, err
-		}
-	}
-
-	return l, nil
-}
-
-func (l *Listener) newConn(rwc net.Conn) (*conn, error) {
-	ns := l.nsCreator()
-	server := &Server{NS: ns, D: Dispatch}
-
-	c := &conn{
-		server:   server,
-		listener: l,
-		rwc:      rwc,
-		replies:  make(chan RPCReply, NumTags),
-	}
-
-	return c, nil
-}
-
-// trackListener from http.Server
-func (l *Listener) trackListener(ln net.Listener, add bool) {
-	l.mu.Lock()
-	defer l.mu.Unlock()
-
-	if l.listeners == nil {
-		l.listeners = make(map[net.Listener]struct{})
-	}
-
-	if add {
-		l.listeners[ln] = struct{}{}
-	} else {
-		delete(l.listeners, ln)
-	}
-}
-
-// closeListenersLocked from http.Server
-func (l *Listener) closeListenersLocked() error {
-	var err error
-	for ln := range l.listeners {
-		if cerr := ln.Close(); cerr != nil && err == nil {
-			err = cerr
-		}
-		delete(l.listeners, ln)
-	}
-	return err
-}
-
-// Serve accepts incoming connections on the Listener and calls e.Accept on
-// each connection.
-func (l *Listener) Serve(ln net.Listener) error {
-	defer ln.Close()
-
-	var tempDelay time.Duration // how long to sleep on accept failure
-
-	l.trackListener(ln, true)
-	defer l.trackListener(ln, false)
-
-	// from http.Server.Serve
-	for {
-		conn, err := ln.Accept()
-		if err != nil {
-			if ne, ok := err.(net.Error); ok && ne.Temporary() {
-				if tempDelay == 0 {
-					tempDelay = 5 * time.Millisecond
-				} else {
-					tempDelay *= 2
-				}
-				if max := 1 * time.Second; tempDelay > max {
-					tempDelay = max
-				}
-				l.logf("ufs: Accept error: %v; retrying in %v", err, tempDelay)
-				time.Sleep(tempDelay)
-				continue
-			}
-			return err
-		}
-		tempDelay = 0
-
-		if err := l.Accept(conn); err != nil {
-			return err
-		}
-	}
-}
-
-// Accept a new connection, typically called via Serve but may be called
-// directly if there's a connection from an exotic listener.
-func (l *Listener) Accept(conn net.Conn) error {
-	c, err := l.newConn(conn)
-	if err != nil {
-		return err
-	}
-
-	go c.serve()
-	return nil
-}
-
-// Shutdown closes all active listeners. It does not close all active
-// connections but probably should.
-func (l *Listener) Shutdown() error {
-	l.mu.Lock()
-	defer l.mu.Unlock()
-
-	return l.closeListenersLocked()
-}
-
-func (l *Listener) String() string {
-	// TODO
-	return ""
-}
-
-func (l *Listener) logf(format string, args ...interface{}) {
-	if l.Trace != nil {
-		l.Trace(format, args...)
-	}
-}
-
-func (c *conn) String() string {
-	return fmt.Sprintf("Dead %v %d replies pending", c.dead, len(c.replies))
-}
-
-func (c *conn) logf(format string, args ...interface{}) {
-	// prepend some info about the conn
-	c.listener.logf("[%v] "+format, append([]interface{}{c.remoteAddr}, args...)...)
-}
-
-func (c *conn) serve() {
-	if c.rwc == nil {
-		c.dead = true
-		return
-	}
-
-	c.remoteAddr = c.rwc.RemoteAddr().String()
-
-	defer c.rwc.Close()
-
-	c.logf("Starting readNetPackets")
-
-	for !c.dead {
-		l := make([]byte, 7)
-		if n, err := c.rwc.Read(l); err != nil || n < 7 {
-			c.logf("readNetPackets: short read: %v", err)
-			c.dead = true
-			return
-		}
-		sz := int64(l[0]) + int64(l[1])<<8 + int64(l[2])<<16 + int64(l[3])<<24
-		t := MType(l[4])
-		b := bytes.NewBuffer(l[5:])
-		r := io.LimitReader(c.rwc, sz-7)
-		if _, err := io.Copy(b, r); err != nil {
-			c.logf("readNetPackets: short read: %v", err)
-			c.dead = true
-			return
-		}
-		c.logf("readNetPackets: got %v, len %d, sending to IO", RPCNames[MType(l[4])], b.Len())
-		//panic(fmt.Sprintf("packet is %v", b.Bytes()[:]))
-		//panic(fmt.Sprintf("s is %v", s))
-		if err := c.server.D(c.server, b, t); err != nil {
-			c.logf("%v: %v", RPCNames[MType(l[4])], err)
-		}
-		c.logf("readNetPackets: Write %v back", b)
-		amt, err := c.rwc.Write(b.Bytes())
-		if err != nil {
-			c.logf("readNetPackets: write error: %v", err)
-			c.dead = true
-			return
-		}
-		c.logf("Returned %v amt %v", b, amt)
-	}
-}
-
-// Dispatch dispatches request to different functions.
-// It's also the the first place we try to establish server semantics.
-// We could do this with interface assertions and such a la rsc/fuse
-// but most people I talked do disliked that. So we don't. If you want
-// to make things optional, just define the ones you want to implement in this case.
-func Dispatch(s *Server, b *bytes.Buffer, t MType) error {
-	switch t {
-	case Tversion:
-		s.Versioned = true
-	default:
-		if !s.Versioned {
-			m := fmt.Sprintf("Dispatch: %v not allowed before Tversion", RPCNames[t])
-			// Yuck. Provide helper.
-			d := b.Bytes()
-			MarshalRerrorPkt(b, Tag(d[0])|Tag(d[1])<<8, m)
-			return fmt.Errorf("Dispatch: %v not allowed before Tversion", RPCNames[t])
-		}
-	}
-
-	switch t {
-	case Tversion:
-		return s.SrvRversion(b)
-	case Tattach:
-		return s.SrvRattach(b)
-	case Tflush:
-		return s.SrvRflush(b)
-	case Twalk:
-		return s.SrvRwalk(b)
-	case Topen:
-		return s.SrvRopen(b)
-	case Tcreate:
-		return s.SrvRcreate(b)
-	case Tclunk:
-		return s.SrvRclunk(b)
-	case Tstat:
-		return s.SrvRstat(b)
-	case Twstat:
-		return s.SrvRwstat(b)
-	case Tremove:
-		return s.SrvRremove(b)
-	case Tread:
-		return s.SrvRread(b)
-	case Twrite:
-		return s.SrvRwrite(b)
-	}
-
-	// This has been tested by removing Attach from the switch.
-	ServerError(b, fmt.Sprintf("Dispatch: %v not supported", RPCNames[t]))
-	return nil
-}

+ 0 - 40
sys/src/go/pkg/ninep/protocol/types.go

@@ -1,40 +0,0 @@
-// Copyright 2009 The Ninep Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package protocol
-
-
-// A File is defined by a QID. File Servers never see a FID.
-// There are two channels. The first is for normal requests.
-// The second is for Flushes. File server code always
-// checks the flush channel first. At the same time, server code
-// puts the flush into both channels, so the server code has some
-// idea when the flush entered the queue. This is very similar
-// to how MSI-X works on PCIe ...
-type File struct {
-}
-
-/*
-// A FileOp is a function to call, an abort channel, and a reply channel
-type FileOp struct {
-	f func() error
-	abort chan abort
-	reply chan
-}
-*/
-
-// A service is a closure which returns an error or nil.
-// It writes its result down the provided channel.
-// It looks for flushes on the flushchan before doing its
-// function, and will respond to all flushes while any are pending.
-type Service func(func() error, chan FID)
-
-// Server maintains file system server state. This is inclusive of RPC
-// server state plus more. In our case when we walk to a fid we kick
-// off a goroutine to manage it. As a result we need a map of Tag to FID
-// so we know what to do about Tflush.
-type FileServer struct {
-	Server
-	Versioned bool
-}