Blame src/gpg-error.h.in

Packit fc043f
/* gpg-error.h or gpgrt.h - Common code for GnuPG and others.    -*- c -*-
Packit fc043f
 * Copyright (C) 2001-2018 g10 Code GmbH
Packit fc043f
 *
Packit fc043f
 * This file is part of libgpg-error (aka libgpgrt).
Packit fc043f
 *
Packit fc043f
 * libgpg-error is free software; you can redistribute it and/or
Packit fc043f
 * modify it under the terms of the GNU Lesser General Public License
Packit fc043f
 * as published by the Free Software Foundation; either version 2.1 of
Packit fc043f
 * the License, or (at your option) any later version.
Packit fc043f
 *
Packit fc043f
 * libgpg-error is distributed in the hope that it will be useful, but
Packit fc043f
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit fc043f
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit fc043f
 * Lesser General Public License for more details.
Packit fc043f
 *
Packit fc043f
 * You should have received a copy of the GNU Lesser General Public
Packit fc043f
 * License along with this program; if not, see <https://www.gnu.org/licenses/>.
Packit fc043f
 * SPDX-License-Identifier: LGPL-2.1+
Packit fc043f
 *
Packit b8b331
 * Do not edit.  Generated from gpg-error.h.in.
Packit fc043f
 */
Packit fc043f
Packit fc043f
/* The GnuPG project consists of many components.  Error codes are
Packit fc043f
 * exchanged between all components.  The common error codes and their
Packit fc043f
 * user-presentable descriptions are kept into a shared library to
Packit fc043f
 * allow adding new error codes and components without recompiling any
Packit fc043f
 * of the other components.  In addition to error codes this library
Packit fc043f
 * also features several other groups of functions which are common to
Packit fc043f
 * all GnuPG components.  They may be used by independet project as
Packit fc043f
 * well.  The interfaces will not change in a backward incompatible way.
Packit fc043f
 *
Packit fc043f
 * An error code together with an error source build up an error
Packit fc043f
 * value.  As the error value is been passed from one component to
Packit fc043f
 * another, it preserves the information about the source and nature
Packit fc043f
 * of the error.
Packit fc043f
 *
Packit fc043f
 * A component of the GnuPG project can define the following macros to
Packit fc043f
 * tune the behaviour of the library:
Packit fc043f
 *
Packit fc043f
 * GPG_ERR_SOURCE_DEFAULT: Define to an error source of type
Packit fc043f
 * gpg_err_source_t to make that source the default for gpg_error().
Packit fc043f
 * Otherwise GPG_ERR_SOURCE_UNKNOWN is used as default.
Packit fc043f
 *
Packit fc043f
 * GPG_ERR_ENABLE_GETTEXT_MACROS: Define to provide macros to map the
Packit fc043f
 * internal gettext API to standard names.  This has only an effect on
Packit fc043f
 * Windows platforms.
Packit fc043f
 *
Packit fc043f
 * GPGRT_ENABLE_ES_MACROS: Define to provide "es_" macros for the
Packit fc043f
 * estream functions.
Packit fc043f
 *
Packit fc043f
 * GPGRT_ENABLE_LOG_MACROS: Define to provide short versions of the
Packit fc043f
 * log functions.
Packit fc043f
 *
Packit fc043f
 * GPGRT_ENABLE_ARGPARSE_MACROS: Needs to be defined to provide the
Packit fc043f
 * mandatory macros of the argparse interface.
Packit fc043f
 */
Packit fc043f
Packit fc043f
#ifndef GPG_ERROR_H
Packit fc043f
#define GPG_ERROR_H 1
Packit fc043f
#ifndef GPGRT_H
Packit fc043f
#define GPGRT_H 1
Packit fc043f
Packit fc043f
#include <stddef.h>
Packit fc043f
#include <stdio.h>
Packit fc043f
#include <stdarg.h>
Packit fc043f
Packit fc043f
/* The version string of this header. */
Packit fc043f
#define GPG_ERROR_VERSION @version@
Packit fc043f
#define GPGRT_VERSION     @version@
Packit fc043f
Packit fc043f
/* The version number of this header. */
Packit fc043f
#define GPG_ERROR_VERSION_NUMBER @version-number@
Packit fc043f
#define GPGRT_VERSION_NUMBER     @version-number@
Packit fc043f
Packit fc043f
Packit fc043f
#ifdef __GNUC__
Packit fc043f
# define GPG_ERR_INLINE __inline__
Packit fc043f
#elif defined(_MSC_VER) && _MSC_VER >= 1300
Packit fc043f
# define GPG_ERR_INLINE __inline
Packit fc043f
#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
Packit fc043f
# define GPG_ERR_INLINE inline
Packit fc043f
#else
Packit fc043f
# ifndef GPG_ERR_INLINE
Packit fc043f
#  define GPG_ERR_INLINE
Packit fc043f
# endif
Packit fc043f
#endif
Packit fc043f
Packit fc043f
#ifdef __cplusplus
Packit fc043f
extern "C" {
Packit fc043f
#if 0 /* just to make Emacs auto-indent happy */
Packit fc043f
}
Packit fc043f
#endif
Packit fc043f
#endif /* __cplusplus */
Packit fc043f
Packit fc043f
Packit fc043f

Packit fc043f
/* The error source type gpg_err_source_t.
Packit fc043f
 *
Packit fc043f
 * Where as the Poo out of a welle small
Packit fc043f
 * Taketh his firste springing and his sours.
Packit fc043f
 *					--Chaucer.
Packit fc043f
 */
Packit fc043f
Packit fc043f
/* Only use free slots, never change or reorder the existing
Packit fc043f
 * entries.  */
Packit fc043f
typedef enum
Packit fc043f
  {
Packit fc043f
@include:err-sources@
Packit fc043f
    /* This is one more than the largest allowed entry.  */
Packit fc043f
    GPG_ERR_SOURCE_DIM = 128
Packit fc043f
  } gpg_err_source_t;
Packit fc043f
Packit fc043f

Packit fc043f
/* The error code type gpg_err_code_t.  */
Packit fc043f
Packit fc043f
/* Only use free slots, never change or reorder the existing
Packit fc043f
 * entries.  */
Packit fc043f
typedef enum
Packit fc043f
  {
Packit fc043f
@include:err-codes@
Packit fc043f
    /* The following error codes are used to map system errors.  */
Packit fc043f
#define GPG_ERR_SYSTEM_ERROR	(1 << 15)
Packit fc043f
@include:errnos@
Packit fc043f
    /* This is one more than the largest allowed entry.  */
Packit fc043f
    GPG_ERR_CODE_DIM = 65536
Packit fc043f
  } gpg_err_code_t;
Packit fc043f
Packit fc043f

Packit fc043f
/* The error value type gpg_error_t.  */
Packit fc043f
Packit fc043f
/* We would really like to use bit-fields in a struct, but using
Packit fc043f
 * structs as return values can cause binary compatibility issues, in
Packit fc043f
 * particular if you want to do it efficiently (also see
Packit fc043f
 * -freg-struct-return option to GCC).  */
Packit fc043f
typedef unsigned int gpg_error_t;
Packit fc043f
Packit fc043f
/* We use the lowest 16 bits of gpg_error_t for error codes.  The 16th
Packit fc043f
 * bit indicates system errors.  */
Packit fc043f
#define GPG_ERR_CODE_MASK	(GPG_ERR_CODE_DIM - 1)
Packit fc043f
Packit fc043f
/* Bits 17 to 24 are reserved.  */
Packit fc043f
Packit fc043f
/* We use the upper 7 bits of gpg_error_t for error sources.  */
Packit fc043f
#define GPG_ERR_SOURCE_MASK	(GPG_ERR_SOURCE_DIM - 1)
Packit fc043f
#define GPG_ERR_SOURCE_SHIFT	24
Packit fc043f
Packit fc043f
/* The highest bit is reserved.  It shouldn't be used to prevent
Packit fc043f
 * potential negative numbers when transmitting error values as
Packit fc043f
 * text.  */
Packit fc043f
Packit fc043f

Packit fc043f
/*
Packit fc043f
 * GCC feature test.
Packit fc043f
 */
Packit fc043f
#if __GNUC__
Packit fc043f
# define _GPG_ERR_GCC_VERSION (__GNUC__ * 10000 \
Packit fc043f
                               + __GNUC_MINOR__ * 100 \
Packit fc043f
                               + __GNUC_PATCHLEVEL__)
Packit fc043f
#else
Packit fc043f
# define _GPG_ERR_GCC_VERSION 0
Packit fc043f
#endif
Packit fc043f
Packit fc043f
#undef _GPG_ERR_HAVE_CONSTRUCTOR
Packit fc043f
#if _GPG_ERR_GCC_VERSION > 30100
Packit fc043f
# define _GPG_ERR_CONSTRUCTOR	__attribute__ ((__constructor__))
Packit fc043f
# define _GPG_ERR_HAVE_CONSTRUCTOR
Packit fc043f
#else
Packit fc043f
# define _GPG_ERR_CONSTRUCTOR
Packit fc043f
#endif
Packit fc043f
Packit fc043f
#define GPGRT_GCC_VERSION  _GPG_ERR_GCC_VERSION
Packit fc043f
Packit fc043f
#if _GPG_ERR_GCC_VERSION >= 29200
Packit fc043f
# define _GPGRT__RESTRICT __restrict__
Packit fc043f
#else
Packit fc043f
# define _GPGRT__RESTRICT
Packit fc043f
#endif
Packit fc043f
Packit fc043f
/* The noreturn attribute.  */
Packit fc043f
#if _GPG_ERR_GCC_VERSION >= 20500
Packit fc043f
# define GPGRT_ATTR_NORETURN   __attribute__ ((noreturn))
Packit fc043f
#else
Packit fc043f
# define GPGRT_ATTR_NORETURN
Packit fc043f
#endif
Packit fc043f
Packit fc043f
/* The printf attributes.  */
Packit fc043f
#if _GPG_ERR_GCC_VERSION >= 40400
Packit fc043f
# define GPGRT_ATTR_PRINTF(f, a) \
Packit fc043f
                    __attribute__ ((format(__gnu_printf__,f,a)))
Packit fc043f
# define GPGRT_ATTR_NR_PRINTF(f, a) \
Packit fc043f
                    __attribute__ ((noreturn, format(__gnu_printf__,f,a)))
