wkd: New command --print-wkd-hash for gpg-wks-client.
[gnupg.git] / tools / gpgtar-extract.c
index 3ee73ef..3da100c 100644 (file)
@@ -14,7 +14,7 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ * along with this program; if not, see <https://www.gnu.org/licenses/>.
  */
 
 #include <config.h>
@@ -27,7 +27,7 @@
 #include <unistd.h>
 #include <assert.h>
 
-#include "i18n.h"
+#include "../common/i18n.h"
 #include "../common/exectool.h"
 #include "../common/sysutils.h"
 #include "../common/ccparray.h"
@@ -36,7 +36,7 @@
 
 static gpg_error_t
 extract_regular (estream_t stream, const char *dirname,
-                 tar_header_t hdr)
+                 tarinfo_t info, tar_header_t hdr)
 {
   gpg_error_t err;
   char record[RECORDSIZE];
@@ -70,6 +70,7 @@ extract_regular (estream_t stream, const char *dirname,
       err = read_record (stream, record);
       if (err)
         goto leave;
+      info->nblocks++;
       n++;
       if (n < hdr->nrecords || (hdr->size && !(hdr->size % RECORDSIZE)))
         nbytes = RECORDSIZE;
@@ -122,11 +123,15 @@ extract_directory (const char *dirname, tar_header_t hdr)
   if (fname[strlen (fname)-1] == '/')
     fname[strlen (fname)-1] = 0;
 
- /* Note that we don't need to care about EEXIST because we always
-     extract into a new hierarchy.  */
   if (! opt.dry_run && gnupg_mkdir (fname, "-rwx------"))
     {
       err = gpg_error_from_syserror ();
+      if (gpg_err_code (err) == GPG_ERR_EEXIST)
+        {
+          /* Ignore existing directories while extracting.  */
+          err = 0;
+        }
+
       if (gpg_err_code (err) == GPG_ERR_ENOENT)
         {
           /* Try to create the directory with parents but keep the
@@ -159,7 +164,8 @@ extract_directory (const char *dirname, tar_header_t hdr)
 
 
 static gpg_error_t
-extract (estream_t stream, const char *dirname, tar_header_t hdr)
+extract (estream_t stream, const char *dirname, tarinfo_t info,
+         tar_header_t hdr)
 {
   gpg_error_t err;
   size_t n;
@@ -186,7 +192,7 @@ extract (estream_t stream, const char *dirname, tar_header_t hdr)
     }
 
   if (hdr->typeflag == TF_REGULAR || hdr->typeflag == TF_UNKNOWN)
-    err = extract_regular (stream, dirname, hdr);
+    err = extract_regular (stream, dirname, info, hdr);
   else if (hdr->typeflag == TF_DIRECTORY)
     err = extract_directory (dirname, hdr);
   else
@@ -196,7 +202,11 @@ extract (estream_t stream, const char *dirname, tar_header_t hdr)
       log_info ("unsupported file type %d for '%s' - skipped\n",
                 (int)hdr->typeflag, hdr->name);
       for (err = 0, n=0; !err && n < hdr->nrecords; n++)
-        err = read_record (stream, record);
+        {
+          err = read_record (stream, record);
+          if (!err)
+            info->nblocks++;
+        }
     }
   return err;
 }
@@ -278,11 +288,15 @@ gpgtar_extract (const char *filename, int decrypt)
   tar_header_t header = NULL;
   const char *dirprefix = NULL;
   char *dirname = NULL;
+  struct tarinfo_s tarinfo_buffer;
+  tarinfo_t tarinfo = &tarinfo_buffer;
+
+  memset (&tarinfo_buffer, 0, sizeof tarinfo_buffer);
 
   if (filename)
     {
       if (!strcmp (filename, "-"))
-        stream = es_stdout;
+        stream = es_stdin;
       else
         stream = es_fopen (filename, "rb");
       if (!stream)
@@ -327,7 +341,7 @@ gpgtar_extract (const char *filename, int decrypt)
         }
 
       err = gnupg_exec_tool_stream (opt.gpg_program, argv,
-                                    cipher_stream, stream);
+                                    cipher_stream, NULL, stream, NULL, NULL);
       xfree (argv);
       if (err)
         goto leave;
@@ -341,21 +355,21 @@ gpgtar_extract (const char *filename, int decrypt)
     dirname = xtrystrdup (opt.directory);
   else
     {
-      if (filename)
+      if (opt.filename)
         {
-          dirprefix = strrchr (filename, '/');
+          dirprefix = strrchr (opt.filename, '/');
           if (dirprefix)
             dirprefix++;
           else
-            dirprefix = filename;
+            dirprefix = opt.filename;
         }
-      else if (opt.filename)
+      else if (filename)
         {
-          dirprefix = strrchr (opt.filename, '/');
+          dirprefix = strrchr (filename, '/');
           if (dirprefix)
             dirprefix++;
           else
-            dirprefix = opt.filename;
+            dirprefix = filename;
         }
 
       if (!dirprefix || !*dirprefix)
@@ -374,11 +388,11 @@ gpgtar_extract (const char *filename, int decrypt)
 
   for (;;)
     {
-      err = gpgtar_read_header (stream, &header);
+      err = gpgtar_read_header (stream, tarinfo, &header);
       if (err || header == NULL)
         goto leave;
 
-      err = extract (stream, dirname, header);
+      err = extract (stream, dirname, tarinfo, header);
       if (err)
         goto leave;
       xfree (header);