1 /* crypto.c - support crypto autoload */
3 * GRUB -- GRand Unified Bootloader
4 * Copyright (C) 2009 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/>.
23 #include <grub/misc.h>
24 #include <grub/crypto.h>
25 #include <grub/normal.h>
29 struct load_spec
*next
;
34 static struct load_spec
*crypto_specs
= NULL
;
37 grub_crypto_autoload (const char *name
)
39 struct load_spec
*cur
;
43 /* Some bufio of filesystems may want some crypto modules.
44 It may result in infinite recursion. Hence this check. */
49 for (cur
= crypto_specs
; cur
; cur
= cur
->next
)
50 if (grub_strcasecmp (name
, cur
->name
) == 0)
52 mod
= grub_dl_load (cur
->modname
);
55 grub_errno
= GRUB_ERR_NONE
;
61 grub_crypto_spec_free (void)
63 struct load_spec
*cur
, *next
;
64 for (cur
= crypto_specs
; cur
; cur
= next
)
67 grub_free (cur
->name
);
68 grub_free (cur
->modname
);
75 /* Read the file crypto.lst for auto-loading. */
77 read_crypto_list (const char *prefix
)
85 grub_errno
= GRUB_ERR_NONE
;
89 filename
= grub_xasprintf ("%s/" GRUB_TARGET_CPU
"-" GRUB_PLATFORM
90 "/crypto.lst", prefix
);
93 grub_errno
= GRUB_ERR_NONE
;
97 file
= grub_file_open (filename
);
101 grub_errno
= GRUB_ERR_NONE
;
105 /* Override previous crypto.lst. */
106 grub_crypto_spec_free ();
108 for (;; grub_free (buf
))
111 struct load_spec
*cur
;
113 buf
= grub_file_getline (file
);
119 while (grub_isspace (name
[0]))
122 p
= grub_strchr (name
, ':');
128 while (*p
== ' ' || *p
== '\t')
131 cur
= grub_malloc (sizeof (*cur
));
134 grub_errno
= GRUB_ERR_NONE
;
138 cur
->name
= grub_strdup (name
);
141 grub_errno
= GRUB_ERR_NONE
;
146 cur
->modname
= grub_strdup (p
);
149 grub_errno
= GRUB_ERR_NONE
;
151 grub_free (cur
->name
);
154 cur
->next
= crypto_specs
;
158 grub_file_close (file
);
160 grub_errno
= GRUB_ERR_NONE
;
162 grub_crypto_autoload_hook
= grub_crypto_autoload
;