Packit fc043f
#elif _GPG_ERR_GCC_VERSION >= 20500
Packit fc043f
# define GPGRT_ATTR_PRINTF(f, a) \
Packit fc043f
                    __attribute__ ((format(printf,f,a)))
Packit fc043f
# define GPGRT_ATTR_NR_PRINTF(f, a) \
Packit fc043f
                    __attribute__ ((noreturn, format(printf,f,a)))
Packit fc043f
#else
Packit fc043f
# define GPGRT_ATTR_PRINTF(f, a)
Packit fc043f
# define GPGRT_ATTR_NR_PRINTF(f, a)
Packit fc043f
#endif
Packit fc043f
#if _GPG_ERR_GCC_VERSION >= 20800
Packit fc043f
# define GPGRT_ATTR_FORMAT_ARG(a)  __attribute__ ((__format_arg__ (a)))
Packit fc043f
#else
Packit fc043f
# define GPGRT_ATTR_FORMAT_ARG(a)
Packit fc043f
#endif
Packit fc043f
Packit fc043f
/* The sentinel attribute.  */
Packit fc043f
#if _GPG_ERR_GCC_VERSION >= 40000
Packit fc043f
# define GPGRT_ATTR_SENTINEL(a)  __attribute__ ((sentinel(a)))
Packit fc043f
#else
Packit fc043f
# define GPGRT_ATTR_SENTINEL(a)
Packit fc043f
#endif
Packit fc043f
Packit fc043f
/* The used and unused attributes.
Packit fc043f
 * I am not sure since when the unused attribute is really supported.
Packit fc043f
 * In any case it it only needed for gcc versions which print a
Packit fc043f
 * warning.  Thus let us require gcc >= 3.5.  */
Packit fc043f
#if _GPG_ERR_GCC_VERSION >= 40000
Packit fc043f
# define GPGRT_ATTR_USED  __attribute__ ((used))
Packit fc043f
#else
Packit fc043f
# define GPGRT_ATTR_USED
Packit fc043f
#endif
Packit fc043f
#if _GPG_ERR_GCC_VERSION >= 30500
Packit fc043f
# define GPGRT_ATTR_UNUSED  __attribute__ ((unused))
Packit fc043f
#else
Packit fc043f
# define GPGRT_ATTR_UNUSED
Packit fc043f
#endif
Packit fc043f
Packit fc043f
/* The deprecated attribute.  */
Packit fc043f
#if _GPG_ERR_GCC_VERSION >= 30100
Packit fc043f
# define GPGRT_ATTR_DEPRECATED  __attribute__ ((__deprecated__))
Packit fc043f
#else
Packit fc043f
# define GPGRT_ATTR_DEPRECATED
Packit fc043f
#endif
Packit fc043f
Packit fc043f
/* The pure attribute.  */
Packit fc043f
#if _GPG_ERR_GCC_VERSION >= 29600
Packit fc043f
# define GPGRT_ATTR_PURE  __attribute__ ((__pure__))
Packit fc043f
#else
Packit fc043f
# define GPGRT_ATTR_PURE
Packit fc043f
#endif
Packit fc043f
Packit fc043f
/* The malloc attribute.  */
Packit fc043f
#if _GPG_ERR_GCC_VERSION >= 30200
Packit fc043f
# define GPGRT_ATTR_MALLOC  __attribute__ ((__malloc__))
Packit fc043f
#else
Packit fc043f
# define GPGRT_ATTR_MALLOC
Packit fc043f
#endif
Packit fc043f
Packit fc043f
/* A macro defined if a GCC style __FUNCTION__ macro is available.  */
Packit fc043f
#undef GPGRT_HAVE_MACRO_FUNCTION
Packit fc043f
#if _GPG_ERR_GCC_VERSION >= 20500
Packit fc043f
# define GPGRT_HAVE_MACRO_FUNCTION 1
Packit fc043f
#endif
Packit fc043f
Packit fc043f
/* A macro defined if the pragma GCC push_options is available.  */
Packit fc043f
#undef GPGRT_HAVE_PRAGMA_GCC_PUSH
Packit fc043f
#if _GPG_ERR_GCC_VERSION >= 40400
Packit fc043f
# define GPGRT_HAVE_PRAGMA_GCC_PUSH 1
Packit fc043f
#endif
Packit fc043f
Packit fc043f
/* Detect LeakSanitizer (LSan) support for GCC and Clang based on
Packit fc043f
 * whether AddressSanitizer (ASAN) is enabled via -fsanitize=address).
Packit fc043f
 * Note that -fsanitize=leak just affect the linker options which
Packit fc043f
 * cannot be detected here.  In that case you have to define the
Packit fc043f
 * GPGRT_HAVE_LEAK_SANITIZER macro manually.  */
Packit fc043f
#ifdef __GNUC__
Packit fc043f
# ifdef __SANITIZE_ADDRESS__
Packit fc043f
#  define GPGRT_HAVE_LEAK_SANITIZER
Packit fc043f
# elif defined(__has_feature)
Packit fc043f
#  if __has_feature(address_sanitizer)
Packit fc043f
#   define GPGRT_HAVE_LEAK_SANITIZER
Packit fc043f
#  endif
Packit fc043f
# endif
Packit fc043f
#endif
Packit fc043f
Packit fc043f
Packit fc043f
/* The new name for the inline macro.  */
Packit fc043f
#define GPGRT_INLINE GPG_ERR_INLINE
Packit fc043f
Packit fc043f
#ifdef GPGRT_HAVE_LEAK_SANITIZER
Packit fc043f
# include <sanitizer/lsan_interface.h>
Packit fc043f
#endif
Packit fc043f
Packit fc043f
/* Mark heap objects as non-leaked memory. */
Packit fc043f
static GPGRT_INLINE void
Packit fc043f
gpgrt_annotate_leaked_object (const void *p)
Packit fc043f
{
Packit fc043f
#ifdef GPGRT_HAVE_LEAK_SANITIZER
Packit fc043f
  __lsan_ignore_object(p);
Packit fc043f
#else
Packit fc043f
  (void)p;
Packit fc043f
#endif
Packit fc043f
}
Packit fc043f
Packit fc043f

Packit fc043f
/*
Packit fc043f
 * Initialization function.
Packit fc043f
 */
Packit fc043f
Packit fc043f
/* Initialize the library.  This function should be run early.  */
Packit fc043f
gpg_error_t gpg_err_init (void) _GPG_ERR_CONSTRUCTOR;
Packit fc043f
Packit fc043f
/* If this is defined, the library is already initialized by the
Packit fc043f
   constructor and does not need to be initialized explicitely.  */
Packit fc043f
#undef GPG_ERR_INITIALIZED
Packit fc043f
#ifdef _GPG_ERR_HAVE_CONSTRUCTOR
Packit fc043f
# define GPG_ERR_INITIALIZED	1
Packit fc043f
# define gpgrt_init() do { gpg_err_init (); } while (0)
Packit fc043f
#else
Packit fc043f
# define gpgrt_init() do { ; } while (0)
Packit fc043f
#endif
Packit fc043f
Packit fc043f
/* See the source on how to use the deinit function; it is usually not
Packit fc043f
   required.  */
Packit fc043f
void gpg_err_deinit (int mode);
Packit fc043f
Packit fc043f
/* Register blocking system I/O clamping functions.  */
Packit fc043f
void gpgrt_set_syscall_clamp (void (*pre)(void), void (*post)(void));
Packit fc043f
Packit fc043f
/* Get current I/O clamping functions.  */
Packit fc043f
void gpgrt_get_syscall_clamp (void (**r_pre)(void), void (**r_post)(void));
Packit fc043f
Packit fc043f
/* Register a custom malloc/realloc/free function.  */
Packit fc043f
void gpgrt_set_alloc_func  (void *(*f)(void *a, size_t n));
Packit fc043f
Packit fc043f
Packit fc043f

Packit fc043f
/*
Packit fc043f
 * Constructor and accessor functions.
Packit fc043f
 */
Packit fc043f
Packit fc043f
/* Construct an error value from an error code and source.  Within a
Packit fc043f
 * subsystem, use gpg_error.  */
Packit fc043f
static GPG_ERR_INLINE gpg_error_t
Packit fc043f
gpg_err_make (gpg_err_source_t source, gpg_err_code_t code)
Packit fc043f
{
Packit fc043f
  return code == GPG_ERR_NO_ERROR ? GPG_ERR_NO_ERROR
Packit fc043f
    : (((source & GPG_ERR_SOURCE_MASK) << GPG_ERR_SOURCE_SHIFT)
Packit fc043f
       | (code & GPG_ERR_CODE_MASK));
Packit fc043f
}
Packit fc043f
Packit fc043f
Packit fc043f
/* The user should define GPG_ERR_SOURCE_DEFAULT before including this
Packit fc043f
 * file to specify a default source for gpg_error.  */
Packit fc043f
#ifndef GPG_ERR_SOURCE_DEFAULT
Packit fc043f
#define GPG_ERR_SOURCE_DEFAULT	GPG_ERR_SOURCE_UNKNOWN
Packit fc043f
#endif
Packit fc043f
Packit fc043f
static GPG_ERR_INLINE gpg_error_t
Packit fc043f
gpg_error (gpg_err_code_t code)
Packit fc043f
{
Packit fc043f
  return gpg_err_make (GPG_ERR_SOURCE_DEFAULT, code);
Packit fc043f
}
Packit fc043f
Packit fc043f
Packit fc043f
/* Retrieve the error code from an error value.  */
Packit fc043f
static GPG_ERR_INLINE gpg_err_code_t
Packit fc043f
gpg_err_code (gpg_error_t err)
Packit fc043f
{
Packit fc043f
  return (gpg_err_code_t) (err & GPG_ERR_CODE_MASK);
Packit fc043f
}
Packit fc043f
Packit fc043f
Packit fc043f
/* Retrieve the error source from an error value.  */
Packit fc043f
static GPG_ERR_INLINE gpg_err_source_t
Packit fc043f
gpg_err_source (gpg_error_t err)
Packit fc043f
{
Packit fc043f
  return (gpg_err_source_t) ((err >> GPG_ERR_SOURCE_SHIFT)
Packit fc043f
			     & GPG_ERR_SOURCE_MASK);
Packit fc043f
}
Packit fc043f
Packit fc043f

