| 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 | |