diff --git a/src/pkg/Make.deps b/src/pkg/Make.deps
index 9df9db4..6a5a0c4 100644
--- a/src/pkg/Make.deps
+++ b/src/pkg/Make.deps
@@ -1,14 +1,14 @@
 archive/tar.install: bufio.install bytes.install io.install os.install strconv.install
 base64.install: bytes.install io.install os.install strconv.install
 bignum.install: fmt.install
-bufio.install: io.install os.install utf8.install
+bufio.install: io.install os.install strconv.install utf8.install
 bytes.install: utf8.install
 compress/flate.install: bufio.install io.install os.install strconv.install
 compress/gzip.install: bufio.install compress/flate.install hash.install hash/crc32.install io.install os.install
 container/list.install:
 container/vector.install:
-crypto/aes.install: os.install
-crypto/block.install: fmt.install io.install os.install
+crypto/aes.install: os.install strconv.install
+crypto/block.install: fmt.install io.install os.install strconv.install
 crypto/hmac.install: crypto/md5.install crypto/sha1.install hash.install os.install
 crypto/md5.install: hash.install os.install
 crypto/sha1.install: hash.install os.install
@@ -26,7 +26,7 @@
 hash.install: io.install
 hash/adler32.install: hash.install os.install
 hash/crc32.install: hash.install os.install
-http.install: bufio.install container/vector.install fmt.install io.install log.install net.install os.install path.install strconv.install strings.install utf8.install
+http.install: bufio.install bytes.install container/vector.install fmt.install io.install log.install net.install os.install path.install strconv.install strings.install utf8.install
 io.install: bytes.install os.install sync.install
 json.install: container/vector.install fmt.install io.install math.install reflect.install strconv.install strings.install utf8.install
 log.install: fmt.install io.install os.install runtime.install time.install
diff --git a/src/pkg/bufio/bufio.go b/src/pkg/bufio/bufio.go
index 520fd3a..4cbebdd 100644
--- a/src/pkg/bufio/bufio.go
+++ b/src/pkg/bufio/bufio.go
@@ -10,6 +10,7 @@
 import (
 	"io";
 	"os";
+	"strconv";
 	"utf8";
 )
 
@@ -30,12 +31,17 @@
 }
 
 var (
-	PhaseError os.Error = &Error{"bufio: phase error"};
-	BufferFull os.Error = &Error{"bufio: buffer full"};
-	InternalError os.Error = &Error{"bufio: internal error"};
-	BadBufSize os.Error = &Error{"bufio: bad buffer size"};
+	ErrInvalidUnreadByte os.Error = &Error{"bufio: invalid use of UnreadByte"};
+	ErrBufferFull os.Error = &Error{"bufio: buffer full"};
+	errInternal os.Error = &Error{"bufio: internal error"};
 )
 
+// BufSizeError is the error representing an invalid buffer size.
+type BufSizeError int
+func (b BufSizeError) String() string {
+	return "bufio: bad buffer size " + strconv.Itoa(int(b));
+}
+
 func copySlice(dst []byte, src []byte) {
 	for i := 0; i < len(dst); i++ {
 		dst[i] = src[i]
@@ -60,7 +66,7 @@
 // It returns the Reader and any error.
 func NewReaderSize(rd io.Reader, size int) (*Reader, os.Error) {
 	if size <= 0 {
-		return nil, BadBufSize
+		return nil, BufSizeError(size)
 	}
 	// Is it already a Reader?
 	b, ok := rd.(*Reader);
@@ -165,7 +171,7 @@
 	return c, nil
 }
 
-// UnreadByte unreads the last byte.  Only one byte may be unread at a given time.
+// UnreadByte unreads the last byte.  Only the most recently read byte can be unread.
 func (b *Reader) UnreadByte() os.Error {
 	if b.err != nil {
 		return b.err
@@ -178,7 +184,7 @@
 		return nil;
 	}
 	if b.r <= 0 {
-		return PhaseError
+		return ErrInvalidUnreadByte
 	}
 	b.r--;
 	b.lastbyte = -1;
@@ -261,7 +267,7 @@
 
 		// Buffer is full?
 		if b.Buffered() >= len(b.buf) {
-			return nil, BufferFull
+			return nil, ErrBufferFull
 		}
 	}
 
@@ -292,7 +298,7 @@
 		if e == nil {	// got final fragment
 			break
 		}
-		if e != BufferFull {	// unexpected error
+		if e != ErrBufferFull {	// unexpected error
 			err = e;
 			break
 		}
@@ -308,7 +314,7 @@
 		}
 		if n != len(buf) {
 			frag = buf[0:n];
-			err = InternalError;
+			err = errInternal;
 			break
 		}
 
@@ -378,7 +384,7 @@
 // It returns the Writer and any error.
 func NewWriterSize(wr io.Writer, size int) (*Writer, os.Error) {
 	if size <= 0 {
-		return nil, BadBufSize
+		return nil, BufSizeError(size)
 	}
 	// Is it already a Writer?
 	b, ok := wr.(*Writer);
diff --git a/src/pkg/compress/flate/inflate.go b/src/pkg/compress/flate/inflate.go
index 1e81aff..31289c8 100644
--- a/src/pkg/compress/flate/inflate.go
+++ b/src/pkg/compress/flate/inflate.go
@@ -61,7 +61,7 @@
 // A CorruptInputError reports the presence of corrupt input at a given offset.
 type CorruptInputError int64
 func (e CorruptInputError) String() string {
-	return "flate: corrupt input at offset " + strconv.Itoa64(int64(e));
+	return "flate: corrupt input before offset " + strconv.Itoa64(int64(e));
 }
 
 // An InternalError reports an error in the flate code itself.
@@ -263,11 +263,6 @@
 	buf [4]byte;
 }
 
-// TODO(rsc): This works around a 6g bug.
-func (f *inflater) getRoffset() int64 {
-	return f.roffset;
-}
-
 func (f *inflater) dataBlock() os.Error
 func (f *inflater) readHuffman() os.Error
 func (f *inflater) decodeBlock(hl, hd *huffmanDecoder) os.Error
@@ -301,10 +296,7 @@
 			}
 		default:
 			// 3 is reserved.
-			// TODO(rsc): Works around the same 6g bug.
-			var i int64 = f.getRoffset();
-			i--;
-			err = CorruptInputError(i);
+			err = CorruptInputError(f.roffset);
 		}
 	}
 	return;
@@ -347,7 +339,7 @@
 		f.codebits[codeOrder[i]] = 0;
 	}
 	if !f.h1.init(&f.codebits) {
-		return os.ErrorString("huff and puff");
+		return CorruptInputError(f.roffset);
 	}
 
 	// HLIT + 257 code lengths, HDIST + 1 code lengths,
@@ -374,7 +366,7 @@
 			rep = 3;
 			nb = 2;
 			if i == 0 {
-				return CorruptInputError(f.getRoffset());
+				return CorruptInputError(f.roffset);
 			}
 			b = f.bits[i-1];
 		case 17:
@@ -395,7 +387,7 @@
 		f.b >>= nb;
 		f.nb -= nb;
 		if i+rep > n {
-			return CorruptInputError(f.getRoffset());
+			return CorruptInputError(f.roffset);
 		}
 		for j := 0; j < rep; j++ {
 			f.bits[i] = b;
@@ -404,7 +396,7 @@
 	}
 
 	if !f.h1.init(f.bits[0:nlit]) || !f.h2.init(f.bits[nlit:nlit+ndist]) {
-		return CorruptInputError(f.getRoffset());
+		return CorruptInputError(f.roffset);
 	}
 
 	return nil;
@@ -488,7 +480,7 @@
 		case dist < 4:
 			dist++;
 		case dist >= 30:
-			return CorruptInputError(f.getRoffset());
+			return CorruptInputError(f.roffset);
 		default:
 			nb := uint(dist - 2) >> 1;
 			// have 1 bit in bottom of dist, need nb more.
@@ -511,7 +503,7 @@
 
 		// No check on length; encoding can be prescient.
 		if !f.hfull && dist > f.hp {
-			return CorruptInputError(f.getRoffset());
+			return CorruptInputError(f.roffset);
 		}
 
 		p := f.hp - dist;
@@ -551,7 +543,7 @@
 	n := int(f.buf[0]) | int(f.buf[1])<<8;
 	nn := int(f.buf[2]) | int(f.buf[3])<<8;
 	if nn != ^n {
-		return CorruptInputError(f.getRoffset());
+		return CorruptInputError(f.roffset);
 	}
 
 	// Read len bytes into history,
@@ -580,6 +572,9 @@
 func (f *inflater) moreBits() os.Error {
 	c, err := f.r.ReadByte();
 	if err != nil {
+		if err == os.EOF {
+			err = io.ErrUnexpectedEOF;
+		}
 		return err;
 	}
 	f.roffset++;
@@ -609,7 +604,7 @@
 			return h.codes[v - h.base[n]], nil;
 		}
 	}
-	return 0, CorruptInputError(f.getRoffset());
+	return 0, CorruptInputError(f.roffset);
 }
 
 // Flush any buffered output to the underlying writer.
diff --git a/src/pkg/crypto/aes/cipher.go b/src/pkg/crypto/aes/cipher.go
index fd8e43e..e430c9e 100644
--- a/src/pkg/crypto/aes/cipher.go
+++ b/src/pkg/crypto/aes/cipher.go
@@ -7,6 +7,7 @@
 import (
 	"crypto/aes";
 	"os";
+	"strconv";
 )
 
 // The AES block size in bytes.
@@ -18,19 +19,25 @@
 	dec []uint32;
 }
 
