summaryrefslogtreecommitdiff
path: root/libmailutils/syslog.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmailutils/syslog.c')
-rw-r--r--libmailutils/syslog.c145
1 files changed, 145 insertions, 0 deletions
diff --git a/libmailutils/syslog.c b/libmailutils/syslog.c
new file mode 100644
index 000000000..c97da9be9
--- /dev/null
+++ b/libmailutils/syslog.c
@@ -0,0 +1,145 @@
+/* GNU Mailutils -- a suite of utilities for electronic mail
+ Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+ 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 3 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, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <syslog.h>
+#include <string.h>
+#include <mailutils/diag.h>
+#include <mailutils/kwd.h>
+#include <mailutils/syslog.h>
+#include <mailutils/cstr.h>
+
+#ifndef LOG_AUTHPRIV
+# define LOG_AUTHPRIV
+#endif
+
+static mu_kwd_t kw_facility[] = {
+ { "USER", LOG_USER },
+ { "DAEMON", LOG_DAEMON },
+ { "AUTH", LOG_AUTH },
+ { "AUTHPRIV",LOG_AUTHPRIV },
+ { "MAIL", LOG_MAIL },
+ { "CRON", LOG_CRON },
+ { "LOCAL0", LOG_LOCAL0 },
+ { "LOCAL1", LOG_LOCAL1 },
+ { "LOCAL2", LOG_LOCAL2 },
+ { "LOCAL3", LOG_LOCAL3 },
+ { "LOCAL4", LOG_LOCAL4 },
+ { "LOCAL5", LOG_LOCAL5 },
+ { "LOCAL6", LOG_LOCAL6 },
+ { "LOCAL7", LOG_LOCAL7 },
+ { NULL }
+};
+
+static int
+syslog_to_n (mu_kwd_t *kw, const char *str, int *pint)
+{
+ if (mu_c_strncasecmp (str, "LOG_", 4) == 0)
+ str += 4;
+ return mu_kwd_xlat_name_ci (kw, str, pint);
+}
+
+int
+mu_string_to_syslog_facility (const char *str, int *pfacility)
+{
+ return syslog_to_n (kw_facility, str, pfacility);
+}
+
+const char *
+mu_syslog_facility_to_string (int n)
+{
+ const char *res = NULL;
+ mu_kwd_xlat_tok (kw_facility, n, &res);
+ return res;
+}
+
+static mu_kwd_t kw_prio[] = {
+ { "EMERG", LOG_EMERG },
+ { "ALERT", LOG_ALERT },
+ { "CRIT", LOG_CRIT },
+ { "ERR", LOG_ERR },
+ { "WARNING", LOG_WARNING },
+ { "NOTICE", LOG_NOTICE },
+ { "INFO", LOG_INFO },
+ { "DEBUG", LOG_DEBUG },
+ { NULL }
+};
+
+int
+mu_string_to_syslog_priority (const char *str, int *pprio)
+{
+ return syslog_to_n (kw_prio, str, pprio);
+}
+
+const char *
+mu_syslog_priority_to_string (int n)
+{
+ const char *res = NULL;
+ mu_kwd_xlat_tok (kw_prio, n, &res);
+ return res;
+}
+
+int
+mu_diag_level_to_syslog (mu_log_level_t level)
+{
+ switch (level)
+ {
+ case MU_DIAG_EMERG:
+ return LOG_EMERG;
+
+ case MU_DIAG_ALERT:
+ return LOG_ALERT;
+
+ case MU_DIAG_CRIT:
+ return LOG_CRIT;
+
+ case MU_DIAG_ERROR:
+ return LOG_ERR;
+
+ case MU_DIAG_WARNING:
+ return LOG_WARNING;
+
+ case MU_DIAG_NOTICE:
+ return LOG_NOTICE;
+
+ case MU_DIAG_INFO:
+ return LOG_INFO;
+
+ case MU_DIAG_DEBUG:
+ return LOG_DEBUG;
+ }
+ return LOG_EMERG;
+}
+
+int
+mu_diag_syslog_printer (void *data, mu_log_level_t level, const char *buf)
+{
+ int len = strlen (buf);
+ if (len > 0 && buf[len-1] == '\n')
+ {
+ len--;
+ if (len > 0 && buf[len-1] == '\r')
+ len--;
+ }
+ syslog (mu_diag_level_to_syslog (level), "%-.*s", len, buf);
+ return 0;
+}
+
+
+int mu_log_facility = LOG_FACILITY;
+char *mu_log_tag = NULL;

Return to:

Send suggestions and report system problems to the System administrator.