]> Dogcows Code - chaz/tar/blobdiff - src/system.c
Don't include <getline.h>. No longer needed.
[chaz/tar] / src / system.c
index 63f9849cf9a027f956e811a23398face0e7f6ac8..ba1d191e0824473a73b72ac2334804b497b6677e 100644 (file)
@@ -1,10 +1,10 @@
 /* System-dependent calls for tar.
 
-   Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
 
    This program 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 2, or (at your option) any later
+   Free Software Foundation; either version 3, or (at your option) any later
    version.
 
    This program is distributed in the hope that it will be useful, but
@@ -17,6 +17,7 @@
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
 
 #include <system.h>
+#include <setenv.h>
 
 #include "common.h"
 #include <rmt.h>
@@ -349,7 +350,7 @@ sys_child_open_for_compress (void)
          if (archive < 0)
            {
              int saved_errno = errno;
-             
+
              if (backup_option)
                undo_last_backup ();
              errno = saved_errno;
@@ -695,7 +696,7 @@ stat_to_env (char *name, char type, struct tar_stat_info *st)
     }
 }
 
-static pid_t pid;
+static pid_t global_pid;
 static RETSIGTYPE (*pipe_handler) (int sig);
 
 int
@@ -706,9 +707,9 @@ sys_exec_command (char *file_name, int typechar, struct tar_stat_info *st)
 
   xpipe (p);
   pipe_handler = signal (SIGPIPE, SIG_IGN);
-  pid = xfork ();
+  global_pid = xfork ();
 
-  if (pid != 0)
+  if (global_pid != 0)
     {
       xclose (p[PREAD]);
       return p[PWRITE];
@@ -735,14 +736,14 @@ sys_wait_command (void)
 {
   int status;
 
-  if (pid < 0)
+  if (global_pid < 0)
     return;
 
   signal (SIGPIPE, pipe_handler);
-  while (waitpid (pid, &status, 0) == -1)
+  while (waitpid (global_pid, &status, 0) == -1)
     if (errno != EINTR)
       {
-        pid = -1;
+        global_pid = -1;
         waitpid_error (to_command_option);
         return;
       }
@@ -751,18 +752,18 @@ sys_wait_command (void)
     {
       if (!ignore_command_error_option && WEXITSTATUS (status))
        ERROR ((0, 0, _("%lu: Child returned status %d"),
-               (unsigned long) pid, WEXITSTATUS (status)));
+               (unsigned long) global_pid, WEXITSTATUS (status)));
     }
   else if (WIFSIGNALED (status))
     {
       WARN ((0, 0, _("%lu: Child terminated on signal %d"),
-            (unsigned long) pid, WTERMSIG (status)));
+            (unsigned long) global_pid, WTERMSIG (status)));
     }
   else
     ERROR ((0, 0, _("%lu: Child terminated on unknown reason"),
-           (unsigned long) pid));
+           (unsigned long) global_pid));
 
-  pid = -1;
+  global_pid = -1;
 }
 
 int
@@ -772,7 +773,7 @@ sys_exec_info_script (const char **archive_name, int volume_number)
   char *argv[4];
   char uintbuf[UINTMAX_STRSIZE_BOUND];
   int p[2];
-  
+
   xpipe (p);
   pipe_handler = signal (SIGPIPE, SIG_IGN);
 
@@ -787,7 +788,7 @@ sys_exec_info_script (const char **archive_name, int volume_number)
       char *buf;
       size_t size = 0;
       FILE *fp;
-      
+
       xclose (p[PWRITE]);
       fp = fdopen (p[PREAD], "r");
       rc = getline (&buf, &size, fp);
@@ -795,14 +796,14 @@ sys_exec_info_script (const char **archive_name, int volume_number)
 
       if (rc > 0 && buf[rc-1] == '\n')
        buf[--rc] = 0;
-      
+
       while (waitpid (pid, &status, 0) == -1)
        if (errno != EINTR)
          {
            waitpid_error (info_script_option);
            return -1;
          }
-      
+
       if (WIFEXITED (status))
        {
          if (WEXITSTATUS (status) == 0 && rc > 0)
@@ -811,7 +812,7 @@ sys_exec_info_script (const char **archive_name, int volume_number)
            free (buf);
          return WEXITSTATUS (status);
        }
-      
+
       free (buf);
       return -1;
     }
@@ -824,9 +825,9 @@ sys_exec_info_script (const char **archive_name, int volume_number)
   setenv ("TAR_FORMAT",
          archive_format_string (current_format == DEFAULT_FORMAT ?
                                 archive_format : current_format), 1);
+  setenv ("TAR_FD", STRINGIFY_BIGINT (p[PWRITE], uintbuf), 1);
 
   xclose (p[PREAD]);
-  xdup2 (p[PWRITE], 3);
 
   argv[0] = "/bin/sh";
   argv[1] = "-c";
This page took 0.026655 seconds and 4 git commands to generate.