+type KeySizeError int
+func (k KeySizeError) String() string {
+	return "crypto/aes: invalid key size " + strconv.Itoa(int(k));
+}
+
 // NewCipher creates and returns a new Cipher.
 // The key argument should be the AES key,
 // either 16, 24, or 32 bytes to select
 // AES-128, AES-192, or AES-256.
 func NewCipher(key []byte) (*Cipher, os.Error) {
-	switch len(key) {
+	k := len(key);
+	switch k {
 	default:
-		return nil, os.ErrorString("crypto/aes: invalid key size");
+		return nil, KeySizeError(k);
 	case 16, 24, 32:
 		break;
 	}
 
-	n := len(key) + 28;
+	n := k + 28;
 	c := &Cipher{make([]uint32, n), make([]uint32, n)};
 	expandKey(key, c.enc, c.dec);
 	return c, nil;
diff --git a/src/pkg/crypto/block/ecb.go b/src/pkg/crypto/block/ecb.go
index d1f1dee..134ac6d 100644
--- a/src/pkg/crypto/block/ecb.go
+++ b/src/pkg/crypto/block/ecb.go
@@ -17,6 +17,7 @@
 	"crypto/block";
 	"io";
 	"os";
+	"strconv";
 )
 
 type ecbDecrypter struct {
@@ -73,6 +74,11 @@
 	return n;
 }
 
+type ecbFragmentError int
+func (n ecbFragmentError) String() string {
+	return "crypto/block: " + strconv.Itoa(int(n)) + "-byte fragment at EOF";
+}
+
 func (x *ecbDecrypter) Read(p []byte) (n int, err os.Error) {
 	if len(p) == 0 {
 		return;
diff --git a/src/pkg/exec/exec.go b/src/pkg/exec/exec.go
index ebb40a2..7ddb98b 100644
--- a/src/pkg/exec/exec.go
+++ b/src/pkg/exec/exec.go
@@ -140,8 +140,8 @@
 // other options cause Wait to return for other
 // process events; see package os for details.
 func (p *Cmd) Wait(options int) (*os.Waitmsg, os.Error) {
-	if p.Pid < 0 {
-		return nil, os.EINVAL;
+	if p.Pid <= 0 {
+		return nil, os.ErrorString("exec: invalid use of Cmd.Wait");
 	}
 	w, err := os.Wait(p.Pid, options);
 	if w != nil && (w.Exited() || w.Signaled()) {
@@ -154,7 +154,7 @@
 // if it hasn't already, and then closes the non-nil file descriptors
 // p.Stdin, p.Stdout, and p.Stderr.
 func (p *Cmd) Close() os.Error {
-	if p.Pid >= 0 {
+	if p.Pid > 0 {
 		// Loop on interrupt, but
 		// ignore other errors -- maybe
 		// caller has already waited for pid.
diff --git a/src/pkg/http/client.go b/src/pkg/http/client.go
index 8c17eb8..14131ec 100644
--- a/src/pkg/http/client.go
+++ b/src/pkg/http/client.go
@@ -78,7 +78,7 @@
 // connections, it may no longer make sense to have a method with this signature.
 func send(req *Request) (resp *Response, err os.Error) {
 	if req.Url.Scheme != "http" {
-		return nil, os.ErrorString("Unsupported protocol: " + req.Url.Scheme);
+		return nil, &badStringError{"unsupported protocol scheme", req.Url.Scheme};
 	}
 
 	addr := req.Url.Host;
@@ -87,7 +87,7 @@
 	}
 	conn, err := net.Dial("tcp", "", addr);
 	if err != nil {
-		return nil, os.ErrorString("Error dialing " + addr + ": " + err.String());
+		return nil, err;
 	}
 
 	// Close the connection if we encounter an error during header parsing.  We'll
@@ -110,12 +110,12 @@
 	}
 	f := strings.Split(line, " ", 3);
 	if len(f) < 3 {
-		return nil, os.ErrorString(fmt.Sprintf("Invalid first line in HTTP response: %q", line));
+		return nil, &badStringError{"malformed HTTP response", line};
 	}
 	resp.Status = f[1] + " " + f[2];
 	resp.StatusCode, err = strconv.Atoi(f[1]);
 	if err != nil {
-		return nil, os.ErrorString(fmt.Sprintf("Invalid status code in HTTP response: %q", line));
+		return nil, &badStringError{"malformed HTTP status code", f[1]};
 	}
 
 	// Parse the response headers.
@@ -165,34 +165,36 @@
 // URL unless redirects were followed.
 //
 // Caller should close r.Body when done reading it.
-func Get(url string) (r *Response, finalUrl string, err os.Error) {
+func Get(url string) (r *Response, finalURL string, err os.Error) {
 	// TODO: if/when we add cookie support, the redirected request shouldn't
 	// necessarily supply the same cookies as the original.
-	// TODO: adjust referrer header on redirects.
-	for redirectCount := 0; redirectCount < 10; redirectCount++ {
+	// TODO: set referrer header on redirects.
+	for redirect := 0;; redirect++ {
+		if redirect >= 10 {
+			err = os.ErrorString("stopped after 10 redirects");
+			break;
+		}
+
 		var req Request;
-		req.Url, err = ParseURL(url);
-		if err != nil {
-			return nil, url, err;
+		if req.Url, err = ParseURL(url); err != nil {
+			break;
 		}
-
-		r, err := send(&req);
-		if err != nil {
-			return nil, url, err;
+		if r, err = send(&req); err != nil {
+			break;
 		}
-
-		if !shouldRedirect(r.StatusCode) {
-			return r, url, nil;
+		if shouldRedirect(r.StatusCode) {
+			r.Body.Close();
+			if url = r.GetHeader("Location"); url == "" {
+				err = os.ErrorString(fmt.Sprintf("%d response missing Location header", r.StatusCode));
+				break;
+			}
 		}
-
-		r.Body.Close();
-		url := r.GetHeader("Location");
-		if url == "" {
-			return r, url, os.ErrorString("302 result with no Location header");
-		}
+		finalURL = url;
+		return;
 	}
 
-	return nil, url, os.ErrorString("Too many redirects");
+	err = &URLError{"Get", url, err};
+	return;
 }
 
 
diff --git a/src/pkg/http/client_test.go b/src/pkg/http/client_test.go
index 919e556..f697fb8 100644
--- a/src/pkg/http/client_test.go
+++ b/src/pkg/http/client_test.go
@@ -24,9 +24,8 @@
 		b, err = io.ReadAll(r.Body);
 		r.Body.Close();
 	}
-
 	if err != nil {
-		t.Errorf("Error fetching URL: %v", err);
+		t.Error(err);
 	} else if s := string(b); !strings.HasPrefix(s, "User-agent:") {
 		t.Errorf("Incorrect page body (did not begin with User-agent): %q", s);
 	}
diff --git a/src/pkg/http/request.go b/src/pkg/http/request.go
index 9051d4c..86b37d4 100644
--- a/src/pkg/http/request.go
+++ b/src/pkg/http/request.go
@@ -11,6 +11,7 @@
 
 import (
 	"bufio";
+	"bytes";
 	"container/vector";
 	"fmt";
 	"http";
@@ -32,19 +33,20 @@
 	os.ErrorString
 }
 var (
-	LineTooLong = &ProtocolError{"http header line too long"};
-	ValueTooLong = &ProtocolError{"http header value too long"};
-	HeaderTooLong = &ProtocolError{"http header too long"};
-	BadContentLength = &ProtocolError{"invalid content length"};
-	ShortEntityBody = &ProtocolError{"entity body too short"};
-	NoEntityBody = &ProtocolError{"no entity body"};
-	BadHeader = &ProtocolError{"malformed http header"};
-	BadRequest = &ProtocolError{"invalid http request"};
-	BadHTTPVersion = &ProtocolError{"unsupported http version"};
-	UnknownContentType = &ProtocolError{"unknown content type"};
-	BadChunkedEncoding = &ProtocolError{"bad chunked encoding"};
+	ErrLineTooLong = &ProtocolError{"header line too long"};
+	ErrHeaderTooLong = &ProtocolError{"header too long"};
+	ErrShortBody = &ProtocolError{"entity body too short"};
 )
 
+type badStringError struct {
+	what string;
+	str string;
+}
+
+func (e *badStringError) String() string {
+	return fmt.Sprintf("%s %q", e.what, e.str);
+}
+
 // A Request represents a parsed HTTP request header.
 type Request struct {
 	Method string;		// GET, POST, PUT, etc.
@@ -204,10 +206,15 @@
 // the bufio, so they are only valid until the next bufio read.
 func readLineBytes(b *bufio.Reader) (p []byte, err os.Error) {
 	if p, err = b.ReadLineSlice('\n'); err != nil {
+		// We always know when EOF is coming.
+		// If the caller asked for a line, there should be a line.
+		if err == os.EOF {
+			err = io.ErrUnexpectedEOF;
+		}
 		return nil, err
 	}
 	if len(p) >= maxLineLength {
-		return nil, LineTooLong
+		return nil, ErrLineTooLong
 	}
 
 	// Chop off trailing white space.
@@ -229,6 +236,8 @@
 	return string(p), nil
 }
 
+var colon = []byte{':'}
+
 // Read a key/value pair from b.
 // A key/value has the form Key: Value\r\n
 // and the Value can continue on multiple lines if each continuation line
@@ -243,58 +252,60 @@
 	}
 
 	// Scan first line for colon.
-	for i := 0; i < len(line); i++ {
-		switch line[i] {
-		case ' ':
-			// Key field has space - no good.
-			return "", "", BadHeader;
-		case ':':
-			key = string(line[0:i]);
-			// Skip initial space before value.
-			for i++; i < len(line); i++ {
-				if line[i] != ' ' {
-					break
-				}
-			}
-			value = string(line[i:len(line)]);
-
-			// Look for extension lines, which must begin with space.
-			for {
-				var c byte;
-
-				if c, e = b.ReadByte(); e != nil {
-					return "", "", e
-				}
-				if c != ' ' {
-					// Not leading space; stop.
-					b.UnreadByte();
-					break
-				}
-
-				// Eat leading space.
-				for c == ' ' {
-					if c, e = b.ReadByte(); e != nil {
-						return "", "", e
-					}
-				}
-				b.UnreadByte();
-
-				// Read the rest of the line and add to value.
-				if line, e = readLineBytes(b); e != nil {
-					return "", "", e
-				}
-				value += " " + string(line);
-
-				if len(value) >= maxValueLength {
-					return "", "", ValueTooLong
-				}
-			}
-			return key, value, nil
-		}
+	i := bytes.Index(line, colon);
+	if i < 0 {
+		goto Malformed;
 	}
 
-	// Line ended before space or colon.
-	return "", "", BadHeader;
+	key = string(line[0:i]);
+	if strings.Index(key, " ") >= 0 {
+		// Key field has space - no good.
+		goto Malformed;
+	}
+
+	// Skip initial space before value.
+	for i++; i < len(line); i++ {
+		if line[i] != ' ' {
+			break
+		}
+	}
+	value = string(line[i:len(line)]);
+
+	// Look for extension lines, which must begin with space.
+	for {
+		c, e := b.ReadByte();
+		if c != ' ' {
+			if e != os.EOF {
+				b.UnreadByte();
+			}
+			break;
+		}
+
+		// Eat leading space.
+		for c == ' ' {
+			if c, e = b.ReadByte(); e != nil {
+				if e == os.EOF {
+					e = io.ErrUnexpectedEOF;
+				}
+				return "", "", e
+			}
+		}
+		b.UnreadByte();
+
+		// Read the rest of the line and add to value.
+		if line, e = readLineBytes(b); e != nil {
+			return "", "", e
+		}
+		value += " " + string(line);
+
+		if len(value) >= maxValueLength {
+			return "", "", &badStringError{"value too long for key", key};
+		}
+	}
+	return key, value, nil;
+
+Malformed:
+	return "", "", &badStringError{"malformed header line", string(line)};
 }
 
 // Convert decimal at s[i:len(s)] to integer,
@@ -424,7 +435,7 @@
 		var nb int;
 		if nb, cr.err = io.ReadFull(cr.r, b); cr.err == nil {
 			if b[0] != '\r' || b[1] != '\n' {
-				cr.err = BadChunkedEncoding;
+				cr.err = os.NewError("malformed chunked encoding");
 			}
 		}
 	}
@@ -443,12 +454,12 @@
 
 	var f []string;
 	if f = strings.Split(s, " ", 3); len(f) < 3 {
-		return nil, BadRequest
+		return nil, &badStringError{"malformed HTTP request", s};
 	}
 	req.Method, req.RawUrl, req.Proto = f[0], f[1], f[2];
 	var ok bool;
 	if req.ProtoMajor, req.ProtoMinor, ok = parseHTTPVersion(req.Proto); !ok {
-		return nil, BadHTTPVersion
+		return nil, &badStringError{"malformed HTTP version", req.Proto};
 	}
 
 	if req.Url, err = ParseURL(req.RawUrl); err != nil {
@@ -467,7 +478,7 @@
 			break
 		}
 		if nheader++; nheader >= maxHeaderLines {
-			return nil, HeaderTooLong
+			return nil, ErrHeaderTooLong
 		}
 
 		key = CanonicalHeaderKey(key);
@@ -556,13 +567,13 @@
 	} else if v, present := req.Header["Content-Length"]; present {
 		length, err := strconv.Btoui64(v, 10);
 		if err != nil {
-			return nil, BadContentLength
+			return nil, &badStringError{"invalid Content-Length", v};
 		}
 		// TODO: limit the Content-Length. This is an easy DoS vector.
 		raw := make([]byte, length);
 		n, err := b.Read(raw);
 		if err != nil || uint64(n) < length {
-			return nil, ShortEntityBody
+			return nil, ErrShortBody
 		}
 		req.Body = io.NewByteReader(raw);
 	}
@@ -599,7 +610,7 @@
 // TODO(dsymonds): Parse r.Url.RawQuery instead for GET requests.
 func (r *Request) ParseForm() (err os.Error) {
 	if r.Body == nil {
-		return NoEntityBody
+		return os.ErrorString("missing form body");
 	}
 	ct, ok := r.Header["Content-Type"];
 	if !ok {
@@ -613,5 +624,5 @@
 		return err
 	// TODO(dsymonds): Handle multipart/form-data
 	}
-	return UnknownContentType
+	return &badStringError{"unknown Content-Type", ct};
 }
diff --git a/src/pkg/http/url.go b/src/pkg/http/url.go
index 156f3ad..87612a9 100644
--- a/src/pkg/http/url.go
+++ b/src/pkg/http/url.go
@@ -9,12 +9,19 @@
 
 import (
 	"os";
-	"strings"
+	"strconv";
+	"strings";
 )
 
-// Errors introduced by ParseURL.
-type BadURL struct {
-	os.ErrorString
+// URLError reports an error and the operation and URL that caused it.
+type URLError struct {
+	Op string;
+	URL string;
+	Error os.Error;
+}
+
+func (e *URLError) String() string {
+	return e.Op + " " + e.URL + ": " + e.Error.String();
 }
 
 func ishex(c byte) bool {
@@ -41,6 +48,11 @@
 	return 0
 }
 
+type URLEscapeError string
+func (e URLEscapeError) String() string {
+	return "invalid URL escape " + strconv.Quote(string(e));
+}
+
 // Return true if the specified character should be escaped when appearing in a
 // URL string.
 //
@@ -56,7 +68,7 @@
 
 // URLUnescape unescapes a URL-encoded string,
 // converting %AB into the byte 0xAB and '+' into ' ' (space).
-// It returns a BadURL error if any % is not followed
+// It returns an error if any % is not followed
 // by two hexadecimal digits.
 func URLUnescape(s string) (string, os.Error) {
 	// Count %, check that they're well-formed.
@@ -67,7 +79,11 @@
 		case '%':
 			n++;
 			if i+2 >= len(s) || !ishex(s[i+1]) || !ishex(s[i+2]) {
-				return "", BadURL{"invalid hexadecimal escape"}
+				s = s[i:len(s)];
+				if len(s) > 3 {
+					s = s[0:3];
+				}
+				return "", URLEscapeError(s);
 			}
 			i += 3;
 		case '+':
@@ -124,18 +140,18 @@
 	t := make([]byte, len(s)+2*hexCount);
 	j := 0;
 	for i := 0; i < len(s); i++ {
-		c := s[i];
-		if !shouldEscape(c) {
-			t[j] = s[i];
-			j++;
-		} else if c == ' ' {
+		switch c := s[i]; {
+		case c == ' ':
 			t[j] = '+';
 			j++;
-		} else {
+		case shouldEscape(c):
 			t[j] = '%';
 			t[j+1] = "0123456789abcdef"[c>>4];
 			t[j+2] = "0123456789abcdef"[c&15];
 			j += 3;
+		default:
+			t[j] = s[i];
+			j++;
 		}
 	}
 	return string(t);
@@ -177,7 +193,7 @@
 			}
 		case c == ':':
 			if i == 0 {
-				return "", "", BadURL{"missing protocol scheme"}
+				return "", "", os.ErrorString("missing protocol scheme")
 			}
 			return rawurl[0:i], rawurl[i+1:len(rawurl)], nil
 		default:
@@ -204,15 +220,21 @@
 	return s, ""
 }
 
+// TODO(rsc): The BUG comment is supposed to appear in the godoc output
+// in a BUGS section, but that got lost in the transition to godoc.
+
 // BUG(rsc): ParseURL should canonicalize the path,
 // removing unnecessary . and .. elements.
 
+
+
 // ParseURL parses rawurl into a URL structure.
 // The string rawurl is assumed not to have a #fragment suffix.
 // (Web browsers strip #fragment before sending the URL to a web server.)
 func ParseURL(rawurl string) (url *URL, err os.Error) {
 	if rawurl == "" {
-		return nil, BadURL{"empty url"}
+		err = os.ErrorString("empty url");
+		goto Error;
 	}
 	url = new(URL);
 	url.Raw = rawurl;
@@ -220,7 +242,7 @@
 	// split off possible leading "http:", "mailto:", etc.
 	var path string;
 	if url.Scheme, path, err = getscheme(rawurl); err != nil {
-		return nil, err
+		goto Error;
 	}
 	url.RawPath = path;
 
@@ -245,25 +267,31 @@
 	// What's left is the path.
 	// TODO: Canonicalize (remove . and ..)?
 	if url.Path, err = URLUnescape(path); err != nil {
-		return nil, err
+		goto Error;
 	}
 
 	// Remove escapes from the Authority and Userinfo fields, and verify
 	// that Scheme and Host contain no escapes (that would be illegal).
 	if url.Authority, err = URLUnescape(url.Authority); err != nil {
-		return nil, err
+		goto Error;
 	}
 	if url.Userinfo, err = URLUnescape(url.Userinfo); err != nil {
-		return nil, err
+		goto Error;
 	}
 	if strings.Index(url.Scheme, "%") >= 0 {
-		return nil, BadURL{"hexadecimal escape in scheme"}
+		err = os.ErrorString("hexadecimal escape in scheme");
+		goto Error;
 	}
 	if strings.Index(url.Host, "%") >= 0 {
-		return nil, BadURL{"hexadecimal escape in host"}
+		err = os.ErrorString("hexadecimal escape in host");
+		goto Error;
 	}
 
-	return url, nil
+	return url, nil;
+
+Error:
+	return nil, &URLError{"parse", rawurl, err}
+
 }
 
 // ParseURLReference is like ParseURL but allows a trailing #fragment.
@@ -274,7 +302,7 @@
 		return nil, err
 	}
 	if url.Fragment, err = URLUnescape(frag); err != nil {
-		return nil, err
+		return nil, &URLError{"parse", rawurl, err}
 	}
 	return url, nil
 }
diff --git a/src/pkg/http/url_test.go b/src/pkg/http/url_test.go
index ea05ed3..51d0283 100644
--- a/src/pkg/http/url_test.go
+++ b/src/pkg/http/url_test.go
@@ -281,27 +281,27 @@
 	URLEscapeTest{
 		"%", // not enough characters after %
 		"",
-		BadURL{"invalid hexadecimal escape"}
+		URLEscapeError("%"),
 	},
 	URLEscapeTest{
 		"%a", // not enough characters after %
 		"",
-		BadURL{"invalid hexadecimal escape"}
+		URLEscapeError("%a"),
 	},
 	URLEscapeTest{
 		"%1", // not enough characters after %
 		"",
-		BadURL{"invalid hexadecimal escape"}
+		URLEscapeError("%1"),
 	},
 	URLEscapeTest{
 		"123%45%6", // not enough characters after %
 		"",
-		BadURL{"invalid hexadecimal escape"}
+		URLEscapeError("%6"),
 	},
 	URLEscapeTest{
-		"%zz", // invalid hex digits
+		"%zzzzz", // invalid hex digits
 		"",
-		BadURL{"invalid hexadecimal escape"}
+		URLEscapeError("%zz"),
 	},
 }
 
diff --git a/src/pkg/io/bytebuffer.go b/src/pkg/io/bytebuffer.go
index 2c35619..6971c0e 100644
--- a/src/pkg/io/bytebuffer.go
+++ b/src/pkg/io/bytebuffer.go
@@ -113,7 +113,7 @@
 	if b.off >= len(b.buf) {
 		return 0, os.EOF;
 	}
-        c = b.buf[b.off];
+	c = b.buf[b.off];
 	b.off++;
 	return c, nil;
 }
diff --git a/src/pkg/net/Makefile b/src/pkg/net/Makefile
index 61c8720..7705619 100644
--- a/src/pkg/net/Makefile
+++ b/src/pkg/net/Makefile
@@ -2,6 +2,7 @@
 # Use of this source code is governed by a BSD-style
 # license that can be found in the LICENSE file.
 
+
 # DO NOT EDIT.  Automatically generated by gobuild.
 # gobuild -m dnsclient.go dnsconfig.go dnsmsg.go fd.go fd_${GOOS}.go ip.go net.go parse.go port.go >Makefile
 
@@ -20,7 +21,7 @@
 
 coverage: packages
 	gotest
-	6cov -g `pwd` | grep -v '_test\.go:'
+	6cov -g $$(pwd) | grep -v '_test\.go:'
 
 %.$O: %.go
 	$(GC) -I_obj $*.go
@@ -32,48 +33,42 @@
 	$(AS) $*.s
 
 O1=\
-	dnsmsg.$O\
+	fd_$(GOOS).$O\
 	parse.$O\
 
 O2=\
-	fd_$(GOOS).$O\
+	fd.$O\
 	ip.$O\
-	port.$O\
 
 O3=\
 	dnsconfig.$O\
-	fd.$O\
-
-O4=\
+	dnsmsg.$O\
 	net.$O\
 
-O5=\
+O4=\
 	dnsclient.$O\
+	port.$O\
 
 
-phases: a1 a2 a3 a4 a5
+phases: a1 a2 a3 a4
 _obj$D/net.a: phases
 
 a1: $(O1)
-	$(AR) grc _obj$D/net.a dnsmsg.$O parse.$O
+	$(AR) grc _obj$D/net.a fd_$(GOOS).$O parse.$O
 	rm -f $(O1)
 
 a2: $(O2)
-	$(AR) grc _obj$D/net.a fd_$(GOOS).$O ip.$O port.$O
+	$(AR) grc _obj$D/net.a fd.$O ip.$O
 	rm -f $(O2)
 
 a3: $(O3)
-	$(AR) grc _obj$D/net.a dnsconfig.$O fd.$O
+	$(AR) grc _obj$D/net.a dnsconfig.$O dnsmsg.$O net.$O
 	rm -f $(O3)
 
 a4: $(O4)
-	$(AR) grc _obj$D/net.a net.$O
+	$(AR) grc _obj$D/net.a dnsclient.$O port.$O
 	rm -f $(O4)
 
-a5: $(O5)
-	$(AR) grc _obj$D/net.a dnsclient.$O
-	rm -f $(O5)
-
 
 newpkg: clean
 	mkdir -p _obj$D
@@ -84,7 +79,6 @@
 $(O3): a2
 $(O4): a3
 $(O5): a4
-$(O6): a5
 
 nuke: clean
 	rm -f $(GOROOT)/pkg/$(GOOS)_$(GOARCH)$D/net.a
diff --git a/src/pkg/net/dialgoogle_test.go b/src/pkg/net/dialgoogle_test.go
index 3792195..f259cba 100644
--- a/src/pkg/net/dialgoogle_test.go
+++ b/src/pkg/net/dialgoogle_test.go
@@ -6,7 +6,6 @@
 
 import (
 	"flag";
-	"fmt";
 	"io";
 	"net";
 	"os";
diff --git a/src/pkg/net/dnsclient.go b/src/pkg/net/dnsclient.go
index cfd67ea..72af10f 100644
--- a/src/pkg/net/dnsclient.go
+++ b/src/pkg/net/dnsclient.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// DNS client.
+// DNS client: see RFC 1035.
 // Has to be linked into package net for Dial.
 
 // TODO(rsc):
@@ -12,12 +12,10 @@
 //	Random UDP source port (net.Dial should do that for us).
 //	Random request IDs.
 //	More substantial error reporting.
-//	Remove use of fmt?
 
 package net
 
 import (
-	"fmt";
 	"io";
 	"net";
 	"once";
@@ -25,28 +23,29 @@
 	"strings";
 )
 
-// DNS errors returned by LookupHost.
+// DNSError represents a DNS lookup error.
 type DNSError struct {
-	os.ErrorString
+	Error string;	// description of the error
+	Name string;	// name looked for
+	Server string;	// server used
 }
-var (
-	DNS_InternalError os.Error = &DNSError{"internal dns error"};
-	DNS_MissingConfig os.Error = &DNSError{"no dns configuration"};
-	DNS_No_Answer os.Error = &DNSError{"dns got no answer"};
-	DNS_BadRequest os.Error = &DNSError{"malformed dns request"};
-	DNS_BadReply os.Error = &DNSError{"malformed dns reply"};
-	DNS_ServerFailure os.Error = &DNSError{"dns server failure"};
-	DNS_NoServers os.Error = &DNSError{"no dns servers"};
-	DNS_NameTooLong os.Error = &DNSError{"dns name too long"};
-	DNS_RedirectLoop os.Error = &DNSError{"dns redirect loop"};
-	DNS_NameNotFound os.Error = &DNSError{"dns name not found"};
-)
+
+func (e *DNSError) String() string {
+	s := "lookup " + e.Name;
+	if e.Server != "" {
+		s += " on " + e.Server;
+	}
+	s += ": " + e.Error;
+	return s;
+}
+
+const noSuchHost = "no such host"
 
 // Send a request on the connection and hope for a reply.
 // Up to cfg.attempts attempts.
 func _Exchange(cfg *_DNS_Config, c Conn, name string) (m *_DNS_Msg, err os.Error) {
 	if len(name) >= 256 {
-		return nil, DNS_NameTooLong
+		return nil, &DNSError{"name too long", name, ""}
 	}
 	out := new(_DNS_Msg);
 	out.id = 0x1234;
@@ -56,7 +55,7 @@
 	out.recursion_desired = true;
 	msg, ok := out.Pack();
 	if !ok {
-		return nil, DNS_InternalError
+		return nil, &DNSError{"internal error - cannot pack message", name, ""}
 	}
 
 	for attempt := 0; attempt < cfg.attempts; attempt++ {
@@ -69,7 +68,8 @@
 
 		buf := make([]byte, 2000);	// More than enough.
 		n, err = c.Read(buf);
-		if err == os.EAGAIN {
+		if isEAGAIN(err)  {
+			err = nil;
 			continue;
 		}
 		if err != nil {
@@ -82,25 +82,25 @@
 		}
 		return in, nil
 	}
-	return nil, DNS_No_Answer
+	return nil, &DNSError{"no answer from server", name, c.RemoteAddr()}
 }
 
 
 // Find answer for name in dns message.
 // On return, if err == nil, addrs != nil.
 // TODO(rsc): Maybe return []IP instead?
-func answer(name string, dns *_DNS_Msg) (addrs []string, err os.Error) {
+func answer(name, server string, dns *_DNS_Msg) (addrs []string, err *DNSError) {
 	addrs = make([]string, 0, len(dns.answer));
 
-	if dns.rcode == _DNS_RcodeNameError && dns.authoritative {
-		return nil, DNS_NameNotFound	// authoritative "no such host"
+	if dns.rcode == _DNS_RcodeNameError && dns.recursion_available {
+		return nil, &DNSError{noSuchHost, name, ""}
 	}
 	if dns.rcode != _DNS_RcodeSuccess {
 		// None of the error codes make sense
 		// for the query we sent.  If we didn't get
 		// a name error and we didn't get success,
 		// the server is behaving incorrectly.
-		return nil, DNS_ServerFailure
+		return nil, &DNSError{"server misbehaving", name, server}
 	}
 
 	// Look for the name.
@@ -120,7 +120,7 @@
 					n := len(addrs);
 					a := rr.(*_DNS_RR_A).a;
 					addrs = addrs[0:n+1];
-					addrs[n] = fmt.Sprintf("%d.%d.%d.%d", (a>>24), (a>>16)&0xFF, (a>>8)&0xFF, a&0xFF);
+					addrs[n] = IPv4(byte(a>>24), byte(a>>16), byte(a>>8), byte(a)).String();
 				case _DNS_TypeCNAME:
 					// redirect to cname
 					name = rr.(*_DNS_RR_CNAME).cname;
@@ -129,19 +129,20 @@
 			}
 		}
 		if len(addrs) == 0 {
-			return nil, DNS_NameNotFound
+			return nil, &DNSError{noSuchHost, name, server}
 		}
 		return addrs, nil
 	}
 
-	// Too many redirects
-	return nil, DNS_RedirectLoop
+	return nil, &DNSError{"too many redirects", name, server}
 }
 
 // Do a lookup for a single name, which must be rooted
 // (otherwise answer will not find the answers).
 func tryOneName(cfg *_DNS_Config, name string) (addrs []string, err os.Error) {
-	err = DNS_NoServers;
+	if len(cfg.servers) == 0 {
+		return nil, &DNSError{"no DNS servers", name, ""}
+	}
 	for i := 0; i < len(cfg.servers); i++ {
 		// Calling Dial here is scary -- we have to be sure
 		// not to dial a name that will require a DNS lookup,
@@ -149,7 +150,8 @@
 		// The DNS config parser has already checked that
 		// all the cfg.servers[i] are IP addresses, which
 		// Dial will use without a DNS lookup.
-		c, cerr := Dial("udp", "", cfg.servers[i] + ":53");
+		server := cfg.servers[i] + ":53";
+		c, cerr := Dial("udp", "", server);
 		if cerr != nil {
 			err = cerr;
 			continue;
@@ -160,12 +162,16 @@
 			err = merr;
 			continue;
 		}
-		addrs, aerr := answer(name, msg);
-		if aerr != nil && aerr != DNS_NameNotFound {
-			err = aerr;
-			continue;
+		var dnserr *DNSError;
+		addrs, dnserr = answer(name, server, msg);
+		if dnserr != nil {
+			err = dnserr;
+		} else {
+			err = nil;	// nil os.Error, not nil *DNSError
 		}
-		return addrs, aerr;
+		if dnserr == nil || dnserr.Error == noSuchHost {
+			break;
+		}
 	}
 	return;
 }
@@ -177,18 +183,60 @@
 	cfg, dnserr = _DNS_ReadConfig();
 }
 
+func isDomainName(s string) bool {
+	// Requirements on DNS name:
+	//	* must not be empty.
+	//	* must be alphanumeric plus - and .
+	//	* each of the dot-separated elements must begin
+	//	  and end with a letter or digit.
+	//	  RFC 1035 required the element to begin with a letter,
+	//	  but RFC 3696 says this has been relaxed to allow digits too.
+	//	  still, there must be a letter somewhere in the entire name.
+	if len(s) == 0 {
+		return false;
+	}
+	if s[len(s)-1] != '.' {	// simplify checking loop: make name end in dot
+		s += ".";
+	}
+
+	last := byte('.');
+	ok := false;	// ok once we've seen a letter
+	for i := 0; i < len(s); i++ {
+		c := s[i];
+		switch {
+		default:
+			return false;
+		case 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z':
+			ok = true;
+		case '0' <= c && c <= '9':
+			// fine
+		case c == '-':
+			// byte before dash cannot be dot
+			if last == '.' {
+				return false;
+			}
+		case c == '.':
+			// byte before dot cannot be dot, dash
+			if last == '.' || last == '-' {
+				return false;
+			}
+		}
+		last = c;
+	}
+
+	return ok;
+}
+
 // LookupHost looks up the host name using the local DNS resolver.
 // It returns the canonical name for the host and an array of that
 // host's addresses.
-func LookupHost(name string) (cname string, addrs []string, err os.Error)
-{
-	// TODO(rsc): Pick out obvious non-DNS names to avoid
-	// sending stupid requests to the server?
-
+func LookupHost(name string) (cname string, addrs []string, err os.Error) {
+	if !isDomainName(name) {
+		return name, nil, &DNSError{"invalid domain name", name, ""};
+	}
 	once.Do(loadConfig);
 	if dnserr != nil || cfg == nil {
-		// better error than file not found.
-		err = DNS_MissingConfig;
+		err = dnserr;
 		return;
 	}
 
@@ -201,11 +249,12 @@
 			rname += ".";
 		}
 		// Can try as ordinary name.
-		addrs, aerr := tryOneName(cfg, rname);
-		if aerr == nil {
-			return rname, addrs, nil;
+		var dnserr *DNSError;
+		addrs, err = tryOneName(cfg, rname);
+		if err == nil {
+			cname = rname;
+			return;
 		}
-		err = aerr;
 	}
 	if rooted {
 		return
@@ -213,15 +262,16 @@
 
 	// Otherwise, try suffixes.
 	for i := 0; i < len(cfg.search); i++ {
-		newname := name+"."+cfg.search[i];
-		if newname[len(newname)-1] != '.' {
-			newname += "."
+		rname := name+"."+cfg.search[i];
+		if rname[len(rname)-1] != '.' {
+			rname += "."
 		}
-		addrs, aerr := tryOneName(cfg, newname);
-		if aerr == nil {
-			return newname, addrs, nil;
+		var dnserr *DNSError;
+		addrs, err = tryOneName(cfg, rname);
+		if err == nil {
+			cname = rname;
+			return;
 		}
-		err = aerr;
 	}
 	return
 }
diff --git a/src/pkg/net/dnsmsg.go b/src/pkg/net/dnsmsg.go
index d7a467f..728e898 100644
--- a/src/pkg/net/dnsmsg.go
+++ b/src/pkg/net/dnsmsg.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// DNS packet assembly.
+// DNS packet assembly.  See RFC 1035.
 //
 // This is intended to support name resolution during net.Dial.
 // It doesn't have to be blazing fast.
@@ -25,6 +25,7 @@
 
 import (
 	"fmt";
+	"net";
 	"os";
 	"reflect";
 )
@@ -464,7 +465,7 @@
 			s += printStructValue(fld.(reflect.StructValue));
 		case kind == reflect.Uint32Kind && tag == "ipv4":
 			i := fld.(reflect.Uint32Value).Get();
-			s += fmt.Sprintf("%d.%d.%d.%d", (i>>24)&0xFF, (i>>16)&0xFF, (i>>8)&0xFF, i&0xFF);
+			s += IPv4(byte(i>>24), byte(i>>16), byte(i>>8), byte(i)).String();
 		default:
 			s += fmt.Sprint(fld.Interface())
 		}
diff --git a/src/pkg/net/fd.go b/src/pkg/net/fd.go
index 17598af..0917c50 100644
--- a/src/pkg/net/fd.go
+++ b/src/pkg/net/fd.go
@@ -85,7 +85,7 @@
 	var e int;
 	if e = syscall.SetNonblock(s.pr.Fd(), true); e != 0 {
 	Errno:
-		err = os.ErrnoToError(e);
+		err = &os.PathError{"setnonblock", s.pr.Name(), os.Errno(e)};
 	Error:
 		s.pr.Close();
 		s.pw.Close();
@@ -304,19 +304,46 @@
 		once.Do(_StartServer);
 	}
 	if e := syscall.SetNonblock(fd, true); e != 0 {
-		return nil, os.ErrnoToError(e);
+		return nil, &os.PathError{"setnonblock", laddr, os.Errno(e)};
 	}
 	f = new(netFD);
 	f.fd = fd;
 	f.net = net;
 	f.laddr = laddr;
 	f.raddr = raddr;
-	f.file = os.NewFile(fd, "net: " + net + " " + laddr + " " + raddr);
+	f.file = os.NewFile(fd, net + "!" + laddr + "->" + raddr);
 	f.cr = make(chan *netFD, 1);
 	f.cw = make(chan *netFD, 1);
 	return f, nil
 }
 
+func isEAGAIN(e os.Error) bool {
+	if e1, ok := e.(*os.PathError); ok {
+		return e1.Error == os.EAGAIN;
+	}
+	return e == os.EAGAIN;
+}
+
+func sockaddrToString(sa syscall.Sockaddr) (name string, err os.Error)
+
+func (fd *netFD) addr() string {
+	sa, e := syscall.Getsockname(fd.fd);
+	if e != 0 {
+		return "";
+	}
+	addr, err := sockaddrToString(sa);
+	return addr;
+}
+
+func (fd *netFD) remoteAddr() string {
+	sa, e := syscall.Getpeername(fd.fd);
+	if e != 0 {
+		return "";
+	}
+	addr, err := sockaddrToString(sa);
+	return addr;
+}
+
 func (fd *netFD) Close() os.Error {
 	if fd == nil || fd.file == nil {
 		return os.EINVAL
@@ -338,7 +365,7 @@
 
 func (fd *netFD) Read(p []byte) (n int, err os.Error) {
 	if fd == nil || fd.file == nil {
-		return -1, os.EINVAL
+		return 0, os.EINVAL
 	}
 	fd.rio.Lock();
 	defer fd.rio.Unlock();
@@ -347,17 +374,20 @@
 	} else {
 		fd.rdeadline = 0;
 	}
-	n, err = fd.file.Read(p);
-	for err == os.EAGAIN && fd.rdeadline >= 0 {
-		pollserver.WaitRead(fd);
-		n, err = fd.file.Read(p)
+	for {
+		n, err = fd.file.Read(p);
+		if isEAGAIN(err) && fd.rdeadline >= 0 {
+			pollserver.WaitRead(fd);
+			continue;
+		}
+		break;
 	}
-	return n, err
+	return;
 }
 
 func (fd *netFD) Write(p []byte) (n int, err os.Error) {
 	if fd == nil || fd.file == nil {
-		return -1, os.EINVAL
+		return 0, os.EINVAL
 	}
 	fd.wio.Lock();
 	defer fd.wio.Unlock();
@@ -376,7 +406,7 @@
 		if nn == len(p) {
 			break;
 		}
-		if err == os.EAGAIN && fd.wdeadline >= 0 {
+		if isEAGAIN(err) && fd.wdeadline >= 0 {
 			pollserver.WaitWrite(fd);
 			continue;
 		}
@@ -387,8 +417,6 @@
 	return nn, err
 }
 
-func sockaddrToString(sa syscall.Sockaddr) (name string, err os.Error)
-
 func (fd *netFD) accept() (nfd *netFD, err os.Error) {
 	if fd == nil || fd.file == nil {
 		return nil, os.EINVAL
@@ -411,7 +439,7 @@
 	}
 	if e != 0 {
 		syscall.ForkLock.RUnlock();
-		return nil, os.ErrnoToError(e)
+		return nil, &os.PathError{"accept", fd.addr(), os.Errno(e)}
 	}
 	syscall.CloseOnExec(s);
 	syscall.ForkLock.RUnlock();
@@ -426,23 +454,3 @@
 	}
 	return nfd, nil
 }
-
-func (fd *netFD) addr() string {
-	sa, err := syscall.Getsockname(fd.fd);
-	if err != 0 {
-		return "";
-	}
-	// TODO(rsc): woud like to say err not err1 but 6g complains
-	addr, err1 := sockaddrToString(sa);
-	return addr;
-}
-
-func (fd *netFD) remoteAddr() string {
-	sa, err := syscall.Getpeername(fd.fd);
-	if err != 0 {
-		return "";
-	}
-	// TODO(rsc): woud like to say err not err1 but 6g complains
-	addr, err1 := sockaddrToString(sa);
-	return addr;
-}
diff --git a/src/pkg/net/fd_darwin.go b/src/pkg/net/fd_darwin.go
index 42bf512..c5b38eb 100644
--- a/src/pkg/net/fd_darwin.go
+++ b/src/pkg/net/fd_darwin.go
@@ -12,8 +12,6 @@
 	"syscall";
 )
 
-var kqueuePhaseError = &Error{"kqueue phase error"}
-
 type pollster struct {
 	kq int;
 	eventbuf [10]syscall.Kevent_t;
@@ -24,7 +22,7 @@
 	p = new(pollster);
 	var e int;
 	if p.kq, e = syscall.Kqueue(); e != 0 {
-		return nil, os.ErrnoToError(e)
+		return nil, os.NewSyscallError("kqueue", e)
 	}
 	p.events = p.eventbuf[0:0];
 	return p, nil
@@ -51,13 +49,13 @@
 
 	n, e := syscall.Kevent(p.kq, &events, &events, nil);
 	if e != 0 {
-		return os.ErrnoToError(e)
+		return os.NewSyscallError("kevent", e);
 	}
 	if n != 1 || (ev.Flags & syscall.EV_ERROR) == 0 || int(ev.Ident) != fd || int(ev.Filter) != kmode {
-		return kqueuePhaseError
+		return os.ErrorString("kqueue phase error");
 	}
 	if ev.Data != 0 {
-		return os.ErrnoToError(int(ev.Data))
+		return os.Errno(int(ev.Data))
 	}
 	return nil
 }
@@ -92,7 +90,7 @@
 			if e == syscall.EINTR {
 				continue
 			}
-			return -1, 0, os.ErrnoToError(e)
+			return -1, 0, os.NewSyscallError("kevent", e)
 		}
 		if nn == 0 {
 			return -1, 0, nil;
@@ -111,5 +109,5 @@
 }
 
 func (p *pollster) Close() os.Error {
-	return os.ErrnoToError(syscall.Close(p.kq))
+	return os.NewSyscallError("close", syscall.Close(p.kq))
 }
diff --git a/src/pkg/net/fd_linux.go b/src/pkg/net/fd_linux.go
index bd82258..04cf8ea 100644
--- a/src/pkg/net/fd_linux.go
+++ b/src/pkg/net/fd_linux.go
@@ -32,7 +32,7 @@
 	// about the number of FDs we will care about.
 	// We don't know.
 	if p.epfd, e = syscall.EpollCreate(16); e != 0 {
-		return nil, os.ErrnoToError(e)
+		return nil, os.NewSyscallError("epoll_create", e)
 	}
 	p.events = make(map[int] uint32);
 	return p, nil
@@ -59,7 +59,7 @@
 		op = syscall.EPOLL_CTL_ADD;
 	}
 	if e := syscall.EpollCtl(p.epfd, op, fd, &ev); e != 0 {
-		return os.ErrnoToError(e)
+		return os.NewSyscallError("epoll_ctl", e)
 	}
 	p.events[fd] = ev.Events;
 	return nil
@@ -87,12 +87,12 @@
 		ev.Fd = int32(fd);
 		ev.Events = events;
 		if e := syscall.EpollCtl(p.epfd, syscall.EPOLL_CTL_MOD, fd, &ev); e != 0 {
-			print("Epoll modify fd=", fd, ": ", os.ErrnoToError(e).String(), "\n");
+			print("Epoll modify fd=", fd, ": ", os.Errno(e).String(), "\n");
 		}
 		p.events[fd] = events;
 	} else {
 		if e := syscall.EpollCtl(p.epfd, syscall.EPOLL_CTL_DEL, fd, nil); e != 0 {
-			print("Epoll delete fd=", fd, ": ", os.ErrnoToError(e).String(), "\n");
+			print("Epoll delete fd=", fd, ": ", os.Errno(e).String(), "\n");
 		}
 		p.events[fd] = 0, false;
 	}
@@ -119,7 +119,7 @@
 		n, e = syscall.EpollWait(p.epfd, &evarray, msec);
 	}
 	if e != 0 {
-		return -1, 0, os.ErrnoToError(e);
+		return -1, 0, os.NewSyscallError("epoll_wait", e);
 	}
 	if n == 0 {
 		return -1, 0, nil;
@@ -146,5 +146,5 @@
 }
 
 func (p *pollster) Close() os.Error {
-	return os.ErrnoToError(syscall.Close(p.epfd));
+	return os.NewSyscallError("close", syscall.Close(p.epfd));
 }
diff --git a/src/pkg/net/net.go b/src/pkg/net/net.go
index 91d498a..bbd89ca 100644
--- a/src/pkg/net/net.go
+++ b/src/pkg/net/net.go
@@ -7,18 +7,50 @@
 import (
 	"net";
 	"os";
+	"reflect";
 	"strconv";
+	"strings";
 	"syscall";
 )
 
-var (
-	BadAddress os.Error = &Error{"malformed address"};
-	MissingAddress os.Error = &Error{"missing address"};
-	UnknownNetwork os.Error = &Error{"unknown network"};
-	UnknownHost os.Error = &Error{"unknown host"};
-	UnknownSocketFamily os.Error = &Error{"unknown socket family"};
-)
+var errMissingAddress = os.ErrorString("missing address")
 
+type OpError struct {
+	Op string;
+	Net string;
+	Addr string;
+	Error os.Error;
+}
+
+func (e *OpError) String() string {
+	s := e.Op;
+	if e.Net != "" {
+		s += " " + e.Net;
+	}
+	if e.Addr != "" {
+		s += " " + e.Addr;
+	}
+	s += ": " + e.Error.String();
+	return s;
+}
+
+type AddrError struct {
+	Error string;
+	Addr string;
+}
+
+func (e *AddrError) String() string {
+	s := e.Error;
+	if e.Addr != "" {
+		s += " " + e.Addr;
+	}
+	return s;
+}
+
+type UnknownNetworkError string
+func (e UnknownNetworkError) String() string {
+	return "unknown network " + string(e);
+}
 
 // Conn is a generic network connection.
 type Conn interface {
@@ -127,23 +159,19 @@
 }
 
 func LookupHost(name string) (cname string, addrs []string, err os.Error)
+func LookupPort(network, service string) (port int, err os.Error)
 
 // Split "host:port" into "host" and "port".
 // Host cannot contain colons unless it is bracketed.
 func splitHostPort(hostport string) (host, port string, err os.Error) {
 	// The port starts after the last colon.
-	var i int;
-	for i = len(hostport)-1; i >= 0; i-- {
-		if hostport[i] == ':' {
-			break
-		}
-	}
+	i := strings.LastIndex(hostport, ":");
 	if i < 0 {
-		return "", "", BadAddress
+		err = &AddrError{"missing port in address", hostport};
+		return;
 	}
 
-	host = hostport[0:i];
-	port = hostport[i+1:len(hostport)];
+	host, port = hostport[0:i], hostport[i+1:len(hostport)];
 
 	// Can put brackets around host ...
 	if len(host) > 0 && host[0] == '[' && host[len(host)-1] == ']' {
@@ -151,10 +179,11 @@
 	} else {
 		// ... but if there are no brackets, no colons.
 		if byteIndex(host, ':') >= 0 {
-			return "", "", BadAddress
+			err = &AddrError{"too many colons in address", hostport};
+			return;
 		}
 	}
-	return host, port, nil
+	return;
 }
 
 // Join "host" and "port" into "host:port".
@@ -171,22 +200,21 @@
 // For now, host and port must be numeric literals.
 // Eventually, we'll have name resolution.
 func hostPortToIP(net, hostport, mode string) (ip IP, iport int, err os.Error) {
-	var host, port string;
-	host, port, err = splitHostPort(hostport);
+	host, port, err := splitHostPort(hostport);
 	if err != nil {
-		return nil, 0, err
+		goto Error;
 	}
 
 	var addr IP;
 	if host == "" {
-		if mode == "listen" {
-			if preferIPv4 {
-				addr = IPv4zero;
-			} else {
-				addr = IPzero;	// wildcard - listen to all
-			}
+		if mode != "listen" {
+			err = &AddrError{"no host in address", hostport};
+			goto Error;
+		}
+		if preferIPv4 {
+			addr = IPv4zero;
 		} else {
-			return nil, 0, MissingAddress;
+			addr = IPzero;	// wildcard - listen to all
 		}
 	}
 
@@ -196,17 +224,16 @@
 	}
 	if addr == nil {
 		// Not an IP address.  Try as a DNS name.
-		hostname, addrs, err := LookupHost(host);
-		if err != nil {
-			return nil, 0, err
-		}
-		if len(addrs) == 0 {
-			return nil, 0, UnknownHost
+		hostname, addrs, err1 := LookupHost(host);
+		if err1 != nil {
+			err = err1;
+			goto Error;
 		}
 		addr = ParseIP(addrs[0]);
 		if addr == nil {
 			// should not happen
-			return nil, 0, BadAddress
+			err = &AddrError{"LookupHost returned invalid address", addrs[0]};
+			goto Error;
 		}
 	}
 
@@ -214,14 +241,25 @@
 	if !ok || i != len(port) {
 		p, err = LookupPort(net, port);
 		if err != nil {
-			return nil, 0, err
+			goto Error;
 		}
 	}
 	if p < 0 || p > 0xFFFF {
-		return nil, 0, BadAddress
+		err = &AddrError{"invalid port", port};
+		goto Error;
 	}
 
-	return addr, p, nil
+	return addr, p, nil;
+
+Error:
+	return nil, 0, err;
+}
+
+type UnknownSocketError struct {
+	sa syscall.Sockaddr;
+}
+func (e *UnknownSocketError) String() string {
+	return "unknown socket address type " + reflect.Typeof(e.sa).String()
 }
 
 func sockaddrToString(sa syscall.Sockaddr) (name string, err os.Error) {
@@ -233,7 +271,8 @@
 	case *syscall.SockaddrUnix:
 		return a.Name, nil;
 	}
-	return "", UnknownSocketFamily
+
+	return "", &UnknownSocketError{sa};
 }
 
 func ipToSockaddr(family int, ip IP, port int) (syscall.Sockaddr, os.Error) {
@@ -283,7 +322,7 @@
 	s, e := syscall.Socket(f, p, t);
 	if e != 0 {
 		syscall.ForkLock.RUnlock();
-		return nil, os.ErrnoToError(e)
+		return nil, os.Errno(e)
 	}
 	syscall.CloseOnExec(s);
 	syscall.ForkLock.RUnlock();
@@ -296,7 +335,7 @@
 		e = syscall.Bind(s, la);
 		if e != 0 {
 			syscall.Close(s);
-			return nil, os.ErrnoToError(e)
+			return nil, os.Errno(e)
 		}
 	}
 
@@ -304,7 +343,7 @@
 		e = syscall.Connect(s, ra);
 		if e != 0 {
 			syscall.Close(s);
-			return nil, os.ErrnoToError(e)
+			return nil, os.Errno(e)
 		}
 	}
 
@@ -390,12 +429,12 @@
 
 
 func setsockoptInt(fd, level, opt int, value int) os.Error {
-	return os.ErrnoToError(syscall.SetsockoptInt(fd, level, opt, value));
+	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, level, opt, value));
 }
 
 func setsockoptNsec(fd, level, opt int, nsec int64) os.Error {
 	var tv = syscall.NsecToTimeval(nsec);
-	return os.ErrnoToError(syscall.SetsockoptTimeval(fd, level, opt, &tv));
+	return os.NewSyscallError("setsockopt", syscall.SetsockoptTimeval(fd, level, opt, &tv));
 }
 
 func (c *connBase) SetReadBuffer(bytes int) os.Error {
@@ -450,7 +489,7 @@
 		l.Linger = 0;
 	}
 	e := syscall.SetsockoptLinger(c.sysFD(), syscall.SOL_SOCKET, syscall.SO_LINGER, &l);
-	return os.ErrnoToError(e);
+	return os.NewSyscallError("setsockopt", e);
 }
 
 
@@ -463,12 +502,12 @@
 
 	if laddr != "" {
 		if lip, lport, err = hostPortToIP(net, laddr, mode); err != nil {
-			return
+			goto Error;
 		}
 	}
 	if raddr != "" {
 		if rip, rport, err = hostPortToIP(net, raddr, mode); err != nil {
-			return
+			goto Error;
 		}
 	}
 
@@ -500,17 +539,27 @@
 	var la, ra syscall.Sockaddr;
 	if lip != nil {
 		if la, err = ipToSockaddr(family, lip, lport); err != nil {
-			return
+			goto Error;
 		}
 	}
 	if rip != nil {
 		if ra, err = ipToSockaddr(family, rip, rport); err != nil {
-			return
+			goto Error;
 		}
 	}
 
 	fd, err = socket(net, laddr, raddr, family, proto, 0, la, ra);
-	return fd, err
+	if err != nil {
+		goto Error;
+	}
+	return fd, nil;
+
+Error:
+	addr := raddr;
+	if mode == "listen" {
+		addr = laddr;
+	}
+	return nil, &OpError{mode, net, addr, err};
 }
 
 
@@ -541,7 +590,7 @@
 // and returns a ConnTCP structure.
 func DialTCP(net, laddr, raddr string) (c *ConnTCP, err os.Error) {
 	if raddr == "" {
-		return nil, MissingAddress
+		return nil, &OpError{"dial", "tcp", "", errMissingAddress}
 	}
 	fd, e := internetSocket(net, laddr, raddr, syscall.SOCK_STREAM, "dial");
 	if e != nil {
@@ -572,7 +621,7 @@
 // and returns a ConnUDP structure.
 func DialUDP(net, laddr, raddr string) (c *ConnUDP, err os.Error) {
 	if raddr == "" {
-		return nil, MissingAddress
+		return nil, &OpError{"dial", "udp", "", errMissingAddress}
 	}
 	fd, e := internetSocket(net, laddr, raddr, syscall.SOCK_DGRAM, "dial");
 	if e != nil {
@@ -593,7 +642,7 @@
 	var proto int;
 	switch net {
 	default:
-		return nil, UnknownNetwork;
+		return nil, UnknownNetworkError(net);
 	case "unix":
 		proto = syscall.SOCK_STREAM;
 	case "unix-dgram":
@@ -602,27 +651,40 @@
 
 	var la, ra syscall.Sockaddr;
 	switch mode {
+	default:
+		panic("unixSocket", mode);
+
 	case "dial":
 		if laddr != "" {
-			return nil, BadAddress;
+			return nil, &OpError{mode, net, raddr, &AddrError{"unexpected local address", laddr}}
 		}
 		if raddr == "" {
-			return nil, MissingAddress;
+			return nil, &OpError{mode, net, "", errMissingAddress}
 		}
 		ra = &syscall.SockaddrUnix{Name: raddr};
 
 	case "listen":
 		if laddr == "" {
-			return nil, MissingAddress;
+			return nil, &OpError{mode, net, "", errMissingAddress}
 		}
 		la = &syscall.SockaddrUnix{Name: laddr};
 		if raddr != "" {
-			return nil, BadAddress;
+			return nil, &OpError{mode, net, laddr, &AddrError{"unexpected remote address", raddr}}
 		}
 	}
 
 	fd, err = socket(net, laddr, raddr, syscall.AF_UNIX, proto, 0, la, ra);
-	return fd, err
+	if err != nil {
+		goto Error;
+	}
+	return fd, nil;
+
+Error:
+	addr := raddr;
+	if mode == "listen" {
+		addr = laddr;
+	}
+	return nil, &OpError{mode, net, addr, err};
 }
 
 // ConnUnix is an implementation of the Conn interface
@@ -663,6 +725,9 @@
 func ListenUnix(net, laddr string) (l *ListenerUnix, err os.Error) {
 	fd, e := unixSocket(net, laddr, "", "listen");
 	if e != nil {
+		if pe, ok := e.(*os.PathError); ok {
+			e = pe.Error;
+		}
 		// Check for socket ``in use'' but ``refusing connections,''
 		// which means some program created it and exited
 		// without unlinking it from the file system.
@@ -675,6 +740,9 @@
 		if e1 == nil {
 			fd1.Close();
 		}
+		if pe, ok := e1.(*os.PathError); ok {
+			e1 = pe.Error;
+		}
 		if e1 != os.ECONNREFUSED {
 			return nil, e;
 		}
@@ -688,7 +756,7 @@
 	e1 := syscall.Listen(fd.fd, 8); // listenBacklog());
 	if e1 != 0 {
 		syscall.Close(fd.fd);
-		return nil, os.ErrnoToError(e1);
+		return nil, &OpError{"listen", "unix", laddr, os.Errno(e1)};
 	}
 	return &ListenerUnix{fd, laddr}, nil;
 }
@@ -788,7 +856,7 @@
 		return c, err
 */
 	}
-	return nil, UnknownNetwork
+	return nil, &OpError{"dial", net, raddr, UnknownNetworkError(net)};
 }
 
 // A Listener is a generic network listener.
@@ -818,7 +886,7 @@
 	e1 := syscall.Listen(fd.fd, listenBacklog());
 	if e1 != 0 {
 		syscall.Close(fd.fd);
-		return nil, os.ErrnoToError(e1)
+		return nil, &OpError{"listen", "tcp", laddr, os.Errno(e1)};
 	}
 	l = new(ListenerTCP);
 	l.fd = fd;
@@ -884,6 +952,6 @@
 */
 	// BUG(rsc): Listen should support UDP.
 	}
-	return nil, UnknownNetwork
+	return nil, UnknownNetworkError(net);
 }
 
diff --git a/src/pkg/net/net_test.go b/src/pkg/net/net_test.go
new file mode 100644
index 0000000..cafca3c
--- /dev/null
+++ b/src/pkg/net/net_test.go
@@ -0,0 +1,72 @@
+// Copyright 2009 The Go 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 net
+
+import (
+	"net";
+	"os";
+	"regexp";
+	"testing";
+)
+
+type DialErrorTest struct {
+	Net string;
+	Laddr string;
+	Raddr string;
+	Pattern string;
+}
+
+var dialErrorTests = []DialErrorTest {
+	DialErrorTest{
+		"datakit", "", "mh/astro/r70",
+		"dial datakit mh/astro/r70: unknown network datakit",
+	},
+	DialErrorTest{
+		"tcp", "", "127.0.0.1:☺",
+		"dial tcp 127.0.0.1:☺: unknown port tcp/☺",
+	},
+	DialErrorTest{
+		"tcp", "", "no-such-name.google.com.:80",
+		"dial tcp no-such-name.google.com.:80: lookup no-such-name.google.com.: no such host",
+	},
+	DialErrorTest{
+		"tcp", "", "no-such-name.no-such-top-level-domain.:80",
+		"dial tcp no-such-name.no-such-top-level-domain.:80: lookup no-such-name.no-such-top-level-domain.: no such host",
+	},
+	DialErrorTest{
+		"tcp", "", "no-such-name:80",
+		"dial tcp no-such-name:80: lookup no-such-name.google.com.: no such host",
+	},
+	DialErrorTest{
+		"tcp", "", "mh/astro/r70:http",
+		"dial tcp mh/astro/r70:http: lookup mh/astro/r70: invalid domain name",
+	},
+	DialErrorTest{
+		"unix", "", "/etc/file-not-found",
+		"dial unix /etc/file-not-found: no such file or directory",
+	},
+	DialErrorTest{
+		"unix", "", "/etc/",
+		"dial unix /etc/: (permission denied|socket operation on non-socket)",
+	},
+}
+
+func TestDialError(t *testing.T) {
+	for i, tt := range dialErrorTests {
+		c, e := net.Dial(tt.Net, tt.Laddr, tt.Raddr);
+		if c != nil {
+			c.Close();
+		}
+		if e == nil {
+			t.Errorf("#%d: nil error, want match for %#q", i, tt.Pattern);
+			continue;
+		}
+		s := e.String();
+		match, err := regexp.Match(tt.Pattern, s);
+		if !match {
+			t.Errorf("#%d: %q, want match for %#q", i, s, tt.Pattern);
+		}
+	}
+}
diff --git a/src/pkg/net/parse.go b/src/pkg/net/parse.go
index 7d5dd8f..8b10519 100644
--- a/src/pkg/net/parse.go
+++ b/src/pkg/net/parse.go
@@ -12,10 +12,6 @@
 	"os";
 )
 
-type Error struct {
-	os.ErrorString
-}
-
 type file struct {
 	file *os.File;
 	data []byte;
diff --git a/src/pkg/net/port.go b/src/pkg/net/port.go
index 21e3b48a..a9cd98d 100644
--- a/src/pkg/net/port.go
+++ b/src/pkg/net/port.go
@@ -11,13 +11,8 @@
 	"net";
 	"once";
 	"os";
-	"strconv";
 )
 
-// The error returned by LookupPort when a network service
-// is not listed in the database.
-var ErrNoService = &Error{"unknown network service"};
-
 var services map[string] map[string] int
 var servicesError os.Error
 
@@ -65,13 +60,10 @@
 		network = "udp";
 	}
 
