4 * Guido Draheim <guidod@gmx.de>
5 * Tomi Ollila <Tomi.Ollila@iki.fi>
7 * Copyright (c) 1999,2000,2001,2002 Guido Draheim
9 * use under the restrictions of the
10 * Lesser GNU General Public License
11 * or alternatively the restrictions
12 * of the Mozilla Public License 1.1
15 * although this file is defining a function called zzip_stat it
16 * will not need a real stat(2) exported by the Operating System.
17 * It will just try to fill the fields of the ZZIP_STAT structure
21 #include <zzip/lib.h> /* exported... */
22 #include <zzip/file.h>
25 #include <strings.h> /* for strcasecmp */
29 #define ZZIP_USE_INTERNAL
30 #include <zzip/info.h>
33 * obtain information about a filename in an opened zip-archive without
34 * opening that file first. Mostly used to obtain the uncompressed
35 * size of a file inside a zip-archive. see => zzip_dir_open.
38 zzip_dir_stat(ZZIP_DIR
* dir
, zzip_char_t
* name
, ZZIP_STAT
* zs
, int flags
)
40 struct zzip_dir_hdr
*hdr
= dir
->hdr0
;
41 int (*cmp
) (zzip_char_t
*, zzip_char_t
*);
43 if (flags
& ZZIP_CASEINSENSITIVE
) flags
|= ZZIP_CASELESS
;
44 cmp
= (flags
& ZZIP_CASELESS
) ? strcasecmp
: strcmp
;
48 dir
->errcode
= ZZIP_ENOENT
;
52 if (flags
& ZZIP_IGNOREPATH
)
54 char *n
= strrchr(name
, '/');
61 register char *hdr_name
= hdr
->d_name
;
62 if (flags
& ZZIP_IGNOREPATH
)
64 register char *n
= strrchr(hdr_name
, '/');
69 if (! cmp(hdr_name
, name
))
74 dir
->errcode
= ZZIP_ENOENT
;
78 hdr
= (struct zzip_dir_hdr
*) ((char *) hdr
+ hdr
->d_reclen
);
81 zs
->d_compr
= hdr
->d_compr
;
82 zs
->d_csize
= hdr
->d_csize
;
83 zs
->st_size
= hdr
->d_usize
;
84 zs
->d_name
= hdr
->d_name
;
90 * This function will obtain information about a opened file _within_ a
91 * zip-archive. The file is supposed to be open (otherwise -1 is returned).
92 * The st_size stat-member contains the uncompressed size. The optional
93 * d_name is never set here.
96 zzip_file_stat(ZZIP_FILE
* file
, ZZIP_STAT
* zs
)
100 zs
->d_compr
= file
->method
;
101 zs
->d_csize
= file
->csize
;
102 zs
->st_size
= file
->usize
;
108 * This function will obtain information about a opened file which may be
109 * either real/zipped. The file is supposed to be open (otherwise -1 is
110 * returned). The st_size stat-member contains the uncompressed size.
111 * The optional d_name is never set here. For a real file, we do set the
112 * d_csize := st_size and d_compr := 0 for meaningful defaults.
115 zzip_fstat(ZZIP_FILE
* file
, ZZIP_STAT
* zs
)
117 if (ZZIP_file_real(file
))
120 if (fstat(file
->fd
, &st
) < 0)
122 zs
->st_size
= st
.st_size
;
123 zs
->d_csize
= st
.st_size
;
128 return zzip_file_stat(file
, zs
);
134 * c-file-style: "stroustrup"