]> Cypherpunks repositories - gostls13.git/commitdiff
Copyn
authorRobert Griesemer <gri@golang.org>
Wed, 19 Nov 2008 02:08:05 +0000 (18:08 -0800)
committerRobert Griesemer <gri@golang.org>
Wed, 19 Nov 2008 02:08:05 +0000 (18:08 -0800)
R=rsc
DELTA=34  (34 added, 0 deleted, 0 changed)
OCL=19541
CL=19545

src/lib/io.go

index 80f753a4bf81a1cc2c043f294bde62353ebb74f8..699f9196c38c677913b3681db3e535af2b8df890 100644 (file)
@@ -76,3 +76,37 @@ export func MakeFullReader(fd Read) Read {
        }
        return &FullRead{fd}
 }
+
+// Copies n bytes (or until EOF is reached) from src to dst.
+// Returns the number of bytes copied and the error, if any.
+export func Copyn(src Read, dst Write, n int) (c int, err *os.Error) {
+       buf := new([]byte, 32*1024);  // BUG 6g crashes on non-pointer array slices
+       c = 0;
+       for c < n {
+               l := n - c;
+               if l > len(buf) {
+                       l = len(buf)
+               }
+               nr, er := src.Read(buf[0 : l]);
+               if nr > 0 {
+                       nw, ew := dst.Write(buf[0 : nr]);
+                       if nw != nr || ew != nil {
+                               c += nw;
+                               if ew == nil {
+                                       ew = os.EIO
+                               }
+                               err = ew;
+                               break;
+                       }
+                       c += nr;
+               }
+               if er != nil {
+                       err = er;
+                       break;
+               }
+               if nr == 0 {
+                       break;
+               }
+       }
+       return c, err
+}