test: Fix test dependancy
[govpp.git] / extras / libmemif / error.go
1 // Copyright (c) 2017 Cisco and/or its affiliates.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at:
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 // +build !windows,!darwin
16
17 package libmemif
18
19 /*
20 #cgo LDFLAGS: -lmemif
21
22 #include <unistd.h>
23 #include <libmemif.h>
24 */
25 import "C"
26
27 // List of errors thrown by go-libmemif.
28 // Error handling code should compare returned error by value against these variables.
29 var (
30         ErrSyscall       = newMemifError(1)
31         ErrConnRefused   = newMemifError(2)
32         ErrAccess        = newMemifError(3)
33         ErrNoFile        = newMemifError(4)
34         ErrFileLimit     = newMemifError(5)
35         ErrProcFileLimit = newMemifError(6)
36         ErrAlready       = newMemifError(7)
37         ErrAgain         = newMemifError(8)
38         ErrBadFd         = newMemifError(9)
39         ErrNoMem         = newMemifError(10)
40         ErrInvalArgs     = newMemifError(11)
41         ErrNoConn        = newMemifError(12)
42         ErrConn          = newMemifError(13)
43         ErrClbFDUpdate   = newMemifError(14)
44         ErrFileNotSock   = newMemifError(15)
45         ErrNoShmFD       = newMemifError(16)
46         ErrCookie        = newMemifError(17)
47
48         // Not thrown, instead properly handled inside the golang adapter:
49         ErrNoBufRing    = newMemifError(18)
50         ErrNoBuf        = newMemifError(19)
51         ErrNoBufDetails = newMemifError(20)
52
53         ErrIntWrite     = newMemifError(21)
54         ErrMalformedMsg = newMemifError(22)
55         ErrQueueID      = newMemifError(23)
56         ErrProto        = newMemifError(24)
57         ErrIfID         = newMemifError(25)
58         ErrAcceptSlave  = newMemifError(26)
59         ErrAlreadyConn  = newMemifError(27)
60         ErrMode         = newMemifError(28)
61         ErrSecret       = newMemifError(29)
62         ErrNoSecret     = newMemifError(30)
63         ErrMaxRegion    = newMemifError(31)
64         ErrMaxRing      = newMemifError(32)
65         ErrNotIntFD     = newMemifError(33)
66         ErrDisconnect   = newMemifError(34)
67         ErrDisconnected = newMemifError(35)
68         ErrUnknownMsg   = newMemifError(36)
69         ErrPollCanceled = newMemifError(37)
70
71         // Errors added by the adapter:
72         ErrNotInit     = newMemifError(100, "libmemif is not initialized")
73         ErrAlreadyInit = newMemifError(101, "libmemif is already initialized")
74         ErrUnsupported = newMemifError(102, "the feature is not supported by C-libmemif")
75
76         // Received unrecognized error code from C-libmemif.
77         ErrUnknown = newMemifError(-1, "unknown error")
78 )
79
80 // MemifError implements and extends the error interface with the method Code(),
81 // which returns the integer error code as returned by C-libmemif.
82 type MemifError struct {
83         code        int
84         description string
85 }
86
87 // Error prints error description.
88 func (e *MemifError) Error() string {
89         return e.description
90 }
91
92 // Code returns the integer error code as returned by C-libmemif.
93 func (e *MemifError) Code() int {
94         return e.code
95 }
96
97 // A registry of libmemif errors. Used to convert C-libmemif error code into
98 // the associated MemifError.
99 var errorRegistry = map[int]*MemifError{}
100
101 // newMemifError builds and registers a new MemifError.
102 func newMemifError(code int, desc ...string) *MemifError {
103         var err *MemifError
104         if len(desc) > 0 {
105                 err = &MemifError{code: code, description: "libmemif: " + desc[0]}
106         } else {
107                 err = &MemifError{code: code, description: "libmemif: " + C.GoString(C.memif_strerror(C.int(code)))}
108         }
109         errorRegistry[code] = err
110         return err
111 }
112
113 // getMemifError returns the MemifError associated with the given C-libmemif
114 // error code.
115 func getMemifError(code int) error {
116         if code == 0 {
117                 return nil /* success */
118         }
119         err, known := errorRegistry[code]
120         if !known {
121                 return ErrUnknown
122         }
123         return err
124 }