/*-
* SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2003-2007 Tim Kientzle
* All rights reserved.
*/

#ifndef CPIO_H_INCLUDED
#define CPIO_H_INCLUDED

#include "cpio_platform.h"
#include <stdio.h>

/*
* The internal state for the "cpio" program.
*
* Keeping all of the state in a structure like this simplifies memory
* leak testing (at exit, anything left on the heap is suspect).  A
* pointer to this structure is passed to most cpio internal
* functions.
*/
struct cpio {
       /* Option parsing */
       const char       *argument;

       /* Options */
       int               add_filter; /* --uuencode */
       const char       *filename;
       int               mode; /* -i -o -p */
       int               compress; /* -j, -y, or -z */
       const char       *format; /* -H format */
       int               bytes_per_block; /* -b block_size */
       int               verbose;   /* -v */
       int               dot;  /* -V */
       int               quiet;   /* --quiet */
       int               extract_flags; /* Flags for extract operation */
       const char       *compress_program;
       int               option_append; /* -A, only relevant for -o */
       int               option_atime_restore; /* -a */
       int               option_follow_links; /* -L */
       int               option_link; /* -l */
       int               option_list; /* -t */
       char              option_null; /* --null */
       int               option_numeric_uid_gid; /* -n */
       int               option_pwb; /* -6 */
       int               option_rename; /* -r */
       char             *destdir;
       size_t            destdir_len;
       size_t            pass_destpath_alloc;
       char             *pass_destpath;
       int               uid_override;
       char             *uname_override;
       int               gid_override;
       char             *gname_override;
       int               day_first; /* true if locale prefers day/mon */
       const char       *passphrase;

       /* If >= 0, then close this when done. */
       int               fd;

       /* Miscellaneous state information */
       struct archive   *archive;
       struct archive   *archive_read_disk;
       int               argc;
       char            **argv;
       int               return_value; /* Value returned by main() */
       struct archive_entry_linkresolver *linkresolver;

       struct name_cache *uname_cache;
       struct name_cache *gname_cache;

       /* Work data. */
       struct archive   *matching;
       char             *buff;
       size_t            buff_size;
       char             *ppbuff;
};

struct cpio_owner {
       int uid;
       int gid;
       char *uname;
       char *gname;
};

int owner_parse(const char *, struct cpio_owner *, const char **);

/* Fake short equivalents for long options that otherwise lack them. */
enum {
       OPTION_B64ENCODE = 1,
       OPTION_GRZIP,
       OPTION_INSECURE,
       OPTION_LRZIP,
       OPTION_LZ4,
       OPTION_LZMA,
       OPTION_LZOP,
       OPTION_PASSPHRASE,
       OPTION_NO_PRESERVE_OWNER,
       OPTION_PRESERVE_OWNER,
       OPTION_QUIET,
       OPTION_UUENCODE,
       OPTION_VERSION,
       OPTION_ZSTD,
};

int     cpio_getopt(struct cpio *cpio);

#endif