summaryrefslogtreecommitdiff
path: root/Build/source/libs/zziplib/zziplib-src/bins/unzzipcat-zip.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/zziplib/zziplib-src/bins/unzzipcat-zip.c')
-rw-r--r--Build/source/libs/zziplib/zziplib-src/bins/unzzipcat-zip.c111
1 files changed, 73 insertions, 38 deletions
diff --git a/Build/source/libs/zziplib/zziplib-src/bins/unzzipcat-zip.c b/Build/source/libs/zziplib/zziplib-src/bins/unzzipcat-zip.c
index 750c95f6345..216be41ee29 100644
--- a/Build/source/libs/zziplib/zziplib-src/bins/unzzipcat-zip.c
+++ b/Build/source/libs/zziplib/zziplib-src/bins/unzzipcat-zip.c
@@ -9,7 +9,13 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include "unzzip.h"
+#include <sys/stat.h>
+#include <zzip/__mkdir.h>
+#include <zzip/__string.h>
+#include <zzip/__fnmatch.h>
+#include <zzip/__debug.h>
+#include "unzzipcat-zip.h"
+#include "unzzip-states.h"
#ifdef ZZIP_HAVE_UNISTD_H
#include <unistd.h>
@@ -18,15 +24,35 @@
#include <io.h>
#endif
-#ifdef ZZIP_HAVE_FNMATCH_H
-#include <fnmatch.h>
-#else
-#define fnmatch(x,y,z) strcmp(x,y)
-#endif
-
-#ifndef O_BINARY
-#define O_BINARY 0
-#endif
+static int exitcode(int e)
+{
+ switch (e)
+ {
+ case ZZIP_NO_ERROR:
+ return EXIT_OK;
+ case ZZIP_OUTOFMEM: /* out of memory */
+ return EXIT_ENOMEM;
+ case ZZIP_DIR_OPEN: /* failed to open zipfile, see errno for details */
+ return EXIT_ZIP_NOT_FOUND;
+ case ZZIP_DIR_STAT: /* failed to fstat zipfile, see errno for details */
+ case ZZIP_DIR_SEEK: /* failed to lseek zipfile, see errno for details */
+ case ZZIP_DIR_READ: /* failed to read zipfile, see errno for details */
+ case ZZIP_DIR_TOO_SHORT:
+ case ZZIP_DIR_EDH_MISSING:
+ return EXIT_FILEFORMAT;
+ case ZZIP_DIRSIZE:
+ return EXIT_EARLY_END_OF_FILE;
+ case ZZIP_ENOENT:
+ return EXIT_FILE_NOT_FOUND;
+ case ZZIP_UNSUPP_COMPR:
+ return EXIT_UNSUPPORTED_COMPRESSION;
+ case ZZIP_CORRUPTED:
+ case ZZIP_UNDEF:
+ case ZZIP_DIR_LARGEFILE:
+ return EXIT_FILEFORMAT;
+ }
+ return EXIT_ERRORS;
+}
static void unzzip_cat_file(ZZIP_DIR* disk, char* name, FILE* out)
{
@@ -43,21 +69,20 @@ static void unzzip_cat_file(ZZIP_DIR* disk, char* name, FILE* out)
}
}
-#if !defined(ZZIP_HAVE_STRNDUP)
-static char *
-strndup(char *p, size_t maxlen)
+static void makedirs(const char* name)
{
- char *r;
- if (!p)
- return NULL;
- r = malloc(maxlen + 1);
- if (!r)
- return NULL;
- strncpy(r, p, maxlen);
- r[maxlen] = '\0';
- return r;
+ char* p = strrchr(name, '/');
+ if (p) {
+ char* dir_name = _zzip_strndup(name, p-name);
+ makedirs(dir_name);
+ free (dir_name);
+ }
+ if (_zzip_mkdir(name, 0775) == -1 && errno != EEXIST)
+ {
+ DBG3("while mkdir %s : %s", name, strerror(errno));
+ }
+ errno = 0;
}
-#endif
static FILE* create_fopen(char* name, char* mode, int subdirs)
{
@@ -65,17 +90,17 @@ static FILE* create_fopen(char* name, char* mode, int subdirs)
{
char* p = strrchr(name, '/');
if (p) {
- char* dir_name = strndup(name, p-name);
- // makedirs(dir_name); // TODO
+ char* dir_name = _zzip_strndup(name, p-name);
+ makedirs(dir_name);
free (dir_name);
}
}
- return fopen(name, mode);
+ return fopen(name, mode);
}
-
static int unzzip_cat (int argc, char ** argv, int extract)
{
+ int done = 0;
int argn;
ZZIP_DIR* disk;
zzip_error_t error;
@@ -83,13 +108,13 @@ static int unzzip_cat (int argc, char ** argv, int extract)
if (argc == 1)
{
printf (__FILE__" version "ZZIP_PACKAGE" "ZZIP_VERSION"\n");
- return -1; /* better provide an archive argument */
+ return EXIT_OK; /* better provide an archive argument */
}
disk = zzip_dir_open (argv[1], &error);
if (! disk) {
- perror(argv[1]);
- return -1;
+ fprintf(stderr, "%s: %s\n", argv[1], zzip_strerror(error));
+ return exitcode(error);
}
if (argc == 2)
@@ -100,6 +125,11 @@ static int unzzip_cat (int argc, char ** argv, int extract)
char* name = entry.d_name;
FILE* out = stdout;
if (extract) out = create_fopen(name, "wb", 1);
+ if (! out) {
+ DBG3("fopen' %s : %s", name, strerror(errno));
+ if (errno != EISDIR) done = EXIT_ERRORS;
+ continue;
+ }
unzzip_cat_file (disk, name, out);
if (extract) fclose(out);
}
@@ -112,20 +142,25 @@ static int unzzip_cat (int argc, char ** argv, int extract)
char* name = entry.d_name;
for (argn=1; argn < argc; argn++)
{
- if (! fnmatch (argv[argn], name,
- FNM_NOESCAPE|FNM_PATHNAME|FNM_PERIOD))
+ if (! _zzip_fnmatch (argv[argn], name,
+ FNM_NOESCAPE|FNM_PATHNAME|FNM_PERIOD))
{
- FILE* out = stdout;
- if (extract) out = create_fopen(name, "wb", 1);
- unzzip_cat_file (disk, name, out);
- if (extract) fclose(out);
- break; /* match loop */
+ FILE* out = stdout;
+ if (extract) out = create_fopen(name, "wb", 1);
+ if (! out) {
+ DBG3("fopen. %s : %s", name, strerror(errno));
+ if (errno != EISDIR) done = EXIT_ERRORS;
+ continue;
+ }
+ unzzip_cat_file (disk, name, out);
+ if (extract) fclose(out);
+ break; /* match loop */
}
}
}
}
zzip_dir_close(disk);
- return 0;
+ return done;
}
int unzzip_print (int argc, char ** argv)