diff options
Diffstat (limited to 'Build/source/libs/zziplib/zziplib-0.13.62/zzip/dir.c')
-rw-r--r-- | Build/source/libs/zziplib/zziplib-0.13.62/zzip/dir.c | 332 |
1 files changed, 0 insertions, 332 deletions
diff --git a/Build/source/libs/zziplib/zziplib-0.13.62/zzip/dir.c b/Build/source/libs/zziplib/zziplib-0.13.62/zzip/dir.c deleted file mode 100644 index 2df1bbc0fda..00000000000 --- a/Build/source/libs/zziplib/zziplib-0.13.62/zzip/dir.c +++ /dev/null @@ -1,332 +0,0 @@ - -/* - * Author: - * Guido Draheim <guidod@gmx.de> - * - * Copyright (c) 1999,2000,2001,2002,2003 Guido Draheim - * All rights reserved, - * use under the restrictions of the - * Lesser GNU General Public License - * or alternatively the restrictions - * of the Mozilla Public License 1.1 - */ - -#include <zzip/lib.h> /* exported... */ -#include <zzip/file.h> -#include <stddef.h> /*offsetof */ -#include <stdlib.h> -#include <string.h> -#include <errno.h> - -#ifdef ZZIP_HAVE_SYS_STAT_H -#include <sys/stat.h> -#else -#include <stdio.h> -#endif - -#include <zzip/__dirent.h> - -#ifndef offsetof -#pragma warning had to DEFINE offsetof as it was not in stddef.h -#define offsetof(T,M) ((unsigned)(& ((T*)0)->M)) -#endif - -#ifdef ZZIP_HAVE_SYS_STAT_H - -/* MSVC does have IFbitmask but not the corresponding IStests */ -# if ! defined S_ISDIR && defined S_IFDIR -# define S_ISDIR(_X_) ((_X_) & S_IFDIR) -# endif -# if ! defined S_ISREG && defined S_IFREG -# define S_ISREG(_X_) ((_X_) & S_IFREG) -# endif -#endif - -/** - * This function is the equivalent of a => rewinddir(2) for a realdir or - * the zipfile in place of a directory. The ZZIP_DIR handle returned from - * => zzip_opendir has a flag saying realdir or zipfile. As for a zipfile, - * the filenames will include the filesubpath, so take care. - */ -void -zzip_rewinddir(ZZIP_DIR * dir) -{ - if (! dir) - return; - - if (USE_DIRENT && dir->realdir) - { - _zzip_rewinddir(dir->realdir); - return; - } - - if (dir->hdr0) - dir->hdr = dir->hdr0; - else - dir->hdr = 0; -} - -#if ! USE_DIRENT -#define real_readdir(_X_) 1 -#else -static int -real_readdir(ZZIP_DIR * dir) -{ - struct stat st = { 0 }; - char filename[PATH_MAX]; - struct dirent *dirent = _zzip_readdir(dir->realdir); - - if (! dirent) - return 0; - - dir->dirent.d_name = dirent->d_name; - strcpy(filename, dir->realname); - strcat(filename, "/"); - strcat(filename, dirent->d_name); - - if (stat(filename, &st) == -1) - return -1; - - dir->dirent.d_csize = dir->dirent.st_size = st.st_size; - - if (st.st_mode) - { - if (! S_ISREG(st.st_mode)) - { - dir->dirent.d_compr = st.st_mode; - dir->dirent.d_compr |= 0x80000000; - /* makes it effectively negative, - * but can still be fed to S_ISXXX(x) */ - } else - { - dir->dirent.d_compr = 0; /* stored */ - } - } else - { - dir->dirent.d_compr = 0; /* stored */ - } - - return 1; -} -#endif - -/** - * This function is the equivalent of a => readdir(2) for a realdir - * or a zipfile referenced by the ZZIP_DIR returned from => zzip_opendir. - * - * The ZZIP_DIR handle (as returned by => zzip_opendir) contains a few more - * entries than being copied into the ZZIP_DIRENT. The only valid fields in - * a ZZIP_DIRENT are d_name (the file name), d_compr (compression), d_csize - * (compressed size), st_size (uncompressed size). - */ -ZZIP_DIRENT * -zzip_readdir(ZZIP_DIR * dir) -{ - if (! dir) - { errno=EBADF; return 0; } - - if (USE_DIRENT && dir->realdir) - { - if (! real_readdir(dir)) - return 0; - } else - { - if (! dir->hdr) - return 0; - - dir->dirent.d_name = dir->hdr->d_name; - dir->dirent.d_compr = dir->hdr->d_compr; - - dir->dirent.d_csize = dir->hdr->d_csize; - dir->dirent.st_size = dir->hdr->d_usize; - - if (! dir->hdr->d_reclen) - dir->hdr = 0; - else - dir->hdr = (struct zzip_dir_hdr *) - ((char *) dir->hdr + dir->hdr->d_reclen); - } - return &dir->dirent; -} - -/** => zzip_rewinddir - * This function is the equivalent of => telldir(2) for a realdir or zipfile. - */ -zzip_off_t -zzip_telldir(ZZIP_DIR * dir) -{ - if (! dir) - { errno=EBADF; return -1; } - - if (USE_DIRENT && dir->realdir) - { - return _zzip_telldir(dir->realdir); - } else - { - return ((zzip_off_t) ((char *) dir->hdr - (char *) dir->hdr0)); - } -} - -/** => zzip_rewinddir - * This function is the equivalent of => seekdir(2) for a realdir or zipfile. - */ -void -zzip_seekdir(ZZIP_DIR * dir, zzip_off_t offset) -{ - if (! dir) - return; - - if (USE_DIRENT && dir->realdir) - { - _zzip_seekdir(dir->realdir, offset); - } else - { - dir->hdr = (struct zzip_dir_hdr *) - (dir->hdr0 ? (char *) dir->hdr0 + (size_t) offset : 0); - } -} - -#ifndef EOVERFLOW -#define EOVERFLOW EFBIG -#endif - -/** => zzip_rewinddir - * This function is provided for users who can not use any largefile-mode. - */ -long -zzip_telldir32(ZZIP_DIR * dir) -{ - if (sizeof(zzip_off_t) == sizeof(long)) - { - return zzip_telldir(dir); - } else - { - off_t off = zzip_telldir(dir); - if (off >= 0) { - register long off32 = off; - if (off32 == off) return off32; - errno = EOVERFLOW; - } - return -1; - } -} - -/** => zzip_rewinddir - * This function is provided for users who can not use any largefile-mode. - */ -void -zzip_seekdir32(ZZIP_DIR * dir, long offset) -{ - zzip_seekdir(dir, offset); -} - -#if defined ZZIP_LARGEFILE_RENAME && defined EOVERFLOW && defined PIC -#undef zzip_seekdir /* zzip_seekdir64 */ -#undef zzip_telldir /* zzip_telldir64 */ - -/* DLL compatibility layer - so that 32bit code can link with a 64on32 too */ -long zzip_telldir(ZZIP_DIR * dir) { return zzip_telldir32(dir); } -void zzip_seekdir(ZZIP_DIR * dir, long offset) { zzip_seekdir32(dir, offset); } -#endif - -/** - * This function is the equivalent of => opendir(3) for a realdir or zipfile. - * - * This function has some magic - if the given argument-path - * is a directory, it will wrap a real => opendir(3) into the ZZIP_DIR - * structure. Otherwise it will divert to => zzip_dir_open which - * can also attach a ".zip" extension if needed to find the archive. - * - * the error-code is mapped to => errno(3). - */ -ZZIP_DIR * -zzip_opendir(zzip_char_t * filename) -{ - return zzip_opendir_ext_io(filename, 0, 0, 0); -} - -/** => zzip_opendir - * This function uses explicit ext and io instead of the internal - * defaults, setting them to zero is equivalent to => zzip_opendir - */ -ZZIP_DIR * -zzip_opendir_ext_io(zzip_char_t * filename, int o_modes, - zzip_strings_t * ext, zzip_plugin_io_t io) -{ - zzip_error_t e; - ZZIP_DIR *dir; - -# ifdef ZZIP_HAVE_SYS_STAT_H - struct stat st; -# endif - - if (o_modes & (ZZIP_PREFERZIP | ZZIP_ONLYZIP)) - goto try_zzip; - try_real: - -# ifdef ZZIP_HAVE_SYS_STAT_H - if (stat(filename, &st) >= 0 && S_ISDIR(st.st_mode)) - { - if (USE_DIRENT) - { - _zzip_DIR *realdir = _zzip_opendir(filename); - - if (realdir) - { - if (! (dir = (ZZIP_DIR *) calloc(1, sizeof(*dir)))) - { - _zzip_closedir(realdir); - return 0; - } else - { - dir->realdir = realdir; - dir->realname = strdup(filename); - return dir; - } - } - } - return 0; - } -# endif /* HAVE_SYS_STAT_H */ - - try_zzip: - dir = zzip_dir_open_ext_io(filename, &e, ext, io); - if (! dir && (o_modes & ZZIP_PREFERZIP)) - goto try_real; - if (e) - errno = zzip_errno(e); - return dir; -} - -/** - * This function is the equivalent of => closedir(3) for a realdir or zipfile. - * - * This function is magic - if the given arg-ZZIP_DIR - * is a real directory, it will call the real => closedir(3) and then - * free the wrapping ZZIP_DIR structure. Otherwise it will divert - * to => zzip_dir_close which will free the ZZIP_DIR structure. - */ -int -zzip_closedir(ZZIP_DIR * dir) -{ - if (! dir) - { errno = EBADF; return -1; } - - if (USE_DIRENT && dir->realdir) - { - _zzip_closedir(dir->realdir); - free(dir->realname); - free(dir); - return 0; - } else - { - zzip_dir_close(dir); - return 0; - } -} - -/* - * Local variables: - * c-file-style: "stroustrup" - * End: - */ |