-	m, ok := services[network];
-	if !ok {
-		return 0, ErrNoService;
+	if m, ok := services[network]; ok {
+		if port, ok = m[service]; ok {
+			return;
+		}
 	}
-	port, ok = m[service];
-	if !ok {
-		return 0, ErrNoService;
-	}
-	return port, nil;
+	return 0, &AddrError{"unknown port", network + "/" + service};
 }
diff --git a/src/pkg/net/timeout_test.go b/src/pkg/net/timeout_test.go
index e08ce88..0aebce8 100644
--- a/src/pkg/net/timeout_test.go
+++ b/src/pkg/net/timeout_test.go
@@ -22,7 +22,7 @@
 	var b [100]byte;
 	n, err1 := fd.Read(&b);
 	t1 := time.Nanoseconds();
-	if n != 0 || err1 != os.EAGAIN {
+	if n != 0 || !isEAGAIN(err1) {
 		t.Errorf("fd.Read on %s %s did not return 0, EAGAIN: %v, %v", network, addr, n, err1);
 	}
 	if t1 - t0 < 0.5e8 || t1 - t0 > 1.5e8 {
diff --git a/src/pkg/os/dir_darwin_386.go b/src/pkg/os/dir_darwin_386.go
index 2803ece..791499d 100644
--- a/src/pkg/os/dir_darwin_386.go
+++ b/src/pkg/os/dir_darwin_386.go
@@ -38,9 +38,9 @@
 			d.nbuf, errno = syscall.Getdirentries(file.fd, d.buf, new(uintptr));
 			if errno != 0 {
 				d.nbuf = 0;
-				return names, ErrnoToError(errno)
+				return names, NewSyscallError("getdirentries", errno);
 			}
-			if d.nbuf == 0 {
+			if d.nbuf <= 0 {
 				break	// EOF
 			}
 		}
diff --git a/src/pkg/os/dir_darwin_amd64.go b/src/pkg/os/dir_darwin_amd64.go
index 2803ece..791499d 100644
--- a/src/pkg/os/dir_darwin_amd64.go
+++ b/src/pkg/os/dir_darwin_amd64.go
@@ -38,9 +38,9 @@
 			d.nbuf, errno = syscall.Getdirentries(file.fd, d.buf, new(uintptr));
 			if errno != 0 {
 				d.nbuf = 0;
-				return names, ErrnoToError(errno)
+				return names, NewSyscallError("getdirentries", errno);
 			}
-			if d.nbuf == 0 {
+			if d.nbuf <= 0 {
 				break	// EOF
 			}
 		}
diff --git a/src/pkg/os/dir_linux_386.go b/src/pkg/os/dir_linux_386.go
index c4594a5..d6d700b 100644
--- a/src/pkg/os/dir_linux_386.go
+++ b/src/pkg/os/dir_linux_386.go
@@ -47,10 +47,10 @@
 		if d.bufp >= d.nbuf {
 			var errno int;
 			d.nbuf, errno = syscall.Getdents(file.fd, d.buf);
-			if d.nbuf < 0 {
-				return names, ErrnoToError(errno)
+			if errno != 0 {
+				return names, NewSyscallError("getdents", errno)
 			}
-			if d.nbuf == 0 {
+			if d.nbuf <= 0 {
 				break	// EOF
 			}
 			d.bufp = 0;
diff --git a/src/pkg/os/dir_linux_amd64.go b/src/pkg/os/dir_linux_amd64.go
index 05b3d4c..8b1664f 100644
--- a/src/pkg/os/dir_linux_amd64.go
+++ b/src/pkg/os/dir_linux_amd64.go
@@ -43,10 +43,10 @@
 		if d.bufp >= d.nbuf {
 			var errno int;
 			d.nbuf, errno = syscall.Getdents(file.fd, d.buf);
-			if d.nbuf < 0 {
-				return names, ErrnoToError(errno)
+			if errno != 0 {
+				return names, NewSyscallError("getdents", errno)
 			}
-			if d.nbuf == 0 {
+			if d.nbuf <= 0 {
 				break	// EOF
 			}
 			d.bufp = 0;
diff --git a/src/pkg/os/error.go b/src/pkg/os/error.go
index 718499b..10a7d04 100644
--- a/src/pkg/os/error.go
+++ b/src/pkg/os/error.go
@@ -30,15 +30,6 @@
 	return syscall.Errstr(int(e))
 }
 
-// ErrnoToError converts errno to an Error (underneath, an Errno).
-// It returns nil for the "no error" errno.
-func ErrnoToError(errno int) Error {
-	if errno == 0 {
-		return nil
-	}
-	return Errno(errno)
-}
-
 // Commonly known Unix errors.
 var (
 	EPERM Error = Errno(syscall.EPERM);
@@ -81,3 +72,33 @@
 	ENAMETOOLONG Error = Errno(syscall.ENAMETOOLONG);
 )
 
+// PathError records an error and the operation and file path that caused it.
+type PathError struct {
+	Op string;
+	Path string;
+	Error Error;
+}
+
+func (e *PathError) String() string {
+	return e.Op + " " + e.Path + ": " + e.Error.String();
+}
+
+// SyscallError records an error from a specific system call.
+type SyscallError struct {
+	Syscall string;
+	Errno Errno;
+}
+
+func (e *SyscallError) String() string {
+	return e.Syscall + ": " + e.Errno.String();
+}
+
+// NewSyscallError returns, as an os.Error, a new SyscallError
+// with the given system call name and error number.
+// As a convenience, if errno is 0, NewSyscallError returns nil.
+func NewSyscallError(syscall string, errno int) os.Error {
+	if errno == 0 {
+		return nil;
+	}
+	return &SyscallError{syscall, Errno(errno)}
+}
diff --git a/src/pkg/os/exec.go b/src/pkg/os/exec.go
index c1551f8..a7430ef 100644
--- a/src/pkg/os/exec.go
+++ b/src/pkg/os/exec.go
@@ -30,7 +30,10 @@
 	}
 
 	p, e := syscall.ForkExec(argv0, argv, envv, dir, intfd);
-	return int(p), ErrnoToError(e);
+	if e != 0 {
+		return 0, &PathError{"fork/exec", argv0, Errno(e)};
+	}
+	return p, nil;
 }
 
 // Exec replaces the current process with an execution of the program
@@ -42,7 +45,10 @@
 		envv = Environ();
 	}
 	e := syscall.Exec(argv0, argv, envv);
-	return ErrnoToError(e);
+	if e != 0 {
+		return &PathError{"exec", argv0, Errno(e)};
+	}
+	return nil;
 }
 
 // TODO(rsc): Should os implement its own syscall.WaitStatus
@@ -79,10 +85,10 @@
 	}
 	pid1, e := syscall.Wait4(pid, &status, options, rusage);
 	if e != 0 {
-		return nil, ErrnoToError(e);
+		return nil, NewSyscallError("wait", e);
 	}
 	w = new(Waitmsg);
-	w.Pid = pid;
+	w.Pid = pid1;
 	w.WaitStatus = status;
 	w.Rusage = rusage;
 	return w, nil;
diff --git a/src/pkg/os/file.go b/src/pkg/os/file.go
index 5b61159..8c76735 100644
--- a/src/pkg/os/file.go
+++ b/src/pkg/os/file.go
@@ -37,11 +37,11 @@
 }
 
 // NewFile returns a new File with the given file descriptor and name.
-func NewFile(file int, name string) *File {
-	if file < 0 {
+func NewFile(fd int, name string) *File {
+	if fd < 0 {
 		return nil
 	}
-	return &File{file, name, nil, 0}
+	return &File{fd, name, nil, 0}
 }
 
 // Stdin, Stdout, and Stderr are open Files pointing to the standard input,
@@ -74,7 +74,7 @@
 func Open(name string, flag int, perm int) (file *File, err Error) {
 	r, e := syscall.Open(name, flag | syscall.O_CLOEXEC, perm);
 	if e != 0 {
-		return nil, ErrnoToError(e);
+		return nil, &PathError{"open", name, Errno(e)};
 	}
 
 	// There's a race here with fork/exec, which we are
@@ -83,7 +83,7 @@
 		syscall.CloseOnExec(r);
 	}
 
-	return NewFile(r, name), ErrnoToError(e)
+	return NewFile(r, name), nil;
 }
 
 // Close closes the File, rendering it unusable for I/O.
@@ -92,7 +92,10 @@
 	if file == nil {
 		return EINVAL
 	}
-	err := ErrnoToError(syscall.Close(file.fd));
+	var err os.Error;
+	if e := syscall.Close(file.fd); e != 0 {
+		err = &PathError{"close", file.name, Errno(e)};
+	}
 	file.fd = -1;  // so it can't be closed again
 	return err;
 }
@@ -124,7 +127,10 @@
 	if n == 0 && e == 0 {
 		return 0, EOF
 	}
-	return n, ErrnoToError(e);
+	if e != 0 {
+		err = &PathError{"read", file.name, Errno(e)};
+	}
+	return n, err
 }
 
 // Write writes len(b) bytes to the File.
