Subversion Repositories SvarDOS

Rev

Rev 1966 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * simple unzip tool that unzips the content of a zip archive to current directory
 * if listonly is set to a non-zero value then unzip() only lists the files
 * returns 0 on success
 *
 * this file is part of pkg (SvarDOS)
 * copyright (C) 2021-2024 Mateusz Viste
 */

#include <stdio.h>

#include "fileexst.h"
#include "helpers.h"
#include "libunzip.h"
#include "svarlang.lib/svarlang.h"

#include "unzip.h"


int unzip(const char *zipfile, unsigned char listonly, unsigned char *buff15k) {
  struct ziplist *zlist, *znode;
  FILE *fd;
  int r = 0;

  fd = fopen(zipfile, "rb");
  if (fd == NULL) {
    outputnl(svarlang_str(10, 1)); /* "ERROR: Failed to open the archive file" */
    return(1);
  }

  zlist = zip_listfiles(fd);
  if (zlist == NULL) {
    outputnl(svarlang_str(10, 2)); /* "ERROR: Invalid ZIP archive" */
    fclose(fd);
    return(-1);
  }

  if (listonly != 0) {
    /* just list the files inside the archive */
    for (znode = zlist; znode != NULL; znode = znode->nextfile) {
      outputnl(znode->filename);
    }
  } else {
    /* examine the list of zipped files - make sure that no file currently
     * exists and that files are neither encrypted nor compressed with an
     * unsupported method */
    for (znode = zlist; znode != NULL; znode = znode->nextfile) {
      int zres;
      /* convert slash to backslash, print filename and create the directories path */
      slash2backslash(znode->filename);
      output(znode->filename);
      output(" ");
      mkpath(znode->filename);
      /* if a dir, we good already */
      if (znode->flags == ZIP_FLAG_ISADIR) goto OK;
      /* file already exists? */
      if (fileexists(znode->filename) != 0) {
        outputnl(svarlang_str(10, 3)); /* "ERROR: File already exists" */
        r = 1;
        continue;
      }
      /* uncompress */
      zres = zip_unzip(fd, znode, znode->filename, buff15k);
      if (zres != 0) {
        sprintf(buff15k, svarlang_str(10,4), zres);
        outputnl(buff15k);
        continue;
      }
      OK:
      outputnl(svarlang_str(10, 0)); /* "OK" */
    }
  }

  zip_freelist(&zlist);
  fclose(fd);
  return(r);
}