]> Cypherpunks repositories - gostls13.git/commitdiff
various: reduce overuse of os.EINVAL + others
authorRuss Cox <rsc@golang.org>
Mon, 14 Nov 2011 03:42:42 +0000 (22:42 -0500)
committerRuss Cox <rsc@golang.org>
Mon, 14 Nov 2011 03:42:42 +0000 (22:42 -0500)
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5372081

15 files changed:
src/pkg/bufio/bufio_test.go
src/pkg/compress/lzw/reader.go
src/pkg/compress/lzw/writer.go
src/pkg/compress/lzw/writer_test.go
src/pkg/compress/zlib/writer_test.go
src/pkg/crypto/rand/util.go
src/pkg/crypto/tls/conn.go
src/pkg/encoding/xml/xml_test.go
src/pkg/image/tiff/buffer.go
src/pkg/log/syslog/syslog.go
src/pkg/mime/multipart/formdata.go
src/pkg/net/http/httputil/persist.go
src/pkg/net/http/transport.go
src/pkg/text/tabwriter/tabwriter.go
src/pkg/websocket/websocket.go

index 1f893951c15bd14c63595d760a421d6556c9cf1d..54029cd40fdd2e76a484344d588a1c68b25561c9 100644 (file)
@@ -10,7 +10,6 @@ import (
        "fmt"
        "io"
        "io/ioutil"
-       "os"
        "strings"
        "testing"
        "testing/iotest"
@@ -425,9 +424,9 @@ var errorWriterTests = []errorWriterTest{
        {0, 1, nil, io.ErrShortWrite},
        {1, 2, nil, io.ErrShortWrite},
        {1, 1, nil, nil},
-       {0, 1, os.EPIPE, os.EPIPE},
-       {1, 2, os.EPIPE, os.EPIPE},
-       {1, 1, os.EPIPE, os.EPIPE},
+       {0, 1, io.ErrClosedPipe, io.ErrClosedPipe},
+       {1, 2, io.ErrClosedPipe, io.ErrClosedPipe},
+       {1, 1, io.ErrClosedPipe, io.ErrClosedPipe},
 }
 
 func TestWriteErrors(t *testing.T) {
index c787a9568b393d1502b3498e7828b9a4bce3c0eb..0ed742c897774af7515f3fad0b41946b0eca42c1 100644 (file)
@@ -19,7 +19,6 @@ import (
        "errors"
        "fmt"
        "io"
-       "os"
 )
 
 // Order specifies the bit ordering in an LZW data stream.
@@ -212,8 +211,10 @@ func (d *decoder) flush() {
        d.o = 0
 }
 
+var errClosed = errors.New("compress/lzw: reader/writer is closed")
+
 func (d *decoder) Close() error {
-       d.err = os.EINVAL // in case any Reads come along
+       d.err = errClosed // in case any Reads come along
        return nil
 }
 
index 3f380fadce2570a180b902d3ae39656f190168a3..642bfc481e66798fe65286e6a3c1f2748489a7a0 100644 (file)
@@ -9,7 +9,6 @@ import (
        "errors"
        "fmt"
        "io"
-       "os"
 )
 
 // A writer is a buffered, flushable writer.
@@ -64,7 +63,7 @@ type encoder struct {
        // call. It is equal to invalidCode if there was no such call.
        savedCode uint32
        // err is the first error encountered during writing. Closing the encoder
-       // will make any future Write calls return os.EINVAL.
+       // will make any future Write calls return errClosed
        err error
        // table is the hash table from 20-bit keys to 12-bit values. Each table
        // entry contains key<<12|val and collisions resolve by linear probing.
@@ -191,13 +190,13 @@ loop:
 // flush e's underlying writer.
 func (e *encoder) Close() error {
        if e.err != nil {
-               if e.err == os.EINVAL {
+               if e.err == errClosed {
                        return nil
                }
                return e.err
        }
-       // Make any future calls to Write return os.EINVAL.
-       e.err = os.EINVAL
+       // Make any future calls to Write return errClosed.
+       e.err = errClosed
        // Write the savedCode if valid.
        if e.savedCode != invalidCode {
                if err := e.write(e, e.savedCode); err != nil {
index 154cdf8090eab035b5acfa1ace853e70fedbf617..d249a09b295ee5a237aa1da4df5f0bdc17bdd942 100644 (file)
@@ -50,10 +50,6 @@ func testFile(t *testing.T, fn string, order Order, litWidth int) {
                                return
                        }
                        _, err1 := lzww.Write(b[:n])
-                       if err1 == os.EPIPE {
-                               // Fail, but do not report the error, as some other (presumably reportable) error broke the pipe.
-                               return
-                       }
                        if err1 != nil {
                                t.Errorf("%s (order=%d litWidth=%d): %v", fn, order, litWidth, err1)
                                return
index 32f05ab68560c6027af38e14b1b5ed3b887aba83..a71894da3200ab92258727682f8344bd1a5f47fd 100644 (file)
@@ -59,10 +59,6 @@ func testLevelDict(t *testing.T, fn string, b0 []byte, level int, d string) {
                }
                defer zlibw.Close()
                _, err = zlibw.Write(b0)
-               if err == os.EPIPE {
-                       // Fail, but do not report the error, as some other (presumably reported) error broke the pipe.
-                       return
-               }
                if err != nil {
                        t.Errorf("%s (level=%d, dict=%q): %v", fn, level, d, err)
                        return
index b44ae9897ba2acc8039ac6163a2a6505c799eb21..fc5fe6c65e9cb07633948ee01febce582d6bfd75 100644 (file)
@@ -5,16 +5,16 @@
 package rand
 
 import (
+       "errors"
        "io"
        "math/big"
-       "os"
 )
 
 // Prime returns a number, p, of the given size, such that p is prime
 // with high probability.
 func Prime(rand io.Reader, bits int) (p *big.Int, err error) {
        if bits < 1 {
-               err = os.EINVAL
+               err = errors.New("crypto/rand: prime size must be positive")
        }
 
        b := uint(bits % 8)
index f4178e30c58248dcdd1e777eb5dd03b35e6cbe58..b8fa2737f67e77a9c349ea191ac5cf8b75a922c7 100644 (file)
@@ -93,7 +93,8 @@ func (c *Conn) SetTimeout(nsec int64) error {
 }
 
 // SetReadTimeout sets the time (in nanoseconds) that
-// Read will wait for data before returning os.EAGAIN.
+// Read will wait for data before returning a net.Error
+// with Timeout() == true.
 // Setting nsec == 0 (the default) disables the deadline.
 func (c *Conn) SetReadTimeout(nsec int64) error {
        return c.conn.SetReadTimeout(nsec)
@@ -737,7 +738,7 @@ func (c *Conn) Write(b []byte) (n int, err error) {
        return c.writeRecord(recordTypeApplicationData, b)
 }
 
-// Read can be made to time out and return err == os.EAGAIN
+// Read can be made to time out and return a net.Error with Timeout() == true
 // after a fixed time limit; see SetTimeout and SetReadTimeout.
 func (c *Conn) Read(b []byte) (n int, err error) {
        if err = c.Handshake(); err != nil {
index 6c874fadb7a0d7d03d688161d4ae2e64c30b4020..4c2d196d7b1a07b5b4ebfd55197d4f7936a7571e 100644 (file)
@@ -7,7 +7,6 @@ package xml
 import (
        "bytes"
        "io"
-       "os"
        "reflect"
        "strings"
        "testing"
@@ -205,7 +204,7 @@ func (d *downCaser) ReadByte() (c byte, err error) {
 
 func (d *downCaser) Read(p []byte) (int, error) {
        d.t.Fatalf("unexpected Read call on downCaser reader")
-       return 0, os.EINVAL
+       panic("unreachable")
 }
 
 func TestRawTokenAltEncoding(t *testing.T) {
index ce350738ed8c1fab617abe48914de9c0f269427a..27533c6047d5579eab29e4aad71db5dc558c0d08 100644 (file)
@@ -4,10 +4,7 @@
 
 package tiff
 
-import (
-       "io"
-       "os"
-)
+import "io"
 
 // buffer buffers an io.Reader to satisfy io.ReaderAt.
 type buffer struct {
@@ -19,7 +16,7 @@ func (b *buffer) ReadAt(p []byte, off int64) (int, error) {
        o := int(off)
        end := o + len(p)
        if int64(end) != off+int64(len(p)) {
-               return 0, os.EINVAL
+               return 0, io.ErrUnexpectedEOF
        }
 
        m := len(b.buf)
index 26a2f736b174a636e07a6fb5648a474fb4551159..546bc296a5ffd9d4f4526f133dce0fec944b9f9e 100644 (file)
@@ -8,6 +8,7 @@
 package syslog
 
 import (
+       "errors"
        "fmt"
        "log"
        "net"
@@ -75,7 +76,7 @@ func Dial(network, raddr string, priority Priority, prefix string) (w *Writer, e
 // Write sends a log message to the syslog daemon.
 func (w *Writer) Write(b []byte) (int, error) {
        if w.priority > LOG_DEBUG || w.priority < LOG_EMERG {
-               return 0, os.EINVAL
+               return 0, errors.New("log/syslog: invalid priority")
        }
        return w.conn.writeBytes(w.priority, w.prefix, b)
 }
index d9982e5b9c8807b03c740a6812f7471a1e5bce9b..ec643c1476fd930230cabb351e6b57d6f13c0da3 100644 (file)
@@ -160,7 +160,7 @@ type sliceReaderAt []byte
 
 func (r sliceReaderAt) ReadAt(b []byte, off int64) (int, error) {
        if int(off) >= len(r) || off < 0 {
-               return 0, os.EINVAL
+               return 0, io.ErrUnexpectedEOF
        }
        n := copy(b, r[int(off):])
        return n, nil
index d7b670110c4bcffc1532f889be5791c719d3ed92..1266bd3ad22eb98414956543c5211b8cfacd234c 100644 (file)
@@ -22,6 +22,10 @@ var (
        ErrPipeline   = &http.ProtocolError{"pipeline error"}
 )
 
+// This is an API usage error - the local side is closed.
+// ErrPersistEOF (above) reports that the remote side is closed.
+var errClosed = errors.New("i/o operation on closed connection")
+
 // A ServerConn reads requests and sends responses over an underlying
 // connection, until the HTTP keepalive logic commands an end. ServerConn
 // also allows hijacking the underlying connection by calling Hijack
@@ -108,7 +112,7 @@ func (sc *ServerConn) Read() (req *http.Request, err error) {
        }
        if sc.r == nil { // connection closed by user in the meantime
                defer sc.lk.Unlock()
-               return nil, os.EBADF
+               return nil, errClosed
        }
        r := sc.r
        lastbody := sc.lastbody
@@ -313,7 +317,7 @@ func (cc *ClientConn) Write(req *http.Request) (err error) {
        }
        if cc.c == nil { // connection closed by user in the meantime
                defer cc.lk.Unlock()
-               return os.EBADF
+               return errClosed
        }
        c := cc.c
        if req.Close {
@@ -369,7 +373,7 @@ func (cc *ClientConn) Read(req *http.Request) (resp *http.Response, err error) {
        }
        if cc.r == nil { // connection closed by user in the meantime
                defer cc.lk.Unlock()
-               return nil, os.EBADF
+               return nil, errClosed
        }
        r := cc.r
        lastbody := cc.lastbody
index da5244b2c12ed0e7ea18b9f4015733069bc543a2..e622e41f0a2de014b8ee9e3a95b5082cab1c05d2 100644 (file)
@@ -504,7 +504,7 @@ func (pc *persistConn) expectingResponse() bool {
 var remoteSideClosedFunc func(error) bool // or nil to use default
 
 func remoteSideClosed(err error) bool {
-       if err == io.EOF || err == os.EINVAL {
+       if err == io.EOF {
                return true
        }
        if remoteSideClosedFunc != nil {
index c136ca2a175c060aae4f0942c79d3052d82c011c..201a685c6305656b8319e19bae17eb7e1072d66b 100644 (file)
@@ -13,7 +13,6 @@ package tabwriter
 import (
        "bytes"
        "io"
-       "os"
        "unicode/utf8"
 )
 
@@ -221,7 +220,7 @@ type osError struct {
 func (b *Writer) write0(buf []byte) {
        n, err := b.output.Write(buf)
        if n != len(buf) && err == nil {
-               err = os.EIO
+               err = io.ErrShortWrite
        }
        if err != nil {
                panic(osError{err})
index 1e4036ce391d101f6363ebb878fd992a23b7a000..df4416e22ed9e999ffe5c4a3bca6bc2bc2f2ca91 100644 (file)
@@ -10,12 +10,12 @@ import (
        "bufio"
        "crypto/tls"
        "encoding/json"
+       "errors"
        "io"
        "io/ioutil"
        "net"
        "net/http"
        "net/url"
-       "os"
        "sync"
 )
 
@@ -243,12 +243,14 @@ func (ws *Conn) RemoteAddr() net.Addr {
        return &Addr{ws.config.Origin}
 }
 
+var errSetTimeout = errors.New("websocket: cannot set timeout: not using a net.Conn")
+
 // SetTimeout sets the connection's network timeout in nanoseconds.
 func (ws *Conn) SetTimeout(nsec int64) error {
        if conn, ok := ws.rwc.(net.Conn); ok {
                return conn.SetTimeout(nsec)
        }
-       return os.EINVAL
+       return errSetTimeout
 }
 
 // SetReadTimeout sets the connection's network read timeout in nanoseconds.
@@ -256,7 +258,7 @@ func (ws *Conn) SetReadTimeout(nsec int64) error {
        if conn, ok := ws.rwc.(net.Conn); ok {
                return conn.SetReadTimeout(nsec)
        }
-       return os.EINVAL
+       return errSetTimeout
 }
 
 // SetWriteTimeout sets the connection's network write timeout in nanoseconds.
@@ -264,7 +266,7 @@ func (ws *Conn) SetWriteTimeout(nsec int64) error {
        if conn, ok := ws.rwc.(net.Conn); ok {
                return conn.SetWriteTimeout(nsec)
        }
-       return os.EINVAL
+       return errSetTimeout
 }
 
 // Config returns the WebSocket config.