@@ -146,7 +152,10 @@
 	} else {
 		file.nepipe = 0;
 	}
-	return n, ErrnoToError(e)
+	if e != 0 {
+		err = &PathError{"write", file.name, Errno(e)};
+	}
+	return n, err
 }
 
 // Seek sets the offset for the next Read or Write on file to offset, interpreted
@@ -155,11 +164,11 @@
 // It returns the new offset and an Error, if any.
 func (file *File) Seek(offset int64, whence int) (ret int64, err Error) {
 	r, e := syscall.Seek(file.fd, offset, whence);
-	if e != 0 {
-		return -1, ErrnoToError(e)
+	if e == 0 && file.dirinfo != nil && r != 0 {
+		e = syscall.EISDIR;
 	}
-	if file.dirinfo != nil && r != 0 {
-		return -1, ErrnoToError(syscall.EISDIR)
+	if e != 0 {
+		return 0, &PathError{"seek", file.name, Errno(e)};
 	}
 	return r, nil
 }
@@ -172,11 +181,7 @@
 	}
 	b := syscall.StringByteSlice(s);
 	b = b[0:len(b)-1];
-	r, e := syscall.Write(file.fd, b);
-	if r < 0 {
-		r = 0
-	}
-	return int(r), ErrnoToError(e)
+	return file.Write(b);
 }
 
 // Pipe returns a connected pair of Files; reads from r return bytes written to w.
