1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
/**
* @file error_msg.c Error Handling Functions
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <syslog.h>
#include <string.h>
#include <errno.h>
#ifndef MAXLINE
#define MAXLINE 4096
#endif
int daemon_proc; /* set nonzero by daemon_init() */
int ganglia_quiet_errors = 0;
static void err_doit (int, int, const char *, va_list);
void
err_quiet( void )
{
ganglia_quiet_errors = 1;
}
void
err_verbose( void )
{
ganglia_quiet_errors = 0;
}
/**
* @fn void err_ret (const char *fmt, ...)
* Print a message and return. Nonfatal error related to a system call.
* @param fmt Format string the same as printf function
* @param ... Arguments for the format string
*/
void
err_ret (const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
err_doit (1, LOG_INFO, fmt, ap);
va_end (ap);
return;
}
/**
* @fn void err_sys (const char *fmt, ...)
* Print a message and terminate.
* Fatal error related to a system call.
* @param fmt Format string the same as printf function
* @param ... Arguments for the format string
*/
void
err_sys (const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
err_doit (1, LOG_ERR, fmt, ap);
va_end (ap);
exit (1);
}
/**
* @fn void err_dump (const char *fmt, ...)
* Print a message, dump core, and terminate.
* Fatal error related to a system call.
* @param fmt Format string the same as printf function
* @param ... Arguments for the format string
*/
void
err_dump (const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
err_doit (1, LOG_ERR, fmt, ap);
va_end (ap);
abort (); /* dump core and terminate */
exit (1); /* shouldn't get here */
}
/**
* @fn void err_msg (const char *fmt, ...)
* Print a message and return. Nonfatal error unrelated to a system call.
* @param fmt Format string the same as printf function
* @param ... Arguments for the format string
*/
void
err_msg (const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
err_doit (0, LOG_INFO, fmt, ap);
va_end (ap);
return;
}
/**
* @fn void err_quit (const char *fmt, ...)
* Print a message and terminate. Fatal error unrelated to a system call.
* @param fmt Format string the same as printf function
* @param ... Arguments for the format string
*/
void
err_quit (const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
err_doit (0, LOG_ERR, fmt, ap);
va_end (ap);
exit (1);
}
/* Print a message and return to caller.
* Caller specifies "errnoflag" and "level". */
static void
err_doit (int errnoflag, int level, const char *fmt, va_list ap)
{
int errno_save, n;
char buf[MAXLINE + 1];
if(ganglia_quiet_errors)
return;
errno_save = errno; /* value caller might want printed */
#ifdef HAVE_VSNPRINTF
vsnprintf (buf, MAXLINE, fmt, ap); /* safe */
#else
vsprintf (buf, fmt, ap); /* not safe */
#endif
n = strlen (buf);
if (errnoflag)
snprintf (buf + n, MAXLINE - n, ": %s", strerror (errno_save));
#ifdef HAVE_STRLCAT
strlcat (buf, "\n", MAXLINE);
#else
strcat (buf, "\n");
#endif
if (daemon_proc)
{
syslog (level, "%s", buf);
}
else
{
fflush (stdout); /* in case stdout and stderr are the same */
fputs (buf, stderr);
fflush (stderr);
}
return;
}
|