make Copyn take and return int64.
add Copy.

R=gri
DELTA=52  (37 added, 1 deleted, 14 changed)
OCL=19557
CL=19559
diff --git a/src/lib/io.go b/src/lib/io.go
index 699f919..b74911d 100644
--- a/src/lib/io.go
+++ b/src/lib/io.go
@@ -40,7 +40,7 @@
 	return r, e
 }
 
-// Read until buffer is full,  EOF, or error
+// Read until buffer is full, EOF, or error
 export func Readn(fd Read, buf *[]byte) (n int, err *os.Error) {
 	n = 0;
 	for n < len(buf) {
@@ -79,26 +79,61 @@
 
 // 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)
+export func Copyn(src Read, dst Write, n int64) (written int64, err *os.Error) {
+	buf := new([]byte, 32*1024);
+	for written < n {
+		var l int;
+		if n - written > int64(len(buf)) {
+			l = len(buf);
+		} else {
+			l = int(n - written);
 		}
 		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
-				}
+			if nw > 0 {
+				written += int64(nw);
+			}
+			if ew != nil {
 				err = ew;
 				break;
 			}
-			c += nr;
+			if nr != nw {
+				err = os.EIO;
+				break;
+			}
+		}
+		if er != nil {
+			err = er;
+			break;
+		}
+		if nr == 0 {
+			err = ErrEOF;
+			break;
+		}
+	}
+	return written, err
+}
+
+// Copies from src to dst until EOF is reached.
+// Returns the number of bytes copied and the error, if any.
+export func Copy(src Read, dst Write) (written int64, err *os.Error) {
+	buf := new([]byte, 32*1024);
+	for {
+		nr, er := src.Read(buf);
+		if nr > 0 {
+			nw, ew := dst.Write(buf[0:nr]);
+			if nw > 0 {
+				written += int64(nw);
+			}
+			if ew != nil {
+				err = ew;
+				break;
+			}
+			if nr != nw {
+				err = os.EIO;
+				break;
+			}
 		}
 		if er != nil {
 			err = er;
@@ -108,5 +143,6 @@
 			break;
 		}
 	}
-	return c, err
+	return written, err
 }
+