Packit fc043f
/* String functions.  */
Packit fc043f
Packit fc043f
/* Return a pointer to a string containing a description of the error
Packit fc043f
 * code in the error value ERR.  This function is not thread-safe.  */
Packit fc043f
const char *gpg_strerror (gpg_error_t err);
Packit fc043f
Packit fc043f
/* Return the error string for ERR in the user-supplied buffer BUF of
Packit fc043f
 * size BUFLEN.  This function is, in contrast to gpg_strerror,
Packit fc043f
 * thread-safe if a thread-safe strerror_r() function is provided by
Packit fc043f
 * the system.  If the function succeeds, 0 is returned and BUF
Packit fc043f
 * contains the string describing the error.  If the buffer was not
Packit fc043f
 * large enough, ERANGE is returned and BUF contains as much of the
Packit fc043f
 * beginning of the error string as fits into the buffer.  */
Packit fc043f
int gpg_strerror_r (gpg_error_t err, char *buf, size_t buflen);
Packit fc043f
Packit fc043f
/* Return a pointer to a string containing a description of the error
Packit fc043f
 * source in the error value ERR.  */
Packit fc043f
const char *gpg_strsource (gpg_error_t err);
Packit fc043f
Packit fc043f

Packit fc043f
/*
Packit fc043f
 * Mapping of system errors (errno).
Packit fc043f
 */
Packit fc043f
Packit fc043f
/* Retrieve the error code for the system error ERR.  This returns
Packit fc043f
 * GPG_ERR_UNKNOWN_ERRNO if the system error is not mapped (report
Packit fc043f
 * this). */
Packit fc043f
gpg_err_code_t gpg_err_code_from_errno (int err);
Packit fc043f
Packit fc043f
/* Retrieve the system error for the error code CODE.  This returns 0
Packit fc043f
 * if CODE is not a system error code.  */
Packit fc043f
int gpg_err_code_to_errno (gpg_err_code_t code);
Packit fc043f
Packit fc043f
/* Retrieve the error code directly from the ERRNO variable.  This
Packit fc043f
 * returns GPG_ERR_UNKNOWN_ERRNO if the system error is not mapped
Packit fc043f
 * (report this) and GPG_ERR_MISSING_ERRNO if ERRNO has the value 0. */
Packit fc043f
gpg_err_code_t gpg_err_code_from_syserror (void);
Packit fc043f
Packit fc043f
Packit fc043f
/* Set the ERRNO variable.  This function is the preferred way to set
Packit fc043f
 * ERRNO due to peculiarities on WindowsCE.  */
Packit fc043f
void gpg_err_set_errno (int err);
Packit fc043f
Packit fc043f
/* Return or check the version.  Both functions are identical.  */
Packit fc043f
const char *gpgrt_check_version (const char *req_version);
Packit fc043f
const char *gpg_error_check_version (const char *req_version);
Packit fc043f
Packit fc043f
/* System specific type definitions.  */
Packit fc043f
@define:pid_t@
Packit fc043f
@define:gpgrt_ssize_t@
Packit fc043f
@define:gpgrt_off_t@
Packit fc043f
Packit fc043f
@include:os-add@
Packit fc043f

Packit fc043f
/* Self-documenting convenience functions.  */
Packit fc043f
Packit fc043f
static GPG_ERR_INLINE gpg_error_t
Packit fc043f
gpg_err_make_from_errno (gpg_err_source_t source, int err)
Packit fc043f
{
Packit fc043f
  return gpg_err_make (source, gpg_err_code_from_errno (err));
Packit fc043f
}
Packit fc043f
Packit fc043f
Packit fc043f
static GPG_ERR_INLINE gpg_error_t
Packit fc043f
gpg_error_from_errno (int err)
Packit fc043f
{
Packit fc043f
  return gpg_error (gpg_err_code_from_errno (err));
Packit fc043f
}
Packit fc043f
Packit fc043f
static GPG_ERR_INLINE gpg_error_t
Packit fc043f
gpg_error_from_syserror (void)
Packit fc043f
{
Packit fc043f
  return gpg_error (gpg_err_code_from_syserror ());
Packit fc043f
}
Packit fc043f
Packit fc043f
Packit fc043f

Packit fc043f
/*
Packit fc043f
 * Malloc and friends
Packit fc043f
 */
Packit fc043f
Packit fc043f
void *gpgrt_realloc (void *a, size_t n);
Packit fc043f
void *gpgrt_malloc (size_t n);
Packit fc043f
void *gpgrt_calloc (size_t n, size_t m);
Packit fc043f
char *gpgrt_strdup (const char *string);
Packit fc043f
char *gpgrt_strconcat (const char *s1, ...) GPGRT_ATTR_SENTINEL(0);
Packit fc043f
void gpgrt_free (void *a);
Packit fc043f
Packit fc043f
Packit fc043f
/*
Packit fc043f
 * System specific function wrappers.
Packit fc043f
 */
Packit fc043f
Packit fc043f
/* A getenv replacement which mallocs the returned string.  */
Packit fc043f
char *gpgrt_getenv (const char *name);
Packit fc043f
Packit fc043f
/* A setenv and a unsetenv replacement.*/
Packit fc043f
gpg_err_code_t gpgrt_setenv (const char *name,
Packit fc043f
                             const char *value, int overwrite);
Packit fc043f
#define gpgrt_unsetenv(n) gpgrt_setenv ((n), NULL, 1)
Packit fc043f
Packit fc043f
/* A wrapper around mkdir using a string for the mode.  */
Packit fc043f
gpg_err_code_t gpgrt_mkdir (const char *name, const char *modestr);
Packit fc043f
Packit fc043f
/* A simple wrapper around chdir.  */
Packit fc043f
gpg_err_code_t gpgrt_chdir (const char *name);
Packit fc043f
Packit fc043f
/* Return the current WD as a malloced string.  */
Packit fc043f
char *gpgrt_getcwd (void);
Packit fc043f
Packit fc043f
Packit fc043f
Packit fc043f

Packit fc043f
/*
Packit fc043f
 * Lock functions.
Packit fc043f
 */
Packit fc043f
Packit fc043f
@include:lock-obj@
Packit fc043f
Packit fc043f
#define GPGRT_LOCK_DEFINE(name) \
Packit fc043f
  static gpgrt_lock_t name  = GPGRT_LOCK_INITIALIZER
Packit fc043f
Packit fc043f
/* NB: If GPGRT_LOCK_DEFINE is not used, zero out the lock variable
Packit fc043f
   before passing it to gpgrt_lock_init.  */
Packit fc043f
gpg_err_code_t gpgrt_lock_init (gpgrt_lock_t *lockhd);
Packit fc043f
gpg_err_code_t gpgrt_lock_lock (gpgrt_lock_t *lockhd);
Packit fc043f
gpg_err_code_t gpgrt_lock_trylock (gpgrt_lock_t *lockhd);
Packit fc043f
gpg_err_code_t gpgrt_lock_unlock (gpgrt_lock_t *lockhd);
Packit fc043f
gpg_err_code_t gpgrt_lock_destroy (gpgrt_lock_t *lockhd);
Packit fc043f
Packit fc043f
Packit fc043f

Packit fc043f
/*
Packit fc043f
 * Thread functions.
Packit fc043f
 */
Packit fc043f
Packit fc043f
gpg_err_code_t gpgrt_yield (void);
Packit fc043f
Packit fc043f
Packit fc043f
Packit fc043f

Packit fc043f
/*
Packit fc043f
 * Estream
Packit fc043f
 */
Packit fc043f
Packit fc043f
/* The definition of this struct is entirely private.  You must not
Packit fc043f
   use it for anything.  It is only here so some functions can be
Packit fc043f
   implemented as macros.  */
Packit fc043f
struct _gpgrt_stream_internal;
Packit fc043f
struct _gpgrt__stream
Packit fc043f
{
Packit fc043f
  /* The layout of this struct must never change.  It may be grown,
Packit fc043f
     but only if all functions which access the new members are
Packit fc043f
     versioned.  */
Packit fc043f
Packit fc043f
  /* Various flags.  */
Packit fc043f
  struct {
Packit fc043f
    unsigned int magic: 16;
Packit fc043f
    unsigned int writing: 1;
Packit fc043f
    unsigned int reserved: 15;
Packit fc043f
  } flags;
Packit fc043f
Packit fc043f
  /* A pointer to the stream buffer.  */
Packit fc043f
  unsigned char *buffer;
Packit fc043f
Packit fc043f
  /* The size of the buffer in bytes.  */
Packit fc043f
  size_t buffer_size;
Packit fc043f
Packit fc043f
  /* The length of the usable data in the buffer, only valid when in
Packit fc043f
     read mode (see flags).  */
Packit fc043f
  size_t data_len;
Packit fc043f
Packit fc043f
  /* The current position of the offset pointer, valid in read and
Packit fc043f
     write mode.  */
Packit fc043f
  size_t data_offset;
Packit fc043f
Packit fc043f
  size_t data_flushed;
Packit fc043f
  unsigned char *unread_buffer;
Packit fc043f
  size_t unread_buffer_size;
Packit fc043f
Packit fc043f
  /* The number of unread bytes.  */
Packit fc043f
  size_t unread_data_len;
Packit fc043f
Packit fc043f
  /* A pointer to our internal data for this stream.  */
Packit fc043f
  struct _gpgrt_stream_internal *intern;
Packit fc043f
};
Packit fc043f
Packit fc043f
/* The opaque type for an estream.  */
Packit fc043f
typedef struct _gpgrt__stream *gpgrt_stream_t;
Packit fc043f
#ifdef GPGRT_ENABLE_ES_MACROS
Packit fc043f
typedef struct _gpgrt__stream *estream_t;
Packit fc043f
#endif
Packit fc043f
Packit fc043f
typedef @api_ssize_t@ (*gpgrt_cookie_read_function_t) (void *cookie,
Packit fc043f
                                                 void *buffer, size_t size);
Packit fc043f
typedef @api_ssize_t@ (*gpgrt_cookie_write_function_t) (void *cookie,
Packit fc043f
                                                  const void *buffer,
Packit fc043f
                                                  size_t size);
