#ifndef K5_PLATFORM_H
#define K5_PLATFORM_H
#include "autoconf.h"
#include <assert.h>
#include <string.h>
#include <stdarg.h>
#include <stdint.h>
#include <limits.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#ifdef HAVE_FNMATCH_H
#include <fnmatch.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _WIN32
#define CAN_COPY_VA_LIST
#endif
#ifdef __GNUC__
#define UNUSED __attribute__((__unused__))
#else
#define UNUSED
#endif
#if defined(macintosh) || (defined(__MACH__) && defined(__APPLE__))
#include <TargetConditionals.h>
#endif
# define JOIN__2_2(A,B) A ## _ ## _ ## B
# define JOIN__2(A,B) JOIN__2_2(A,B)
#if defined(DELAY_INITIALIZER)
# include "k5-thread.h"
typedef struct { k5_once_t once; int error, did_run; void (*fn)(void); } k5_init_t;
# ifdef USE_LINKER_INIT_OPTION
# define MAYBE_DUMMY_INIT(NAME) \
void JOIN__2(NAME, auxinit) () { }
# else
# define MAYBE_DUMMY_INIT(NAME)
# endif
# ifdef __GNUC__
# define k5_call_init_function(I) \
(__extension__ ({ \
k5_init_t *k5int_i = (I); \
int k5int_err = k5_once(&k5int_i->once, k5int_i->fn); \
(k5int_err \
? k5int_err \
: (assert(k5int_i->did_run != 0), k5int_i->error)); \
}))
# define MAYBE_DEFINE_CALLINIT_FUNCTION
# else
# define MAYBE_DEFINE_CALLINIT_FUNCTION \
static inline int k5_call_init_function(k5_init_t *i) \
{ \
int err; \
err = k5_once(&i->once, i->fn); \
if (err) \
return err; \
assert (i->did_run != 0); \
return i->error; \
}
# endif
# define MAKE_INIT_FUNCTION(NAME) \
static int NAME(void); \
MAYBE_DUMMY_INIT(NAME) \
\
static void JOIN__2(NAME, aux) (void); \
static k5_init_t JOIN__2(NAME, once) = \
{ K5_ONCE_INIT, 0, 0, JOIN__2(NAME, aux) }; \
MAYBE_DEFINE_CALLINIT_FUNCTION \
static void JOIN__2(NAME, aux) (void) \
{ \
JOIN__2(NAME, once).did_run = 1; \
JOIN__2(NAME, once).error = NAME(); \
} \
\
static int NAME(void)
# define CALL_INIT_FUNCTION(NAME) \
k5_call_init_function(& JOIN__2(NAME, once))
# define INITIALIZER_RAN(NAME) \
(JOIN__2(NAME, once).did_run && JOIN__2(NAME, once).error == 0)
# define PROGRAM_EXITING() (0)
#elif defined(__GNUC__) && !defined(_WIN32) && defined(CONSTRUCTOR_ATTR_WORKS)
# ifdef USE_LINKER_INIT_OPTION
# define MAYBE_DUMMY_INIT(NAME) \
void JOIN__2(NAME, auxinit) () { }
# else
# define MAYBE_DUMMY_INIT(NAME)
# endif
typedef struct { int error; unsigned char did_run; } k5_init_t;
# define MAKE_INIT_FUNCTION(NAME) \
MAYBE_DUMMY_INIT(NAME) \
static k5_init_t JOIN__2(NAME, ran) \
= { 0, 2 }; \
static void JOIN__2(NAME, aux)(void) \
__attribute__((constructor)); \
static int NAME(void); \
static void JOIN__2(NAME, aux)(void) \
{ \
JOIN__2(NAME, ran).error = NAME(); \
JOIN__2(NAME, ran).did_run = 3; \
} \
static int NAME(void)
# define CALL_INIT_FUNCTION(NAME) \
(JOIN__2(NAME, ran).did_run == 3 \
? JOIN__2(NAME, ran).error \
: (abort(),0))
# define INITIALIZER_RAN(NAME) (JOIN__2(NAME,ran).did_run == 3 && JOIN__2(NAME, ran).error == 0)
# define PROGRAM_EXITING() (0)
#elif defined(USE_LINKER_INIT_OPTION) || defined(_WIN32)
typedef struct { int error; unsigned char did_run; } k5_init_t;
# define MAKE_INIT_FUNCTION(NAME) \
static k5_init_t JOIN__2(NAME, ran) \
= { 0, 2 }; \
static int NAME(void); \
void JOIN__2(NAME, auxinit)() \
{ \
JOIN__2(NAME, ran).error = NAME(); \
JOIN__2(NAME, ran).did_run = 3; \
} \
static int NAME(void)
# define CALL_INIT_FUNCTION(NAME) \
(JOIN__2(NAME, ran).did_run == 3 \
? JOIN__2(NAME, ran).error \
: (abort(),0))
# define INITIALIZER_RAN(NAME) \
(JOIN__2(NAME, ran).error == 0)
# define PROGRAM_EXITING() (0)
#else
# error "Don't know how to do load-time initializers for this configuration."
# define PROGRAM_EXITING() (0)
#endif
#if defined(USE_LINKER_FINI_OPTION) || defined(_WIN32)
# ifdef __hpux
# include <dl.h>
# define MAKE_FINI_FUNCTION(NAME) \
static void NAME(void); \
void JOIN__2(NAME, auxfini)(shl_t, int); \
void JOIN__2(NAME, auxfini)(shl_t h, int l) { if (!l) NAME(); } \
static void NAME(void)
# else
# define MAKE_FINI_FUNCTION(NAME) \
void NAME(void)
# endif
#elif !defined(SHARED) || defined(LIB_UNLOAD_PREVENTED)
# define MAKE_FINI_FUNCTION(NAME) \
static void NAME(void) UNUSED
#elif defined(__GNUC__) && defined(DESTRUCTOR_ATTR_WORKS)
# define MAKE_FINI_FUNCTION(NAME) \
static void NAME(void) __attribute__((destructor))
#else
# error "Don't know how to do unload-time finalization for this configuration."
#endif
#ifndef SIZE_MAX
# define SIZE_MAX ((size_t)((size_t)0 - 1))
#endif
#ifdef _WIN32
# define SSIZE_MAX ((ssize_t)(SIZE_MAX/2))
#endif
#if HAVE_ENDIAN_H
# include <endian.h>
#elif HAVE_MACHINE_ENDIAN_H
# include <machine/endian.h>
#endif
#if defined(BIG_ENDIAN) && defined(LITTLE_ENDIAN)
# if BYTE_ORDER == BIG_ENDIAN
# define K5_BE
# endif
# if BYTE_ORDER == LITTLE_ENDIAN
# define K5_LE
# endif
#elif defined(BIG_ENDIAN)
# define K5_BE
#elif defined(LITTLE_ENDIAN)
# define K5_LE
#elif defined(_BIG_ENDIAN) && defined(_LITTLE_ENDIAN)
# if _BYTE_ORDER == _BIG_ENDIAN
# define K5_BE
# endif
# if _BYTE_ORDER == _LITTLE_ENDIAN
# define K5_LE
# endif
#elif defined(_BIG_ENDIAN)
# define K5_BE
#elif defined(_LITTLE_ENDIAN)
# define K5_LE
#elif defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__)
# define K5_BE
#elif defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)
# define K5_LE
#endif
#if !defined(K5_BE) && !defined(K5_LE)
# if defined(__i386__) || defined(_MIPSEL) || defined(__alpha__) || (defined(__ia64__) && !defined(__hpux))
# define K5_LE
# endif
# if defined(__hppa__) || defined(__rs6000__) || defined(__sparc__) || defined(_MIPSEB) || defined(__m68k__) || defined(__sparc64__) || defined(__ppc__) || defined(__ppc64__) || (defined(__hpux) && defined(__ia64__))
# define K5_BE
# endif
#endif
#if defined(K5_BE) && defined(K5_LE)
# error "oops, check the byte order macros"
#endif
#ifdef __GNUC__
# define PUT(SIZE,PTR,VAL) (((struct { uint##SIZE##_t i; } __attribute__((packed)) *)(PTR))->i = (VAL))
# define GET(SIZE,PTR) (((const struct { uint##SIZE##_t i; } __attribute__((packed)) *)(PTR))->i)
# define PUTSWAPPED(SIZE,PTR,VAL) PUT(SIZE,PTR,SWAP##SIZE(VAL))
# define GETSWAPPED(SIZE,PTR) SWAP##SIZE(GET(SIZE,PTR))
#endif
#if defined(HAVE_BYTESWAP_H) && defined(HAVE_BSWAP_16)
# include <byteswap.h>
# define SWAP16 bswap_16
# define SWAP32 bswap_32
# ifdef HAVE_BSWAP_64
# define SWAP64 bswap_64
# endif
#elif TARGET_OS_MAC
# include <architecture/byte_order.h>
# define SWAP16 k5_swap16
static inline unsigned int k5_swap16 (unsigned int x) {
x &= 0xffff;
return (x >> 8) | ((x & 0xff) << 8);
}
# define SWAP32 OSSwapInt32
# define SWAP64 OSSwapInt64
#elif defined(HAVE_SYS_BSWAP_H)
# include <sys/bswap.h>
# define SWAP16 bswap16
# define SWAP32 bswap32
# if LONG_MAX > 0x7fffffffL
# define SWAP64 bswap64
# endif
#endif
static inline void
store_16_be (unsigned int val, void *vp)
{
unsigned char *p = (unsigned char *) vp;
#if defined(__GNUC__) && defined(K5_BE) && !defined(__cplusplus)
PUT(16,p,val);
#elif defined(__GNUC__) && defined(K5_LE) && defined(SWAP16) && !defined(__cplusplus)
PUTSWAPPED(16,p,val);
#else
p[0] = (val >> 8) & 0xff;
p[1] = (val ) & 0xff;
#endif
}
static inline void
store_32_be (unsigned int val, void *vp)
{
unsigned char *p = (unsigned char *) vp;
#if defined(__GNUC__) && defined(K5_BE) && !defined(__cplusplus)
PUT(32,p,val);
#elif defined(__GNUC__) && defined(K5_LE) && defined(SWAP32) && !defined(__cplusplus)
PUTSWAPPED(32,p,val);
#else
p[0] = (val >> 24) & 0xff;
p[1] = (val >> 16) & 0xff;
p[2] = (val >> 8) & 0xff;
p[3] = (val ) & 0xff;
#endif
}
static inline void
store_64_be (uint64_t val, void *vp)
{
unsigned char *p = (unsigned char *) vp;
#if defined(__GNUC__) && defined(K5_BE) && !defined(__cplusplus)
PUT(64,p,val);
#elif defined(__GNUC__) && defined(K5_LE) && defined(SWAP64) && !defined(__cplusplus)
PUTSWAPPED(64,p,val);
#else
p[0] = (unsigned char)((val >> 56) & 0xff);
p[1] = (unsigned char)((val >> 48) & 0xff);
p[2] = (unsigned char)((val >> 40) & 0xff);
p[3] = (unsigned char)((val >> 32) & 0xff);
p[4] = (unsigned char)((val >> 24) & 0xff);
p[5] = (unsigned char)((val >> 16) & 0xff);
p[6] = (unsigned char)((val >> 8) & 0xff);
p[7] = (unsigned char)((val ) & 0xff);
#endif
}
static inline unsigned short
load_16_be (const void *cvp)
{
const unsigned char *p = (const unsigned char *) cvp;
#if defined(__GNUC__) && defined(K5_BE) && !defined(__cplusplus)
return GET(16,p);
#elif defined(__GNUC__) && defined(K5_LE) && defined(SWAP16) && !defined(__cplusplus)
return GETSWAPPED(16,p);
#else
return (p[1] | (p[0] << 8));
#endif
}
static inline unsigned int
load_32_be (const void *cvp)
{
const unsigned char *p = (const unsigned char *) cvp;
#if defined(__GNUC__) && defined(K5_BE) && !defined(__cplusplus)
return GET(32,p);
#elif defined(__GNUC__) && defined(K5_LE) && defined(SWAP32) && !defined(__cplusplus)
return GETSWAPPED(32,p);
#else
return (p[3] | (p[2] << 8)
| ((uint32_t) p[1] << 16)
| ((uint32_t) p[0] << 24));
#endif
}
static inline uint64_t
load_64_be (const void *cvp)
{
const unsigned char *p = (const unsigned char *) cvp;
#if defined(__GNUC__) && defined(K5_BE) && !defined(__cplusplus)
return GET(64,p);
#elif defined(__GNUC__) && defined(K5_LE) && defined(SWAP64) && !defined(__cplusplus)
return GETSWAPPED(64,p);
#else
return ((uint64_t)load_32_be(p) << 32) | load_32_be(p+4);
#endif
}
static inline void
store_16_le (unsigned int val, void *vp)
{
unsigned char *p = (unsigned char *) vp;
#if defined(__GNUC__) && defined(K5_LE) && !defined(__cplusplus)
PUT(16,p,val);
#elif defined(__GNUC__) && defined(K5_BE) && defined(SWAP16) && !defined(__cplusplus)
PUTSWAPPED(16,p,val);
#else
p[1] = (val >> 8) & 0xff;
p[0] = (val ) & 0xff;
#endif
}
static inline void
store_32_le (unsigned int val, void *vp)
{
unsigned char *p = (unsigned char *) vp;
#if defined(__GNUC__) && defined(K5_LE) && !defined(__cplusplus)
PUT(32,p,val);
#elif defined(__GNUC__) && defined(K5_BE) && defined(SWAP32) && !defined(__cplusplus)
PUTSWAPPED(32,p,val);
#else
p[3] = (val >> 24) & 0xff;
p[2] = (val >> 16) & 0xff;
p[1] = (val >> 8) & 0xff;
p[0] = (val ) & 0xff;
#endif
}
static inline void
store_64_le (uint64_t val, void *vp)
{
unsigned char *p = (unsigned char *) vp;
#if defined(__GNUC__) && defined(K5_LE) && !defined(__cplusplus)
PUT(64,p,val);
#elif defined(__GNUC__) && defined(K5_BE) && defined(SWAP64) && !defined(__cplusplus)
PUTSWAPPED(64,p,val);
#else
p[7] = (unsigned char)((val >> 56) & 0xff);
p[6] = (unsigned char)((val >> 48) & 0xff);
p[5] = (unsigned char)((val >> 40) & 0xff);
p[4] = (unsigned char)((val >> 32) & 0xff);
p[3] = (unsigned char)((val >> 24) & 0xff);
p[2] = (unsigned char)((val >> 16) & 0xff);
p[1] = (unsigned char)((val >> 8) & 0xff);
p[0] = (unsigned char)((val ) & 0xff);
#endif
}
static inline unsigned short
load_16_le (const void *cvp)
{
const unsigned char *p = (const unsigned char *) cvp;
#if defined(__GNUC__) && defined(K5_LE) && !defined(__cplusplus)
return GET(16,p);
#elif defined(__GNUC__) && defined(K5_BE) && defined(SWAP16) && !defined(__cplusplus)
return GETSWAPPED(16,p);
#else
return (p[0] | (p[1] << 8));
#endif
}
static inline unsigned int
load_32_le (const void *cvp)
{
const unsigned char *p = (const unsigned char *) cvp;
#if defined(__GNUC__) && defined(K5_LE) && !defined(__cplusplus)
return GET(32,p);
#elif defined(__GNUC__) && defined(K5_BE) && defined(SWAP32) && !defined(__cplusplus)
return GETSWAPPED(32,p);
#else
return (p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24));
#endif
}
static inline uint64_t
load_64_le (const void *cvp)
{
const unsigned char *p = (const unsigned char *) cvp;
#if defined(__GNUC__) && defined(K5_LE) && !defined(__cplusplus)
return GET(64,p);
#elif defined(__GNUC__) && defined(K5_BE) && defined(SWAP64) && !defined(__cplusplus)
return GETSWAPPED(64,p);
#else
return ((uint64_t)load_32_le(p+4) << 32) | load_32_le(p);
#endif
}
#define UINT16_TYPE uint16_t
#define UINT32_TYPE uint32_t
static inline void
store_16_n (unsigned int val, void *vp)
{
UINT16_TYPE n = val;
memcpy(vp, &n, 2);
}
static inline void
store_32_n (unsigned int val, void *vp)
{
UINT32_TYPE n = val;
memcpy(vp, &n, 4);
}
static inline void
store_64_n (uint64_t val, void *vp)
{
uint64_t n = val;
memcpy(vp, &n, 8);
}
static inline unsigned short
load_16_n (const void *p)
{
UINT16_TYPE n;
memcpy(&n, p, 2);
return n;
}
static inline unsigned int
load_32_n (const void *p)
{
UINT32_TYPE n;
memcpy(&n, p, 4);
return n;
}
static inline uint64_t
load_64_n (const void *p)
{
uint64_t n;
memcpy(&n, p, 8);
return n;
}
#undef UINT16_TYPE
#undef UINT32_TYPE
static inline uint64_t
k5_htonll (uint64_t val)
{
#ifdef K5_BE
return val;
#elif defined K5_LE && defined SWAP64
return SWAP64 (val);
#else
return load_64_be ((unsigned char *)&val);
#endif
}
static inline uint64_t
k5_ntohll (uint64_t val)
{
return k5_htonll (val);
}
#ifdef HAVE_GETPWNAM_R
# ifndef GETPWNAM_R_4_ARGS
# define k5_getpwnam_r(NAME, REC, BUF, BUFSIZE, OUT) \
(getpwnam_r(NAME,REC,BUF,BUFSIZE,OUT) == 0 \
? (*(OUT) == NULL ? -1 : 0) : -1)
# else
# ifdef GETPWNAM_R_RETURNS_INT
# define k5_getpwnam_r(NAME, REC, BUF, BUFSIZE, OUT) \
(getpwnam_r(NAME,REC,BUF,BUFSIZE) == 0 \
? (*(OUT) = REC, 0) \
: (*(OUT) = NULL, -1))
# else
# define k5_getpwnam_r(NAME, REC, BUF, BUFSIZE, OUT) \
(*(OUT) = getpwnam_r(NAME,REC,BUF,BUFSIZE), *(OUT) == NULL ? -1 : 0)
# endif
# endif
#else
# define k5_getpwnam_r(NAME, REC, BUF, BUFSIZE, OUT) \
(*(OUT) = getpwnam(NAME), *(OUT) == NULL ? -1 : 0)
#endif
#ifdef HAVE_GETPWUID_R
# ifndef GETPWUID_R_4_ARGS
# define k5_getpwuid_r(UID, REC, BUF, BUFSIZE, OUT) \
(getpwuid_r(UID,REC,BUF,BUFSIZE,OUT) == 0 \
? (*(OUT) == NULL ? -1 : 0) : -1)
# else
# ifdef GETPWNAM_R_RETURNS_INT
# define k5_getpwuid_r(UID, REC, BUF, BUFSIZE, OUT) \
(getpwuid_r(UID,REC,BUF,BUFSIZE) == 0 \
? (*(OUT) = REC, 0) \
: (*(OUT) = NULL, -1))
# else
# define k5_getpwuid_r(UID, REC, BUF, BUFSIZE, OUT) \
(*(OUT) = getpwuid_r(UID,REC,BUF,BUFSIZE), *(OUT) == NULL ? -1 : 0)
# endif
# endif
#else
# define k5_getpwuid_r(UID, REC, BUF, BUFSIZE, OUT) \
(*(OUT) = getpwuid(UID), *(OUT) == NULL ? -1 : 0)
#endif
#ifdef F_SETFD
# ifdef FD_CLOEXEC
# define set_cloexec_fd(FD) ((void)fcntl((FD), F_SETFD, FD_CLOEXEC))
# else
# define set_cloexec_fd(FD) ((void)fcntl((FD), F_SETFD, 1))
# endif
#else
# define set_cloexec_fd(FD) ((void)(FD))
#endif
#define set_cloexec_file(F) set_cloexec_fd(fileno(F))
#if defined(HAS_VA_COPY) || defined(va_copy)
#elif defined(CAN_COPY_VA_LIST)
#define va_copy(dest, src) ((dest) = (src))
#else
#define va_copy(dest, src) memcpy(dest, src, sizeof(va_list))
#endif
#ifndef HAVE_STRLCPY
#define strlcpy krb5int_strlcpy
#define strlcat krb5int_strlcat
extern size_t krb5int_strlcpy(char *dst, const char *src, size_t siz);
extern size_t krb5int_strlcat(char *dst, const char *src, size_t siz);
#endif
#ifndef HAVE_FNMATCH
#define fnmatch k5_fnmatch
int k5_fnmatch(const char *pattern, const char *string, int flags);
#define FNM_NOMATCH 1
#define FNM_NOSYS 2
#define FNM_NORES 3
#define FNM_NOESCAPE 0x01
#define FNM_PATHNAME 0x02
#define FNM_PERIOD 0x04
#define FNM_CASEFOLD 0x08
#define FNM_LEADING_DIR 0x10
#endif
#ifndef HAVE_VSNPRINTF
#ifdef _WIN32
static inline int
vsnprintf(char *str, size_t size, const char *format, va_list args)
{
va_list args_copy;
int length;
va_copy(args_copy, args);
length = _vscprintf(format, args_copy);
va_end(args_copy);
if (size > 0) {
_vsnprintf(str, size, format, args);
str[size - 1] = '\0';
}
return length;
}
static inline int
snprintf(char *str, size_t size, const char *format, ...)
{
va_list args;
int n;
va_start(args, format);
n = vsnprintf(str, size, format, args);
va_end(args);
return n;
}
#else
#error We need an implementation of vsnprintf.
#endif
#endif
#ifndef HAVE_VASPRINTF
extern int krb5int_vasprintf(char **, const char *, va_list)
#if !defined(__cplusplus) && (__GNUC__ > 2)
__attribute__((__format__(__printf__, 2, 0)))
#endif
;
extern int krb5int_asprintf(char **, const char *, ...)
#if !defined(__cplusplus) && (__GNUC__ > 2)
__attribute__((__format__(__printf__, 2, 3)))
#endif
;
#define vasprintf krb5int_vasprintf
#define asprintf krb5int_asprintf
#elif defined(NEED_VASPRINTF_PROTO)
extern int vasprintf(char **, const char *, va_list)
#if !defined(__cplusplus) && (__GNUC__ > 2)
__attribute__((__format__(__printf__, 2, 0)))
#endif
;
extern int asprintf(char **, const char *, ...)
#if !defined(__cplusplus) && (__GNUC__ > 2)
__attribute__((__format__(__printf__, 2, 3)))
#endif
;
#endif
#define SNPRINTF_OVERFLOW(result, size) \
((unsigned int)(result) >= (size_t)(size))
#if defined(_WIN32) || !defined(HAVE_STRERROR_R) || defined(STRERROR_R_CHAR_P)
#define strerror_r k5_strerror_r
#endif
extern int k5_strerror_r(int errnum, char *buf, size_t buflen);
#ifndef HAVE_MKSTEMP
extern int krb5int_mkstemp(char *);
#define mkstemp krb5int_mkstemp
#endif
#ifndef HAVE_GETTIMEOFDAY
extern int krb5int_gettimeofday(struct timeval *tp, void *ignore);
#define gettimeofday krb5int_gettimeofday
#endif
#ifdef _WIN32
# define zap(ptr, len) SecureZeroMemory(ptr, len)
#elif defined(__STDC_LIB_EXT1__)
static inline void zap(void *ptr, size_t len)
{
if (len > 0)
memset_s(ptr, len, 0, len);
}
#elif defined(HAVE_EXPLICIT_BZERO)
# define zap(ptr, len) explicit_bzero(ptr, len)
#elif defined(HAVE_EXPLICIT_MEMSET)
# define zap(ptr, len) explicit_memset(ptr, 0, len)
#elif defined(__GNUC__) || defined(__clang__)
static inline void zap(void *ptr, size_t len)
{
if (len > 0)
memset(ptr, 0, len);
__asm__ __volatile__("" : : "g" (ptr) : "memory");
}
#else
# define zap(ptr, len) krb5int_zap(ptr, len)
#endif
extern void krb5int_zap(void *ptr, size_t len);
int k5_bcmp(const void *p1, const void *p2, size_t n);
long k5_path_split(const char *path, char **parent_out, char **basename_out);
long k5_path_join(const char *path1, const char *path2, char **path_out);
int k5_path_isabs(const char *path);
#ifdef ENABLE_NLS
#include <libintl.h>
#define KRB5_TEXTDOMAIN "mit-krb5"
#define _(s) dgettext(KRB5_TEXTDOMAIN, s)
#else
#define _(s) s
#define dgettext(d, m) m
#define ngettext(m1, m2, n) (((n) == 1) ? m1 : m2)
#define bindtextdomain(p, d)
#endif
#define N_(s) s
#if !defined(HAVE_GETOPT) || !defined(HAVE_UNISTD_H)
#if defined(_WIN32) && !defined(K5_GETOPT_C)
#define K5_GETOPT_DECL __declspec(dllimport)
#else
#define K5_GETOPT_DECL
#endif
K5_GETOPT_DECL extern int k5_opterr;
K5_GETOPT_DECL extern int k5_optind;
K5_GETOPT_DECL extern int k5_optopt;
K5_GETOPT_DECL extern char *k5_optarg;
#define opterr k5_opterr
#define optind k5_optind
#define optopt k5_optopt
#define optarg k5_optarg
extern int k5_getopt(int nargc, char * const nargv[], const char *ostr);
#define getopt k5_getopt
#endif
#ifdef HAVE_GETOPT_LONG
#include <getopt.h>
#else
struct option
{
const char *name;
int has_arg;
int *flag;
int val;
};
#define no_argument 0
#define required_argument 1
#define optional_argument 2
extern int k5_getopt_long(int nargc, char **nargv, char *options,
struct option *long_options, int *index);
#define getopt_long k5_getopt_long
#endif
#if defined(_WIN32)
#define secure_getenv getenv
#elif !defined(HAVE_SECURE_GETENV)
#define secure_getenv k5_secure_getenv
extern char *k5_secure_getenv(const char *name);
#endif
int k5_dir_filenames(const char *dirname, char ***fnames_out);
void k5_free_filenames(char **fnames);
#ifdef __cplusplus
}
#endif
#endif