| 1 | #ifndef AWS_COMMON_ERROR_H | 
| 2 | #define AWS_COMMON_ERROR_H | 
| 3 |  | 
| 4 | /* | 
| 5 |  * Copyright 2010-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. | 
| 6 |  * | 
| 7 |  * Licensed under the Apache License, Version 2.0 (the "License"). | 
| 8 |  * You may not use this file except in compliance with the License. | 
| 9 |  * A copy of the License is located at | 
| 10 |  * | 
| 11 |  *  http://aws.amazon.com/apache2.0 | 
| 12 |  * | 
| 13 |  * or in the "license" file accompanying this file. This file is distributed | 
| 14 |  * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either | 
| 15 |  * express or implied. See the License for the specific language governing | 
| 16 |  * permissions and limitations under the License. | 
| 17 |  */ | 
| 18 |  | 
| 19 | #include <aws/common/assert.h> | 
| 20 | #include <aws/common/exports.h> | 
| 21 | #include <aws/common/macros.h> | 
| 22 | #include <aws/common/stdint.h> | 
| 23 |  | 
| 24 | #define AWS_OP_SUCCESS (0) | 
| 25 | #define AWS_OP_ERR (-1) | 
| 26 |  | 
| 27 | struct aws_error_info { | 
| 28 |     int error_code; | 
| 29 |     const char *literal_name; | 
| 30 |     const char *error_str; | 
| 31 |     const char *lib_name; | 
| 32 |     const char *formatted_name; | 
| 33 | }; | 
| 34 |  | 
| 35 | struct aws_error_info_list { | 
| 36 |     const struct aws_error_info *error_list; | 
| 37 |     uint16_t count; | 
| 38 | }; | 
| 39 |  | 
| 40 | #define AWS_DEFINE_ERROR_INFO(C, ES, LN)                                                                               \ | 
| 41 |     {                                                                                                                  \ | 
| 42 |         .literal_name = #C, .error_code = (C), .error_str = (ES), .lib_name = (LN),                                    \ | 
| 43 |         .formatted_name = LN ": " #C ", " ES,                                                                          \ | 
| 44 |     } | 
| 45 |  | 
| 46 | typedef void(aws_error_handler_fn)(int err, void *ctx); | 
| 47 |  | 
| 48 | AWS_EXTERN_C_BEGIN | 
| 49 |  | 
| 50 | /* | 
| 51 |  * Returns the latest error code on the current thread, or 0 if none have | 
| 52 |  * occurred. | 
| 53 |  */ | 
| 54 | AWS_COMMON_API | 
| 55 | int aws_last_error(void); | 
| 56 |  | 
| 57 | /* | 
| 58 |  * Returns the error str corresponding to `err`. | 
| 59 |  */ | 
| 60 | AWS_COMMON_API | 
| 61 | const char *aws_error_str(int err); | 
| 62 |  | 
| 63 | /* | 
| 64 |  * Returns the enum name corresponding to `err`. | 
| 65 |  */ | 
| 66 | AWS_COMMON_API | 
| 67 | const char *aws_error_name(int err); | 
| 68 |  | 
| 69 | /* | 
| 70 |  * Returns the error lib name corresponding to `err`. | 
| 71 |  */ | 
| 72 | AWS_COMMON_API | 
| 73 | const char *aws_error_lib_name(int err); | 
| 74 |  | 
| 75 | /* | 
| 76 |  * Returns libname concatenated with error string. | 
| 77 |  */ | 
| 78 | AWS_COMMON_API | 
| 79 | const char *aws_error_debug_str(int err); | 
| 80 |  | 
| 81 | /* | 
| 82 |  * Internal implementation detail. | 
| 83 |  */ | 
| 84 | AWS_COMMON_API | 
| 85 | void aws_raise_error_private(int err); | 
| 86 |  | 
| 87 | /* | 
| 88 |  * Raises `err` to the installed callbacks, and sets the thread's error. | 
| 89 |  */ | 
| 90 | AWS_STATIC_IMPL | 
| 91 | int aws_raise_error(int err); | 
| 92 |  | 
| 93 | /* | 
| 94 |  * Resets the `err` back to defaults | 
| 95 |  */ | 
| 96 | AWS_COMMON_API | 
| 97 | void aws_reset_error(void); | 
| 98 | /* | 
| 99 |  * Sets `err` to the latest error. Does not invoke callbacks. | 
| 100 |  */ | 
| 101 | AWS_COMMON_API | 
| 102 | void aws_restore_error(int err); | 
| 103 |  | 
| 104 | /* | 
| 105 |  * Sets an application wide error handler function. This will be overridden by | 
| 106 |  * the thread local handler. The previous handler is returned, this can be used | 
| 107 |  * for restoring an error handler if it needs to be overridden temporarily. | 
| 108 |  * Setting this to NULL will turn off this error callback after it has been | 
| 109 |  * enabled. | 
| 110 |  */ | 
| 111 | AWS_COMMON_API | 
| 112 | aws_error_handler_fn *aws_set_global_error_handler_fn(aws_error_handler_fn *handler, void *ctx); | 
| 113 |  | 
| 114 | /* | 
| 115 |  * Sets a thread-local error handler function. This will override the global | 
| 116 |  * handler. The previous handler is returned, this can be used for restoring an | 
| 117 |  * error handler if it needs to be overridden temporarily. Setting this to NULL | 
| 118 |  * will turn off this error callback after it has been enabled. | 
| 119 |  */ | 
| 120 | AWS_COMMON_API | 
| 121 | aws_error_handler_fn *aws_set_thread_local_error_handler_fn(aws_error_handler_fn *handler, void *ctx); | 
| 122 |  | 
| 123 | /** TODO: this needs to be a private function (wait till we have the cmake story | 
| 124 |  * better before moving it though). It should be external for the purpose of | 
| 125 |  * other libs we own, but customers should not be able to hit it without going | 
| 126 |  * out of their way to do so. | 
| 127 |  */ | 
| 128 | AWS_COMMON_API | 
| 129 | void aws_register_error_info(const struct aws_error_info_list *error_info); | 
| 130 |  | 
| 131 | AWS_COMMON_API | 
| 132 | void aws_unregister_error_info(const struct aws_error_info_list *error_info); | 
| 133 |  | 
| 134 | /** | 
| 135 |  * Convert a c library io error into an aws error. | 
| 136 |  */ | 
| 137 | AWS_COMMON_API | 
| 138 | int aws_translate_and_raise_io_error(int error_no); | 
| 139 |  | 
| 140 | #ifndef AWS_NO_STATIC_IMPL | 
| 141 | #    include <aws/common/error.inl> | 
| 142 | #endif /* AWS_NO_STATIC_IMPL */ | 
| 143 |  | 
| 144 | AWS_EXTERN_C_END | 
| 145 |  | 
| 146 | enum aws_common_error { | 
| 147 |     AWS_ERROR_SUCCESS = 0, | 
| 148 |     AWS_ERROR_OOM, | 
| 149 |     AWS_ERROR_UNKNOWN, | 
| 150 |     AWS_ERROR_SHORT_BUFFER, | 
| 151 |     AWS_ERROR_OVERFLOW_DETECTED, | 
| 152 |     AWS_ERROR_UNSUPPORTED_OPERATION, | 
| 153 |     AWS_ERROR_INVALID_BUFFER_SIZE, | 
| 154 |     AWS_ERROR_INVALID_HEX_STR, | 
| 155 |     AWS_ERROR_INVALID_BASE64_STR, | 
| 156 |     AWS_ERROR_INVALID_INDEX, | 
| 157 |     AWS_ERROR_THREAD_INVALID_SETTINGS, | 
| 158 |     AWS_ERROR_THREAD_INSUFFICIENT_RESOURCE, | 
| 159 |     AWS_ERROR_THREAD_NO_PERMISSIONS, | 
| 160 |     AWS_ERROR_THREAD_NOT_JOINABLE, | 
| 161 |     AWS_ERROR_THREAD_NO_SUCH_THREAD_ID, | 
| 162 |     AWS_ERROR_THREAD_DEADLOCK_DETECTED, | 
| 163 |     AWS_ERROR_MUTEX_NOT_INIT, | 
| 164 |     AWS_ERROR_MUTEX_TIMEOUT, | 
| 165 |     AWS_ERROR_MUTEX_CALLER_NOT_OWNER, | 
| 166 |     AWS_ERROR_MUTEX_FAILED, | 
| 167 |     AWS_ERROR_COND_VARIABLE_INIT_FAILED, | 
| 168 |     AWS_ERROR_COND_VARIABLE_TIMED_OUT, | 
| 169 |     AWS_ERROR_COND_VARIABLE_ERROR_UNKNOWN, | 
| 170 |     AWS_ERROR_CLOCK_FAILURE, | 
| 171 |     AWS_ERROR_LIST_EMPTY, | 
| 172 |     AWS_ERROR_DEST_COPY_TOO_SMALL, | 
| 173 |     AWS_ERROR_LIST_EXCEEDS_MAX_SIZE, | 
| 174 |     AWS_ERROR_LIST_STATIC_MODE_CANT_SHRINK, | 
| 175 |     AWS_ERROR_PRIORITY_QUEUE_FULL, | 
| 176 |     AWS_ERROR_PRIORITY_QUEUE_EMPTY, | 
| 177 |     AWS_ERROR_PRIORITY_QUEUE_BAD_NODE, | 
| 178 |     AWS_ERROR_HASHTBL_ITEM_NOT_FOUND, | 
| 179 |     AWS_ERROR_INVALID_DATE_STR, | 
| 180 |     AWS_ERROR_INVALID_ARGUMENT, | 
| 181 |     AWS_ERROR_RANDOM_GEN_FAILED, | 
| 182 |     AWS_ERROR_MALFORMED_INPUT_STRING, | 
| 183 |     AWS_ERROR_UNIMPLEMENTED, | 
| 184 |     AWS_ERROR_INVALID_STATE, | 
| 185 |     AWS_ERROR_ENVIRONMENT_GET, | 
| 186 |     AWS_ERROR_ENVIRONMENT_SET, | 
| 187 |     AWS_ERROR_ENVIRONMENT_UNSET, | 
| 188 |     AWS_ERROR_STREAM_UNSEEKABLE, | 
| 189 |     AWS_ERROR_NO_PERMISSION, | 
| 190 |     AWS_ERROR_FILE_INVALID_PATH, | 
| 191 |     AWS_ERROR_MAX_FDS_EXCEEDED, | 
| 192 |     AWS_ERROR_SYS_CALL_FAILURE, | 
| 193 |     AWS_ERROR_C_STRING_BUFFER_NOT_NULL_TERMINATED, | 
| 194 |     AWS_ERROR_STRING_MATCH_NOT_FOUND, | 
| 195 |  | 
| 196 |     AWS_ERROR_END_COMMON_RANGE = 0x03FF | 
| 197 | }; | 
| 198 |  | 
| 199 | #endif /* AWS_COMMON_ERROR_H */ | 
| 200 |  |