Packit fc043f
typedef int (*gpgrt_cookie_seek_function_t) (void *cookie,
Packit fc043f
                                             gpgrt_off_t *pos, int whence);
Packit fc043f
typedef int (*gpgrt_cookie_close_function_t) (void *cookie);
Packit fc043f
Packit fc043f
struct _gpgrt_cookie_io_functions
Packit fc043f
{
Packit fc043f
  gpgrt_cookie_read_function_t func_read;
Packit fc043f
  gpgrt_cookie_write_function_t func_write;
Packit fc043f
  gpgrt_cookie_seek_function_t func_seek;
Packit fc043f
  gpgrt_cookie_close_function_t func_close;
Packit fc043f
};
Packit fc043f
typedef struct _gpgrt_cookie_io_functions gpgrt_cookie_io_functions_t;
Packit fc043f
#ifdef GPGRT_ENABLE_ES_MACROS
Packit fc043f
typedef struct _gpgrt_cookie_io_functions  es_cookie_io_functions_t;
Packit fc043f
#define es_cookie_read_function_t  gpgrt_cookie_read_function_t
Packit fc043f
#define es_cookie_write_function_t gpgrt_cookie_read_function_t
Packit fc043f
#define es_cookie_seek_function_t  gpgrt_cookie_read_function_t
Packit fc043f
#define es_cookie_close_function_t gpgrt_cookie_read_function_t
Packit fc043f
#endif
Packit fc043f
Packit fc043f
enum gpgrt_syshd_types
Packit fc043f
  {
Packit fc043f
    GPGRT_SYSHD_NONE = 0,  /* No system handle available.                   */
Packit fc043f
    GPGRT_SYSHD_FD = 1,    /* A file descriptor as returned by open().      */
Packit fc043f
    GPGRT_SYSHD_SOCK = 2,  /* A socket as returned by socket().             */
Packit fc043f
    GPGRT_SYSHD_RVID = 3,  /* A rendezvous id (see libassuan's gpgcedev.c).  */
Packit fc043f
    GPGRT_SYSHD_HANDLE = 4 /* A HANDLE object (Windows).                    */
Packit fc043f
  };
Packit fc043f
Packit fc043f
struct _gpgrt_syshd
Packit fc043f
{
Packit fc043f
  enum gpgrt_syshd_types type;
Packit fc043f
  union {
Packit fc043f
    int fd;
Packit fc043f
    int sock;
Packit fc043f
    int rvid;
Packit fc043f
    void *handle;
Packit fc043f
  } u;
Packit fc043f
};
Packit fc043f
typedef struct _gpgrt_syshd gpgrt_syshd_t;
Packit fc043f
#ifdef GPGRT_ENABLE_ES_MACROS
Packit fc043f
typedef struct _gpgrt_syshd es_syshd_t;
Packit fc043f
#define ES_SYSHD_NONE   GPGRT_SYSHD_NONE
Packit fc043f
#define ES_SYSHD_FD     GPGRT_SYSHD_FD
Packit fc043f
#define ES_SYSHD_SOCK   GPGRT_SYSHD_SOCK
Packit fc043f
#define ES_SYSHD_RVID   GPGRT_SYSHD_RVID
Packit fc043f
#define ES_SYSHD_HANDLE GPGRT_SYSHD_HANDLE
Packit fc043f
#endif
Packit fc043f
Packit fc043f
/* The object used with gpgrt_poll.  */
Packit fc043f
struct _gpgrt_poll_s
Packit fc043f
{
Packit fc043f
  gpgrt_stream_t stream;
Packit fc043f
  unsigned int want_read:1;
Packit fc043f
  unsigned int want_write:1;
Packit fc043f
  unsigned int want_oob:1;
Packit fc043f
  unsigned int want_rdhup:1;
Packit fc043f
  unsigned int _reserv1:4;
Packit fc043f
  unsigned int got_read:1;
Packit fc043f
  unsigned int got_write:1;
Packit fc043f
  unsigned int got_oob:1;
Packit fc043f
  unsigned int got_rdhup:1;
Packit fc043f
  unsigned int _reserv2:4;
Packit fc043f
  unsigned int got_err:1;
Packit fc043f
  unsigned int got_hup:1;
Packit fc043f
  unsigned int got_nval:1;
Packit fc043f
  unsigned int _reserv3:4;
Packit fc043f
  unsigned int ignore:1;
Packit fc043f
  unsigned int user:8;       /* For application use.  */
Packit fc043f
};
Packit fc043f
typedef struct _gpgrt_poll_s gpgrt_poll_t;
Packit fc043f
#ifdef GPGRT_ENABLE_ES_MACROS
Packit fc043f
typedef struct _gpgrt_poll_s es_poll_t;
Packit fc043f
#endif
Packit fc043f
Packit fc043f
gpgrt_stream_t gpgrt_fopen (const char *_GPGRT__RESTRICT path,
Packit fc043f
                            const char *_GPGRT__RESTRICT mode);
Packit fc043f
gpgrt_stream_t gpgrt_mopen (void *_GPGRT__RESTRICT data,
Packit fc043f
                            size_t data_n, size_t data_len,
Packit fc043f
                            unsigned int grow,
Packit fc043f
                            void *(*func_realloc) (void *mem, size_t size),
Packit fc043f
                            void (*func_free) (void *mem),
Packit fc043f
                            const char *_GPGRT__RESTRICT mode);
Packit fc043f
gpgrt_stream_t gpgrt_fopenmem (size_t memlimit,
Packit fc043f
                               const char *_GPGRT__RESTRICT mode);
Packit fc043f
gpgrt_stream_t gpgrt_fopenmem_init (size_t memlimit,
Packit fc043f
                                    const char *_GPGRT__RESTRICT mode,
Packit fc043f
                                    const void *data, size_t datalen);
Packit fc043f
gpgrt_stream_t gpgrt_fdopen    (int filedes, const char *mode);
Packit fc043f
gpgrt_stream_t gpgrt_fdopen_nc (int filedes, const char *mode);
Packit fc043f
gpgrt_stream_t gpgrt_sysopen    (gpgrt_syshd_t *syshd, const char *mode);
Packit fc043f
gpgrt_stream_t gpgrt_sysopen_nc (gpgrt_syshd_t *syshd, const char *mode);
Packit fc043f
gpgrt_stream_t gpgrt_fpopen    (FILE *fp, const char *mode);
Packit fc043f
gpgrt_stream_t gpgrt_fpopen_nc (FILE *fp, const char *mode);
Packit fc043f
gpgrt_stream_t gpgrt_freopen (const char *_GPGRT__RESTRICT path,
Packit fc043f
                              const char *_GPGRT__RESTRICT mode,
Packit fc043f
                              gpgrt_stream_t _GPGRT__RESTRICT stream);
Packit fc043f
gpgrt_stream_t gpgrt_fopencookie (void *_GPGRT__RESTRICT cookie,
Packit fc043f
                                  const char *_GPGRT__RESTRICT mode,
Packit fc043f
                                  gpgrt_cookie_io_functions_t functions);
Packit fc043f
int gpgrt_fclose (gpgrt_stream_t stream);
Packit fc043f
int gpgrt_fclose_snatch (gpgrt_stream_t stream,
Packit fc043f
                         void **r_buffer, size_t *r_buflen);
Packit fc043f
int gpgrt_onclose (gpgrt_stream_t stream, int mode,
Packit fc043f
                   void (*fnc) (gpgrt_stream_t, void*), void *fnc_value);
Packit fc043f
int gpgrt_fileno (gpgrt_stream_t stream);
Packit fc043f
int gpgrt_fileno_unlocked (gpgrt_stream_t stream);
Packit fc043f
int gpgrt_syshd (gpgrt_stream_t stream, gpgrt_syshd_t *syshd);
Packit fc043f
int gpgrt_syshd_unlocked (gpgrt_stream_t stream, gpgrt_syshd_t *syshd);
Packit fc043f
Packit fc043f
void _gpgrt_set_std_fd (int no, int fd);
Packit fc043f
gpgrt_stream_t _gpgrt_get_std_stream (int fd);
Packit fc043f
Packit fc043f
#define gpgrt_stdin  _gpgrt_get_std_stream (0)
Packit fc043f
#define gpgrt_stdout _gpgrt_get_std_stream (1)
Packit fc043f
#define gpgrt_stderr _gpgrt_get_std_stream (2)
Packit fc043f
Packit fc043f
Packit fc043f
void gpgrt_flockfile (gpgrt_stream_t stream);
Packit fc043f
int  gpgrt_ftrylockfile (gpgrt_stream_t stream);
Packit fc043f
void gpgrt_funlockfile (gpgrt_stream_t stream);
Packit fc043f
Packit fc043f
int gpgrt_feof (gpgrt_stream_t stream);
Packit fc043f
int gpgrt_feof_unlocked (gpgrt_stream_t stream);
Packit fc043f
int gpgrt_ferror (gpgrt_stream_t stream);
Packit fc043f
int gpgrt_ferror_unlocked (gpgrt_stream_t stream);
Packit fc043f
void gpgrt_clearerr (gpgrt_stream_t stream);
Packit fc043f
void gpgrt_clearerr_unlocked (gpgrt_stream_t stream);
Packit fc043f
Packit fc043f
int _gpgrt_pending (gpgrt_stream_t stream);          /* (private) */
Packit fc043f
int _gpgrt_pending_unlocked (gpgrt_stream_t stream); /* (private) */
Packit fc043f
Packit fc043f
#define gpgrt_pending(stream) _gpgrt_pending (stream)
Packit fc043f
Packit fc043f
#define gpgrt_pending_unlocked(stream)				\
Packit fc043f
  (((!(stream)->flags.writing)					\
Packit fc043f
    && (((stream)->data_offset < (stream)->data_len)		\
Packit fc043f
        || ((stream)->unread_data_len)))                        \
Packit fc043f
   ? 1 : _gpgrt_pending_unlocked ((stream)))
