1 // Copyright (c) 2017 Cisco and/or its affiliates.
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:
7 // http://www.apache.org/licenses/LICENSE-2.0
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.
15 // +build !windows,!darwin
27 // List of errors thrown by go-libmemif.
28 // Error handling code should compare returned error by value against these variables.
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)
47 // Not thrown, instead properly handled inside the golang adapter:
48 ErrNoBufRing = newMemifError(17)
49 ErrNoBuf = newMemifError(18)
50 ErrNoBufDetails = newMemifError(19)
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)
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")
75 // Received unrecognized error code from C-libmemif.
76 ErrUnknown = newMemifError(-1, "unknown error")
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 {
86 // Error prints error description.
87 func (e *MemifError) Error() string {
91 // Code returns the integer error code as returned by C-libmemif.
92 func (e *MemifError) Code() int {
96 // A registry of libmemif errors. Used to convert C-libmemif error code into
97 // the associated MemifError.
98 var errorRegistry = map[int]*MemifError{}
100 // newMemifError builds and registers a new MemifError.
101 func newMemifError(code int, desc ...string) *MemifError {
104 err = &MemifError{code: code, description: "libmemif: " + desc[0]}
106 err = &MemifError{code: code, description: "libmemif: " + C.GoString(C.memif_strerror(C.int(code)))}
108 errorRegistry[code] = err
112 // getMemifError returns the MemifError associated with the given C-libmemif
114 func getMemifError(code int) error {
116 return nil /* success */
118 err, known := errorRegistry[code]