bug-tar
[Top][All Lists]
Advanced

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

[Bug-tar] [PATCH] tar: simplify code in system.c


From: Pavel Raiskup
Subject: [Bug-tar] [PATCH] tar: simplify code in system.c
Date: Wed, 20 Feb 2013 10:15:27 +0100

Do not call wordsplit on multiple places when not necessary.

* system.c (sys_child_open_for_compress): Trim line.
(run_decompress_program): Do not call wordsplit - rather reuse xexec.
(sys_exec_command): Remove unused variable argv.
---
 src/system.c | 40 +++++++++++++---------------------------
 1 file changed, 13 insertions(+), 27 deletions(-)

diff --git a/src/system.c b/src/system.c
index 6adcbf0..af917b6 100644
--- a/src/system.c
+++ b/src/system.c
@@ -329,7 +329,7 @@ sys_child_open_for_compress (void)
   int child_pipe[2];
   pid_t grandchild_pid;
   pid_t child_pid;
-  
+
   xpipe (parent_pipe);
   child_pid = xfork ();
 
@@ -468,15 +468,12 @@ static void
 run_decompress_program (void)
 {
   int i;
-  const char *p, *prog = NULL;
-  struct wordsplit ws;
-  int wsflags = (WRDSF_DEFFLAGS | WRDSF_ENV | WRDSF_DOOFFS) & ~WRDSF_NOVAR;
+  const char *p;
+  char *prog = NULL;
 
-  ws.ws_env = (const char **) environ;
-  ws.ws_offs = 1;
-  
   for (p = first_decompress_program (&i); p; p = next_decompress_program (&i))
     {
+      int len = strlen (p);
       if (prog)
        {
          WARNOPT (WARN_DECOMPRESS_PROGRAM,
@@ -484,16 +481,12 @@ run_decompress_program (void)
          WARNOPT (WARN_DECOMPRESS_PROGRAM,
                   (0, 0, _("trying %s"), p));
        }
-      if (wordsplit (p, &ws, wsflags))
-       FATAL_ERROR ((0, 0, _("cannot split string '%s': %s"),
-                     p, wordsplit_strerror (&ws)));
-      wsflags |= WRDSF_REUSE;
-      memmove(ws.ws_wordv, ws.ws_wordv + ws.ws_offs,
-             sizeof(ws.ws_wordv[0])*ws.ws_wordc);
-      ws.ws_wordv[ws.ws_wordc] = "-d";
-      prog = p;                      
-      execvp (ws.ws_wordv[0], ws.ws_wordv);
-      ws.ws_wordv[ws.ws_wordc] = NULL;
+      prog = xmalloc (len + 4 /* { ' ', '-', 'd', '\0' } */);
+      strcpy (prog, p);
+      strcpy (prog + len, " -d");
+      prog[len + 3] = 0;
+
+      xexec (prog);
     }
   if (!prog)
     FATAL_ERROR ((0, 0, _("unable to run decompression program")));
@@ -726,8 +719,7 @@ int
 sys_exec_command (char *file_name, int typechar, struct tar_stat_info *st)
 {
   int p[2];
-  char *argv[4];
-  
+
   xpipe (p);
   pipe_handler = signal (SIGPIPE, SIG_IGN);
   global_pid = xfork ();
@@ -787,7 +779,6 @@ int
 sys_exec_info_script (const char **archive_name, int volume_number)
 {
   pid_t pid;
-  char *argv[4];
   char uintbuf[UINTMAX_STRSIZE_BOUND];
   int p[2];
   static RETSIGTYPE (*saved_handler) (int sig);
@@ -849,7 +840,7 @@ sys_exec_info_script (const char **archive_name, int 
volume_number)
          archive_format_string (current_format == DEFAULT_FORMAT ?
                                 archive_format : current_format), 1);
   setenv ("TAR_FD", STRINGIFY_BIGINT (p[PWRITE], uintbuf), 1);
-  
+
   xclose (p[PREAD]);
 
   priv_set_restore_linkdir ();
@@ -862,9 +853,8 @@ sys_exec_checkpoint_script (const char *script_name,
                            int checkpoint_number)
 {
   pid_t pid;
-  char *argv[4];
   char uintbuf[UINTMAX_STRSIZE_BOUND];
-  
+
   pid = xfork ();
 
   if (pid != 0)
@@ -893,10 +883,6 @@ sys_exec_checkpoint_script (const char *script_name,
   setenv ("TAR_FORMAT",
          archive_format_string (current_format == DEFAULT_FORMAT ?
                                 archive_format : current_format), 1);
-  argv[0] = (char *) "/bin/sh";
-  argv[1] = (char *) "-c";
-  argv[2] = (char *) script_name;
-  argv[3] = NULL;
 
   priv_set_restore_linkdir ();
   xexec (script_name);
-- 
1.8.1.2




reply via email to

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