Packit fc043f
Packit fc043f
int gpgrt_fflush (gpgrt_stream_t stream);
Packit fc043f
int gpgrt_fseek (gpgrt_stream_t stream, long int offset, int whence);
Packit fc043f
int gpgrt_fseeko (gpgrt_stream_t stream, gpgrt_off_t offset, int whence);
Packit fc043f
long int gpgrt_ftell (gpgrt_stream_t stream);
Packit fc043f
gpgrt_off_t gpgrt_ftello (gpgrt_stream_t stream);
Packit fc043f
void gpgrt_rewind (gpgrt_stream_t stream);
Packit fc043f
Packit fc043f
int gpgrt_fgetc (gpgrt_stream_t stream);
Packit fc043f
int gpgrt_fputc (int c, gpgrt_stream_t stream);
Packit fc043f
Packit fc043f
int _gpgrt_getc_underflow (gpgrt_stream_t stream);       /* (private) */
Packit fc043f
int _gpgrt_putc_overflow (int c, gpgrt_stream_t stream); /* (private) */
Packit fc043f
Packit fc043f
#define gpgrt_getc_unlocked(stream)				\
Packit fc043f
  (((!(stream)->flags.writing)					\
Packit fc043f
    && ((stream)->data_offset < (stream)->data_len)		\
Packit fc043f
    && (! (stream)->unread_data_len))				\
Packit fc043f
  ? ((int) (stream)->buffer[((stream)->data_offset)++])		\
Packit fc043f
  : _gpgrt_getc_underflow ((stream)))
Packit fc043f
Packit fc043f
#define gpgrt_putc_unlocked(c, stream)				\
Packit fc043f
  (((stream)->flags.writing					\
Packit fc043f
    && ((stream)->data_offset < (stream)->buffer_size)		\
Packit fc043f
    && (c != '\n'))						\
Packit fc043f
  ? ((int) ((stream)->buffer[((stream)->data_offset)++] = (c)))	\
Packit fc043f
  : _gpgrt_putc_overflow ((c), (stream)))
Packit fc043f
Packit fc043f
#define gpgrt_getc(stream)    gpgrt_fgetc (stream)
Packit fc043f
#define gpgrt_putc(c, stream) gpgrt_fputc (c, stream)
Packit fc043f
Packit fc043f
int gpgrt_ungetc (int c, gpgrt_stream_t stream);
Packit fc043f
Packit fc043f
int gpgrt_read (gpgrt_stream_t _GPGRT__RESTRICT stream,
Packit fc043f
                void *_GPGRT__RESTRICT buffer, size_t bytes_to_read,
Packit fc043f
                size_t *_GPGRT__RESTRICT bytes_read);
Packit fc043f
int gpgrt_write (gpgrt_stream_t _GPGRT__RESTRICT stream,
Packit fc043f
                 const void *_GPGRT__RESTRICT buffer, size_t bytes_to_write,
Packit fc043f
                 size_t *_GPGRT__RESTRICT bytes_written);
Packit fc043f
int gpgrt_write_sanitized (gpgrt_stream_t _GPGRT__RESTRICT stream,
Packit fc043f
                           const void *_GPGRT__RESTRICT buffer, size_t length,
Packit fc043f
                           const char *delimiters,
Packit fc043f
                           size_t *_GPGRT__RESTRICT bytes_written);
Packit fc043f
int gpgrt_write_hexstring (gpgrt_stream_t _GPGRT__RESTRICT stream,
Packit fc043f
                           const void *_GPGRT__RESTRICT buffer, size_t length,
Packit fc043f
                           int reserved,
Packit fc043f
                           size_t *_GPGRT__RESTRICT bytes_written);
Packit fc043f
Packit fc043f
size_t gpgrt_fread (void *_GPGRT__RESTRICT ptr, size_t size, size_t nitems,
Packit fc043f
                    gpgrt_stream_t _GPGRT__RESTRICT stream);
Packit fc043f
size_t gpgrt_fwrite (const void *_GPGRT__RESTRICT ptr, size_t size, size_t memb,
Packit fc043f
                     gpgrt_stream_t _GPGRT__RESTRICT stream);
Packit fc043f
Packit fc043f
char *gpgrt_fgets (char *_GPGRT__RESTRICT s, int n,
Packit fc043f
                   gpgrt_stream_t _GPGRT__RESTRICT stream);
Packit fc043f
int gpgrt_fputs (const char *_GPGRT__RESTRICT s,
Packit fc043f
                 gpgrt_stream_t _GPGRT__RESTRICT stream);
Packit fc043f
int gpgrt_fputs_unlocked (const char *_GPGRT__RESTRICT s,
Packit fc043f
                          gpgrt_stream_t _GPGRT__RESTRICT stream);
Packit fc043f
Packit fc043f
@api_ssize_t@ gpgrt_getline (char *_GPGRT__RESTRICT *_GPGRT__RESTRICT lineptr,
Packit fc043f
                       size_t *_GPGRT__RESTRICT n,
Packit fc043f
                       gpgrt_stream_t stream);
Packit fc043f
@api_ssize_t@ gpgrt_read_line (gpgrt_stream_t stream,
Packit fc043f
                         char **addr_of_buffer, size_t *length_of_buffer,
Packit fc043f
                         size_t *max_length);
Packit fc043f
Packit fc043f
int gpgrt_fprintf (gpgrt_stream_t _GPGRT__RESTRICT stream,
Packit fc043f
                   const char *_GPGRT__RESTRICT format, ...)
Packit fc043f
                   GPGRT_ATTR_PRINTF(2,3);
Packit fc043f
int gpgrt_fprintf_unlocked (gpgrt_stream_t _GPGRT__RESTRICT stream,
Packit fc043f
                            const char *_GPGRT__RESTRICT format, ...)
Packit fc043f
                            GPGRT_ATTR_PRINTF(2,3);
Packit fc043f
Packit fc043f
int gpgrt_printf (const char *_GPGRT__RESTRICT format, ...)
Packit fc043f
                  GPGRT_ATTR_PRINTF(1,2);
Packit fc043f
int gpgrt_printf_unlocked (const char *_GPGRT__RESTRICT format, ...)
Packit fc043f
                           GPGRT_ATTR_PRINTF(1,2);
Packit fc043f
Packit fc043f
int gpgrt_vfprintf (gpgrt_stream_t _GPGRT__RESTRICT stream,
Packit fc043f
                    const char *_GPGRT__RESTRICT format, va_list ap)
Packit fc043f
                    GPGRT_ATTR_PRINTF(2,0);
Packit fc043f
int gpgrt_vfprintf_unlocked (gpgrt_stream_t _GPGRT__RESTRICT stream,
Packit fc043f
                             const char *_GPGRT__RESTRICT format, va_list ap)
Packit fc043f
                             GPGRT_ATTR_PRINTF(2,0);
Packit fc043f
Packit fc043f
int gpgrt_setvbuf (gpgrt_stream_t _GPGRT__RESTRICT stream,
Packit fc043f
                   char *_GPGRT__RESTRICT buf, int mode, size_t size);
Packit fc043f
void gpgrt_setbuf (gpgrt_stream_t _GPGRT__RESTRICT stream,
Packit fc043f
                   char *_GPGRT__RESTRICT buf);
Packit fc043f
Packit fc043f
void gpgrt_set_binary (gpgrt_stream_t stream);
Packit fc043f
int  gpgrt_set_nonblock (gpgrt_stream_t stream, int onoff);
Packit fc043f
int  gpgrt_get_nonblock (gpgrt_stream_t stream);
Packit fc043f
Packit fc043f
int gpgrt_poll (gpgrt_poll_t *fdlist, unsigned int nfds, int timeout);
Packit fc043f
Packit fc043f
gpgrt_stream_t gpgrt_tmpfile (void);
Packit fc043f
Packit fc043f
void gpgrt_opaque_set (gpgrt_stream_t _GPGRT__RESTRICT stream,
Packit fc043f
                       void *_GPGRT__RESTRICT opaque);
Packit fc043f
void *gpgrt_opaque_get (gpgrt_stream_t stream);
Packit fc043f
Packit fc043f
void gpgrt_fname_set (gpgrt_stream_t stream, const char *fname);
Packit fc043f
const char *gpgrt_fname_get (gpgrt_stream_t stream);
Packit fc043f
Packit fc043f
int gpgrt_asprintf (char **r_buf, const char * _GPGRT__RESTRICT format, ...)
Packit fc043f
                    GPGRT_ATTR_PRINTF(2,3);
Packit fc043f
int gpgrt_vasprintf (char **r_buf, const char * _GPGRT__RESTRICT format,
Packit fc043f
                     va_list ap)
Packit fc043f
                     GPGRT_ATTR_PRINTF(2,0);
Packit fc043f
char *gpgrt_bsprintf (const char * _GPGRT__RESTRICT format, ...)
Packit fc043f
                      GPGRT_ATTR_PRINTF(1,2);
Packit fc043f
char *gpgrt_vbsprintf (const char * _GPGRT__RESTRICT format, va_list ap)
Packit fc043f
                       GPGRT_ATTR_PRINTF(1,0);
Packit fc043f
int gpgrt_snprintf (char *buf, size_t bufsize,
Packit fc043f
                    const char * _GPGRT__RESTRICT format, ...)
Packit fc043f
                    GPGRT_ATTR_PRINTF(3,4);
Packit fc043f
int gpgrt_vsnprintf (char *buf,size_t bufsize,
Packit fc043f
                     const char * _GPGRT__RESTRICT format, va_list arg_ptr)
Packit fc043f
                     GPGRT_ATTR_PRINTF(3,0);
