#include "ircd_defs.h"
#include "logger.h"
#include "s_conf.h"
-#include "sprintf_irc.h"
#include "send.h"
#include "client.h"
#include "s_serv.h"
static FILE *log_foper;
static FILE *log_server;
static FILE *log_kill;
-static FILE *log_gline;
static FILE *log_kline;
static FILE *log_operspy;
static FILE *log_ioerror;
{ &ConfigFileEntry.fname_serverlog, &log_server },
{ &ConfigFileEntry.fname_killlog, &log_kill },
{ &ConfigFileEntry.fname_klinelog, &log_kline },
- { &ConfigFileEntry.fname_glinelog, &log_gline },
{ &ConfigFileEntry.fname_operspylog, &log_operspy },
{ &ConfigFileEntry.fname_ioerrorlog, &log_ioerror }
};
+static void
+verify_logfile_access(const char *filename)
+{
+ char *dirname, *d;
+ char buf[512];
+ d = rb_dirname(filename);
+ dirname = LOCAL_COPY(d);
+ rb_free(d);
+
+ if(access(dirname, F_OK) == -1)
+ {
+ rb_snprintf(buf, sizeof(buf), "WARNING: Unable to access logfile %s - parent directory %s does not exist", filename, dirname);
+ if(testing_conf || server_state_foreground)
+ fprintf(stderr, "%s\n", buf);
+ sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s", buf);
+ return;
+ }
+
+ if(access(filename, F_OK) == -1)
+ {
+ if(access(dirname, W_OK) == -1)
+ {
+ rb_snprintf(buf, sizeof(buf), "WARNING: Unable to access logfile %s - access to parent directory %s failed: %s",
+ filename, dirname, strerror(errno));
+ if(testing_conf || server_state_foreground)
+ fprintf(stderr, "%s\n", buf);
+ sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s", buf);
+ }
+ return;
+ }
+
+ if(access(filename, W_OK) == -1)
+ {
+ rb_snprintf(buf, sizeof(buf), "WARNING: Access denied for logfile %s: %s", filename, strerror(errno));
+ if(testing_conf || server_state_foreground)
+ fprintf(stderr, "%s\n", buf);
+ sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s", buf);
+ return;
+ }
+ return;
+}
+
void
init_main_logfile(void)
{
+ verify_logfile_access(logFileName);
if(log_main == NULL)
+ {
log_main = fopen(logFileName, "a");
+ }
}
void
{
int i;
- if(log_main != NULL)
- fclose(log_main);
+ close_logfiles();
log_main = fopen(logFileName, "a");
/* log_main is handled above, so just do the rest */
for(i = 1; i < LAST_LOGFILE; i++)
{
- /* close open logfiles */
+ /* reopen those with paths */
+ if(!EmptyString(*log_table[i].name))
+ {
+ verify_logfile_access(*log_table[i].name);
+ *log_table[i].logfile = fopen(*log_table[i].name, "a");
+ }
+ }
+}
+
+void
+close_logfiles(void)
+{
+ int i;
+
+ if(log_main != NULL)
+ fclose(log_main);
+
+ /* log_main is handled above, so just do the rest */
+ for(i = 1; i < LAST_LOGFILE; i++)
+ {
if(*log_table[i].logfile != NULL)
{
fclose(*log_table[i].logfile);
*log_table[i].logfile = NULL;
}
-
- /* reopen those with paths */
- if(!EmptyString(*log_table[i].name))
- *log_table[i].logfile = fopen(*log_table[i].name, "a");
}
-}
+}
void
ilog(ilogfile dest, const char *format, ...)
{
fclose(logfile);
*log_table[dest].logfile = NULL;
+ return;
}
fflush(logfile);