Merge branch 'master' of git.sv.gnu.org:/srv/git/grub
This commit is contained in:
commit
dd05b91f6b
5 changed files with 103 additions and 117 deletions
16
ChangeLog
16
ChangeLog
|
@ -1,3 +1,19 @@
|
||||||
|
2013-12-16 Andrey Borzenkov <arvidjaar@gmail.com>
|
||||||
|
|
||||||
|
* grub-core/osdep/linux/platform.c (grub_install_get_default_x86_platform):
|
||||||
|
Add verbose information which firmware directories were tried.
|
||||||
|
|
||||||
|
2013-12-16 Andrey Borzenkov <arvidjaar@gmail.com>
|
||||||
|
|
||||||
|
* grub-core/osdep/unix/exec.c (grub_util_exec_redirect_all): New
|
||||||
|
function to optionally redirect all three standard descriptors.
|
||||||
|
Redefine grub_util_exec, grub_util_exec_redirect and
|
||||||
|
grub_util_exec_redirect_null to use it.
|
||||||
|
* include/grub/emu/exec.h: Define it.
|
||||||
|
* include/grub/osdep/exec_unix.h: Delete, it is unused.
|
||||||
|
* grub-core/osdep/linux/platform.c (grub_install_get_default_x86_platform):
|
||||||
|
Use grub_util_exec_redirect_all to redirect error to NULL.
|
||||||
|
|
||||||
2013-12-16 Vladimir Serbinenko <phcoder@gmail.com>
|
2013-12-16 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
* grub-core/tests/sleep_test.c: Silence spurious warning.
|
* grub-core/tests/sleep_test.c: Silence spurious warning.
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
|
|
||||||
#include <grub/util/install.h>
|
#include <grub/util/install.h>
|
||||||
#include <grub/emu/exec.h>
|
#include <grub/emu/exec.h>
|
||||||
|
#include <grub/emu/misc.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -69,17 +70,26 @@ grub_install_get_default_x86_platform (void)
|
||||||
anyway later. So it should be safe to
|
anyway later. So it should be safe to
|
||||||
try to load it here.
|
try to load it here.
|
||||||
*/
|
*/
|
||||||
grub_util_exec ((const char * []){ "modprobe", "-q",
|
grub_util_exec_redirect_all ((const char * []){ "modprobe", "efivars", NULL },
|
||||||
"efivars", NULL });
|
NULL, NULL, "/dev/null");
|
||||||
|
|
||||||
|
grub_util_info ("Looking for /sys/firmware/efi ..");
|
||||||
if (is_not_empty_directory ("/sys/firmware/efi"))
|
if (is_not_empty_directory ("/sys/firmware/efi"))
|
||||||
{
|
{
|
||||||
|
grub_util_info ("...found");
|
||||||
if (is_64_kernel ())
|
if (is_64_kernel ())
|
||||||
return "x86_64-efi";
|
return "x86_64-efi";
|
||||||
else
|
else
|
||||||
return "i386-efi";
|
return "i386-efi";
|
||||||
}
|
}
|
||||||
else if (is_not_empty_directory ("/proc/device-tree"))
|
|
||||||
|
grub_util_info ("... not found. Looking for /proc/device-tree ..");
|
||||||
|
if (is_not_empty_directory ("/proc/device-tree"))
|
||||||
|
{
|
||||||
|
grub_util_info ("...found");
|
||||||
return "i386-ieee1275";
|
return "i386-ieee1275";
|
||||||
else
|
}
|
||||||
|
|
||||||
|
grub_util_info ("... not found");
|
||||||
return "i386-pc";
|
return "i386-pc";
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,8 @@
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
|
|
||||||
int
|
int
|
||||||
grub_util_exec (const char *const *argv)
|
grub_util_exec_redirect_all (const char *const *argv, const char *stdin_file,
|
||||||
|
const char *stdout_file, const char *stderr_file)
|
||||||
{
|
{
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
int status = -1;
|
int status = -1;
|
||||||
|
@ -43,15 +44,39 @@ grub_util_exec (const char *const *argv)
|
||||||
grub_size_t strl = 0;
|
grub_size_t strl = 0;
|
||||||
for (ptr = argv; *ptr; ptr++)
|
for (ptr = argv; *ptr; ptr++)
|
||||||
strl += grub_strlen (*ptr) + 1;
|
strl += grub_strlen (*ptr) + 1;
|
||||||
|
if (stdin_file)
|
||||||
|
strl += grub_strlen (stdin_file) + 2;
|
||||||
|
if (stdout_file)
|
||||||
|
strl += grub_strlen (stdout_file) + 2;
|
||||||
|
if (stderr_file)
|
||||||
|
strl += grub_strlen (stderr_file) + 3;
|
||||||
|
|
||||||
pstr = str = xmalloc (strl);
|
pstr = str = xmalloc (strl);
|
||||||
for (ptr = argv; *ptr; ptr++)
|
for (ptr = argv; *ptr; ptr++)
|
||||||
{
|
{
|
||||||
pstr = grub_stpcpy (pstr, *ptr);
|
pstr = grub_stpcpy (pstr, *ptr);
|
||||||
*pstr++ = ' ';
|
*pstr++ = ' ';
|
||||||
}
|
}
|
||||||
if (pstr > str)
|
if (stdin_file)
|
||||||
pstr--;
|
{
|
||||||
*pstr = '\0';
|
*pstr++ = '<';
|
||||||
|
pstr = grub_stpcpy (pstr, stdin_file);
|
||||||
|
*pstr++ = ' ';
|
||||||
|
}
|
||||||
|
if (stdout_file)
|
||||||
|
{
|
||||||
|
*pstr++ = '>';
|
||||||
|
pstr = grub_stpcpy (pstr, stdout_file);
|
||||||
|
*pstr++ = ' ';
|
||||||
|
}
|
||||||
|
if (stderr_file)
|
||||||
|
{
|
||||||
|
*pstr++ = '2';
|
||||||
|
*pstr++ = '>';
|
||||||
|
pstr = grub_stpcpy (pstr, stderr_file);
|
||||||
|
pstr++;
|
||||||
|
}
|
||||||
|
*--pstr = '\0';
|
||||||
|
|
||||||
grub_util_info ("executing %s", str);
|
grub_util_info ("executing %s", str);
|
||||||
grub_free (str);
|
grub_free (str);
|
||||||
|
@ -61,6 +86,7 @@ grub_util_exec (const char *const *argv)
|
||||||
grub_util_error (_("Unable to fork: %s"), strerror (errno));
|
grub_util_error (_("Unable to fork: %s"), strerror (errno));
|
||||||
else if (pid == 0)
|
else if (pid == 0)
|
||||||
{
|
{
|
||||||
|
int fd;
|
||||||
/* Child. */
|
/* Child. */
|
||||||
|
|
||||||
/* Close fd's. */
|
/* Close fd's. */
|
||||||
|
@ -69,92 +95,62 @@ grub_util_exec (const char *const *argv)
|
||||||
grub_diskfilter_fini ();
|
grub_diskfilter_fini ();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (stdin_file)
|
||||||
|
{
|
||||||
|
fd = open (stdin_file, O_RDONLY);
|
||||||
|
if (fd < 0)
|
||||||
|
exit (127);
|
||||||
|
dup2 (fd, STDIN_FILENO);
|
||||||
|
close (fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stdout_file)
|
||||||
|
{
|
||||||
|
fd = open (stdout_file, O_WRONLY | O_CREAT, 0700);
|
||||||
|
if (fd < 0)
|
||||||
|
exit (127);
|
||||||
|
dup2 (fd, STDOUT_FILENO);
|
||||||
|
close (fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stderr_file)
|
||||||
|
{
|
||||||
|
fd = open (stderr_file, O_WRONLY | O_CREAT, 0700);
|
||||||
|
if (fd < 0)
|
||||||
|
exit (127);
|
||||||
|
dup2 (fd, STDERR_FILENO);
|
||||||
|
close (fd);
|
||||||
|
}
|
||||||
|
|
||||||
/* Ensure child is not localised. */
|
/* Ensure child is not localised. */
|
||||||
setenv ("LC_ALL", "C", 1);
|
setenv ("LC_ALL", "C", 1);
|
||||||
|
|
||||||
execvp ((char *) argv[0], (char **) argv);
|
execvp ((char *) argv[0], (char **) argv);
|
||||||
exit (127);
|
exit (127);
|
||||||
}
|
}
|
||||||
|
|
||||||
waitpid (pid, &status, 0);
|
waitpid (pid, &status, 0);
|
||||||
if (!WIFEXITED (status))
|
if (!WIFEXITED (status))
|
||||||
return -1;
|
return -1;
|
||||||
return WEXITSTATUS (status);
|
return WEXITSTATUS (status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
grub_util_exec (const char *const *argv)
|
||||||
|
{
|
||||||
|
return grub_util_exec_redirect_all (argv, NULL, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
grub_util_exec_redirect (const char *const *argv, const char *stdin_file,
|
grub_util_exec_redirect (const char *const *argv, const char *stdin_file,
|
||||||
const char *stdout_file)
|
const char *stdout_file)
|
||||||
{
|
{
|
||||||
pid_t pid;
|
return grub_util_exec_redirect_all (argv, stdin_file, stdout_file, NULL);
|
||||||
int status = -1;
|
|
||||||
char *str, *pstr;
|
|
||||||
const char *const *ptr;
|
|
||||||
grub_size_t strl = 0;
|
|
||||||
for (ptr = argv; *ptr; ptr++)
|
|
||||||
strl += grub_strlen (*ptr) + 1;
|
|
||||||
strl += grub_strlen (stdin_file) + 2;
|
|
||||||
strl += grub_strlen (stdout_file) + 2;
|
|
||||||
|
|
||||||
pstr = str = xmalloc (strl);
|
|
||||||
for (ptr = argv; *ptr; ptr++)
|
|
||||||
{
|
|
||||||
pstr = grub_stpcpy (pstr, *ptr);
|
|
||||||
*pstr++ = ' ';
|
|
||||||
}
|
|
||||||
*pstr++ = '<';
|
|
||||||
pstr = grub_stpcpy (pstr, stdin_file);
|
|
||||||
*pstr++ = ' ';
|
|
||||||
*pstr++ = '>';
|
|
||||||
pstr = grub_stpcpy (pstr, stdout_file);
|
|
||||||
*pstr = '\0';
|
|
||||||
|
|
||||||
grub_util_info ("executing %s", str);
|
|
||||||
grub_free (str);
|
|
||||||
|
|
||||||
pid = fork ();
|
|
||||||
if (pid < 0)
|
|
||||||
grub_util_error (_("Unable to fork: %s"), strerror (errno));
|
|
||||||
else if (pid == 0)
|
|
||||||
{
|
|
||||||
int in, out;
|
|
||||||
/* Child. */
|
|
||||||
|
|
||||||
/* Close fd's. */
|
|
||||||
#ifdef GRUB_UTIL
|
|
||||||
grub_util_devmapper_cleanup ();
|
|
||||||
grub_diskfilter_fini ();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
in = open (stdin_file, O_RDONLY);
|
|
||||||
if (in < 0)
|
|
||||||
exit (127);
|
|
||||||
dup2 (in, STDIN_FILENO);
|
|
||||||
close (in);
|
|
||||||
|
|
||||||
out = open (stdout_file, O_WRONLY | O_CREAT, 0700);
|
|
||||||
dup2 (out, STDOUT_FILENO);
|
|
||||||
close (out);
|
|
||||||
|
|
||||||
if (out < 0)
|
|
||||||
exit (127);
|
|
||||||
|
|
||||||
/* Ensure child is not localised. */
|
|
||||||
setenv ("LC_ALL", "C", 1);
|
|
||||||
|
|
||||||
execvp ((char *) argv[0], (char **) argv);
|
|
||||||
exit (127);
|
|
||||||
}
|
|
||||||
waitpid (pid, &status, 0);
|
|
||||||
if (!WIFEXITED (status))
|
|
||||||
return -1;
|
|
||||||
return WEXITSTATUS (status);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
grub_util_exec_redirect_null (const char *const *argv)
|
grub_util_exec_redirect_null (const char *const *argv)
|
||||||
{
|
{
|
||||||
return grub_util_exec_redirect (argv, "/dev/null", "/dev/null");
|
return grub_util_exec_redirect_all (argv, "/dev/null", "/dev/null", NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
pid_t
|
pid_t
|
||||||
|
|
|
@ -28,6 +28,9 @@ grub_util_exec_pipe (const char *const *argv, int *fd);
|
||||||
pid_t
|
pid_t
|
||||||
grub_util_exec_pipe_stderr (const char *const *argv, int *fd);
|
grub_util_exec_pipe_stderr (const char *const *argv, int *fd);
|
||||||
|
|
||||||
|
int
|
||||||
|
grub_util_exec_redirect_all (const char *const *argv, const char *stdin_file,
|
||||||
|
const char *stdout_file, const char *stderr_file);
|
||||||
int
|
int
|
||||||
grub_util_exec (const char *const *argv);
|
grub_util_exec (const char *const *argv);
|
||||||
int
|
int
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
/*
|
|
||||||
* GRUB -- GRand Unified Bootloader
|
|
||||||
* Copyright (C) 2013 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_EMU_EXEC_H
|
|
||||||
#define GRUB_EMU_EXEC_H 1
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
pid_t
|
|
||||||
grub_util_exec_pipe (const char *const *argv, int *fd);
|
|
||||||
pid_t
|
|
||||||
grub_util_exec_pipe_stderr (const char *const *argv, int *fd);
|
|
||||||
|
|
||||||
int
|
|
||||||
grub_util_exec (const char *const *argv);
|
|
||||||
int
|
|
||||||
grub_util_exec_redirect (const char *const *argv, const char *stdin_file,
|
|
||||||
const char *stdout_file);
|
|
||||||
int
|
|
||||||
grub_util_exec_redirect_null (const char *const *argv);
|
|
||||||
|
|
||||||
#endif
|
|
Loading…
Reference in a new issue