@@ -189,7 +194,7 @@
 	e := syscall.Pipe(&p);
 	if e != 0 {
 		syscall.ForkLock.RUnlock();
-		return nil, nil, ErrnoToError(e)
+		return nil, nil, NewSyscallError("pipe", e);
 	}
 	syscall.CloseOnExec(p[0]);
 	syscall.CloseOnExec(p[1]);
@@ -201,7 +206,11 @@
 // Mkdir creates a new directory with the specified name and permission bits.
 // It returns an error, if any.
 func Mkdir(name string, perm int) Error {
-	return ErrnoToError(syscall.Mkdir(name, perm));
+	e := syscall.Mkdir(name, perm);
+	if e != 0 {
+		return &PathError{"mkdir", name, Errno(e)};
+	}
+	return nil;
 }
 
 // Stat returns a Dir structure describing the named file and an error, if any.
@@ -213,7 +222,7 @@
 	var lstat, stat syscall.Stat_t;
 	e := syscall.Lstat(name, &lstat);
 	if e != 0 {
-		return nil, ErrnoToError(e);
+		return nil, &PathError{"stat", name, Errno(e)};
 	}
 	statp := &lstat;
 	if lstat.Mode & syscall.S_IFMT == syscall.S_IFLNK {
@@ -231,7 +240,7 @@
 	var stat syscall.Stat_t;
 	e := syscall.Fstat(file.fd, &stat);
 	if e != 0 {
-		return nil, ErrnoToError(e)
+		return nil, &PathError{"stat", file.name, Errno(e)};
 	}
 	return dirFromStat(file.name, new(Dir), &stat, &stat), nil
 }
