aboutsummaryrefslogtreecommitdiffstats
path: root/set_error.c
diff options
context:
space:
mode:
Diffstat (limited to 'set_error.c')
-rw-r--r--set_error.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/set_error.c b/set_error.c
new file mode 100644
index 0000000..5ee54ce
--- /dev/null
+++ b/set_error.c
@@ -0,0 +1,33 @@
+/* See LICENSE file for copyright and license details. */
+#include "internal.h"
+
+
+void
+liberror_set_error(const char description[256], const char source[64], const char code_group[64], long long int code)
+{
+ struct liberror_error *cause;
+ struct liberror_error *error;
+ int have_cause;
+
+ cause = liberror_get_error();
+ have_cause = !!cause;
+ cause = liberror_copy_error(cause);
+
+ error = &liberror_error_;
+ liberror_have_error_ = 1;
+
+ memset(error, 0, sizeof(*error));
+
+ if (*description) {
+ stpcpy(error->description, description);
+ } else if (!strcmp(code_group, "errno")) {
+ if (code >= (long long int)INT_MIN && code <= (long long int)INT_MAX)
+ strerror_r((int)code, error->description, sizeof(error->description));
+ }
+ stpcpy(error->source, source);
+ stpcpy(error->code_group, code_group);
+ error->code = code;
+ liberror_save_backtrace_(error);
+ error->cause = cause;
+ error->failed_to_allocate_cause = have_cause && !cause;
+}