1 /* err.c - error handling routines */
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/>.
21 #include <grub/misc.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
;
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
;
42 grub_error (grub_err_t n
, const char *fmt
, ...)
49 grub_vsnprintf (grub_errmsg
, sizeof (grub_errmsg
), _(fmt
), ap
);
56 grub_fatal (const char *fmt
, ...)
61 grub_vprintf (_(fmt
), ap
);
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
,
77 sizeof (grub_errmsg
));
79 /* Advance to next error stack position. */
80 grub_error_stack_pos
++;
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
;
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
));
111 /* There is no more items on error stack, reset to no error state. */
112 grub_errno
= GRUB_ERR_NONE
;
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;