@@ -243,7 +252,7 @@
 	var stat syscall.Stat_t;
 	e := syscall.Lstat(name, &stat);
 	if e != 0 {
-		return nil, ErrnoToError(e)
+		return nil, &PathError{"lstat", name, Errno(e)};
 	}
 	return dirFromStat(name, new(Dir), &stat, &stat), nil
 }
@@ -290,13 +299,19 @@
 
 // Chdir changes the current working directory to the named directory.
 func Chdir(dir string) Error {
-	return ErrnoToError(syscall.Chdir(dir));
+	if e := syscall.Chdir(dir); e != 0 {
+		return &PathError{"chdir", dir, Errno(e)};
+	}
+	return nil;
 }
 
 // Chdir changes the current working directory to the file,
 // which must be a directory.
 func (f *File) Chdir() Error {
-	return ErrnoToError(syscall.Fchdir(f.fd));
+	if e := syscall.Fchdir(f.fd); e != 0 {
+		return &PathError{"chdir", f.name, Errno(e)};
+	}
+	return nil;
 }
 
 // Remove removes the named file or directory.
@@ -326,17 +341,38 @@
 	if e1 != syscall.ENOTDIR {
 		e = e1;
 	}
-	return ErrnoToError(e);
+	return &PathError{"remove", name, Errno(e)};
+}
+
+// LinkError records an error during a link or symlink
+// system call and the paths that caused it.
+type LinkError struct {
+	Op string;
+	Old string;
+	New string;
+	Error Error;
+}
+
+func (e *LinkError) String() string {
+	return e.Op + " " + e.Old + " " + e.New + ": " + e.Error.String();
 }
 
 // Link creates a hard link.
 func Link(oldname, newname string) Error {
-	return ErrnoToError(syscall.Link(oldname, newname));
+	e := syscall.Link(oldname, newname);
+	if e != 0 {
+		return &LinkError{"link", oldname, newname, Errno(e)};
+	}
+	return nil;
 }
 
 // Symlink creates a symbolic link.
 func Symlink(oldname, newname string) Error {
-	return ErrnoToError(syscall.Symlink(oldname, newname));
+	e := syscall.Symlink(oldname, newname);
+	if e != 0 {
+		return &LinkError{"symlink", oldname, newname, Errno(e)};
+	}
+	return nil;
 }
 
 // Readlink reads the contents of a symbolic link: the destination of
@@ -346,7 +382,7 @@
 		b := make([]byte, len);
 		n, e := syscall.Readlink(name, b);
 		if e != 0 {
-			return "", ErrnoToError(e);
+			return "", &PathError{"readlink", name, Errno(e)};
 		}
 		if n < len {
 			return string(b[0:n]), nil;
@@ -359,40 +395,61 @@
 // Chmod changes the mode of the named file to mode.
 // If the file is a symbolic link, it changes the uid and gid of the link's target.
 func Chmod(name string, mode int) Error {
-	return ErrnoToError(syscall.Chmod(name, mode));
+	if e := syscall.Chmod(name, mode); e != 0 {
+		return &PathError{"chmod", name, Errno(e)};
+	}
+	return nil;
 }
 
 // Chmod changes the mode of the file to mode.
 func (f *File) Chmod(mode int) Error {
-	return ErrnoToError(syscall.Fchmod(f.fd, mode));
+	if e := syscall.Fchmod(f.fd, mode); e != 0 {
+		return &PathError{"chmod", f.name, Errno(e)};
+	}
+	return nil;
 }
 
 // Chown changes the numeric uid and gid of the named file.
 // If the file is a symbolic link, it changes the uid and gid of the link's target.
 func Chown(name string, uid, gid int) Error {
-	return ErrnoToError(syscall.Chown(name, uid, gid));
+	if e := syscall.Chown(name, uid, gid); e != 0 {
+		return &PathError{"chown", name, Errno(e)};
+	}
+	return nil;
 }
 
 // Lchown changes the numeric uid and gid of the named file.
 // If the file is a symbolic link, it changes the uid and gid of the link itself.
 func Lchown(name string, uid, gid int) Error {
-	return ErrnoToError(syscall.Lchown(name, uid, gid));
+	if e := syscall.Lchown(name, uid, gid); e != 0 {
+		return &PathError{"lchown", name, Errno(e)};
+	}
+	return nil;
 }
 
 // Chown changes the numeric uid and gid of the named file.
 func (f *File) Chown(uid, gid int) Error {
-	return ErrnoToError(syscall.Fchown(f.fd, uid, gid));
+	if e := syscall.Fchown(f.fd, uid, gid); e != 0 {
+		return &PathError{"chown", f.name, Errno(e)};
+	}
+	return nil;
 }
 
 // Truncate changes the size of the named file.
 // If the file is a symbolic link, it changes the size of the link's target.
 func Truncate(name string, size int64) Error {
-	return ErrnoToError(syscall.Truncate(name, size));
+	if e := syscall.Truncate(name, size); e != 0 {
+		return &PathError{"truncate", name, Errno(e)};
+	}
+	return nil;
 }
 
 // Truncate changes the size of the file.
 // It does not change the I/O offset.
 func (f *File) Truncate(size int64) Error {
-	return ErrnoToError(syscall.Ftruncate(f.fd, size));
+	if e := syscall.Ftruncate(f.fd, size); e != 0 {
+		return &PathError{"truncate", f.name, Errno(e)};
+	}
+	return nil;
 }
 
diff --git a/src/pkg/os/getwd.go b/src/pkg/os/getwd.go
index 2d7b754..cbc6134 100644
--- a/src/pkg/os/getwd.go
+++ b/src/pkg/os/getwd.go
@@ -17,7 +17,7 @@
 	// If the operating system provides a Getwd call, use it.
 	if syscall.ImplementsGetwd {
 		s, e := syscall.Getwd();
-		return s, ErrnoToError(e);
+		return s, NewSyscallError("getwd", e);
 	}
 
 	// Otherwise, we're trying to find our way back to ".".
diff --git a/src/pkg/os/os_test.go b/src/pkg/os/os_test.go
index 77b6944..fb555eb 100644
--- a/src/pkg/os/os_test.go
+++ b/src/pkg/os/os_test.go
@@ -549,3 +549,41 @@
 	}
 	f.Close();
 }
