3 * Guido Draheim <guidod@gmx.de>
4 * Tomi Ollila <Tomi.Ollila@iki.fi>
6 * Copyright (c) 1999,2000,2001,2002 Guido Draheim
8 * use under the restrictions of the
9 * Lesser GNU General Public License
10 * or alternatively the restrictions
11 * of the Mozilla Public License 1.1
14 * although this file is defining a function called zzip_stat it
15 * will not need a real stat(2) exported by the Operating System.
16 * It will just try to fill the fields of the ZZIP_STAT structure
20 #include <zzip/lib.h> /* exported...*/
21 #include <zzip/file.h>
25 #define ZZIP_USE_INTERNAL
26 #include <zzip/info.h>
29 * obtain information about a filename in an opened zip-archive without
30 * opening that file first. Mostly used to obtain the uncompressed
31 * size of a file inside a zip-archive. see => zzip_dir_open.
34 zzip_dir_stat(ZZIP_DIR * dir, zzip_char_t* name, ZZIP_STAT * zs, int flags)
36 struct zzip_dir_hdr * hdr = dir->hdr0;
37 int (*cmp)(zzip_char_t*, zzip_char_t*);
39 cmp = (flags & ZZIP_CASEINSENSITIVE) ? strcasecmp : strcmp;
42 dir->errcode = ZZIP_ENOENT;
46 if (flags & ZZIP_IGNOREPATH)
48 char* n = strrchr(name, '/');
54 register char* hdr_name = hdr->d_name;
55 if (flags & ZZIP_IGNOREPATH)
57 register char* n = strrchr(hdr_name, '/');
58 if (n) hdr_name = n + 1;
61 if (! cmp(hdr_name, name))
66 dir->errcode = ZZIP_ENOENT;
70 hdr = (struct zzip_dir_hdr *) ((char *)hdr + hdr->d_reclen);
73 zs->d_compr = hdr->d_compr;
74 zs->d_csize = hdr->d_csize;
75 zs->st_size = hdr->d_usize;
76 zs->d_name = hdr->d_name;
82 * This function will obtain information about a opened file _within_ a
83 * zip-archive. The file is supposed to be open (otherwise -1 is returned).
84 * The st_size stat-member contains the uncompressed size. The optional
85 * d_name is never set here.
87 int zzip_file_stat (ZZIP_FILE* file, ZZIP_STAT* zs)
89 if (! file) return -1;
90 zs->d_compr = file->method;
91 zs->d_csize = file->csize;
92 zs->st_size = file->usize;
98 * This function will obtain information about a opened file which may be
99 * either real/zipped. The file is supposed to be open (otherwise -1 is
100 * returned). The st_size stat-member contains the uncompressed size.
101 * The optional d_name is never set here. For a real file, we do set the
102 * d_csize := st_size and d_compr := 0 for meaningful defaults.
104 int zzip_fstat (ZZIP_FILE* file, ZZIP_STAT* zs)
106 if (ZZIP_file_real(file))
109 if (fstat (file->fd, &st) < 0) return -1;
110 zs->st_size = st.st_size;
111 zs->d_csize = st.st_size;
115 return zzip_file_stat (file, zs);
121 * c-file-style: "stroustrup"