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
|
/*
* Logging routines.
* Contains routines that are used with the glib logging facility.
*/
#include "ledd.h"
#include <syslog.h>
#include <stdio.h>
static void log_via_syslog(const gchar *domain, GLogLevelFlags level,
const gchar *message,gpointer data);
static void log_via_stderr(const gchar *domain, GLogLevelFlags level,
const gchar *message,gpointer data);
static void log_via_none(const gchar *domain, GLogLevelFlags level,
const gchar *message,gpointer data);
/*
* Sets the correct logging facility. If file is NULL, sets logging to
* STDERR.
*/
void log_set_facility(File *file) {
File std;
if (file==NULL) {
std.name="";
std.type=TYPE_LOG_STDERR;
std.fd=-1;
std.pid=0;
std.timer=NULL;
file=&std;
}
if (file->type==TYPE_LOG_SYSLOG) {
g_log_set_handler(G_LOG_DOMAIN,
G_LOG_LEVEL_MESSAGE|
G_LOG_LEVEL_WARNING|
G_LOG_LEVEL_ERROR|
G_LOG_FLAG_FATAL,
log_via_syslog,NULL);
#ifdef HAVE_SYSLOG
openlog("ledd",0,LOG_DAEMON);
#endif
} else if (file->type==TYPE_LOG_STDERR) {
g_log_set_handler(G_LOG_DOMAIN,
G_LOG_LEVEL_MESSAGE|
G_LOG_LEVEL_WARNING|
G_LOG_LEVEL_ERROR|
G_LOG_FLAG_FATAL,
log_via_stderr,NULL);
} else if (file->type==TYPE_LOG_NONE) {
g_log_set_handler(G_LOG_DOMAIN,
G_LOG_LEVEL_MESSAGE|
G_LOG_LEVEL_WARNING|
G_LOG_LEVEL_ERROR|
G_LOG_FLAG_FATAL,
log_via_none,NULL);
} else {
G_ERROR("unknown logging type %d",file->type);
}
return;
}
/*
* Closes neccessary stuff from logging. Sets the handler to STDERR.
*/
void log_close(File *file) {
#ifdef HAVE_SYSLOG
if (file->type==TYPE_LOG_SYSLOG) {
closelog();
}
#endif
log_set_facility(NULL);
return;
}
/*
* Actual logging functions. Function name describes it.
*/
static void log_via_syslog(const gchar *domain, GLogLevelFlags level,
const gchar *message,gpointer data) {
#ifdef HAVE_SYSLOG
int lvl;
if (level & G_LOG_LEVEL_ERROR)
lvl=LOG_ERR;
else if (level & G_LOG_LEVEL_WARNING)
lvl=LOG_WARNING;
else if (level & G_LOG_LEVEL_MESSAGE)
lvl=LOG_NOTICE;
/* Unknown, guess. */
else if (level & G_LOG_FLAG_FATAL)
lvl=LOG_ERR;
else
lvl=LOG_WARNING;
syslog(lvl,"%s",message);
#endif
return;
}
static void log_via_stderr(const gchar *domain, GLogLevelFlags level,
const gchar *message, gpointer data) {
fprintf(stderr,"ledd: %s\n",message);
return;
}
static void log_via_none(const gchar *domain, GLogLevelFlags level,
const gchar *message, gpointer data) {
return;
}
|