+
+type openErrorTest struct {
+	path string;
+	mode int;
+	error string;
+}
+
+var openErrorTests = []openErrorTest {
+	openErrorTest {
+		"/etc/no-such-file",
+		O_RDONLY,
+		"open /etc/no-such-file: no such file or directory",
+	},
+	openErrorTest {
+		"/etc",
+		O_WRONLY,
+		"open /etc: is a directory",
+	},
+	openErrorTest {
+		"/etc/passwd/group",
+		O_WRONLY,
+		"open /etc/passwd/group: not a directory",
+	},
+}
+
+func TestOpenError(t *testing.T) {
+	for i, tt := range openErrorTests {
+		f, err := Open(tt.path, tt.mode, 0);
+		if err == nil {
+			t.Errorf("Open(%q, %d) succeeded", tt.path, tt.mode);
+			f.Close();
+			continue;
+		}
+		if s := err.String(); s != tt.error {
+			t.Errorf("Open(%q, %d) = _, %q; want %q", tt.path, tt.mode, s, tt.error);
+		}
+	}
+}
diff --git a/src/pkg/os/path.go b/src/pkg/os/path.go
index 0b86b8f..d8efe51 100644
--- a/src/pkg/os/path.go
+++ b/src/pkg/os/path.go
@@ -6,16 +6,6 @@
 
 import "os"
 
-// PathError reports an error and the file path where it occurred.
-type PathError struct {
-	Path string;
-	Error Error;
-}
-
-func (p *PathError) String() string {
-	return p.Path + ": " + p.Error.String();
-}
-
 // MkdirAll creates a directory named path,
 // along with any necessary parents, and returns nil,
 // or else returns an error.
@@ -30,7 +20,7 @@
 		if dir.IsDirectory() {
 			return nil;
 		}
-		return &PathError{path, ENOTDIR};
+		return &PathError{"mkdir", path, ENOTDIR};
 	}
 
 	// Doesn't already exist; make sure parent does.
@@ -61,7 +51,7 @@
 		if err1 == nil && dir.IsDirectory() {
 			return nil;
 		}
-		return &PathError{path, err};
+		return err;
 	}
 	return nil;
 }
@@ -77,19 +67,19 @@
 	}
 
 	// Otherwise, is this a directory we need to recurse into?
