Index: conf/common.rmk =================================================================== --- conf/common.rmk (revision 1833) +++ conf/common.rmk (working copy) @@ -20,7 +20,7 @@ grub_probe_SOURCES = util/grub-probe.c \ fs/ufs.c fs/xfs.c fs/afs.c \ \ partmap/pc.c partmap/apple.c partmap/gpt.c \ - kern/fs.c kern/env.c fs/fshelp.c \ + kern/fs.c kern/env.c kern/handler.c fs/fshelp.c \ disk/lvm.c disk/raid.c disk/mdraid_linux.c grub_probe_init.c ifeq ($(enable_grub_fstest), yes) @@ -40,8 +40,8 @@ grub_fstest_SOURCES = util/grub-fstest.c fs/ufs.c fs/xfs.c fs/afs.c \ \ kern/partition.c partmap/pc.c partmap/apple.c partmap/gpt.c \ - kern/fs.c kern/env.c fs/fshelp.c disk/lvm.c disk/raid.c \ - disk/raid5_recover.c disk/raid6_recover.c \ + kern/fs.c kern/env.c kern/handler.c fs/fshelp.c disk/lvm.c \ + disk/raid.c disk/raid5_recover.c disk/raid6_recover.c \ disk/mdraid_linux.c disk/dmraid_nvidia.c \ grub_fstest_init.c Index: conf/i386-pc.rmk =================================================================== --- conf/i386-pc.rmk (revision 1833) +++ conf/i386-pc.rmk (working copy) @@ -40,7 +40,7 @@ cdboot_img_LDFLAGS = $(COMMON_LDFLAGS) $ # For kernel.img. kernel_img_SOURCES = kern/i386/pc/startup.S kern/main.c kern/device.c \ - kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \ + kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c kern/handler.c \ kern/misc.c kern/mm.c kern/loader.c kern/rescue.c kern/term.c \ kern/time.c \ kern/i386/dl.c kern/i386/pc/init.c kern/i386/pc/mmap.c \ @@ -52,7 +52,7 @@ kernel_img_SOURCES = kern/i386/pc/startu term/i386/pc/console.c \ symlist.c kernel_img_HEADERS = arg.h boot.h cache.h device.h disk.h dl.h elf.h elfload.h \ - env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \ + env.h err.h file.h fs.h handler.h kernel.h loader.h misc.h mm.h net.h parser.h \ partition.h pc_partition.h rescue.h symbol.h term.h time.h types.h \ machine/biosdisk.h machine/boot.h machine/console.h machine/init.h \ machine/memory.h machine/loader.h machine/vga.h machine/vbe.h \ @@ -93,8 +93,9 @@ util/i386/pc/grub-mkimage.c_DEPENDENCIES util/i386/pc/grub-setup.c_DEPENDENCIES = grub_setup_init.h grub_setup_SOURCES = util/i386/pc/grub-setup.c util/biosdisk.c \ util/misc.c util/getroot.c kern/device.c kern/disk.c \ - kern/err.c kern/misc.c kern/parser.c kern/partition.c \ - kern/file.c kern/fs.c kern/env.c fs/fshelp.c \ + kern/err.c kern/handler.c kern/misc.c kern/parser.c \ + kern/partition.c kern/file.c kern/fs.c kern/env.c \ + fs/fshelp.c \ \ fs/affs.c fs/cpio.c fs/ext2.c fs/fat.c fs/hfs.c \ fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c \ @@ -124,7 +125,7 @@ grub_emu_SOURCES = commands/boot.c comma \ io/gzio.c \ kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c \ - kern/err.c \ + kern/err.c kern/handler.c \ normal/execute.c kern/file.c kern/fs.c normal/lexer.c \ kern/loader.c kern/main.c kern/misc.c kern/parser.c \ grub_script.tab.c kern/partition.c kern/rescue.c kern/term.c \ Index: conf/i386-efi.rmk =================================================================== --- conf/i386-efi.rmk (revision 1833) +++ conf/i386-efi.rmk (working copy) @@ -48,7 +48,7 @@ grub_emu_SOURCES = commands/boot.c comma \ io/gzio.c \ kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c \ - kern/err.c \ + kern/err.c kern/handler.c \ normal/execute.c kern/file.c kern/fs.c normal/lexer.c \ kern/loader.c kern/main.c kern/misc.c kern/parser.c \ grub_script.tab.c kern/partition.c kern/rescue.c kern/term.c \ @@ -82,7 +82,7 @@ pkglib_MODULES = kernel.mod normal.mod _ # For kernel.mod. kernel_mod_EXPORTS = no kernel_mod_SOURCES = kern/i386/efi/startup.S kern/main.c kern/device.c \ - kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \ + kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c kern/handler.c \ kern/misc.c kern/mm.c kern/loader.c kern/rescue.c kern/term.c \ kern/i386/dl.c kern/i386/efi/init.c kern/parser.c kern/partition.c \ kern/env.c symlist.c kern/efi/efi.c kern/efi/init.c kern/efi/mm.c \ @@ -92,7 +92,7 @@ kernel_mod_SOURCES = kern/i386/efi/start kern/generic/rtc_get_time_ms.c \ kern/generic/millisleep.c kernel_mod_HEADERS = arg.h boot.h cache.h device.h disk.h dl.h elf.h elfload.h \ - env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \ + env.h err.h handler.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \ partition.h pc_partition.h rescue.h symbol.h term.h time.h types.h \ efi/efi.h efi/time.h efi/disk.h kernel_mod_CFLAGS = $(COMMON_CFLAGS) Index: conf/x86_64-efi.rmk =================================================================== --- conf/x86_64-efi.rmk (revision 1833) +++ conf/x86_64-efi.rmk (working copy) @@ -50,7 +50,7 @@ grub_emu_SOURCES = commands/boot.c comma \ io/gzio.c \ kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c \ - kern/err.c \ + kern/err.c kern/handler.c \ normal/execute.c kern/file.c kern/fs.c normal/lexer.c \ kern/loader.c kern/main.c kern/misc.c kern/parser.c \ grub_script.tab.c kern/partition.c kern/rescue.c kern/term.c \ @@ -85,7 +85,7 @@ pkglib_MODULES = kernel.mod normal.mod _ kernel_mod_EXPORTS = no kernel_mod_SOURCES = kern/x86_64/efi/startup.S kern/x86_64/efi/callwrap.S \ kern/main.c kern/device.c \ - kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \ + kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c kern/handler.c \ kern/misc.c kern/mm.c kern/loader.c kern/rescue.c kern/term.c \ kern/x86_64/dl.c kern/i386/efi/init.c kern/parser.c kern/partition.c \ kern/env.c symlist.c kern/efi/efi.c kern/efi/init.c kern/efi/mm.c \ @@ -94,7 +94,7 @@ kernel_mod_SOURCES = kern/x86_64/efi/sta kern/generic/millisleep.c kern/generic/rtc_get_time_ms.c \ term/efi/console.c disk/efi/efidisk.c kernel_mod_HEADERS = arg.h boot.h cache.h device.h disk.h dl.h elf.h elfload.h \ - env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \ + env.h err.h handler.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \ partition.h pc_partition.h rescue.h symbol.h term.h time.h types.h \ efi/efi.h efi/time.h efi/disk.h machine/loader.h kernel_mod_CFLAGS = $(COMMON_CFLAGS) Index: conf/i386-coreboot.rmk =================================================================== --- conf/i386-coreboot.rmk (revision 1833) +++ conf/i386-coreboot.rmk (working copy) @@ -15,7 +15,7 @@ kernel_elf_SOURCES = kern/i386/coreboot/ kern/i386/coreboot/init.c \ kern/i386/coreboot/mmap.c \ kern/main.c kern/device.c \ - kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \ + kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c kern/handler.c \ kern/misc.c kern/mm.c kern/loader.c kern/rescue.c kern/term.c \ kern/time.c \ kern/i386/dl.c kern/parser.c kern/partition.c \ @@ -27,7 +27,7 @@ kernel_elf_SOURCES = kern/i386/coreboot/ term/i386/pc/at_keyboard.c term/i386/pc/vga_text.c \ symlist.c kernel_elf_HEADERS = arg.h boot.h cache.h device.h disk.h dl.h elf.h elfload.h \ - env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \ + env.h err.h file.h fs.h handler.h kernel.h loader.h misc.h mm.h net.h parser.h \ partition.h pc_partition.h rescue.h symbol.h term.h time.h types.h \ machine/boot.h machine/console.h machine/init.h \ machine/memory.h machine/loader.h @@ -71,7 +71,7 @@ grub_emu_SOURCES = commands/boot.c comma fs/fshelp.c \ io/gzio.c \ kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c \ - kern/err.c \ + kern/err.c kern/handler.c \ normal/execute.c kern/file.c kern/fs.c normal/lexer.c \ kern/loader.c kern/main.c kern/misc.c kern/parser.c \ grub_script.tab.c kern/partition.c kern/rescue.c kern/term.c \ Index: conf/powerpc-ieee1275.rmk =================================================================== --- conf/powerpc-ieee1275.rmk (revision 1833) +++ conf/powerpc-ieee1275.rmk (working copy) @@ -14,7 +14,7 @@ MOSTLYCLEANFILES += symlist.c kernel_sym DEFSYMFILES += kernel_syms.lst kernel_elf_HEADERS = arg.h boot.h cache.h device.h disk.h dl.h elf.h elfload.h \ - env.h err.h file.h fs.h kernel.h misc.h mm.h net.h parser.h rescue.h \ + env.h err.h file.h fs.h handler.h kernel.h misc.h mm.h net.h parser.h rescue.h \ symbol.h term.h time.h types.h powerpc/libgcc.h loader.h partition.h \ pc_partition.h ieee1275/ieee1275.h machine/kernel.h @@ -53,7 +53,8 @@ grub_emu_SOURCES = commands/boot.c comma \ io/gzio.c \ kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c \ - kern/err.c kern/file.c kern/fs.c kern/loader.c kern/main.c \ + kern/err.c kern/file.c kern/fs.c kern/handler.c kern/loader.c \ + kern/main.c \ kern/misc.c kern/parser.c kern/partition.c kern/rescue.c \ kern/term.c fs/fshelp.c \ normal/arg.c normal/cmdline.c normal/command.c \ @@ -75,10 +76,10 @@ grub_emu_LDFLAGS = $(LIBCURSES) kernel_elf_SOURCES = kern/powerpc/ieee1275/crt0.S kern/ieee1275/cmain.c \ kern/ieee1275/ieee1275.c kern/main.c kern/device.c \ - kern/disk.c kern/dl.c kern/err.c kern/file.c kern/fs.c \ - kern/misc.c kern/mm.c kern/loader.c kern/rescue.c kern/term.c \ - kern/ieee1275/init.c term/ieee1275/ofconsole.c \ - kern/ieee1275/openfw.c disk/ieee1275/ofdisk.c \ + kern/disk.c kern/dl.c kern/err.c kern/handler.c kern/file.c \ + kern/fs.c kern/misc.c kern/mm.c kern/loader.c kern/rescue.c \ + kern/term.c kern/ieee1275/init.c term/ieee1275/ofconsole.c \ + kern/ieee1275/openfw.c disk/ieee1275/ofdisk.c \ kern/parser.c kern/partition.c kern/env.c kern/powerpc/dl.c \ kern/generic/millisleep.c kern/time.c \ symlist.c kern/powerpc/cache.S Index: conf/sparc64-ieee1275.rmk =================================================================== --- conf/sparc64-ieee1275.rmk (revision 1833) +++ conf/sparc64-ieee1275.rmk (working copy) @@ -14,7 +14,7 @@ MOSTLYCLEANFILES += symlist.c kernel_sym DEFSYMFILES += kernel_syms.lst kernel_elf_HEADERS = arg.h boot.h cache.h device.h disk.h dl.h elf.h elfload.h \ - env.h err.h file.h fs.h kernel.h misc.h mm.h net.h parser.h rescue.h \ + env.h err.h handler.h file.h fs.h kernel.h misc.h mm.h net.h parser.h rescue.h \ symbol.h term.h time.h types.h sparc64/libgcc.h loader.h partition.h \ pc_partition.h ieee1275/ieee1275.h machine/kernel.h @@ -69,7 +69,7 @@ grub_emu_LDFLAGS = $(LIBCURSES) kernel_elf_SOURCES = kern/sparc64/ieee1275/init.c kern/ieee1275/ieee1275.c \ kern/main.c kern/device.c kern/disk.c kern/dl.c kern/file.c \ - kern/fs.c kern/err.c kern/misc.c kern/mm.c kern/loader.c \ + kern/fs.c kern/err.c kern/handler.c kern/misc.c kern/mm.c kern/loader.c \ kern/rescue.c kern/term.c term/ieee1275/ofconsole.c \ kern/sparc64/ieee1275/openfw.c disk/ieee1275/ofdisk.c \ kern/partition.c kern/env.c kern/sparc64/dl.c symlist.c \ Index: conf/i386-ieee1275.rmk =================================================================== --- conf/i386-ieee1275.rmk (revision 1833) +++ conf/i386-ieee1275.rmk (working copy) @@ -18,7 +18,7 @@ kernel_elf_SOURCES = kern/i386/ieee1275/ kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \ kern/misc.c kern/mm.c kern/loader.c kern/rescue.c kern/term.c \ kern/i386/dl.c kern/parser.c kern/partition.c \ - kern/env.c \ + kern/env.c kern/handler.c \ kern/time.c \ kern/generic/millisleep.c \ kern/ieee1275/ieee1275.c \ @@ -26,7 +26,7 @@ kernel_elf_SOURCES = kern/i386/ieee1275/ disk/ieee1275/ofdisk.c \ symlist.c kernel_elf_HEADERS = arg.h cache.h device.h disk.h dl.h elf.h elfload.h \ - env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \ + env.h err.h file.h fs.h handler.h kernel.h loader.h misc.h mm.h net.h parser.h \ partition.h pc_partition.h rescue.h symbol.h term.h time.h types.h \ ieee1275/ieee1275.h machine/kernel.h machine/loader.h machine/memory.h kernel_elf_CFLAGS = $(COMMON_CFLAGS) @@ -69,7 +69,7 @@ grub_emu_SOURCES = commands/boot.c comma fs/fshelp.c \ io/gzio.c \ kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c \ - kern/err.c \ + kern/err.c kern/handler.c \ normal/execute.c kern/file.c kern/fs.c normal/lexer.c \ kern/loader.c kern/main.c kern/misc.c kern/parser.c \ grub_script.tab.c kern/partition.c kern/rescue.c kern/term.c \ Index: kern/fs.c =================================================================== --- kern/fs.c (revision 1833) +++ kern/fs.c (working copy) @@ -27,39 +27,9 @@ #include #include -static grub_fs_t grub_fs_list; - grub_fs_autoload_hook_t grub_fs_autoload_hook = 0; -void -grub_fs_register (grub_fs_t fs) -{ - fs->next = grub_fs_list; - grub_fs_list = fs; -} - -void -grub_fs_unregister (grub_fs_t fs) -{ - grub_fs_t *p, q; - - for (p = &grub_fs_list, q = *p; q; p = &(q->next), q = q->next) - if (q == fs) - { - *p = q->next; - break; - } -} - -void -grub_fs_iterate (int (*hook) (const grub_fs_t fs)) -{ - grub_fs_t p; - - for (p = grub_fs_list; p; p = p->next) - if (hook (p)) - break; -} +GRUB_HANDLER_CREATE_C (grub_fs); grub_fs_t grub_fs_probe (grub_device_t device) Index: kern/handler.c =================================================================== --- kern/handler.c (revision 0) +++ kern/handler.c (revision 0) @@ -0,0 +1,56 @@ +/* handler.c - handle handlers */ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2008 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 +#include +#include + +void +grub_handler_register (grub_handler_t *head, grub_handler_t handler) +{ + handler->next = *head; + *head = handler; +} + +void +grub_handler_unregister (grub_handler_t *head, grub_handler_t handler) +{ + grub_handler_t *p, q; + + for (p = head, q = *p; q; p = &(q->next), q = q->next) + if (q == handler) + { + *p = q->next; + break; + } +} + +int +grub_handler_iterate (grub_handler_t head, + int (*hook) (const grub_handler_t handler)) +{ + grub_handler_t p; + + for (p = head; p; p = p->next) + if (hook (p)) + break; + + return 0; +} Index: genkernsyms.sh.in =================================================================== --- genkernsyms.sh.in (revision 1833) +++ genkernsyms.sh.in (working copy) @@ -24,4 +24,5 @@ $CC -DGRUB_SYMBOL_GENERATOR=1 -E -I. -Ii | sed -n \ -e '/EXPORT_FUNC *([a-zA-Z0-9_]*)/{s/.*EXPORT_FUNC *(\([a-zA-Z0-9_]*\)).*/'"$u"'\1 kernel/;p;}' \ -e '/EXPORT_VAR *([a-zA-Z0-9_]*)/{s/.*EXPORT_VAR *(\([a-zA-Z0-9_]*\)).*/'"$u"'\1 kernel/;p;}' \ + -e '/GRUB_HANDLER_CREATE_H_KERNEL *([a-zA-Z0-9_]*)/{s/.*GRUB_HANDLER_CREATE_H_KERNEL *(\([a-zA-Z0-9_]*\)).*/'"$u"'\1_register kernel\n\1_unregister kernel\n\1_iterate kernel/;p;}' \ | sort -u Index: include/grub/fs.h =================================================================== --- include/grub/fs.h (revision 1833) +++ include/grub/fs.h (working copy) @@ -23,6 +23,7 @@ #include #include #include +#include /* Forward declaration is required, because of mutual reference. */ struct grub_file; @@ -30,8 +31,7 @@ struct grub_file; /* Filesystem descriptor. */ struct grub_fs { - /* My name. */ - const char *name; + GRUB_HANDLER_CREATE_STRUCT(grub_fs); /* Call HOOK with each file under DIR. */ grub_err_t (*dir) (grub_device_t device, const char *path, @@ -55,11 +55,9 @@ struct grub_fs returned in a grub_malloc'ed buffer and should be freed by the caller. */ grub_err_t (*uuid) (grub_device_t device, char **uuid); - - /* The next filesystem. */ - struct grub_fs *next; }; -typedef struct grub_fs *grub_fs_t; + +GRUB_HANDLER_CREATE_H_KERNEL(grub_fs); /* This is special, because block lists are not files in usual sense. */ extern struct grub_fs grub_fs_blocklist; @@ -71,9 +69,6 @@ extern struct grub_fs grub_fs_blocklist; typedef int (*grub_fs_autoload_hook_t) (void); extern grub_fs_autoload_hook_t EXPORT_VAR(grub_fs_autoload_hook); -void EXPORT_FUNC(grub_fs_register) (grub_fs_t fs); -void EXPORT_FUNC(grub_fs_unregister) (grub_fs_t fs); -void EXPORT_FUNC(grub_fs_iterate) (int (*hook) (const grub_fs_t fs)); grub_fs_t EXPORT_FUNC(grub_fs_probe) (grub_device_t device); #endif /* ! GRUB_FS_HEADER */ Index: include/grub/handler.h =================================================================== --- include/grub/handler.h (revision 0) +++ include/grub/handler.h (revision 0) @@ -0,0 +1,105 @@ +/* handler.h - handler interfaces */ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2008 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 . + */ + +#ifndef GRUB_HANDLER_HEADER +#define GRUB_HANDLER_HEADER 1 + +struct grub_handler +{ + struct grub_handler *next; +}; +typedef struct grub_handler *grub_handler_t; + +void grub_handler_register (grub_handler_t *head, grub_handler_t handler); + +void grub_handler_unregister (grub_handler_t *head, grub_handler_t handler); + +int grub_handler_iterate (grub_handler_t head, + int (*hook) (const grub_handler_t handler)); + + + +/* Whenever a struct that needs a handler is defined, use this macro + as if it is a member. HNAME is the name of the handler, HSNAME is + the name of the struct the handler uses. */ +#define GRUB_HANDLER_CREATE_STRUCT(hsname) \ + /* The next struct of this kind. */ \ + struct hsname *next; \ + \ + /* My name. */ \ + const char *name; + +/* Create the types for the handler. This macro should be used inside + the header file for handlers defined by the GRUB kernel. Users of + this macro should define the prototypes themselves. HSNAME is the + name of the struct the handler uses. */ +#ifndef GRUB_SYMBOL_GENERATOR +#define GRUB_HANDLER_CREATE_H_KERNEL(hsname) \ +typedef struct hsname *hsname ## _t; \ +extern hsname ## _t hsname ## _list; \ +typedef int (*hsname ## _hookfunc) (const grub_handler_t handler); \ +void hsname ## _register (hsname ## _t); \ +void hsname ## _unregister (hsname ## _t); \ +void hsname ##_iterate (int (*hook) (const hsname ## _t h)); +#else + +#endif + +/* Create the types and prototypes for the handler. This macro should + be used inside the header file for handlers defined by GRUB + modules. HSNAME is the name of the struct the handler uses. */ +#define GRUB_HANDLER_CREATE_H(hsname) \ +typedef struct hsname *hsname ## _t; \ +extern hsname ## _t hsname ## _list; \ +typedef int (*hsname ## _hookfunc) (const grub_handler_t handler); \ +void hsname ## _register (hsname ## _t); \ +void hsname ## _unregister (hsname ## _t); \ +void hsname ##_iterate (int (*hook) (const hsname ## _t h)); + + +/* Create the wrapper functions for the handler. This macro should be + used inside the C file for handlers. HSNAME is the name of the + struct the handler uses. */ +#define GRUB_HANDLER_CREATE_C(hsname) \ +hsname ## _t hsname ## _list; \ + \ +void \ +hsname ##_register (hsname ## _t handler) \ +{ \ + grub_handler_register ((grub_handler_t *) \ + (void *) &hsname ## _list, \ + (grub_handler_t) handler); \ +} \ + \ +void \ +hsname ##_unregister (hsname ## _t handler) \ +{ \ + grub_handler_unregister ((grub_handler_t *) \ + (void *) &hsname ## _list, \ + (grub_handler_t) handler); \ +} \ + \ +void \ +hsname ##_iterate (int (*hook) (const hsname ## _t h)) \ +{ \ + grub_handler_iterate ((grub_handler_t) hsname ## _list, \ + (hsname ## _hookfunc) hook); \ +} + +#endif /* ! GRUB_HANDLER_HEADER */