/**************************************************************************************************
$Header: /pub/cvsroot/yencode/lib/error.c,v 1.13 2002/03/19 06:52:16 bboy Exp $
Copyright (C) 2002 Don Moore <bboy@bboy.net>
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**************************************************************************************************/
#include "misc.h"
/* Short program name - set with set_progname(). */
char *short_progname = PACKAGE;
/* Program name (argv[0] verbatim) - set with set_progname(). */
char *progname = PACKAGE;
/* Full program name - set with set_progname(). */
char *long_progname = PACKAGE;
/* Should verbose messages be output? */
int err_verbose = 0;
/* Should debug messages be output? */
int err_debug = 0;
/* Should these functions be COMPLETELY silent? */
int err_quiet = 0;
/* Function to call on exit */
static void (*_err_exit_func)(int) = NULL;
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ERR_SET_EXIT
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void
err_set_exit(void (*ef)(int))
{
_err_exit_func = ef;
}
/*--- err_set_exit() ----------------------------------------------------------------------------*/
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SET_PROGRAM_NAME
Sets the global variables `_err_progname' and `_err_long_progname'.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void
set_progname(const char *name)
{
char *c, resolved_path[PATH_MAX];
if (!name)
return;
progname = xstrdup(name);
if ((c = strrchr(name, '/')))
short_progname = xstrdup(c+1);
else
short_progname = xstrdup(name);
if (!(realpath(name, resolved_path)))
long_progname = xstrdup(name);
else
long_progname = xstrdup(resolved_path);
}
/*--- set_progname() ----------------------------------------------------------------------------*/
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
_ERR_OUT
Outputs an error message.
Returns -1 for convenience if msg_type is err_type_warning or err_type_error, else returns 0.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
int
_err_out(
_err_errtype_t err_type, /* Message type; "warning", "error", etc. */
int append_strerror, /* Should strerror(errno) be appended to the message? */
int is_fatal, /* Should this error cause an abort()? */
int output_help, /* Append the "try --help" message? */
const char *sourcefile, /* Source file name (i.e. __FILE__) */
unsigned int lineno, /* Source file line number (i.e. __LINE__) */
const char *fmt, ... /* The user supplied message to output. */
)
{
#if HAVE_VASPRINTF
unsigned char *msg = NULL;
#else
unsigned char msg[BUFSIZ] = "\0";
#endif
va_list ap;
/* If this is a debug or verbose msg_type and the user doesn't want to see it, don't output. */
if ((err_type == err_type_verbose) && !err_verbose && !err_debug) // (debug implies verbose)
return (0);
if ((err_type == err_type_debug) && !err_debug)
return (0);
if (!err_quiet)
{
va_start(ap, fmt);
#if HAVE_VASPRINTF
vasprintf(&msg, fmt, ap);
#else
vsnprintf(msg, sizeof(msg), fmt, ap);
#endif
va_end(ap);
// Start with "progname: " if this is an error
if (err_type == err_type_error)
{
fputs(progname, stderr); // "progname: "
fputs(": ", stderr);
}
if (err_type == err_type_debug)
fputs("[DEBUG] ", stderr);
fputs(msg, stderr); // message
if (append_strerror) // strerror(errno) if requested
{
fputs(": ", stderr);
if (!errno)
fputs("None/unknown error", stderr);
else
fputs(strerror(errno), stderr);
}
fputc('\n', stderr); // done
// Output help string if requested
if (output_help)
fprintf(stderr, "Try `%s --help' for more information.\n", progname);
#if HAVE_VASPRINTF
free(msgbuf);
#endif
}
if (is_fatal) // Exit if requested
{
if (_err_exit_func)
_err_exit_func(0); // (send 0 so this could also be a signal handler)
exit(EXIT_FAILURE);
}
return (err_type == err_type_warning || err_type == err_type_error) ? -1 : 0;
}
/*--- _err_out() --------------------------------------------------------------------------------*/
/* vi:set ts=3: */
syntax highlighted by Code2HTML, v. 0.9.1