Packit fc043f
Packit fc043f
Packit fc043f
#ifdef GPGRT_ENABLE_ES_MACROS
Packit fc043f
# define es_fopen             gpgrt_fopen
Packit fc043f
# define es_mopen             gpgrt_mopen
Packit fc043f
# define es_fopenmem          gpgrt_fopenmem
Packit fc043f
# define es_fopenmem_init     gpgrt_fopenmem_init
Packit fc043f
# define es_fdopen            gpgrt_fdopen
Packit fc043f
# define es_fdopen_nc         gpgrt_fdopen_nc
Packit fc043f
# define es_sysopen           gpgrt_sysopen
Packit fc043f
# define es_sysopen_nc        gpgrt_sysopen_nc
Packit fc043f
# define es_fpopen            gpgrt_fpopen
Packit fc043f
# define es_fpopen_nc         gpgrt_fpopen_nc
Packit fc043f
# define es_freopen           gpgrt_freopen
Packit fc043f
# define es_fopencookie       gpgrt_fopencookie
Packit fc043f
# define es_fclose            gpgrt_fclose
Packit fc043f
# define es_fclose_snatch     gpgrt_fclose_snatch
Packit fc043f
# define es_onclose           gpgrt_onclose
Packit fc043f
# define es_fileno            gpgrt_fileno
Packit fc043f
# define es_fileno_unlocked   gpgrt_fileno_unlocked
Packit fc043f
# define es_syshd             gpgrt_syshd
Packit fc043f
# define es_syshd_unlocked    gpgrt_syshd_unlocked
Packit fc043f
# define es_stdin             _gpgrt_get_std_stream (0)
Packit fc043f
# define es_stdout            _gpgrt_get_std_stream (1)
Packit fc043f
# define es_stderr            _gpgrt_get_std_stream (2)
Packit fc043f
# define es_flockfile         gpgrt_flockfile
Packit fc043f
# define es_ftrylockfile      gpgrt_ftrylockfile
Packit fc043f
# define es_funlockfile       gpgrt_funlockfile
Packit fc043f
# define es_feof              gpgrt_feof
Packit fc043f
# define es_feof_unlocked     gpgrt_feof_unlocked
Packit fc043f
# define es_ferror            gpgrt_ferror
Packit fc043f
# define es_ferror_unlocked   gpgrt_ferror_unlocked
Packit fc043f
# define es_clearerr          gpgrt_clearerr
Packit fc043f
# define es_clearerr_unlocked gpgrt_clearerr_unlocked
Packit fc043f
# define es_pending           gpgrt_pending
Packit fc043f
# define es_pending_unlocked  gpgrt_pending_unlocked
Packit fc043f
# define es_fflush            gpgrt_fflush
Packit fc043f
# define es_fseek             gpgrt_fseek
Packit fc043f
# define es_fseeko            gpgrt_fseeko
Packit fc043f
# define es_ftell             gpgrt_ftell
Packit fc043f
# define es_ftello            gpgrt_ftello
Packit fc043f
# define es_rewind            gpgrt_rewind
Packit fc043f
# define es_fgetc             gpgrt_fgetc
Packit fc043f
# define es_fputc             gpgrt_fputc
Packit fc043f
# define es_getc_unlocked     gpgrt_getc_unlocked
Packit fc043f
# define es_putc_unlocked     gpgrt_putc_unlocked
Packit fc043f
# define es_getc              gpgrt_getc
Packit fc043f
# define es_putc              gpgrt_putc
Packit fc043f
# define es_ungetc            gpgrt_ungetc
Packit fc043f
# define es_read              gpgrt_read
Packit fc043f
# define es_write             gpgrt_write
Packit fc043f
# define es_write_sanitized   gpgrt_write_sanitized
Packit fc043f
# define es_write_hexstring   gpgrt_write_hexstring
Packit fc043f
# define es_fread             gpgrt_fread
Packit fc043f
# define es_fwrite            gpgrt_fwrite
Packit fc043f
# define es_fgets             gpgrt_fgets
Packit fc043f
# define es_fputs             gpgrt_fputs
Packit fc043f
# define es_fputs_unlocked    gpgrt_fputs_unlocked
Packit fc043f
# define es_getline           gpgrt_getline
Packit fc043f
# define es_read_line         gpgrt_read_line
Packit fc043f
# define es_free              gpgrt_free
Packit fc043f
# define es_fprintf           gpgrt_fprintf
Packit fc043f
# define es_fprintf_unlocked  gpgrt_fprintf_unlocked
Packit fc043f
# define es_printf            gpgrt_printf
Packit fc043f
# define es_printf_unlocked   gpgrt_printf_unlocked
Packit fc043f
# define es_vfprintf          gpgrt_vfprintf
Packit fc043f
# define es_vfprintf_unlocked gpgrt_vfprintf_unlocked
Packit fc043f
# define es_setvbuf           gpgrt_setvbuf
Packit fc043f
# define es_setbuf            gpgrt_setbuf
Packit fc043f
# define es_set_binary        gpgrt_set_binary
Packit fc043f
# define es_set_nonblock      gpgrt_set_nonblock
Packit fc043f
# define es_get_nonblock      gpgrt_get_nonblock
Packit fc043f
# define es_poll              gpgrt_poll
Packit fc043f
# define es_tmpfile           gpgrt_tmpfile
Packit fc043f
# define es_opaque_set        gpgrt_opaque_set
Packit fc043f
# define es_opaque_get        gpgrt_opaque_get
Packit fc043f
# define es_fname_set         gpgrt_fname_set
Packit fc043f
# define es_fname_get         gpgrt_fname_get
Packit fc043f
# define es_asprintf          gpgrt_asprintf
Packit fc043f
# define es_vasprintf         gpgrt_vasprintf
Packit fc043f
# define es_bsprintf          gpgrt_bsprintf
Packit fc043f
# define es_vbsprintf         gpgrt_vbsprintf
Packit fc043f
#endif /*GPGRT_ENABLE_ES_MACROS*/
Packit fc043f
Packit fc043f
Packit fc043f

Packit fc043f
/*
Packit fc043f
 * Base64 encode and decode functions.
Packit fc043f
 */
Packit fc043f
Packit fc043f
struct _gpgrt_b64state;
Packit fc043f
typedef struct _gpgrt_b64state *gpgrt_b64state_t;
Packit fc043f
Packit fc043f
gpgrt_b64state_t gpgrt_b64enc_start (gpgrt_stream_t stream, const char *title);
Packit fc043f
gpg_err_code_t   gpgrt_b64enc_write (gpgrt_b64state_t state,
Packit fc043f
                                     const void *buffer, size_t nbytes);
Packit fc043f
gpg_err_code_t   gpgrt_b64enc_finish (gpgrt_b64state_t state);
Packit fc043f
Packit fc043f
gpgrt_b64state_t gpgrt_b64dec_start (const char *title);
Packit fc043f
gpg_error_t      gpgrt_b64dec_proc (gpgrt_b64state_t state,
Packit fc043f
                                    void *buffer, size_t length,
Packit fc043f
                                    size_t *r_nbytes);
Packit fc043f
gpg_error_t      gpgrt_b64dec_finish (gpgrt_b64state_t state);
Packit fc043f
Packit fc043f
Packit fc043f

Packit fc043f
/*
Packit fc043f
 * Logging functions
Packit fc043f
 */
Packit fc043f
Packit fc043f
/* Flag values for gpgrt_log_set_prefix. */
Packit fc043f
#define GPGRT_LOG_WITH_PREFIX  1
Packit fc043f
#define GPGRT_LOG_WITH_TIME    2
Packit fc043f
#define GPGRT_LOG_WITH_PID     4
Packit fc043f
#define GPGRT_LOG_RUN_DETACHED 256
Packit fc043f
#define GPGRT_LOG_NO_REGISTRY  512
Packit fc043f
Packit fc043f
/* Log levels as used by gpgrt_log.  */
Packit fc043f
enum gpgrt_log_levels
Packit fc043f
  {
Packit fc043f
    GPGRT_LOGLVL_BEGIN,
Packit fc043f
    GPGRT_LOGLVL_CONT,
Packit fc043f
    GPGRT_LOGLVL_INFO,
Packit fc043f
    GPGRT_LOGLVL_WARN,
Packit fc043f
    GPGRT_LOGLVL_ERROR,
Packit fc043f
    GPGRT_LOGLVL_FATAL,
Packit fc043f
    GPGRT_LOGLVL_BUG,
Packit fc043f
    GPGRT_LOGLVL_DEBUG
Packit fc043f
  };
Packit fc043f
Packit fc043f
Packit fc043f
/* The next 4 functions are not thread-safe - call them early.  */
Packit fc043f
void gpgrt_log_set_sink (const char *name, gpgrt_stream_t stream, int fd);
Packit fc043f
void gpgrt_log_set_socket_dir_cb (const char *(*fnc)(void));
Packit fc043f
void gpgrt_log_set_pid_suffix_cb (int (*cb)(unsigned long *r_value));
Packit fc043f
void gpgrt_log_set_prefix (const char *text, unsigned int flags);
Packit fc043f
Packit fc043f
int  gpgrt_get_errorcount (int clear);
Packit fc043f
void gpgrt_inc_errorcount (void);
Packit fc043f
const char *gpgrt_log_get_prefix (unsigned int *flags);
Packit fc043f
int  gpgrt_log_test_fd (int fd);
Packit fc043f
int  gpgrt_log_get_fd (void);
Packit fc043f
gpgrt_stream_t gpgrt_log_get_stream (void);
Packit fc043f
Packit fc043f
void gpgrt_log (int level, const char *fmt, ...) GPGRT_ATTR_PRINTF(2,3);
Packit fc043f
void gpgrt_logv (int level, const char *fmt, va_list arg_ptr);
Packit fc043f
void gpgrt_logv_prefix (int level, const char *prefix,
Packit fc043f
                              const char *fmt, va_list arg_ptr);
Packit fc043f
void gpgrt_log_string (int level, const char *string);
Packit fc043f
void gpgrt_log_bug (const char *fmt, ...)    GPGRT_ATTR_NR_PRINTF(1,2);
Packit fc043f
void gpgrt_log_fatal (const char *fmt, ...)  GPGRT_ATTR_NR_PRINTF(1,2);
Packit fc043f
void gpgrt_log_error (const char *fmt, ...)  GPGRT_ATTR_PRINTF(1,2);
Packit fc043f
void gpgrt_log_info (const char *fmt, ...)   GPGRT_ATTR_PRINTF(1,2);
Packit fc043f
void gpgrt_log_debug (const char *fmt, ...)  GPGRT_ATTR_PRINTF(1,2);
Packit fc043f
void gpgrt_log_debug_string (const char *string,
Packit fc043f
                             const char *fmt, ...) GPGRT_ATTR_PRINTF(2,3);
Packit fc043f
void gpgrt_log_printf (const char *fmt, ...) GPGRT_ATTR_PRINTF(1,2);
Packit fc043f
void gpgrt_log_printhex (const void *buffer, size_t length,
Packit fc043f
                         const char *fmt, ...) GPGRT_ATTR_PRINTF(3,4);
Packit fc043f
void gpgrt_log_clock (const char *fmt, ...) GPGRT_ATTR_PRINTF(1,2);
Packit fc043f
void gpgrt_log_flush (void);
Packit fc043f
void _gpgrt_log_assert (const char *expr, const char *file, int line,
Packit fc043f
                        const char *func) GPGRT_ATTR_NORETURN;
