ODPM 266: Go-libmemif + 2 examples.
[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         ErrAccess        = newMemifError(2)
32         ErrNoFile        = newMemifError(3)
33         ErrFileLimit     = newMemifError(4)
34         ErrProcFileLimit = newMemifError(5)
35         ErrAlready       = newMemifError(6)
36         ErrAgain         = newMemifError(7)
37         ErrBadFd         = newMemifError(8)
38         ErrNoMem         = newMemifError(9)
39         ErrInvalArgs     = newMemifError(10)
40         ErrNoConn        = newMemifError(11)
41         ErrConn          = newMemifError(12)
42         ErrClbFDUpdate   = newMemifError(13)
43         ErrFileNotSock   = newMemifError(14)
44         ErrNoShmFD       = newMemifError(15)
45         ErrCookie        = newMemifError(16)
46
47         // Not thrown, instead properly handled inside the golang adapter:
48         ErrNoBufRing    = newMemifError(17)
49         ErrNoBuf        = newMemifError(18)
50         ErrNoBufDetails = newMemifError(19)
51
52         ErrIntWrite     = newMemifError(20)
53         ErrMalformedMsg = newMemifError(21)
54         ErrQueueID      = newMemifError(22)
55         ErrProto        = newMemifError(23)
56         ErrIfID         = newMemifError(24)
57         ErrAcceptSlave  = newMemifError(25)
58         ErrAlreadyConn  = newMemifError(26)
59         ErrMode         = newMemifError(27)
60         ErrSecret       = newMemifError(28)
61         ErrNoSecret     = newMemifError(29)
62         ErrMaxRegion    = newMemifError(30)
63         ErrMaxRing      = newMemifError(31)
64         ErrNotIntFD     = newMemifError(32)
65         ErrDisconnect   = newMemifError(33)
66         ErrDisconnected = newMemifError(34)
67         ErrUnknownMsg   = newMemifError(35)
68         ErrPollCanceled = newMemifError(36)
69
70         // Errors added by the adapter:
71         ErrNotInit     = newMemifError(100, "libmemif is not initialized")
72         ErrAlreadyInit = newMemifError(101, "libmemif is already initialized")
73         ErrUnsupported = newMemifError(102, "the feature is not supported by C-libmemif")
74
75         // Received unrecognized error code from C-libmemif.
76         ErrUnknown = newMemifError(-1, "unknown error")
77 )
78
79 // MemifError implements and extends the error interface with the method Code(),
80 // which returns the integer error code as returned by C-libmemif.
81 type MemifError struct {
82         code        int
83         description string
84 }
85
86 // Error prints error description.
87 func (e *MemifError) Error() string {
88         return e.description
89 }
90
91 // Code returns the integer error code as returned by C-libmemif.
92 func (e *MemifError) Code() int {
93         return e.code
94 }
95
96 // A registry of libmemif errors. Used to convert C-libmemif error code into
97 // the associated MemifError.
98 var errorRegistry = map[int]*MemifError{}
99
100 // newMemifError builds and registers a new MemifError.
101 func newMemifError(code int, desc ...string) *MemifError {
102         var err *MemifError
103         if len(desc) > 0 {
104                 err = &MemifError{code: code, description: "libmemif: " + desc[0]}
105         } else {
106                 err = &MemifError{code: code, description: "libmemif: " + C.GoString(C.memif_strerror(C.int(code)))}
107         }
108         errorRegistry[code] = err
109         return err
110 }
111
112 // getMemifError returns the MemifError associated with the given C-libmemif
113 // error code.
114 func getMemifError(code int) error {
115         if code == 0 {
116                 return nil /* success */
117         }
118         err, known := errorRegistry[code]
119         if !known {
120                 return ErrUnknown
121         }
122         return err
123 }