]> jfr.im git - irc/rqf/shadowircd.git/blame - src/logger.c
Correct error message involving no fingerprint credentials or password credentials...
[irc/rqf/shadowircd.git] / src / logger.c
CommitLineData
212380e3 1/*
3a2ff95d 2 * charybdis: an advanced Internet Relay Chat Daemon(ircd).
212380e3 3 *
4 * Copyright (C) 2003 Lee H <lee@leeh.co.uk>
5 * Copyright (C) 2003-2005 ircd-ratbox development team
3a2ff95d 6 * Copyright (C) 2008 William Pitcock <nenolod@sacredspiral.co.uk>
212380e3 7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are
10 * met:
11 *
12 * 1.Redistributions of source code must retain the above copyright notice,
13 * this list of conditions and the following disclaimer.
3a2ff95d 14 *
212380e3 15 * 2.Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
3a2ff95d 18 *
212380e3 19 * 3.The name of the author may not be used to endorse or promote products
20 * derived from this software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
24 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
26 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
27 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
28 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
30 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
31 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 * POSSIBILITY OF SUCH DAMAGE.
33 *
212380e3 34 */
35
36#include "stdinc.h"
37#include "ircd_defs.h"
d3455e2c 38#include "logger.h"
212380e3 39#include "s_conf.h"
212380e3 40#include "send.h"
41#include "client.h"
42#include "s_serv.h"
43
44static FILE *log_main;
45static FILE *log_user;
46static FILE *log_fuser;
47static FILE *log_oper;
48static FILE *log_foper;
49static FILE *log_server;
50static FILE *log_kill;
212380e3 51static FILE *log_kline;
52static FILE *log_operspy;
53static FILE *log_ioerror;
54
55struct log_struct
56{
57 char **name;
58 FILE **logfile;
59};
60
61static struct log_struct log_table[LAST_LOGFILE] =
62{
63 { NULL, &log_main },
64 { &ConfigFileEntry.fname_userlog, &log_user },
65 { &ConfigFileEntry.fname_fuserlog, &log_fuser },
66 { &ConfigFileEntry.fname_operlog, &log_oper },
67 { &ConfigFileEntry.fname_foperlog, &log_foper },
68 { &ConfigFileEntry.fname_serverlog, &log_server },
69 { &ConfigFileEntry.fname_killlog, &log_kill },
70 { &ConfigFileEntry.fname_klinelog, &log_kline },
212380e3 71 { &ConfigFileEntry.fname_operspylog, &log_operspy },
72 { &ConfigFileEntry.fname_ioerrorlog, &log_ioerror }
73};
74
5274a6d7
AS
75static void
76verify_logfile_access(const char *filename)
77{
78 char *dirname, *d;
79 char buf[512];
80 d = rb_dirname(filename);
81 dirname = LOCAL_COPY(d);
82 rb_free(d);
83
84 if(access(dirname, F_OK) == -1)
85 {
86 rb_snprintf(buf, sizeof(buf), "WARNING: Unable to access logfile %s - parent directory %s does not exist", filename, dirname);
87 if(testing_conf || server_state_foreground)
88 fprintf(stderr, "%s\n", buf);
89 sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s", buf);
90 return;
91 }
92
93 if(access(filename, F_OK) == -1)
94 {
95 if(access(dirname, W_OK) == -1)
96 {
97 rb_snprintf(buf, sizeof(buf), "WARNING: Unable to access logfile %s - access to parent directory %s failed: %s",
98 filename, dirname, strerror(errno));
99 if(testing_conf || server_state_foreground)
100 fprintf(stderr, "%s\n", buf);
101 sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s", buf);
102 }
103 return;
104 }
105
106 if(access(filename, W_OK) == -1)
107 {
108 rb_snprintf(buf, sizeof(buf), "WARNING: Access denied for logfile %s: %s", filename, strerror(errno));
109 if(testing_conf || server_state_foreground)
110 fprintf(stderr, "%s\n", buf);
111 sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s", buf);
112 return;
113 }
114 return;
115}
116
212380e3 117void
118init_main_logfile(void)
119{
5274a6d7 120 verify_logfile_access(logFileName);
212380e3 121 if(log_main == NULL)
5274a6d7 122 {
9b6ff0c8 123 log_main = fopen(logFileName, "a");
5274a6d7 124 }
212380e3 125}
126
127void
128open_logfiles(void)
129{
130 int i;
131
359dada2 132 close_logfiles();
212380e3 133
9b6ff0c8 134 log_main = fopen(logFileName, "a");
212380e3 135
136 /* log_main is handled above, so just do the rest */
137 for(i = 1; i < LAST_LOGFILE; i++)
138 {
359dada2
VY
139 /* reopen those with paths */
140 if(!EmptyString(*log_table[i].name))
5274a6d7
AS
141 {
142 verify_logfile_access(*log_table[i].name);
359dada2 143 *log_table[i].logfile = fopen(*log_table[i].name, "a");
5274a6d7 144 }
359dada2
VY
145 }
146}
147
148void
149close_logfiles(void)
150{
151 int i;
152
153 if(log_main != NULL)
154 fclose(log_main);
155
156 /* log_main is handled above, so just do the rest */
157 for(i = 1; i < LAST_LOGFILE; i++)
158 {
212380e3 159 if(*log_table[i].logfile != NULL)
160 {
161 fclose(*log_table[i].logfile);
162 *log_table[i].logfile = NULL;
163 }
212380e3 164 }
359dada2 165}
212380e3 166
167void
168ilog(ilogfile dest, const char *format, ...)
169{
170 FILE *logfile = *log_table[dest].logfile;
171 char buf[BUFSIZE];
172 char buf2[BUFSIZE];
173 va_list args;
174
175 if(logfile == NULL)
176 return;
177
178 va_start(args, format);
e49c49f9 179 rb_vsnprintf(buf, sizeof(buf), format, args);
212380e3 180 va_end(args);
181
ce60772d
JT
182 rb_snprintf(buf2, sizeof(buf2), "%s %s\n",
183 smalldate(rb_current_time()), buf);
212380e3 184
185 if(fputs(buf2, logfile) < 0)
186 {
187 fclose(logfile);
188 *log_table[dest].logfile = NULL;
0fcbff0c 189 return;
212380e3 190 }
191
192 fflush(logfile);
193}
194
195static void
3a2ff95d 196_iprint(const char *domain, const char *buf)
212380e3 197{
198 if (domain == NULL || buf == NULL)
199 return;
200
201 fprintf(stderr, "%8s: %s\n", domain, buf);
202}
203
204void
205inotice(const char *format, ...)
206{
207 char buf[BUFSIZE];
208 va_list args;
209
210 va_start(args, format);
a5497589 211 rb_vsnprintf(buf, sizeof(buf), format, args);
212380e3 212 va_end(args);
213
214 _iprint("notice", buf);
215
216 ilog(L_MAIN, "%s", buf);
217}
218
219void
220iwarn(const char *format, ...)
221{
222 char buf[BUFSIZE];
223 va_list args;
224
225 va_start(args, format);
a5497589 226 rb_vsnprintf(buf, sizeof(buf), format, args);
212380e3 227 va_end(args);
228
229 _iprint("warning", buf);
230
231 ilog(L_MAIN, "%s", buf);
232}
233
234void
235ierror(const char *format, ...)
236{
237 char buf[BUFSIZE];
238 va_list args;
239
240 va_start(args, format);
a5497589 241 rb_vsnprintf(buf, sizeof(buf), format, args);
212380e3 242 va_end(args);
243
244 _iprint("error", buf);
245
246 ilog(L_MAIN, "%s", buf);
247}
248
249void
250report_operspy(struct Client *source_p, const char *token, const char *arg)
251{
252 /* if its not my client its already propagated */
253 if(MyClient(source_p))
254 sendto_match_servs(source_p, "*", CAP_ENCAP, NOCAPS,
255 "ENCAP * OPERSPY %s %s",
256 token, arg ? arg : "");
257
258 sendto_realops_snomask(SNO_OPERSPY,
259 ConfigFileEntry.operspy_admin_only ? L_ADMIN : L_ALL,
260 "OPERSPY %s %s %s",
261 get_oper_name(source_p), token,
262 arg ? arg : "");
263
264 ilog(L_OPERSPY, "OPERSPY %s %s %s",
265 get_oper_name(source_p), token, arg ? arg : "");
266}
267
268const char *
ce60772d 269smalldate(time_t ltime)
212380e3 270{
271 static char buf[MAX_DATE_STRING];
272 struct tm *lt;
212380e3 273
274 lt = localtime(&ltime);
275
38e6acdd 276 rb_snprintf(buf, sizeof(buf), "%d/%d/%d %02d.%02d",
212380e3 277 lt->tm_year + 1900, lt->tm_mon + 1,
278 lt->tm_mday, lt->tm_hour, lt->tm_min);
279
280 return buf;
281}
282
212380e3 283void
3a2ff95d 284ilog_error(const char *error)
212380e3 285{
d7b7d8bb 286 ilog(L_IOERROR, "%s: %d (%s)", error, errno, strerror(errno));
212380e3 287
d7b7d8bb 288 sendto_realops_snomask(SNO_DEBUG, L_ALL, "%s: %d (%s)", error, errno, strerror(errno));
212380e3 289}