/*
* Copyright (C) 1996-2000,2007,2010 Michael R. Elkins <me@mutt.org>
* Copyright (C) 1999-2004,2006-2007 Thomas Roessler <roessler@does-not-exist.org>
*
* This program is free software; you can redistribute it
* and/or modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later
* version.
*
* This program is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
/*
* This file used to contain some more functions, namely those
* which are now in muttlib.c. They have been removed, so we have
* some of our "standard" functions in external programs, too.
*/
#define _LIB_C 1
#if HAVE_CONFIG_H
# include "config.h"
#endif
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pwd.h>
#include <sys/types.h>
#include <dirent.h>
#ifdef HAVE_SYSEXITS_H
#include <sysexits.h>
#else /* Make sure EX_OK is defined <philiph@pobox.com> */
#define EX_OK 0
#endif
#include "lib.h"
static const struct sysexits
{
int v;
const char *str;
}
sysexits_h[] =
{
#ifdef EX_USAGE
{ 0xff & EX_USAGE, "Bad usage." },
#endif
#ifdef EX_DATAERR
{ 0xff & EX_DATAERR, "Data format error." },
#endif
#ifdef EX_NOINPUT
{ 0xff & EX_NOINPUT, "Cannot open input." },
#endif
#ifdef EX_NOUSER
{ 0xff & EX_NOUSER, "User unknown." },
#endif
#ifdef EX_NOHOST
{ 0xff & EX_NOHOST, "Host unknown." },
#endif
#ifdef EX_UNAVAILABLE
{ 0xff & EX_UNAVAILABLE, "Service unavailable." },
#endif
#ifdef EX_SOFTWARE
{ 0xff & EX_SOFTWARE, "Internal error." },
#endif
#ifdef EX_OSERR
{ 0xff & EX_OSERR, "Operating system error." },
#endif
#ifdef EX_OSFILE
{ 0xff & EX_OSFILE, "System file missing." },
#endif
#ifdef EX_CANTCREAT
{ 0xff & EX_CANTCREAT, "Can't create output." },
#endif
#ifdef EX_IOERR
{ 0xff & EX_IOERR, "I/O error." },
#endif
#ifdef EX_TEMPFAIL
{ 0xff & EX_TEMPFAIL, "Deferred." },
#endif
#ifdef EX_PROTOCOL
{ 0xff & EX_PROTOCOL, "Remote protocol error." },
#endif
#ifdef EX_NOPERM
{ 0xff & EX_NOPERM, "Insufficient permission." },
#endif
#ifdef EX_CONFIG
{ 0xff & EX_NOPERM, "Local configuration error." },
#endif
{ S_ERR, "Exec error." },
{ -1, NULL}
};
void mutt_nocurses_error (const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
vfprintf (stderr, fmt, ap);
va_end (ap);
fputc ('\n', stderr);
}
void *safe_calloc (size_t nmemb, size_t size)
{
void *p;
if (!nmemb || !size)
return NULL;
if (((size_t) -1) / nmemb <= size)
{
mutt_error _("Integer overflow -- can't allocate memory!");
sleep (1);
mutt_exit (1);
}
if (!(p = calloc (nmemb, size)))
{
mutt_error _("