Packit fc043f
Packit fc043f
#ifdef GPGRT_HAVE_MACRO_FUNCTION
Packit fc043f
# define gpgrt_assert(expr)                                     \
Packit fc043f
  ((expr)                                                       \
Packit fc043f
   ? (void) 0                                                   \
Packit fc043f
   : _gpgrt_log_assert (#expr, __FILE__, __LINE__, __FUNCTION__))
Packit fc043f
#else /*!GPGRT_HAVE_MACRO_FUNCTION*/
Packit fc043f
# define gpgrt_assert(expr)                                     \
Packit fc043f
  ((expr)                                                       \
Packit fc043f
   ? (void) 0                                                   \
Packit fc043f
   : _gpgrt_log_assert (#expr, __FILE__, __LINE__, NULL))
Packit fc043f
#endif /*!GPGRT_HAVE_MACRO_FUNCTION*/
Packit fc043f
Packit fc043f
#ifdef GPGRT_ENABLE_LOG_MACROS
Packit fc043f
# define log_get_errorcount      gpgrt_get_errorcount
Packit fc043f
# define log_inc_errorcount      gpgrt_inc_errorcount
Packit fc043f
# define log_set_file(a)         gpgrt_log_set_sink ((a), NULL, -1)
Packit fc043f
# define log_set_fd(a)           gpgrt_log_set_sink (NULL, NULL, (a))
Packit fc043f
# define log_set_stream(a)       gpgrt_log_set_sink (NULL, (a), -1)
Packit fc043f
# define log_set_socket_dir_cb   gpgrt_log_set_socket_dir_cb
Packit fc043f
# define log_set_pid_suffix_cb   gpgrt_log_set_pid_suffix_cb
Packit fc043f
# define log_set_prefix          gpgrt_log_set_prefix
Packit fc043f
# define log_get_prefix          gpgrt_log_get_prefix
Packit fc043f
# define log_test_fd             gpgrt_log_test_fd
Packit fc043f
# define log_get_fd              gpgrt_log_get_fd
Packit fc043f
# define log_get_stream          gpgrt_log_get_stream
Packit fc043f
# define log_log                 gpgrt_log
Packit fc043f
# define log_logv                gpgrt_logv
Packit fc043f
# define log_logv_prefix         gpgrt_logv_prefix
Packit fc043f
# define log_string              gpgrt_log_string
Packit fc043f
# define log_bug                 gpgrt_log_bug
Packit fc043f
# define log_fatal               gpgrt_log_fatal
Packit fc043f
# define log_error               gpgrt_log_error
Packit fc043f
# define log_info                gpgrt_log_info
Packit fc043f
# define log_debug               gpgrt_log_debug
Packit fc043f
# define log_debug_string        gpgrt_log_debug_string
Packit fc043f
# define log_printf              gpgrt_log_printf
Packit fc043f
# define log_printhex            gpgrt_log_printhex
Packit fc043f
# define log_clock               gpgrt_log_clock
Packit fc043f
# define log_flush               gpgrt_log_flush
Packit fc043f
# ifdef GPGRT_HAVE_MACRO_FUNCTION
Packit fc043f
#  define log_assert(expr)                                      \
Packit fc043f
  ((expr)                                                       \
Packit fc043f
   ? (void) 0                                                   \
Packit fc043f
   : _gpgrt_log_assert (#expr, __FILE__, __LINE__, __FUNCTION__))
Packit fc043f
# else /*!GPGRT_HAVE_MACRO_FUNCTION*/
Packit fc043f
#  define log_assert(expr)                                      \
Packit fc043f
  ((expr)                                                       \
Packit fc043f
   ? (void) 0                                                   \
Packit fc043f
   : _gpgrt_log_assert (#expr, __FILE__, __LINE__, NULL))
Packit fc043f
# endif /*!GPGRT_HAVE_MACRO_FUNCTION*/
Packit fc043f
Packit fc043f
#endif /*GPGRT_ENABLE_LOG_MACROS*/
Packit fc043f
Packit fc043f

Packit fc043f
/*
Packit fc043f
 * Spawn functions  (Not yet available)
Packit fc043f
 */
Packit fc043f
#define GPGRT_SPAWN_NONBLOCK   16 /* Set the streams to non-blocking.      */
Packit fc043f
#define GPGRT_SPAWN_RUN_ASFW   64 /* Use AllowSetForegroundWindow on W32.  */
Packit fc043f
#define GPGRT_SPAWN_DETACHED  128 /* Start the process in the background.  */
Packit fc043f
Packit fc043f
#if 0
Packit fc043f
Packit fc043f
/* Function and convenience macros to create pipes.  */
Packit fc043f
gpg_err_code_t gpgrt_make_pipe (int filedes[2], gpgrt_stream_t *r_fp,
Packit fc043f
                                int direction, int nonblock);
Packit fc043f
#define gpgrt_create_pipe(a)              gpgrt_make_pipe ((a),NULL,  0,  0);
Packit fc043f
#define gpgrt_create_inbound_pipe(a,b,c)  gpgrt_make_pipe ((a), (b), -1,(c));
Packit fc043f
#define gpgrt_create_outbound_pipe(a,b,c) gpgrt_make_pipe ((a), (b),  1,(c));
Packit fc043f
Packit fc043f
Packit fc043f
/* Fork and exec PGMNAME.  */
Packit fc043f
gpg_err_code_t gpgrt_spawn_process (const char *pgmname, const char *argv[],
Packit fc043f
                                    int *execpt, void (*preexec)(void),
Packit fc043f
                                    unsigned int flags,
Packit fc043f
                                    gpgrt_stream_t *r_infp,
Packit fc043f
                                    gpgrt_stream_t *r_outfp,
Packit fc043f
                                    gpgrt_stream_t *r_errfp,
Packit fc043f
                                    pid_t *pid);
Packit fc043f
Packit fc043f
/* Fork and exec PGNNAME and connect the process to the given FDs.  */
Packit fc043f
gpg_err_code_t gpgrt_spawn_process_fd (const char *pgmname, const char *argv[],
Packit fc043f
                                       int infd, int outfd, int errfd,
Packit fc043f
                                       pid_t *pid);
Packit fc043f
Packit fc043f
/* Fork and exec PGMNAME as a detached process.  */
Packit fc043f
gpg_err_code_t gpgrt_spawn_process_detached (const char *pgmname,
Packit fc043f
                                             const char *argv[],
Packit fc043f
                                             const char *envp[] );
Packit fc043f
Packit fc043f
/* Wait for a single process.  */
Packit fc043f
gpg_err_code_t gpgrt_wait_process (const char *pgmname, pid_t pid, int hang,
Packit fc043f
                                int *r_exitcode);
Packit fc043f
Packit fc043f
/* Wait for a multiple processes.  */
Packit fc043f
gpg_err_code_t gpgrt_wait_processes (const char **pgmnames, pid_t *pids,
Packit fc043f
                                     size_t count, int hang, int *r_exitcodes);
Packit fc043f
Packit fc043f
/* Kill the process identified by PID.  */
Packit fc043f
void gpgrt_kill_process (pid_t pid);
Packit fc043f
Packit fc043f
/* Release process resources identified by PID.  */
Packit fc043f
void gpgrt_release_process (pid_t pid);
Packit fc043f
Packit fc043f
#endif /*0*/
Packit fc043f
Packit fc043f
Packit fc043f

Packit fc043f
/*
Packit fc043f
 * Option parsing.
Packit fc043f
 */
Packit fc043f
Packit fc043f
struct _gpgrt_argparse_internal_s;
Packit fc043f
typedef struct
Packit fc043f
{
Packit fc043f
  int  *argc;	      /* Pointer to ARGC (value subject to change). */
Packit fc043f
  char ***argv;	      /* Pointer to ARGV (value subject to change). */
Packit fc043f
  unsigned int flags; /* Global flags.  May be set prior to calling the
Packit fc043f
                         parser.  The parser may change the value.  */
Packit fc043f
  int err;            /* Print error description for last option.
Packit fc043f
                         Either 0,  ARGPARSE_PRINT_WARNING or
Packit fc043f
                         ARGPARSE_PRINT_ERROR.  */
Packit fc043f
  unsigned int lineno;/* The current line number.  */
Packit fc043f
  int r_opt; 	      /* Returns option code. */
Packit fc043f
  int r_type;	      /* Returns type of option value.  */
Packit fc043f
  union {
Packit fc043f
    int   ret_int;
Packit fc043f
    long  ret_long;
Packit fc043f
    unsigned long ret_ulong;
Packit fc043f
    char *ret_str;
Packit fc043f
  } r;		      /* Return values */
Packit fc043f
Packit fc043f
  struct _gpgrt_argparse_internal_s *internal;
Packit fc043f
} gpgrt_argparse_t;
Packit fc043f
Packit fc043f
Packit fc043f
typedef struct
Packit fc043f
{
Packit fc043f
  int          short_opt;
Packit fc043f
  const char  *long_opt;
Packit fc043f
  unsigned int flags;
Packit fc043f
  const char  *description; /* Optional description. */
Packit fc043f
} gpgrt_opt_t;
Packit fc043f
Packit fc043f
Packit fc043f
#ifdef GPGRT_ENABLE_ARGPARSE_MACROS
Packit fc043f
Packit fc043f
/* Global flags for (gpgrt_argparse_t).flags.  */
Packit fc043f
#define ARGPARSE_FLAG_KEEP        1  /* Do not remove options form argv.     */
Packit fc043f
#define ARGPARSE_FLAG_ALL         2  /* Do not stop at last option but return
Packit fc043f
                                        remaining args with R_OPT set to -1. */
Packit fc043f
#define ARGPARSE_FLAG_MIXED       4  /* Assume options and args are mixed.   */
Packit fc043f
#define ARGPARSE_FLAG_NOSTOP      8  /* Do not stop processing at "--".      */
Packit fc043f
#define ARGPARSE_FLAG_ARG0       16  /* Do not skip the first arg.           */
Packit fc043f
#define ARGPARSE_FLAG_ONEDASH    32  /* Allow long options with one dash.    */
Packit fc043f
#define ARGPARSE_FLAG_NOVERSION  64  /* No output for "--version".           */
Packit fc043f
#define ARGPARSE_FLAG_RESET     128  /* Request to reset the internal state. */
Packit fc043f
#define ARGPARSE_FLAG_STOP_SEEN 256  /* Set to true if a "--" has been seen. */
Packit fc043f
#define ARGPARSE_FLAG_NOLINENO  512  /* Do not zero the lineno field.         */
Packit fc043f
Packit fc043f
/* Constants for (gpgrt_argparse_t).err.  */
Packit fc043f
#define ARGPARSE_PRINT_WARNING  1    /* Print a diagnostic.                  */
Packit fc043f
#define ARGPARSE_PRINT_ERROR    2    /* Print a diagnostic and call exit.    */
Packit fc043f
Packit fc043f
/* Special return values of gpgrt_argparse.  */
Packit fc043f
#define ARGPARSE_IS_ARG            (-1)
Packit fc043f
#define ARGPARSE_INVALID_OPTION    (-2)
Packit fc043f
#define ARGPARSE_MISSING_ARG       (-3)
Packit fc043f
#define ARGPARSE_KEYWORD_TOO_LONG  (-4)
Packit fc043f
#define ARGPARSE_READ_ERROR        (-5)
Packit fc043f
#define ARGPARSE_UNEXPECTED_ARG    (-6)
Packit fc043f
#define ARGPARSE_INVALID_COMMAND   (-7)
Packit fc043f
#define ARGPARSE_AMBIGUOUS_OPTION  (-8)
Packit fc043f
#define ARGPARSE_AMBIGUOUS_COMMAND (-9)
Packit fc043f
#define ARGPARSE_INVALID_ALIAS     (-10)
Packit fc043f
#define ARGPARSE_OUT_OF_CORE       (-11)
Packit fc043f
#define ARGPARSE_INVALID_ARG       (-12)
Packit fc043f
Packit fc043f
/* Flags for the option descriptor (gpgrt_opt_t)->flags.  Note that
Packit fc043f
 * a TYPE constant may be or-ed with the OPT constants.  */
Packit fc043f
#define ARGPARSE_TYPE_NONE        0  /* Does not take an argument.        */
Packit fc043f
#define ARGPARSE_TYPE_INT         1  /* Takes an int argument.            */
Packit fc043f
#define ARGPARSE_TYPE_STRING      2  /* Takes a string argument.          */
Packit fc043f
#define ARGPARSE_TYPE_LONG        3  /* Takes a long argument.            */
Packit fc043f
#define ARGPARSE_TYPE_ULONG       4  /* Takes an unsigned long argument.  */
Packit fc043f
#define ARGPARSE_OPT_OPTIONAL (1<<3) /* Argument is optional.             */
Packit fc043f
#define ARGPARSE_OPT_PREFIX   (1<<4) /* Allow 0x etc. prefixed values.    */
Packit fc043f
#define ARGPARSE_OPT_IGNORE   (1<<6) /* Ignore command or option.         */
Packit fc043f
#define ARGPARSE_OPT_COMMAND  (1<<7) /* The argument is a command.        */
Packit fc043f
Packit fc043f
/* A set of macros to make option definitions easier to read.  */
Packit fc043f
#define ARGPARSE_x(s,l,t,f,d) \
Packit fc043f
     { (s), (l), ARGPARSE_TYPE_ ## t | (f), (d) }
Packit fc043f
Packit fc043f
#define ARGPARSE_s(s,l,t,d) \
Packit fc043f
     { (s), (l), ARGPARSE_TYPE_ ## t, (d) }
Packit fc043f
#define ARGPARSE_s_n(s,l,d) \
Packit fc043f
     { (s), (l), ARGPARSE_TYPE_NONE, (d) }
Packit fc043f
#define ARGPARSE_s_i(s,l,d) \
Packit fc043f
     { (s), (l), ARGPARSE_TYPE_INT, (d) }
Packit fc043f
#define ARGPARSE_s_s(s,l,d) \
Packit fc043f
     { (s), (l), ARGPARSE_TYPE_STRING, (d) }
Packit fc043f
#define ARGPARSE_s_l(s,l,d) \
Packit fc043f
     { (s), (l), ARGPARSE_TYPE_LONG, (d) }
Packit fc043f
#define ARGPARSE_s_u(s,l,d) \
Packit fc043f
     { (s), (l), ARGPARSE_TYPE_ULONG, (d) }
Packit fc043f
Packit fc043f
#define ARGPARSE_o(s,l,t,d) \
Packit fc043f
     { (s), (l), (ARGPARSE_TYPE_ ## t  | ARGPARSE_OPT_OPTIONAL), (d) }
Packit fc043f
#define ARGPARSE_o_n(s,l,d) \
Packit fc043f
     { (s), (l), (ARGPARSE_TYPE_NONE   | ARGPARSE_OPT_OPTIONAL), (d) }
Packit fc043f
#define ARGPARSE_o_i(s,l,d) \
Packit fc043f
     { (s), (l), (ARGPARSE_TYPE_INT    | ARGPARSE_OPT_OPTIONAL), (d) }
Packit fc043f
#define ARGPARSE_o_s(s,l,d) \
Packit fc043f
     { (s), (l), (ARGPARSE_TYPE_STRING | ARGPARSE_OPT_OPTIONAL), (d) }
Packit fc043f
#define ARGPARSE_o_l(s,l,d) \
Packit fc043f
     { (s), (l), (ARGPARSE_TYPE_LONG   | ARGPARSE_OPT_OPTIONAL), (d) }
Packit fc043f
#define ARGPARSE_o_u(s,l,d) \
Packit fc043f
     { (s), (l), (ARGPARSE_TYPE_ULONG  | ARGPARSE_OPT_OPTIONAL), (d) }
Packit fc043f
Packit fc043f
#define ARGPARSE_p(s,l,t,d) \
Packit fc043f
     { (s), (l), (ARGPARSE_TYPE_ ## t  | ARGPARSE_OPT_PREFIX), (d) }
Packit fc043f
#define ARGPARSE_p_n(s,l,d) \
Packit fc043f
     { (s), (l), (ARGPARSE_TYPE_NONE   | ARGPARSE_OPT_PREFIX), (d) }
Packit fc043f
#define ARGPARSE_p_i(s,l,d) \
Packit fc043f
     { (s), (l), (ARGPARSE_TYPE_INT    | ARGPARSE_OPT_PREFIX), (d) }
Packit fc043f
#define ARGPARSE_p_s(s,l,d) \
Packit fc043f
     { (s), (l), (ARGPARSE_TYPE_STRING | ARGPARSE_OPT_PREFIX), (d) }
Packit fc043f
#define ARGPARSE_p_l(s,l,d) \
Packit fc043f
     { (s), (l), (ARGPARSE_TYPE_LONG   | ARGPARSE_OPT_PREFIX), (d) }
Packit fc043f
#define ARGPARSE_p_u(s,l,d) \
Packit fc043f
     { (s), (l), (ARGPARSE_TYPE_ULONG  | ARGPARSE_OPT_PREFIX), (d) }
Packit fc043f
Packit fc043f
#define ARGPARSE_op(s,l,t,d) \
Packit fc043f
     { (s), (l), (ARGPARSE_TYPE_ ## t \
Packit fc043f
                  | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
Packit fc043f
#define ARGPARSE_op_n(s,l,d) \
Packit fc043f
     { (s), (l), (ARGPARSE_TYPE_NONE \
Packit fc043f
                  | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
Packit fc043f
#define ARGPARSE_op_i(s,l,d) \
Packit fc043f
     { (s), (l), (ARGPARSE_TYPE_INT \
Packit fc043f
                  | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
Packit fc043f
#define ARGPARSE_op_s(s,l,d) \
Packit fc043f
     { (s), (l), (ARGPARSE_TYPE_STRING \
Packit fc043f
                  | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
Packit fc043f
#define ARGPARSE_op_l(s,l,d) \
Packit fc043f
     { (s), (l), (ARGPARSE_TYPE_LONG \
Packit fc043f
                  | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
Packit fc043f
#define ARGPARSE_op_u(s,l,d) \
Packit fc043f
     { (s), (l), (ARGPARSE_TYPE_ULONG \
Packit fc043f
                  | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
Packit fc043f
Packit fc043f
#define ARGPARSE_c(s,l,d) \
Packit fc043f
     { (s), (l), (ARGPARSE_TYPE_NONE | ARGPARSE_OPT_COMMAND), (d) }
Packit fc043f
Packit fc043f
#define ARGPARSE_ignore(s,l) \
Packit fc043f
     { (s), (l), (ARGPARSE_OPT_IGNORE), "@" }
Packit fc043f
Packit fc043f
#define ARGPARSE_group(s,d) \
Packit fc043f
     { (s), NULL, 0, (d) }
Packit fc043f
Packit fc043f
/* Mark the end of the list (mandatory).  */
Packit fc043f
#define ARGPARSE_end() \
Packit fc043f
     { 0, NULL, 0, NULL }
Packit fc043f
Packit fc043f
#endif /* GPGRT_ENABLE_ARGPARSE_MACROS */
Packit fc043f
Packit fc043f
/* Take care: gpgrt_argparse keeps state in ARG and requires that
Packit fc043f
 * either ARGPARSE_FLAG_RESET is used after OPTS has been changed or
Packit fc043f
 * gpgrt_argparse (NULL, ARG, NULL) is called first.  */
Packit fc043f
int gpgrt_argparse (gpgrt_stream_t fp,
Packit fc043f
                    gpgrt_argparse_t *arg, gpgrt_opt_t *opts);
Packit fc043f
void gpgrt_usage (int level);
Packit fc043f
const char *gpgrt_strusage (int level);
Packit fc043f
void gpgrt_set_strusage (const char *(*f)(int));
Packit fc043f
void gpgrt_set_usage_outfnc (int (*f)(int, const char *));
Packit fc043f
void gpgrt_set_fixed_string_mapper (const char *(*f)(const char*));
Packit fc043f
Packit fc043f
Packit fc043f
Packit fc043f
#ifdef __cplusplus
Packit fc043f
}
Packit fc043f
#endif
Packit fc043f
#endif	/* GPGRT_H */
Packit fc043f
#endif	/* GPG_ERROR_H */