Index: conf/common.rmk =================================================================== --- conf/common.rmk (Revision 1804) +++ conf/common.rmk (Arbeitskopie) @@ -4,7 +4,7 @@ sbin_UTILITIES += grub-probe util/grub-probe.c_DEPENDENCIES = grub_probe_init.h grub_probe_SOURCES = util/grub-probe.c \ - util/biosdisk.c util/misc.c util/getroot.c \ + util/biosdisk.c util/misc.c util/getroot.c util/err.c \ kern/device.c kern/disk.c kern/err.c kern/misc.c \ kern/parser.c kern/partition.c kern/file.c \ \ Index: kern/err.c =================================================================== --- kern/err.c (Revision 1804) +++ kern/err.c (Arbeitskopie) @@ -34,7 +34,7 @@ static struct } grub_error_stack_items[GRUB_ERROR_STACK_SIZE]; static int grub_error_stack_pos; -static int grub_error_stack_assert; +int grub_error_stack_assert; grub_err_t grub_error (grub_err_t n, const char *fmt, ...) @@ -112,7 +112,7 @@ grub_error_pop (void) return 0; } } - +#ifndef GRUB_UTIL void grub_print_error (void) { @@ -132,3 +132,4 @@ grub_print_error (void) grub_error_stack_assert = 0; } } +#endif Index: include/grub/err.h =================================================================== --- include/grub/err.h (Revision 1804) +++ include/grub/err.h (Arbeitskopie) @@ -58,6 +58,7 @@ grub_err_t; extern grub_err_t EXPORT_VAR(grub_errno); extern char EXPORT_VAR(grub_errmsg)[]; +extern int grub_error_stack_assert; grub_err_t EXPORT_FUNC(grub_error) (grub_err_t n, const char *fmt, ...); void EXPORT_FUNC(grub_fatal) (const char *fmt, ...) __attribute__ ((noreturn)); Index: conf/common.rmk =================================================================== --- conf/common.rmk (Revision 1804) +++ conf/common.rmk (Arbeitskopie) @@ -4,7 +4,7 @@ sbin_UTILITIES += grub-probe util/grub-probe.c_DEPENDENCIES = grub_probe_init.h grub_probe_SOURCES = util/grub-probe.c \ - util/biosdisk.c util/misc.c util/getroot.c \ + util/biosdisk.c util/misc.c util/getroot.c util/err.c \ kern/device.c kern/disk.c kern/err.c kern/misc.c \ kern/parser.c kern/partition.c kern/file.c \ \ Index: kern/err.c =================================================================== --- kern/err.c (Revision 1804) +++ kern/err.c (Arbeitskopie) @@ -34,7 +34,7 @@ static struct } grub_error_stack_items[GRUB_ERROR_STACK_SIZE]; static int grub_error_stack_pos; -static int grub_error_stack_assert; +int grub_error_stack_assert; grub_err_t grub_error (grub_err_t n, const char *fmt, ...) @@ -112,7 +112,7 @@ grub_error_pop (void) return 0; } } - +#ifndef GRUB_UTIL void grub_print_error (void) { @@ -132,3 +132,4 @@ grub_print_error (void) grub_error_stack_assert = 0; } } +#endif Index: include/grub/err.h =================================================================== --- include/grub/err.h (Revision 1804) +++ include/grub/err.h (Arbeitskopie) @@ -58,6 +58,7 @@ grub_err_t; extern grub_err_t EXPORT_VAR(grub_errno); extern char EXPORT_VAR(grub_errmsg)[]; +extern int grub_error_stack_assert; grub_err_t EXPORT_FUNC(grub_error) (grub_err_t n, const char *fmt, ...); void EXPORT_FUNC(grub_fatal) (const char *fmt, ...) __attribute__ ((noreturn)); Index: util/err.c =================================================================== --- util/err.c (Revision 0) +++ util/err.c (Revision 0) @@ -0,0 +1,41 @@ +/* err.c - util error printing routine */ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2002,2005,2007 Free Software Foundation, Inc. + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see . + */ + +#include +#include + +void +grub_print_error (void) +{ + /* Print error messages in reverse order. First print active error message + and then empty error stack. */ + do + { + if (grub_errno != GRUB_ERR_NONE) + fprintf (stderr, "error: %s\n", grub_errmsg); + } + while (grub_error_pop ()); + + /* If there was an assert while using error stack, report about it. */ + if (grub_error_stack_assert) + { + fprintf (stderr, "assert: error stack overflow detected!\n"); + grub_error_stack_assert = 0; + } +}