#if HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <gpg-error.h>
#include "gettext.h"
#include "err-codes.h"
const char *
_gpg_strerror (gpg_error_t err)
{
gpg_err_code_t code = gpg_err_code (err);
if (code & GPG_ERR_SYSTEM_ERROR)
{
int no = gpg_err_code_to_errno (code);
if (no)
return strerror (no);
else
code = GPG_ERR_UNKNOWN_ERRNO;
}
return dgettext (PACKAGE, msgstr + msgidx[msgidxof (code)]);
}
#ifdef HAVE_STRERROR_R
#ifdef STRERROR_R_CHAR_P
static int
system_strerror_r (int no, char *buf, size_t buflen)
{
char *errstr;
errstr = strerror_r (no, buf, buflen);
if (errstr != buf)
{
size_t errstr_len = strlen (errstr) + 1;
size_t cpy_len = errstr_len < buflen ? errstr_len : buflen;
memcpy (buf, errstr, cpy_len);
return cpy_len == errstr_len ? 0 : ERANGE;
}
else
{
if (strlen (buf) + 1 >= buflen)
return ERANGE;
return 0;
}
}
#else
static int
system_strerror_r (int no, char *buf, size_t buflen)
{
return strerror_r (no, buf, buflen);
}
#endif
#else
static int
system_strerror_r (int no, char *buf, size_t buflen)
{
char *errstr = strerror (no);
if (!errstr)
{
int saved_errno = errno;
if (saved_errno != EINVAL)
snprintf (buf, buflen, "strerror failed: %i\n", errno);
return saved_errno;
}
else
{
size_t errstr_len = strlen (errstr) + 1;
size_t cpy_len = errstr_len < buflen ? errstr_len : buflen;
memcpy (buf, errstr, cpy_len);
return cpy_len == errstr_len ? 0 : ERANGE;
}
}
#endif
int
_gpg_strerror_r (gpg_error_t err, char *buf, size_t buflen)
{
gpg_err_code_t code = gpg_err_code (err);
const char *errstr;
size_t errstr_len;
size_t cpy_len;
if (code & GPG_ERR_SYSTEM_ERROR)
{
int no = gpg_err_code_to_errno (code);
if (no)
{
int system_err = system_strerror_r (no, buf, buflen);
if (system_err != EINVAL)
{
if (buflen)
buf[buflen - 1] = '\0';
return system_err;
}
}
code = GPG_ERR_UNKNOWN_ERRNO;
}
errstr = dgettext (PACKAGE, msgstr + msgidx[msgidxof (code)]);
errstr_len = strlen (errstr) + 1;
cpy_len = errstr_len < buflen ? errstr_len : buflen;
memcpy (buf, errstr, cpy_len);
if (buflen)
buf[buflen - 1] = '\0';
return cpy_len == errstr_len ? 0 : ERANGE;
}