libarchive Complete Extractor - PullRequest
       31

libarchive Complete Extractor

0 голосов
/ 08 июня 2018

Я скачал libarchive-3.3.2.zip и собрал его, используя mingw32 в соответствии с https://github.com/libarchive/libarchive/wiki/BuildInstructions

Я также установил LIBS += -L$$PWD/libarchive/ -larchive_static для статической сборки.

После сборки я попыталсяизвлечь мой .zip-файл, используя примеры в https://github.com/libarchive/libarchive/wiki/Examples#A_Complete_Extractor

static int copy_data(struct archive *ar, struct archive *aw)
{
  int r;
  const void *buff;
  size_t size;
  la_int64_t offset;

  for (;;) {
    r = archive_read_data_block(ar, &buff, &size, &offset);
    if (r == ARCHIVE_EOF)
      return (ARCHIVE_OK);
    if (r < ARCHIVE_OK)
      return (r);
    r = archive_write_data_block(aw, buff, size, offset);
    if (r < ARCHIVE_OK) {
      fprintf(stderr, "%s\n", archive_error_string(aw));
      return (r);
    }
  }
}
static void extract(const char *filename)
{
  struct archive *a;
  struct archive *ext;
  struct archive_entry *entry;
  int flags;
  int r;

  /* Select which attributes we want to restore. */
  flags = ARCHIVE_EXTRACT_TIME;
  flags |= ARCHIVE_EXTRACT_PERM;
  flags |= ARCHIVE_EXTRACT_ACL;
  flags |= ARCHIVE_EXTRACT_FFLAGS;

  a = archive_read_new();
  archive_read_support_format_all(a);
  archive_read_support_compression_all(a);
  ext = archive_write_disk_new();
  archive_write_disk_set_options(ext, flags);
  archive_write_disk_set_standard_lookup(ext);
  if ((r = archive_read_open_filename(a, filename, 10240))){
    exit(1);
  }
  for (;;) {
      qDebug()<<"for;;";
    r = archive_read_next_header(a, &entry);
    if (r == ARCHIVE_EOF)
      break;
    if (r < ARCHIVE_OK)
      fprintf(stderr, "%s\n", archive_error_string(a));
    if (r < ARCHIVE_WARN){
      exit(1);
    }
    r = archive_write_header(ext, entry);

    if (r < ARCHIVE_OK)
      fprintf(stderr, "%s\n", archive_error_string(ext));
    else if (archive_entry_size(entry) > 0) {
      r = copy_data(a, ext);
      if (r < ARCHIVE_OK){
        fprintf(stderr, "%s\n", archive_error_string(ext));
      }
      if (r < ARCHIVE_WARN){
        exit(1);                              //A1: Program exits here.
      }
    }
    r = archive_write_finish_entry(ext);
    if (r < ARCHIVE_OK)
      fprintf(stderr, "%s\n", archive_error_string(ext));
    if (r < ARCHIVE_WARN){
      exit(1);
    }
  }
  archive_read_close(a);
  archive_read_free(a);
  archive_write_close(ext);
  archive_write_free(ext);
  exit(0);
}

Когда я запускаю приведенный выше код, он выходит из A1.Когда я отлаживаю r = copy_data (a, ext);Я нашел r = -25 и #define ARCHIVE_WARN (-20)

Кажется, что-то не так с моей сборкой, но я не мог понять это.

...