.\" zip_stat.mdoc \-- get information about file
.\" Copyright (C) 2003-2012 Dieter Baron and Thomas Klausner
.\"
.\" This file is part of libzip, a library to manipulate ZIP archives.
.\" The authors can be contacted at <libzip@nih.at>
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\"    notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\"    notice, this list of conditions and the following disclaimer in
.\"    the documentation and/or other materials provided with the
.\"    distribution.
.\" 3. The names of the authors may not be used to endorse or promote
.\"    products derived from this software without specific prior
.\"    written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
.TH ZIP_STAT 3 "July 22, 2012" NiH
.SH "NAME"
zip_stat , \- .Nm zip_stat_index
get information about file
.SH "LIBRARY"
libzip (-lzip)
.SH "SYNOPSIS"
#include <zip.h>
.PP
int
zip_stat(struct zip *archive, const char *fname, zip_flags_t flags, struct zip_stat *sb);
.PP
int
zip_stat_index(struct zip *archive, int index, zip_flags_t flags, struct zip_stat *sb);
.SH "DESCRIPTION"
The
zip_stat
function obtains information about the file named
\fBfname\fR
in
\fBarchive.\fR
The
\fBflags\fR
argument specifies how the name lookup should be done.
Its values are described in
zip_name_locate(3).
Also,
\fBZIP_FL_UNCHANGED\fR
may be
.I or'ed
to it to request information about the original file in the archive,
ignoring any changes made.
.PP
The
zip_stat_index
function obtains information about the file at position
\fBindex.\fR
.PP
The
\fBsb\fR
argument is a pointer to a
.PP
struct zip_stat
(shown below), into which information about the file is placed.
.Bd \-literal
struct zip_stat {
    zip_uint64_t valid;                 /* which fields have valid values */
    const char *name;                   /* name of the file */
    zip_uint64_t index;                 /* index within archive */
    zip_uint64_t size;                  /* size of file (uncompressed) */
    zip_uint64_t comp_size;             /* size of file (compressed) */
    time_t mtime;                       /* modification time */
    zip_uint32_t crc;                   /* crc of file data */
    zip_uint16_t comp_method;           /* compression method used */
    zip_uint16_t encryption_method;     /* encryption method used */
    zip_uint32_t flags;                 /* reserved for future use */
};
.Ed
The structure pointed to by
\fBsb\fR
must be allocated before calling
zip_stat
or
zip_stat_index.
.PP
The
\fBvalid\fR
field of the structure specifies which other fields are valid.
Check if the flag defined by the following defines are in
\fBvalid\fR
before accessing the fields:
.RS
.TP 30
\fBZIP_STAT_NAME\fR
\fBname\fR
.TP 30
\fBZIP_STAT_INDEX\fR
\fBindex\fR
.TP 30
\fBZIP_STAT_SIZE\fR
\fBsize\fR
.TP 30
\fBZIP_STAT_COMP_SIZE\fR
\fBcomp_size\fR
.TP 30
\fBZIP_STAT_MTIME\fR
\fBmtime\fR
.TP 30
\fBZIP_STAT_CRC\fR
\fBcrc\fR
.TP 30
\fBZIP_STAT_COMP_METHOD\fR
\fBcomp_method\fR
.TP 30
\fBZIP_STAT_ENCRYPTION_METHOD\fR
\fBencryption_method\fR
.TP 30
\fBZIP_STAT_FLAGS\fR
\fBflags\fR
.RE
.SH "RETURN VALUES"
Upon successful completion 0 is returned.
Otherwise, \-1 is returned and the error information in
\fBarchive\fR
is set to indicate the error.
.SH "ERRORS"
The function
zip_stat
can fail for any of the errors specified for the routine
zip_name_locate(3).
.PP
The function
zip_stat_index
fails and sets the error information to
ZIP_ER_INVAL
if
\fBindex\fR
is invalid.
If
\fBZIP_FL_UNCHANGED\fR
is not set and no information can be obtained from the source
callback, the error information is set to
ZIP_ER_CHANGED.
.SH "SEE ALSO"
libzip(3),
zip_get_num_entries(3),
zip_name_locate(3),
zip_stat_init(3)
.SH "AUTHORS"

Dieter Baron <dillo@nih.at>
and
Thomas Klausner <tk@giga.or.at>
