@@ -34,41 +34,41 @@ const maxErrno uint32 = errno.EHWPOISON + 1
3434// (e.g. unix.Errno(EPERM.Errno()) == unix.EPERM is true). Converting unix/syscall.Errno
3535// to the errors should be done via the lookup methods provided.
3636var (
37- NOERROR = errors .New ( errno . NOERRNO , "not an error" )
38- EPERM = errors .New (errno .EPERM , "operation not permitted" )
39- ENOENT = errors .New (errno .ENOENT , "no such file or directory" )
40- ESRCH = errors .New (errno .ESRCH , "no such process" )
41- EINTR = errors .New (errno .EINTR , "interrupted system call" )
42- EIO = errors .New (errno .EIO , "I/O error" )
43- ENXIO = errors .New (errno .ENXIO , "no such device or address" )
44- E2BIG = errors .New (errno .E2BIG , "argument list too long" )
45- ENOEXEC = errors .New (errno .ENOEXEC , "exec format error" )
46- EBADF = errors .New (errno .EBADF , "bad file number" )
47- ECHILD = errors .New (errno .ECHILD , "no child processes" )
48- EAGAIN = errors .New (errno .EAGAIN , "try again" )
49- ENOMEM = errors .New (errno .ENOMEM , "out of memory" )
50- EACCES = errors .New (errno .EACCES , "permission denied" )
51- EFAULT = errors .New (errno .EFAULT , "bad address" )
52- ENOTBLK = errors .New (errno .ENOTBLK , "block device required" )
53- EBUSY = errors .New (errno .EBUSY , "device or resource busy" )
54- EEXIST = errors .New (errno .EEXIST , "file exists" )
55- EXDEV = errors .New (errno .EXDEV , "cross-device link" )
56- ENODEV = errors .New (errno .ENODEV , "no such device" )
57- ENOTDIR = errors .New (errno .ENOTDIR , "not a directory" )
58- EISDIR = errors .New (errno .EISDIR , "is a directory" )
59- EINVAL = errors .New (errno .EINVAL , "invalid argument" )
60- ENFILE = errors .New (errno .ENFILE , "file table overflow" )
61- EMFILE = errors .New (errno .EMFILE , "too many open files" )
62- ENOTTY = errors .New (errno .ENOTTY , "not a typewriter" )
63- ETXTBSY = errors .New (errno .ETXTBSY , "text file busy" )
64- EFBIG = errors .New (errno .EFBIG , "file too large" )
65- ENOSPC = errors .New (errno .ENOSPC , "no space left on device" )
66- ESPIPE = errors .New (errno .ESPIPE , "illegal seek" )
67- EROFS = errors .New (errno .EROFS , "read-only file system" )
68- EMLINK = errors .New (errno .EMLINK , "too many links" )
69- EPIPE = errors .New (errno .EPIPE , "broken pipe" )
70- EDOM = errors .New (errno .EDOM , "math argument out of domain of func" )
71- ERANGE = errors .New (errno .ERANGE , "math result not representable" )
37+ noError * errors.Error = nil
38+ EPERM = errors .New (errno .EPERM , "operation not permitted" )
39+ ENOENT = errors .New (errno .ENOENT , "no such file or directory" )
40+ ESRCH = errors .New (errno .ESRCH , "no such process" )
41+ EINTR = errors .New (errno .EINTR , "interrupted system call" )
42+ EIO = errors .New (errno .EIO , "I/O error" )
43+ ENXIO = errors .New (errno .ENXIO , "no such device or address" )
44+ E2BIG = errors .New (errno .E2BIG , "argument list too long" )
45+ ENOEXEC = errors .New (errno .ENOEXEC , "exec format error" )
46+ EBADF = errors .New (errno .EBADF , "bad file number" )
47+ ECHILD = errors .New (errno .ECHILD , "no child processes" )
48+ EAGAIN = errors .New (errno .EAGAIN , "try again" )
49+ ENOMEM = errors .New (errno .ENOMEM , "out of memory" )
50+ EACCES = errors .New (errno .EACCES , "permission denied" )
51+ EFAULT = errors .New (errno .EFAULT , "bad address" )
52+ ENOTBLK = errors .New (errno .ENOTBLK , "block device required" )
53+ EBUSY = errors .New (errno .EBUSY , "device or resource busy" )
54+ EEXIST = errors .New (errno .EEXIST , "file exists" )
55+ EXDEV = errors .New (errno .EXDEV , "cross-device link" )
56+ ENODEV = errors .New (errno .ENODEV , "no such device" )
57+ ENOTDIR = errors .New (errno .ENOTDIR , "not a directory" )
58+ EISDIR = errors .New (errno .EISDIR , "is a directory" )
59+ EINVAL = errors .New (errno .EINVAL , "invalid argument" )
60+ ENFILE = errors .New (errno .ENFILE , "file table overflow" )
61+ EMFILE = errors .New (errno .EMFILE , "too many open files" )
62+ ENOTTY = errors .New (errno .ENOTTY , "not a typewriter" )
63+ ETXTBSY = errors .New (errno .ETXTBSY , "text file busy" )
64+ EFBIG = errors .New (errno .EFBIG , "file too large" )
65+ ENOSPC = errors .New (errno .ENOSPC , "no space left on device" )
66+ ESPIPE = errors .New (errno .ESPIPE , "illegal seek" )
67+ EROFS = errors .New (errno .EROFS , "read-only file system" )
68+ EMLINK = errors .New (errno .EMLINK , "too many links" )
69+ EPIPE = errors .New (errno .EPIPE , "broken pipe" )
70+ EDOM = errors .New (errno .EDOM , "math argument out of domain of func" )
71+ ERANGE = errors .New (errno .ERANGE , "math result not representable" )
7272
7373 // Errno values from include/uapi/asm-generic/errno.h.
7474 EDEADLK = errors .New (errno .EDEADLK , "resource deadlock would occur" )
@@ -186,7 +186,7 @@ var errNotValidError = errors.New(errno.Errno(maxErrno), "not a valid error")
186186// errnos (especially uint32(sycall.Errno)) and *errors.Error.
187187var errorSlice = []* errors.Error {
188188 // Errno values from include/uapi/asm-generic/errno-base.h.
189- errno .NOERRNO : NOERROR ,
189+ errno .NOERRNO : noError ,
190190 errno .EPERM : EPERM ,
191191 errno .ENOENT : ENOENT ,
192192 errno .ESRCH : ESRCH ,
@@ -324,32 +324,45 @@ var errorSlice = []*errors.Error{
324324 errno .EHWPOISON : EHWPOISON ,
325325}
326326
327- // ErrorFromErrno gets an error from the list and panics if an invalid entry is requested.
328- func ErrorFromErrno (e errno.Errno ) * errors.Error {
329- err := errorSlice [e ]
327+ // ErrorFromUnix returns a linuxerr from a unix.Errno.
328+ func ErrorFromUnix (err unix.Errno ) error {
329+ if err == unix .Errno (0 ) {
330+ return nil
331+ }
332+ e := errorSlice [errno .Errno (err )]
330333 // Done this way because a single comparison in benchmarks is 2-3 faster
331334 // than something like ( if err == nil && err > 0 ).
332- if err ! = errNotValidError {
333- return err
335+ if e = = errNotValidError {
336+ panic ( fmt . Sprintf ( "invalid error requested with errno: %v" , e ))
334337 }
335- panic ( fmt . Sprintf ( "invalid error requested with errno: %d" , e ))
338+ return e
336339}
337340
338- // Equals compars a linuxerr to a given error
339- // TODO(b/34162363): Remove when syserror is removed.
340- func Equals (e * errors.Error , err error ) bool {
341- if err == nil {
342- return e == NOERROR || e == nil
341+ // ToError converts a linuxerr to an error type.
342+ func ToError (err * errors.Error ) error {
343+ if err == noError {
344+ return nil
343345 }
344- if e == nil {
345- return err == NOERROR || err == unix .Errno (0 )
346+ return err
347+ }
348+
349+ // ToUnix converts a linuxerr to a unix.Errno.
350+ func ToUnix (e * errors.Error ) unix.Errno {
351+ var unixErr unix.Errno
352+ if e != noError {
353+ unixErr = unix .Errno (e .Errno ())
346354 }
355+ return unixErr
356+ }
347357
348- switch err .(type ) {
349- case * errors.Error :
350- return e == err
351- case unix.Errno , error :
352- return unix .Errno (e .Errno ()) == err
358+ // Equals compars a linuxerr to a given error.
359+ func Equals (e * errors.Error , err error ) bool {
360+ var unixErr unix.Errno
361+ if e != noError {
362+ unixErr = unix .Errno (e .Errno ())
363+ }
364+ if err == nil {
365+ err = noError
353366 }
354- return false
367+ return e == err || unixErr == err
355368}
0 commit comments