grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Idea: elimination of the normal mode (revised version)


From: Marco Gerards
Subject: Re: Idea: elimination of the normal mode (revised version)
Date: Tue, 22 Jul 2008 23:26:31 +0200
User-agent: Gnus/5.110006 (No Gnus v0.6) Emacs/21.4 (gnu/linux)

Marco Gerards <address@hidden> writes:

[...]

> Although what if we want additional handlers.  Like image readers or
> so?  We do not need to centralize this.  What about this:

[...]

Here is a patch to register and deal with handlers.  It decentralizes
handlers and should remove some maintainance burden and boring code
duplication.  Please tell me what you think of this.

Okuji, can you please comment on this, as this is important, it
changes all core functionality eventually.

--
Marco

2008-07-22  Marco Gerards  <address@hidden>

        * conf/i386-efi.rmk (grub_emu_SOURCES): Add `kern/handler.c'.
        (kernel_img_SOURCES): Likewise.
        (grub_setup_SOURCES): Likewise.
        (kernel_mod_HEADERS): Add handler.h.

        * conf/common.rmk (grub_probe_SOURCES): Add `kern/handler.c'.
        (grub_fstest_SOURCES): Likewise.

        * conf/i386-efi.rmk (grub_emu_SOURCES): Add `kern/handler.c'.
        (kernel_mod_SOURCES): Likewise.
        (kernel_mod_HEADERS): Add `handler.h'.

        * conf/x86_64-efi.rmk (grub_emu_SOURCES): Add `kern/handler.c'.
        (kernel_mod_SOURCES): Likewise.
        (kernel_mod_HEADERS): Add `handler.h'.

        * conf/powerpc-ieee1275.rmk (kernel_elf_HEADERS): Add `handler.h'.
        (grub_emu_SOURCES): Add `kern/handler.c'.
        (kernel_elf_SOURCES): Likewise.

        * conf/i386-coreboot.rmk (kernel_elf_HEADERS): Add `handler.h'.
        (grub_emu_SOURCES): Add kern/handler.c
        (kernel_elf_SOURCES): Likewise.

        * conf/sparc64-ieee1275.rmk (kernel_elf_HEADERS): Add `handler.h'.
        (kernel_elf_SOURCES): Likewise.

        * conf/i386-ieee1275.rmk (kernel_elf_HEADERS): Add `handler.h'.
        (grub_emu_SOURCES): Add `kern/handler.c'.
        (kernel_elf_SOURCES): Likewise.

        * kern/fs.c: Register fs handler using GRUB_HANDLER_CREATE_C.
        (grub_fs_list): Removed.
        (grub_fs_register): Likewise.
        (grub_fs_unregister): Likewise.
        (grub_fs_iterate): Likewise.

        * kern/handler.c: New file.

        * include/grub/handler.h: Likewise.

        * include/grub/fs.h: Include <grub/handler.h>.  Create handler
        using GRUB_HANDLER_CREATE_H_KERNEL.
        (grub_fs): Removed members `name' and `next'.  Use
        GRUB_HANDLER_CREATE_STRUCT to recreate these members.
        (grub_fs_t): Removed.
 

Index: conf/common.rmk
===================================================================
--- conf/common.rmk     (revision 1724)
+++ conf/common.rmk     (working copy)
@@ -14,7 +14,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 grub_probe_init.c
 
 ifeq ($(enable_grub_fstest), yes)
@@ -34,8 +34,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 \
-       grub_fstest_init.c
+       kern/handler.c kern/fs.c kern/env.c fs/fshelp.c disk/lvm.c      \
+       disk/raid.c grub_fstest_init.c
 
 # For the parser.
 grub_script.tab.c grub_script.tab.h: normal/parser.y
Index: conf/i386-pc.rmk
===================================================================
--- conf/i386-pc.rmk    (revision 1724)
+++ conf/i386-pc.rmk    (working copy)
@@ -40,14 +40,14 @@ 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/i386/dl.c kern/i386/pc/init.c kern/parser.c kern/partition.c \
        kern/env.c \
        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 
