]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - src/logger.c
mkpasswd: Default to MD5-based crypt instead of SHA-based.
[irc/rqf/shadowircd.git] / src / logger.c
index 3fea75b58e4f4d67353d8aedee480d85a003c4c3..b6d3dccd490da1b040faa4f5a873cfe7eaadeaa5 100644 (file)
  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  *
- * $Id: s_log.c 3209 2007-02-11 16:54:43Z jilles $
  */
 
 #include "stdinc.h"
 #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"
@@ -74,11 +72,56 @@ static struct log_struct log_table[LAST_LOGFILE] =
        { &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
@@ -86,26 +129,40 @@ open_logfiles(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, ...)
@@ -122,12 +179,14 @@ ilog(ilogfile dest, const char *format, ...)
        rb_vsnprintf(buf, sizeof(buf), format, args);
        va_end(args);
 
-       rb_snprintf(buf2, sizeof(buf2), "%s %s\n", smalldate(), buf);
+       rb_snprintf(buf2, sizeof(buf2), "%s %s\n",
+                       smalldate(rb_current_time()), buf);
 
        if(fputs(buf2, logfile) < 0)
        {
                fclose(logfile);
                *log_table[dest].logfile = NULL;
+               return;
        }
 
        fflush(logfile);
@@ -207,11 +266,10 @@ report_operspy(struct Client *source_p, const char *token, const char *arg)
 }
 
 const char *
-smalldate(void)
+smalldate(time_t ltime)
 {
        static char buf[MAX_DATE_STRING];
        struct tm *lt;
-       time_t ltime = rb_current_time();
 
        lt = localtime(&ltime);