]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - src/logger.c
Add mr_flea (and Taros) to the list of Charybdis contributors.
[irc/rqf/shadowircd.git] / src / logger.c
index 56af880c22036ac18a4a3953eff77159a7f14afb..b6d3dccd490da1b040faa4f5a873cfe7eaadeaa5 100644 (file)
@@ -31,7 +31,6 @@
  * 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"
@@ -73,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
@@ -94,7 +138,10 @@ open_logfiles(void)
        {
                /* 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");
+               }
        }
 }                      
 
@@ -132,7 +179,8 @@ 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)
        {
@@ -218,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);