machine/kernel.h
@@ -87,8 +87,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  \
@@ -118,7 +119,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 1724)
+++ 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    \
@@ -80,13 +80,13 @@ 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 \
        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
 kernel_mod_CFLAGS = $(COMMON_CFLAGS)
Index: conf/x86_64-efi.rmk
===================================================================
--- conf/x86_64-efi.rmk (revision 1724)
+++ 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    \
@@ -83,13 +83,13 @@ 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 \
        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/powerpc-ieee1275.rmk
===================================================================
--- conf/powerpc-ieee1275.rmk   (revision 1724)
+++ 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
 
@@ -59,7 +59,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                  \
@@ -80,10 +81,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     \
        symlist.c kern/powerpc/cache.S
 kernel_elf_HEADERS = grub/powerpc/ieee1275/ieee1275.h
Index: conf/i386-coreboot.rmk
===================================================================
--- conf/i386-coreboot.rmk      (revision 1724)
+++ conf/i386-coreboot.rmk      (working copy)
@@ -14,7 +14,7 @@ pkglib_PROGRAMS = kernel.elf
 kernel_elf_SOURCES = kern/i386/linuxbios/startup.S kern/i386/linuxbios/init.c \
        kern/i386/linuxbios/table.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/i386/dl.c kern/parser.c kern/partition.c \
        kern/env.c \
@@ -22,7 +22,7 @@ kernel_elf_SOURCES = kern/i386/linuxbios
        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
@@ -72,7 +72,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/sparc64-ieee1275.rmk
===================================================================
--- conf/sparc64-ieee1275.rmk   (revision 1724)
+++ 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 1724)
+++ conf/i386-ieee1275.rmk      (working copy)
@@ -18,13 +18,13 @@ 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/ieee1275/ieee1275.c \
        term/ieee1275/ofconsole.c term/i386/pc/at_keyboard.c \
        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)
@@ -74,7 +74,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 1724)
+++ kern/fs.c   (working copy)
@@ -27,39 +27,9 @@
 #include <grub/mm.h>
 #include <grub/term.h>
 
-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 (fs, 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include <grub/types.h>
+#include <grub/misc.h>
+#include <grub/mm.h>
+#include <grub/handler.h>
+
+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: include/grub/fs.h
===================================================================
--- include/grub/fs.h   (revision 1724)
+++ include/grub/fs.h   (working copy)
@@ -23,6 +23,7 @@
 #include <grub/device.h>
 #include <grub/symbol.h>
 #include <grub/types.h>
+#include <grub/handler.h>
 
 /* 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(fs, 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(fs, grub_fs);
 
 /* This is special, because block lists are not files in usual sense.  */
 extern struct grub_fs grub_fs_blocklist;
Index: include/grub/handler.h
===================================================================
--- include/grub/handler.h      (revision 0)
+++ include/grub/handler.h      (revision 0)
@@ -0,0 +1,100 @@
+/* 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 <http://www.gnu.org/licenses/>.
+ */
+
+#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(hname, 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.  HNAME is the
+   name of the handler, HSNAME is the name of the struct the handler
+   uses.  */
+#define GRUB_HANDLER_CREATE_H_KERNEL(hname, hsname)                    \
+typedef struct hsname *hsname ## _t;                                   \
+typedef int (*hsname ## _hookfunc) (const grub_handler_t handler);     \
+extern hsname ## _t hsname ## _list; 
+
+/* Create the types and prototypes for the handler.  This macro should
+   be used inside the header file for handlers defined by GRUB
+   modules.  HNAME is the name of the handler, HSNAME is the name of
+   the struct the handler uses.  */
+#define GRUB_HANDLER_CREATE_H(hname, 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.  HNAME is the name of the
+   handler, HSNAME is the name of the struct the handler uses.  */
+#define GRUB_HANDLER_CREATE_C(hname, 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 */

reply via email to

[Prev in Thread] Current Thread [Next in Thread]