Ensure all lines that should be omitted from public includes are marked
[AROS.git] / arch / all-pc / boot / grub2-aros / grub-core / kern / err.c
blob74f3915aa77e7b90c751cacfe8943b300a794cdb
1 /* err.c - error handling routines */
2 /*
3 * GRUB -- GRand Unified Bootloader
4 * Copyright (C) 2002,2005,2007,2008 Free Software Foundation, Inc.
6 * GRUB is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * GRUB is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
20 #include <grub/err.h>
21 #include <grub/misc.h>
22 #include <stdarg.h>
23 #include <grub/i18n.h>
25 #define GRUB_MAX_ERRMSG 256
26 #define GRUB_ERROR_STACK_SIZE 10
28 grub_err_t grub_errno;
29 char grub_errmsg[GRUB_MAX_ERRMSG];
30 int grub_err_printed_errors;
32 static struct
34 grub_err_t errno;
35 char errmsg[GRUB_MAX_ERRMSG];
36 } grub_error_stack_items[GRUB_ERROR_STACK_SIZE];
38 static int grub_error_stack_pos;
39 static int grub_error_stack_assert;
41 grub_err_t
42 grub_error (grub_err_t n, const char *fmt, ...)
44 va_list ap;
46 grub_errno = n;
48 va_start (ap, fmt);
49 grub_vsnprintf (grub_errmsg, sizeof (grub_errmsg), _(fmt), ap);
50 va_end (ap);
52 return n;
55 void
56 grub_fatal (const char *fmt, ...)
58 va_list ap;
60 va_start (ap, fmt);
61 grub_vprintf (_(fmt), ap);
62 va_end (ap);
64 grub_abort ();
67 void
68 grub_error_push (void)
70 /* Only add items to stack, if there is enough room. */
71 if (grub_error_stack_pos < GRUB_ERROR_STACK_SIZE)
73 /* Copy active error message to stack. */
74 grub_error_stack_items[grub_error_stack_pos].errno = grub_errno;
75 grub_memcpy (grub_error_stack_items[grub_error_stack_pos].errmsg,
76 grub_errmsg,
77 sizeof (grub_errmsg));
79 /* Advance to next error stack position. */
80 grub_error_stack_pos++;
82 else
84 /* There is no room for new error message. Discard new error message
85 and mark error stack assertion flag. */
86 grub_error_stack_assert = 1;
89 /* Allow further operation of other components by resetting
90 active errno to GRUB_ERR_NONE. */
91 grub_errno = GRUB_ERR_NONE;
94 int
95 grub_error_pop (void)
97 if (grub_error_stack_pos > 0)
99 /* Pop error message from error stack to current active error. */
100 grub_error_stack_pos--;
102 grub_errno = grub_error_stack_items[grub_error_stack_pos].errno;
103 grub_memcpy (grub_errmsg,
104 grub_error_stack_items[grub_error_stack_pos].errmsg,
105 sizeof (grub_errmsg));
107 return 1;
109 else
111 /* There is no more items on error stack, reset to no error state. */
112 grub_errno = GRUB_ERR_NONE;
114 return 0;
118 void
119 grub_print_error (void)
121 /* Print error messages in reverse order. First print active error message
122 and then empty error stack. */
125 if (grub_errno != GRUB_ERR_NONE)
127 grub_err_printf (_("error: %s.\n"), grub_errmsg);
128 grub_err_printed_errors++;
131 while (grub_error_pop ());
133 /* If there was an assert while using error stack, report about it. */
134 if (grub_error_stack_assert)
136 grub_err_printf ("assert: error stack overflow detected!\n");
137 grub_error_stack_assert = 0;