All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrey Borzenkov <arvidjaar@gmail.com>
To: grub-devel@gnu.org
Subject: [PATCH 1/2] consolidate grub_util_exec code
Date: Mon, 16 Dec 2013 22:20:51 +0400	[thread overview]
Message-ID: <1387218052-22765-2-git-send-email-arvidjaar@gmail.com> (raw)
In-Reply-To: <1387218052-22765-1-git-send-email-arvidjaar@gmail.com>

We need to hide "modprobe efivars" error output to avoid confusion. So
consolidate grub_util_exec_* into single function that can optionally redirect
all three standard descriptors and make all other functions compatibility
wrappers.

Also remove include/grub/osdep/exec_unix.h which does not appear to be used
anywhere.
---
 grub-core/osdep/unix/exec.c    | 134 ++++++++++++++++++++---------------------
 include/grub/emu/exec.h        |   3 +
 include/grub/osdep/exec_unix.h |  39 ------------
 3 files changed, 68 insertions(+), 108 deletions(-)
 delete mode 100644 include/grub/osdep/exec_unix.h

diff --git a/grub-core/osdep/unix/exec.c b/grub-core/osdep/unix/exec.c
index d4865f6..935ff12 100644
--- a/grub-core/osdep/unix/exec.c
+++ b/grub-core/osdep/unix/exec.c
@@ -34,7 +34,8 @@
 #include <sys/wait.h>
 
 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;
   int status = -1;
@@ -43,71 +44,39 @@ grub_util_exec (const char *const *argv)
   grub_size_t strl = 0;
   for (ptr = argv; *ptr; ptr++)
     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);
   for (ptr = argv; *ptr; ptr++)
     {
       pstr = grub_stpcpy (pstr, *ptr);
       *pstr++ = ' ';
     }
-  if (pstr > str)
-    pstr--;
-  *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)
+  if (stdin_file)
     {
-      /* Child.  */
-
-      /* Close fd's.  */
-#ifdef GRUB_UTIL
-      grub_util_devmapper_cleanup ();
-      grub_diskfilter_fini ();
-#endif
-
-      /* Ensure child is not localised.  */
-      setenv ("LC_ALL", "C", 1);
-
-      execvp ((char *) argv[0], (char **) argv);
-      exit (127);
+      *pstr++ = '<';
+      pstr = grub_stpcpy (pstr, stdin_file);
+      *pstr++ = ' ';
     }
-
-  waitpid (pid, &status, 0);
-  if (!WIFEXITED (status))
-    return -1;
-  return WEXITSTATUS (status);
-}
-
-int
-grub_util_exec_redirect (const char *const *argv, const char *stdin_file,
-			 const char *stdout_file)
-{
-  pid_t pid;
-  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++)
+  if (stdout_file)
     {
-      pstr = grub_stpcpy (pstr, *ptr);
+      *pstr++ = '>';
+      pstr = grub_stpcpy (pstr, stdout_file);
       *pstr++ = ' ';
     }
-  *pstr++ = '<';
-  pstr = grub_stpcpy (pstr, stdin_file);
-  *pstr++ = ' ';
-  *pstr++ = '>';
-  pstr = grub_stpcpy (pstr, stdout_file);
-  *pstr = '\0';
+  if (stderr_file)
+    {
+      *pstr++ = '2';
+      *pstr++ = '>';
+      pstr = grub_stpcpy (pstr, stderr_file);
+      pstr++;
+    }
+  *--pstr = '\0';
 
   grub_util_info ("executing %s", str);
   grub_free (str);
@@ -117,7 +86,7 @@ grub_util_exec_redirect (const char *const *argv, const char *stdin_file,
     grub_util_error (_("Unable to fork: %s"), strerror (errno));
   else if (pid == 0)
     {
-      int in, out;
+      int fd;
       /* Child.  */
       
       /* Close fd's.  */
@@ -126,18 +95,32 @@ grub_util_exec_redirect (const char *const *argv, const char *stdin_file,
       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);
+      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.  */
       setenv ("LC_ALL", "C", 1);
@@ -152,9 +135,22 @@ grub_util_exec_redirect (const char *const *argv, const char *stdin_file,
 }
 
 int
+grub_util_exec (const char *const *argv)
+{
+  return grub_util_exec_redirect_all (argv, NULL, NULL, NULL);
+}
+
+int
+grub_util_exec_redirect (const char *const *argv, const char *stdin_file,
+			 const char *stdout_file)
+{
+  return grub_util_exec_redirect_all (argv, stdin_file, stdout_file, NULL);
+}
+
+int
 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
diff --git a/include/grub/emu/exec.h b/include/grub/emu/exec.h
index ecc3adc..d1073ef 100644
--- a/include/grub/emu/exec.h
+++ b/include/grub/emu/exec.h
@@ -29,6 +29,9 @@ pid_t
 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
 grub_util_exec (const char *const *argv);
 int
 grub_util_exec_redirect (const char *const *argv, const char *stdin_file,
diff --git a/include/grub/osdep/exec_unix.h b/include/grub/osdep/exec_unix.h
deleted file mode 100644
index ecc3adc..0000000
--- a/include/grub/osdep/exec_unix.h
+++ /dev/null
@@ -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
-- 
1.8.4



  reply	other threads:[~2013-12-16 18:21 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-12-15 19:24 [grub-devel] fatal error message on grub-install for i386-pc (x86-64) with latest repo Javier Vasquez
2013-12-15 21:49 ` Javier Vasquez
2013-12-16  2:22 ` Andrey Borzenkov
2013-12-16 18:20   ` [PATCH 0/2] allow redirect of stderr in grub_util_exec* Andrey Borzenkov
2013-12-16 18:20     ` Andrey Borzenkov [this message]
2013-12-16 18:20     ` [PATCH 2/2] use grub_util_exec_redirect_all to silence "moprobe efivars" Andrey Borzenkov
2013-12-16 18:29       ` Vladimir 'φ-coder/phcoder' Serbinenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1387218052-22765-2-git-send-email-arvidjaar@gmail.com \
    --to=arvidjaar@gmail.com \
    --cc=grub-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.