-	dir, err1 := os.Lstat(path);
-	if err1 != nil {
-		return &PathError{path, err1};
+	dir, err := os.Lstat(path);
+	if err != nil {
+		return err;
 	}
 	if !dir.IsDirectory() {
 		// Not a directory; return the error from Remove.
-		return &PathError{path, err};
+		return err;
 	}
 
 	// Directory.
 	fd, err := Open(path, os.O_RDONLY, 0);
 	if err != nil {
-		return &PathError{path, err};
+		return err;
 	}
 	defer fd.Close();
 
@@ -99,13 +89,13 @@
 		names, err1 := fd.Readdirnames(100);
 		for i, name := range names {
 			err1 := RemoveAll(path + "/" + name);
-			if err1 != nil && err == nil {
+			if err == nil {
 				err = err1;
 			}
 		}
 		// If Readdirnames returned an error, use it.
-		if err1 != nil && err == nil {
-			err = &PathError{path, err1};
+		if err == nil {
+			err = err1;
 		}
 		if len(names) == 0 {
 			break;
@@ -113,9 +103,9 @@
 	}
 
 	// Remove directory.
-	err1 = Remove(path);
-	if err1 != nil && err == nil {
-		err = &PathError{path, err1};
+	err1 := Remove(path);
+	if err == nil {
+		err = err1;
 	}
 	return err;
 }
diff --git a/src/pkg/os/proc.go b/src/pkg/os/proc.go
index d2fd649..9920c13 100644
--- a/src/pkg/os/proc.go
+++ b/src/pkg/os/proc.go
@@ -39,7 +39,7 @@
 // Getgroups returns a list of the numeric ids of groups that the caller belongs to.
 func Getgroups() ([]int, os.Error) {
 	gids, errno := syscall.Getgroups();
-	return gids, ErrnoToError(errno);
+	return gids, NewSyscallError("getgroups", errno);
 }
 
 // Exit causes the current program to exit with the given status code.
diff --git a/src/pkg/os/time.go b/src/pkg/os/time.go
index 3eee243..e102206 100644
--- a/src/pkg/os/time.go
+++ b/src/pkg/os/time.go
@@ -17,7 +17,7 @@
 func Time() (sec int64, nsec int64, err Error) {
 	var tv syscall.Timeval;
 	if errno := syscall.Gettimeofday(&tv); errno != 0 {
-		return 0, 0, ErrnoToError(errno)
+		return 0, 0, NewSyscallError("gettimeofday", errno);
 	}
 	return int64(tv.Sec), int64(tv.Usec)*1000, err;
 }
diff --git a/src/pkg/runtime/Makefile b/src/pkg/runtime/Makefile
index 281dca9..e1c320c 100644
--- a/src/pkg/runtime/Makefile
+++ b/src/pkg/runtime/Makefile
@@ -85,9 +85,13 @@
 
 all: $(LIB) runtime.acid
 
-install: $(LIB) runtime.acid
+TARG=$(GOROOT)/pkg/$(GOOS)_$(GOARCH)/$(LIB)
+
+install: $(TARG)
+
+$(TARG): $(LIB) runtime.acid
 	test -d $(GOROOT)/pkg && mkdir -p $(GOROOT)/pkg/$(GOOS)_$(GOARCH)
-	cp $(LIB) $(GOROOT)/pkg/$(GOOS)_$(GOARCH)/$(LIB)
+	cp $(LIB) $(TARG)
 	cp runtime.acid $(GOROOT)/acid/runtime.acid
 
 $(LIB): $(OFILES)
@@ -96,7 +100,7 @@
 $(OFILES): $(HFILES)
 
 nuke:
-	rm -f *.[568] *.a $(GOROOT)/lib/$(LIB)
+	rm -f *.[568] *.a $(TARG)
 
 clean:
 	rm -f *.[568] *.a runtime.acid cgo2c */asm.h
diff --git a/src/pkg/strconv/Makefile b/src/pkg/strconv/Makefile
index 499f8c1..f295218 100644
--- a/src/pkg/strconv/Makefile
+++ b/src/pkg/strconv/Makefile
@@ -2,6 +2,7 @@
 # Use of this source code is governed by a BSD-style
 # license that can be found in the LICENSE file.
 
+
 # DO NOT EDIT.  Automatically generated by gobuild.
 # gobuild -m >Makefile
 
@@ -20,7 +21,7 @@
 
 coverage: packages
 	gotest
-	6cov -g `pwd` | grep -v '_test\.go:'
+	6cov -g $$(pwd) | grep -v '_test\.go:'
 
 %.$O: %.go
 	$(GC) -I_obj $*.go
@@ -32,12 +33,12 @@
 	$(AS) $*.s
 
 O1=\
-	atoi.$O\
 	decimal.$O\
 	itoa.$O\
 	quote.$O\
 
 O2=\
+	atoi.$O\
 	ftoa.$O\
 
 O3=\
@@ -48,11 +49,11 @@
 _obj$D/strconv.a: phases
 
 a1: $(O1)
-	$(AR) grc _obj$D/strconv.a atoi.$O decimal.$O itoa.$O quote.$O
+	$(AR) grc _obj$D/strconv.a decimal.$O itoa.$O quote.$O
 	rm -f $(O1)
 
 a2: $(O2)
-	$(AR) grc _obj$D/strconv.a ftoa.$O
+	$(AR) grc _obj$D/strconv.a atoi.$O ftoa.$O
 	rm -f $(O2)
 
 a3: $(O3)
diff --git a/src/pkg/strconv/atof.go b/src/pkg/strconv/atof.go
index c257b2a..6d6ec56 100644
--- a/src/pkg/strconv/atof.go
+++ b/src/pkg/strconv/atof.go
@@ -316,15 +316,18 @@
 // Atof32 returns the nearest floating point number rounded
 // using IEEE754 unbiased rounding.
 //
-// If s is not syntactically well-formed, Atof32 returns err = os.EINVAL.
+// The errors that Atof32 returns have concrete type *NumError
+// and include err.Num = s.
+//
+// If s is not syntactically well-formed, Atof32 returns err.Error = os.EINVAL.
 //
 // If s is syntactically well-formed but is more than 1/2 ULP
 // away from the largest floating point number of the given size,
-// Atof32 returns f = ±Inf, err = os.ERANGE.
+// Atof32 returns f = ±Inf, err.Error = os.ERANGE.
 func Atof32(s string) (f float32, err os.Error) {
 	neg, d, trunc, ok := stringToDecimal(s);
 	if !ok {
-		return 0, os.EINVAL;
+		return 0, &NumError{s, os.EINVAL};
 	}
 	if optimize {
 		if f, ok := decimalAtof32(neg, d, trunc); ok {
@@ -334,7 +337,7 @@
 	b, ovf := decimalToFloatBits(neg, d, trunc, &float32info);
 	f = math.Float32frombits(uint32(b));
 	if ovf {
-		err = os.ERANGE;
+		err = &NumError{s, os.ERANGE};
 	}
 	return f, err
 }
@@ -345,7 +348,7 @@
 func Atof64(s string) (f float64, err os.Error) {
 	neg, d, trunc, ok := stringToDecimal(s);
 	if !ok {
-		return 0, os.EINVAL;
+		return 0, &NumError{s, os.EINVAL};
 	}
 	if optimize {
 		if f, ok := decimalAtof64(neg, d, trunc); ok {
@@ -355,7 +358,7 @@
 	b, ovf := decimalToFloatBits(neg, d, trunc, &float64info);
 	f = math.Float64frombits(b);
 	if ovf {
-		err = os.ERANGE;
+		err = &NumError{s, os.ERANGE};
 	}
 	return f, err
 }
diff --git a/src/pkg/strconv/atof_test.go b/src/pkg/strconv/atof_test.go
index 6782f27..ecccab7 100644
--- a/src/pkg/strconv/atof_test.go
+++ b/src/pkg/strconv/atof_test.go
@@ -6,6 +6,7 @@
 import (
 	"fmt";
 	"os";
+	"reflect";
 	"strconv";
 	"testing"
 )
@@ -91,6 +92,17 @@
 	atofTest{ ".e-1", "0", os.EINVAL },
 }
 
+func init() {
+	// The atof routines return NumErrors wrapping
+	// the error and the string.  Convert the table above.
+	for i := range atoftests {
+		test := &atoftests[i];
+		if test.err != nil {
+			test.err = &NumError{test.in, test.err}
+		}
+	}
+}
+
 func testAtof(t *testing.T, opt bool) {
 	oldopt := strconv.optimize;
 	strconv.optimize = opt;
@@ -98,7 +110,7 @@
 		test := &atoftests[i];
 		out, err := strconv.Atof64(test.in);
 		outs := strconv.Ftoa64(out, 'g', -1);
-		if outs != test.out || err != test.err {
+		if outs != test.out || !reflect.DeepEqual(err, test.err) {
 			t.Errorf("strconv.Atof64(%v) = %v, %v want %v, %v\n",
 				test.in, out, err, test.out, test.err);
 		}
@@ -106,7 +118,7 @@
 		if float64(float32(out)) == out {
 			out32, err := strconv.Atof32(test.in);
 			outs := strconv.Ftoa32(out32, 'g', -1);
-			if outs != test.out || err != test.err {
+			if outs != test.out || !reflect.DeepEqual(err, test.err) {
 				t.Errorf("strconv.Atof32(%v) = %v, %v want %v, %v  # %v\n",
 					test.in, out32, err, test.out, test.err, out);
 			}
@@ -115,7 +127,7 @@
 		if FloatSize == 64 || float64(float32(out)) == out {
 			outf, err := strconv.Atof(test.in);
 			outs := strconv.Ftoa(outf, 'g', -1);
-			if outs != test.out || err != test.err {
+			if outs != test.out || !reflect.DeepEqual(err, test.err) {
 				t.Errorf("strconv.Ftoa(%v) = %v, %v want %v, %v  # %v\n",
 					test.in, outf, err, test.out, test.err, out);
 			}
diff --git a/src/pkg/strconv/atoi.go b/src/pkg/strconv/atoi.go
index a5d896a..857b1af 100644
--- a/src/pkg/strconv/atoi.go
+++ b/src/pkg/strconv/atoi.go
@@ -3,7 +3,20 @@
 // license that can be found in the LICENSE file.
 
 package strconv
-import "os"
+import (
+	"os";
+	"strconv"
+)
+
+type NumError struct {
+	Num string;
+	Error os.Error;
+}
+
+func (e *NumError) String() string {
+	return "parsing " + e.Num + ": " + e.Error.String();
+}
+
 
 func computeIntsize() uint {
 	siz := uint(8);
@@ -25,13 +38,18 @@
 // Btoui64 interprets a string s in an arbitrary base b (2 to 36)
 // and returns the corresponding value n.
 //
-// Btoui64 returns err == os.EINVAL if b is out of
-// range or s is empty or contains invalid digits.
-// It returns err == os.ERANGE if the value corresponding
-// to s cannot be represented by a uint64.
+// The errors that Btoui64 returns have concrete type *NumError
+// and include err.Num = s.  If s is empty or contains invalid
+// digits, err.Error = os.EINVAL; if the value corresponding
+// to s cannot be represented by a uint64, err.Error = os.ERANGE.
 func Btoui64(s string, b int) (n uint64, err os.Error) {
-	if b < 2 || b > 36 || len(s) < 1 {
-		return 0, os.EINVAL;
+	if b < 2 || b > 36 {
+		err = os.ErrorString("invalid base " + Itoa(b));
+		goto Error;
+	}
+	if len(s) < 1 {
+		err = os.EINVAL;
+		goto Error;
 	}
 
 	n = 0;
@@ -47,27 +65,38 @@
 		case 'A' <= s[i] && s[i] <= 'Z':
 			v = s[i] - 'A' + 10;
 		default:
-			return 0, os.EINVAL;
+			n = 0;
+			err = os.EINVAL;
+			goto Error;
 		}
 		if int(v) >= b {
-			return 0, os.EINVAL;
+			n = 0;
+			err = os.EINVAL;
+			goto Error;
 		}
 
 		if n >= cutoff {
 			// n*b overflows
-			return 1<<64-1, os.ERANGE;
+			n = 1<<64-1;
+			err = os.ERANGE;
+			goto Error;
 		}
 		n *= uint64(b);
 
 		n1 := n+uint64(v);
 		if n1 < n {
 			// n+v overflows
-			return 1<<64-1, os.ERANGE;
+			n = 1<<64-1;
+			err = os.ERANGE;
+			goto Error;
 		}
 		n = n1;
 	}
 
 	return n, nil;
+
+Error:
+	return n, &NumError{s, err};
 }
 
 // Atoui64 interprets a string s as an unsigned decimal, octal, or
@@ -80,7 +109,7 @@
 func Atoui64(s string) (n uint64, err os.Error) {
 	// Empty string bad.
 	if len(s) == 0 {
-		return 0, os.EINVAL
+		return 0, &NumError{s, os.EINVAL}
 	}
 
 	// Look for octal, hex prefix.
@@ -102,7 +131,7 @@
 func Atoi64(s string) (i int64, err os.Error) {
 	// Empty string bad.
 	if len(s) == 0 {
-		return 0, os.EINVAL
+		return 0, &NumError{s, os.EINVAL}
 	}
 
 	// Pick off leading sign.
@@ -117,14 +146,14 @@
 	// Convert unsigned and check range.
 	var un uint64;
 	un, err = Atoui64(s);
-	if err != nil && err != os.ERANGE {
+	if err != nil && err.(*NumError).Error != os.ERANGE {
 		return 0, err
 	}
 	if !neg && un >= 1<<63 {
-		return 1<<63-1, os.ERANGE
+		return 1<<63-1, &NumError{s, os.ERANGE}
 	}
 	if neg && un > 1<<63 {
-		return -1<<63, os.ERANGE
+		return -1<<63, &NumError{s, os.ERANGE}
 	}
 	n := int64(un);
 	if neg {
@@ -136,14 +165,12 @@
 // Atoui is like Atoui64 but returns its result as a uint.
 func Atoui(s string) (i uint, err os.Error) {
 	i1, e1 := Atoui64(s);
-	if e1 != nil && e1 != os.ERANGE {
+	if e1 != nil && e1.(*NumError).Error != os.ERANGE {
 		return 0, e1
 	}
 	i = uint(i1);
 	if uint64(i) != i1 {
-		// TODO: return uint(^0), os.ERANGE.
-		i1 = 1<<64-1;
-		return uint(i1), os.ERANGE
+		return ^uint(0), &NumError{s, os.ERANGE}
 	}
 	return i, nil
 }
@@ -151,15 +178,15 @@
 // Atoi is like Atoi64 but returns its result as an int.
 func Atoi(s string) (i int, err os.Error) {
 	i1, e1 := Atoi64(s);
-	if e1 != nil && e1 != os.ERANGE {
+	if e1 != nil && e1.(*NumError).Error != os.ERANGE {
 		return 0, e1
 	}
 	i = int(i1);
 	if int64(i) != i1 {
 		if i1 < 0 {
-			return -1<<(intsize-1), os.ERANGE
+			return -1<<(intsize-1), &NumError{s, os.ERANGE}
 		}
-		return 1<<(intsize-1) - 1, os.ERANGE
+		return 1<<(intsize-1) - 1, &NumError{s, os.ERANGE}
 	}
 	return i, nil
 }
diff --git a/src/pkg/strconv/atoi_test.go b/src/pkg/strconv/atoi_test.go
index e4a9f95..2483a6f 100644
--- a/src/pkg/strconv/atoi_test.go
+++ b/src/pkg/strconv/atoi_test.go
@@ -7,6 +7,7 @@
 import (
 	"fmt";
 	"os";
+	"reflect";
 	"strconv";
 	"testing"
 )
@@ -44,7 +45,7 @@
 	err os.Error;
 }
 
-var atoi64test = []atoi64Test {
+var atoi64tests = []atoi64Test {
 	atoi64Test{"", 0, os.EINVAL},
 	atoi64Test{"0", 0, nil},
 	atoi64Test{"-0", 0, nil},
@@ -118,11 +119,40 @@
 	atoi32Test{"-2147483649", -1<<31, os.ERANGE},
 }
 
+func init() {
+	// The atoi routines return NumErrors wrapping
+	// the error and the string.  Convert the tables above.
+	for i := range atoui64tests {
+		test := &atoui64tests[i];
+		if test.err != nil {
+			test.err = &NumError{test.in, test.err}
+		}
+	}
+	for i := range atoi64tests {
+		test := &atoi64tests[i];
+		if test.err != nil {
+			test.err = &NumError{test.in, test.err}
+		}
+	}
+	for i := range atoui32tests {
+		test := &atoui32tests[i];
+		if test.err != nil {
+			test.err = &NumError{test.in, test.err}
+		}
+	}
+	for i := range atoi32tests {
+		test := &atoi32tests[i];
+		if test.err != nil {
+			test.err = &NumError{test.in, test.err}
+		}
+	}
+}
+
 func TestAtoui64(t *testing.T) {
-	for i := 0; i < len(atoui64tests); i++ {
+	for i := range atoui64tests {
 		test := &atoui64tests[i];
 		out, err := strconv.Atoui64(test.in);
-		if test.out != out || test.err != err {
+		if test.out != out || !reflect.DeepEqual(test.err, err) {
 			t.Errorf("strconv.Atoui64(%v) = %v, %v want %v, %v\n",
 				test.in, out, err, test.out, test.err);
 		}
@@ -130,10 +160,10 @@
 }
 
 func TestAtoi64(t *testing.T) {
-	for i := 0; i < len(atoi64test); i++ {
-		test := &atoi64test[i];
+	for i := range atoi64tests {
+		test := &atoi64tests[i];
 		out, err := strconv.Atoi64(test.in);
-		if test.out != out || test.err != err {
+		if test.out != out || !reflect.DeepEqual(test.err, err) {
 			t.Errorf("strconv.Atoi64(%v) = %v, %v want %v, %v\n",
 				test.in, out, err, test.out, test.err);
 		}
@@ -143,19 +173,19 @@
 func TestAtoui(t *testing.T) {
 	switch intsize {
 	case 32:
-		for i := 0; i < len(atoui32tests); i++ {
+		for i := range atoui32tests {
 			test := &atoui32tests[i];
 			out, err := strconv.Atoui(test.in);
-			if test.out != uint32(out) || test.err != err {
+			if test.out != uint32(out) || !reflect.DeepEqual(test.err, err) {
 				t.Errorf("strconv.Atoui(%v) = %v, %v want %v, %v\n",
 					test.in, out, err, test.out, test.err);
 			}
 		}
 	case 64:
-		for i := 0; i < len(atoui64tests); i++ {
+		for i := range atoui64tests {
 			test := &atoui64tests[i];
 			out, err := strconv.Atoui(test.in);
-			if test.out != uint64(out) || test.err != err {
+			if test.out != uint64(out) || !reflect.DeepEqual(test.err, err) {
 				t.Errorf("strconv.Atoui(%v) = %v, %v want %v, %v\n",
 					test.in, out, err, test.out, test.err);
 			}
@@ -166,19 +196,19 @@
 func TestAtoi(t *testing.T) {
 	switch intsize {
 	case 32:
-		for i := 0; i < len(atoi32tests); i++ {
+		for i := range atoi32tests {
 			test := &atoi32tests[i];
 			out, err := strconv.Atoi(test.in);
-			if test.out != int32(out) || test.err != err {
+			if test.out != int32(out) || !reflect.DeepEqual(test.err, err) {
 				t.Errorf("strconv.Atoi(%v) = %v, %v want %v, %v\n",
 					test.in, out, err, test.out, test.err);
 			}
 		}
 	case 64:
-		for i := 0; i < len(atoi64test); i++ {
-			test := &atoi64test[i];
+		for i := range atoi64tests {
+			test := &atoi64tests[i];
 			out, err := strconv.Atoi(test.in);
-			if test.out != int64(out) || test.err != err {
+			if test.out != int64(out) || !reflect.DeepEqual(test.err, err) {
 				t.Errorf("strconv.Atoi(%v) = %v, %v want %v, %v\n",
 					test.in, out, err, test.out, test.err);
 			}
diff --git a/src/pkg/time/sleep.go b/src/pkg/time/sleep.go
index 3bb76cf..6f9ab12 100644
--- a/src/pkg/time/sleep.go
+++ b/src/pkg/time/sleep.go
@@ -13,5 +13,5 @@
 // Sleep pauses the current goroutine for ns nanoseconds.
 // It returns os.EINTR if interrupted.
 func Sleep(ns int64) os.Error {
-	return os.ErrnoToError(syscall.Sleep(ns));
+	return os.NewSyscallError("sleep", syscall.Sleep(ns));
 }
diff --git a/src/pkg/time/time.go b/src/pkg/time/time.go
index ea9b66c..3d69d99 100644
--- a/src/pkg/time/time.go
+++ b/src/pkg/time/time.go
@@ -159,10 +159,7 @@
 // SecondsToLocalTime converts sec, in number of seconds since the Unix epoch,
 // into a parsed Time value in the local time zone.
 func SecondsToLocalTime(sec int64) *Time {
-	z, offset, err := time.lookupTimezone(sec);
-	if err != nil {
-		return SecondsToUTC(sec)
-	}
+	z, offset := time.lookupTimezone(sec);
 	t := SecondsToUTC(sec+int64(offset));
 	t.Zone = z;
 	t.ZoneOffset = offset;
diff --git a/src/pkg/time/zoneinfo.go b/src/pkg/time/zoneinfo.go
index c4fe814..e2102f1 100644
--- a/src/pkg/time/zoneinfo.go
+++ b/src/pkg/time/zoneinfo.go
@@ -21,14 +21,6 @@
 	zoneDir = "/usr/share/zoneinfo/";
 )
 
-// Errors that can be generated recovering time zone information.
-type TimeZoneError struct {
-	os.ErrorString
-}
-
-var errShort = TimeZoneError{ "time: short zone file" }
-var errInvalid = TimeZoneError{ "time: invalid zone file" }
-
 // Simple I/O interface to binary blob of data.
 type data struct {
 	p []byte;
@@ -89,18 +81,18 @@
 	isstd, isutc bool;	// ignored - no idea what these mean
 }
 
-func parseinfo(bytes []byte) (zt []zonetime, err os.Error) {
+func parseinfo(bytes []byte) (zt []zonetime, ok bool) {
 	d := data{bytes, false};
 
 	// 4-byte magic "TZif"
 	if magic := d.read(4); string(magic) != "TZif" {
-		return nil, TimeZoneError{ "time: bad zone magic" }
+		return nil, false
 	}
 
 	// 1-byte version, then 15 bytes of padding
 	var p []byte;
 	if p = d.read(16); len(p) != 16 || p[0] != 0 && p[0] != '2' {
-		return nil, TimeZoneError { "time: bad zone file version" }
+		return nil, false
 	}
 	vers := p[0];
 
@@ -123,7 +115,7 @@
 	for i := 0; i < 6; i++ {
 		nn, ok := d.big4();
 		if !ok {
-			return nil, errShort
+			return nil, false
 		}
 		n[i] = int(nn);
 	}
@@ -152,7 +144,7 @@
 	isutc := d.read(n[NUTCLocal]);
 
 	if d.error {	// ran out of data
-		return nil, errShort
+		return nil, false
 	}
 
 	// If version == 2, the entire file repeats, this time using
@@ -167,16 +159,16 @@
 		var ok bool;
 		var n uint32;
 		if n, ok = zonedata.big4(); !ok {
-			return nil, errShort
+			return nil, false
 		}
 		z[i].utcoff = int(n);
 		var b byte;
 		if b, ok = zonedata.byte(); !ok {
-			return nil, errShort
+			return nil, false
 		}
 		z[i].isdst = b != 0;
 		if b, ok = zonedata.byte(); !ok || int(b) >= len(abbrev) {
-			return nil, errInvalid
+			return nil, false
 		}
 		z[i].name = byteString(abbrev[b:len(abbrev)])
 	}
@@ -187,11 +179,11 @@
 		var ok bool;
 		var n uint32;
 		if n, ok = txtimes.big4(); !ok {
-			return nil, errShort
+			return nil, false
 		}
 		zt[i].time = int32(n);
 		if int(txzones[i]) >= len(z) {
-			return nil, errInvalid
+			return nil, false
 		}
 		zt[i].zone = &z[txzones[i]];
 		if i < len(isstd) {
@@ -201,29 +193,18 @@
 			zt[i].isutc = isutc[i] != 0
 		}
 	}
-	return zt, nil
+	return zt, true
 }
 
-func readinfofile(name string) ([]zonetime, os.Error) {
+func readinfofile(name string) ([]zonetime, bool) {
 	buf, err := io.ReadFile(name);
 	if err != nil {
-		goto Error;
+		return nil, false
 	}
-	tx, err := parseinfo(buf);
-	if err != nil {
-		goto Error;
-	}
-	return tx, nil;
-
-Error:
-	if tzerr, ok := err.(TimeZoneError); ok {
-		tzerr.ErrorString = os.ErrorString(tzerr.String() + ": " + name)
-	}
-	return nil, err
+	return parseinfo(buf);
 }
 
 var zones []zonetime
-var zoneerr os.Error
 
 func setupZone() {
 	// consult $TZ to find the time zone to use.
@@ -232,23 +213,21 @@
 	// $TZ="foo" means use /usr/share/zoneinfo/foo.
 
 	tz, err := os.Getenv("TZ");
-	var file string;
+	var ok bool;
 	switch {
 	case err == os.ENOENV:
-		zones, zoneerr = readinfofile("/etc/localtime");
-	case err != nil:
-		zoneerr = err;
+		zones, ok = readinfofile("/etc/localtime");
 	case len(tz) > 0:
-		zones, zoneerr = readinfofile(zoneDir + tz);
+		zones, ok = readinfofile(zoneDir + tz);
 	case len(tz) == 0:
 		// do nothing: use UTC
 	}
 }
 
-func lookupTimezone(sec int64) (zone string, offset int, err os.Error) {
+func lookupTimezone(sec int64) (zone string, offset int) {
 	once.Do(setupZone);
-	if zoneerr != nil || len(zones) == 0 {
-		return "UTC", 0, zoneerr
+	if len(zones) == 0 {
+		return "UTC", 0
 	}
 
 	// Binary search for entry with largest time <= sec
@@ -262,5 +241,5 @@
 		}
 	}
 	z := tz[0].zone;
-	return z.name, z.utcoff, nil
+	return z.name, z.utcoff
 }
