masqmail

annotate src/log.c @ 0:08114f7dcc23

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