masqmail

annotate src/log.c @ 426:d48d3622b64f

Updated AUTHORS and THANKS files.
author markus schnalke <meillo@marmaro.de>
date Wed, 30 May 2012 11:49:40 +0200
parents 5f0829f8e6c7
children
rev   line source
meillo@367 1 /*
meillo@367 2 ** MasqMail
meillo@367 3 ** Copyright (C) 1999-2001 Oliver Kurth
meillo@367 4 **
meillo@367 5 ** This program is free software; you can redistribute it and/or modify
meillo@367 6 ** it under the terms of the GNU General Public License as published by
meillo@367 7 ** the Free Software Foundation; either version 2 of the License, or
meillo@367 8 ** (at your option) any later version.
meillo@367 9 **
meillo@367 10 ** This program is distributed in the hope that it will be useful,
meillo@367 11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
meillo@367 12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
meillo@367 13 ** GNU General Public License for more details.
meillo@367 14 **
meillo@367 15 ** You should have received a copy of the GNU General Public License
meillo@367 16 ** along with this program; if not, write to the Free Software
meillo@367 17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
meillo@0 18 */
meillo@0 19
meillo@377 20 #include <sys/stat.h>
meillo@15 21 #include <sysexits.h>
meillo@15 22
meillo@0 23 #include "masqmail.h"
meillo@0 24
meillo@0 25 static char *_sysexit_strings[] = {
meillo@10 26 "command line usage error",
meillo@10 27 "data format error",
meillo@10 28 "cannot open input",
meillo@10 29 "addressee unknown",
meillo@10 30 "host name unknown",
meillo@10 31 "service unavailable",
meillo@10 32 "internal software error",
meillo@10 33 "system error (e.g., can't fork)",
meillo@10 34 "critical OS file missing",
meillo@10 35 "can't create (user) output file",
meillo@10 36 "input/output error",
meillo@10 37 "temp failure; user is invited to retry",
meillo@10 38 "remote error in protocol",
meillo@10 39 "permission denied",
meillo@10 40 "configuration error"
meillo@0 41 };
meillo@0 42
meillo@10 43 gchar*
meillo@10 44 ext_strerror(int err)
meillo@0 45 {
meillo@10 46 if (err < 1024)
meillo@10 47 return strerror(err);
meillo@10 48 else if (err > 1024 + EX__BASE
meillo@10 49 && (err - 1024 - EX__BASE < sizeof(_sysexit_strings) / sizeof(_sysexit_strings[0])))
meillo@10 50 return _sysexit_strings[err - 1024 - EX__BASE];
meillo@0 51
meillo@10 52 return "unknown error";
meillo@0 53 }
meillo@0 54
meillo@0 55 static FILE *logfile = NULL;
meillo@0 56 static FILE *debugfile = NULL;
meillo@0 57
meillo@10 58 gboolean
meillo@10 59 logopen()
meillo@0 60 {
meillo@10 61 gchar *filename;
meillo@10 62 mode_t saved_mode = umask(066);
meillo@0 63
meillo@10 64 if (conf.use_syslog) {
meillo@10 65 openlog(PACKAGE, LOG_PID, LOG_MAIL);
meillo@10 66 } else {
meillo@10 67 uid_t saved_uid;
meillo@10 68 gid_t saved_gid;
meillo@0 69
meillo@331 70 if (!conf.run_as_user) {
meillo@331 71 set_euidgid(conf.mail_uid, conf.mail_gid, &saved_uid, &saved_gid);
meillo@331 72 }
meillo@0 73
meillo@10 74 filename = g_strdup_printf("%s/masqmail.log", conf.log_dir);
meillo@10 75 logfile = fopen(filename, "a");
meillo@10 76 if (!logfile) {
meillo@10 77 fprintf(stderr, "could not open log '%s': %s\n", filename, strerror(errno));
meillo@424 78 if (!conf.run_as_user) {
meillo@424 79 set_euidgid(saved_uid, saved_gid, NULL, NULL);
meillo@424 80 }
meillo@10 81 return FALSE;
meillo@10 82 }
meillo@10 83 g_free(filename);
meillo@10 84
meillo@331 85 if (!conf.run_as_user) {
meillo@331 86 set_euidgid(saved_uid, saved_gid, NULL, NULL);
meillo@331 87 }
meillo@10 88 }
meillo@0 89
meillo@0 90 #ifdef ENABLE_DEBUG
meillo@10 91 if (conf.debug_level > 0) {
meillo@10 92 filename = g_strdup_printf("%s/debug.log", conf.log_dir);
meillo@10 93 debugfile = fopen(filename, "a");
meillo@10 94 if (!debugfile) {
meillo@10 95 fprintf(stderr, "could not open debug log '%s'\n", filename);
meillo@10 96 return FALSE;
meillo@10 97 }
meillo@10 98 g_free(filename);
meillo@10 99 }
meillo@0 100 #endif
meillo@10 101 umask(saved_mode);
meillo@10 102 return TRUE;
meillo@0 103 }
meillo@0 104
meillo@10 105 void
meillo@10 106 logclose()
meillo@0 107 {
meillo@10 108 if (conf.use_syslog)
meillo@10 109 closelog();
meillo@10 110 else if (logfile)
meillo@10 111 fclose(logfile);
meillo@10 112 if (debugfile)
meillo@10 113 fclose(debugfile);
meillo@0 114 }
meillo@0 115
meillo@10 116 void
meillo@10 117 vlogwrite(int pri, const char *fmt, va_list args)
meillo@0 118 {
meillo@15 119 if ((conf.do_verbose && (pri & LOG_VERBOSE)) || (pri == LOG_ALERT) || (pri == LOG_WARNING)) {
meillo@10 120 va_list args_copy;
meillo@10 121 va_copy(args_copy, args);
meillo@10 122 vfprintf(stdout, fmt, args_copy);
meillo@10 123 va_end(args_copy);
meillo@331 124 fflush(stdout); /* in case output ends not with newline */
meillo@10 125 }
meillo@0 126
meillo@10 127 pri &= ~LOG_VERBOSE;
meillo@331 128 if (!pri) {
meillo@331 129 return;
meillo@331 130 }
meillo@395 131 if (conf.use_syslog) {
meillo@331 132 vsyslog(pri, fmt, args);
meillo@395 133 return;
meillo@395 134 }
meillo@395 135 FILE *file = logfile ? logfile : stderr;
meillo@395 136 time_t now = time(NULL);
meillo@395 137 struct tm *t = localtime(&now);
meillo@395 138 gchar buf[24];
meillo@10 139
meillo@395 140 strftime(buf, 24, "%Y-%m-%d %H:%M:%S", t);
meillo@395 141 fprintf(file, "%s [%d] ", buf, getpid());
meillo@10 142
meillo@395 143 vfprintf(file, fmt, args);
meillo@395 144 fflush(file);
meillo@10 145 }
meillo@10 146
meillo@10 147 #ifdef ENABLE_DEBUG
meillo@10 148 void
meillo@10 149 vdebugwrite(int pri, const char *fmt, va_list args)
meillo@10 150 {
meillo@0 151 time_t now = time(NULL);
meillo@0 152 struct tm *t = localtime(&now);
meillo@0 153 gchar buf[24];
meillo@10 154 strftime(buf, 24, "%Y-%m-%d %H:%M:%S", t);
meillo@0 155
meillo@10 156 if (debugfile) {
meillo@10 157 fprintf(debugfile, "%s [%d] ", buf, getpid());
meillo@10 158 vfprintf(debugfile, fmt, args);
meillo@10 159 fflush(debugfile);
meillo@10 160 } else {
meillo@10 161 fprintf(stderr, "no debug file, msg was:\n");
meillo@10 162 vfprintf(stderr, fmt, args);
meillo@10 163 }
meillo@0 164 }
meillo@0 165 #endif
meillo@0 166
meillo@10 167 void
meillo@10 168 logwrite(int pri, const char *fmt, ...)
meillo@0 169 {
meillo@10 170 va_list args, args_copy;
meillo@10 171 int saved_errno = errno; /* somewhere this is changed to EBADF */
meillo@0 172
meillo@10 173 va_start(args, fmt);
meillo@0 174 #ifdef ENABLE_DEBUG
meillo@10 175 va_copy(args_copy, args);
meillo@0 176 #endif
meillo@10 177 vlogwrite(pri, fmt, args);
meillo@0 178 #ifdef ENABLE_DEBUG
meillo@10 179 if (debugfile)
meillo@10 180 vdebugwrite(pri, fmt, args_copy);
meillo@10 181 va_end(args_copy);
meillo@0 182 #endif
meillo@10 183 va_end(args);
meillo@0 184
meillo@10 185 errno = saved_errno;
meillo@0 186 }
meillo@0 187
meillo@0 188 #ifdef ENABLE_DEBUG
meillo@10 189 void
meillo@10 190 debugf(const char *fmt, ...)
meillo@0 191 {
meillo@10 192 va_list args;
meillo@10 193 va_start(args, fmt);
meillo@0 194
meillo@10 195 vdebugwrite(LOG_DEBUG, fmt, args);
meillo@0 196
meillo@10 197 va_end(args);
meillo@0 198 }
meillo@0 199
meillo@10 200 void
meillo@10 201 vdebugf(const char *fmt, va_list args)
meillo@0 202 {
meillo@10 203 vdebugwrite(LOG_DEBUG, fmt, args);
meillo@0 204 }
meillo@0 205 #endif
meillo@0 206
meillo@10 207 void
meillo@10 208 maillog(const char *fmt, ...)
meillo@0 209 {
meillo@10 210 va_list args;
meillo@10 211 va_start(args, fmt);
meillo@0 212
meillo@10 213 vlogwrite(LOG_NOTICE, fmt, args);
meillo@0 214
meillo@10 215 va_end(args);
meillo@0 216 }