]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - scheduler/log.c
Update svn:keyword properties.
[thirdparty/cups.git] / scheduler / log.c
index df47885811a2ea3a93c7773bc46ec52437684009..0d49357364b91c74374256bd64eac30d90538007 100644 (file)
@@ -1,9 +1,9 @@
 /*
- * "$Id: log.c 7918 2008-09-08 22:03:01Z mike $"
+ * "$Id$"
  *
- *   Log file routines for the Common UNIX Printing System (CUPS).
+ *   Log file routines for the CUPS scheduler.
  *
- *   Copyright 2007-2009 by Apple Inc.
+ *   Copyright 2007-2012 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -14,6 +14,7 @@
  *
  * Contents:
  *
+ *   cupsdCheckLogFile()     - Open/rotate a log file if it needs it.
  *   cupsdGetDateTime()   - Returns a pointer to a date/time string.
  *   cupsdLogGSSMessage() - Log a GSSAPI error...
  *   cupsdLogJob()        - Log a job message.
@@ -21,7 +22,6 @@
  *   cupsdLogPage()       - Log a page to the page log file.
  *   cupsdLogRequest()    - Log an HTTP request in Common Log Format.
  *   cupsdWriteErrorLog() - Write a line to the ErrorLog.
- *   check_log_file()     - Open/rotate a log file if it needs it.
  *   format_log_line()    - Format a line for a log file.
  */
 
 static int     log_linesize = 0;       /* Size of line for output file */
 static char    *log_line = NULL;       /* Line for output file */
 
+#ifdef HAVE_VSYSLOG
+static const int syslevels[] =         /* SYSLOG levels... */
+               {
+                 0,
+                 LOG_EMERG,
+                 LOG_ALERT,
+                 LOG_CRIT,
+                 LOG_ERR,
+                 LOG_WARNING,
+                 LOG_NOTICE,
+                 LOG_INFO,
+                 LOG_DEBUG,
+                 LOG_DEBUG
+               };
+#endif /* HAVE_VSYSLOG */
+
 
 /*
  * Local functions...
  */
 
-static int     check_log_file(cups_file_t **lf, const char *logname);
 static int     format_log_line(const char *message, va_list ap);
 
 
+/*
+ * 'cupsdCheckLogFile()' - Open/rotate a log file if it needs it.
+ */
+
+int                                    /* O  - 1 if log file open */
+cupsdCheckLogFile(cups_file_t **lf,    /* IO - Log file */
+                 const char  *logname) /* I  - Log filename */
+{
+  char         backname[1024],         /* Backup log filename */
+               filename[1024],         /* Formatted log filename */
+               *ptr;                   /* Pointer into filename */
+  const char   *logptr;                /* Pointer into log filename */
+
+
+ /*
+  * See if we have a log file to check...
+  */
+
+  if (!lf || !logname || !logname[0])
+    return (1);
+
+ /*
+  * Format the filename as needed...
+  */
+
+  if (!*lf ||
+      (strncmp(logname, "/dev/", 5) && cupsFileTell(*lf) > MaxLogSize &&
+       MaxLogSize > 0))
+  {
+   /*
+    * Handle format strings...
+    */
+
+    filename[sizeof(filename) - 1] = '\0';
+
+    if (logname[0] != '/')
+    {
+      strlcpy(filename, ServerRoot, sizeof(filename));
+      strlcat(filename, "/", sizeof(filename));
+    }
+    else
+      filename[0] = '\0';
+
+    for (logptr = logname, ptr = filename + strlen(filename);
+         *logptr && ptr < (filename + sizeof(filename) - 1);
+        logptr ++)
+      if (*logptr == '%')
+      {
+       /*
+        * Format spec...
+       */
+
+        logptr ++;
+       if (*logptr == 's')
+       {
+        /*
+         * Insert the server name...
+         */
+
+         strlcpy(ptr, ServerName, sizeof(filename) - (ptr - filename));
+         ptr += strlen(ptr);
+       }
+        else
+       {
+        /*
+         * Otherwise just insert the character...
+         */
+
+         *ptr++ = *logptr;
+       }
+      }
+      else
+       *ptr++ = *logptr;
+
+    *ptr = '\0';
+  }
+
+ /*
+  * See if the log file is open...
+  */
+
+  if (!*lf)
+  {
+   /*
+    * Nope, open the log file...
+    */
+
+    if ((*lf = cupsFileOpen(filename, "a")) == NULL)
+    {
+     /*
+      * If the file is in CUPS_LOGDIR then try to create a missing directory...
+      */
+
+      if (!strncmp(filename, CUPS_LOGDIR, strlen(CUPS_LOGDIR)))
+      {
+       /*
+        * Try updating the permissions of the containing log directory, using
+       * the log file permissions as a basis...
+       */
+
+        int log_dir_perm = 0300 | LogFilePerm;
+                                       /* LogFilePerm + owner write/search */
+       if (log_dir_perm & 0040)
+         log_dir_perm |= 0010;         /* Add group search */
+       if (log_dir_perm & 0004)
+         log_dir_perm |= 0001;         /* Add other search */
+
+        cupsdCheckPermissions(CUPS_LOGDIR, NULL, log_dir_perm, RunUser, Group,
+                             1, -1);
+
+        *lf = cupsFileOpen(filename, "a");
+      }
+
+      if (*lf == NULL)
+      {
+       syslog(LOG_ERR, "Unable to open log file \"%s\" - %s", filename,
+              strerror(errno));
+
+        if (FatalErrors & CUPSD_FATAL_LOG)
+         cupsdEndProcess(getpid(), 0);
+
+       return (0);
+      }
+    }
+
+    if (strncmp(filename, "/dev/", 5))
+    {
+     /*
+      * Change ownership and permissions of non-device logs...
+      */
+
+      fchown(cupsFileNumber(*lf), RunUser, Group);
+      fchmod(cupsFileNumber(*lf), LogFilePerm);
+    }
+  }
+
+ /*
+  * Do we need to rotate the log?
+  */
+
+  if (strncmp(logname, "/dev/", 5) && cupsFileTell(*lf) > MaxLogSize &&
+      MaxLogSize > 0)
+  {
+   /*
+    * Rotate log file...
+    */
+
+    cupsFileClose(*lf);
+
+    strlcpy(backname, filename, sizeof(backname));
+    strlcat(backname, ".O", sizeof(backname));
+
+    unlink(backname);
+    rename(filename, backname);
+
+    if ((*lf = cupsFileOpen(filename, "a")) == NULL)
+    {
+      syslog(LOG_ERR, "Unable to open log file \"%s\" - %s", filename,
+             strerror(errno));
+
+      if (FatalErrors & CUPSD_FATAL_LOG)
+       cupsdEndProcess(getpid(), 0);
+
+      return (0);
+    }
+
+   /*
+    * Change ownership and permissions of non-device logs...
+    */
+
+    fchown(cupsFileNumber(*lf), RunUser, Group);
+    fchmod(cupsFileNumber(*lf), LogFilePerm);
+  }
+
+  return (1);
+}
+
+
 /*
  * 'cupsdGetDateTime()' - Returns a pointer to a date/time string.
  */
@@ -135,6 +328,52 @@ cupsdGetDateTime(struct timeval *t,        /* I - Time value or NULL for current */
 }
 
 
+/*
+ * 'cupsdLogFCMessage()' - Log a file checking message.
+ */
+
+void
+cupsdLogFCMessage(
+    void              *context,                /* I - Printer (if any) */
+    _cups_fc_result_t result,          /* I - Check result */
+    const char        *message)                /* I - Message to log */
+{
+  cupsd_printer_t      *p = (cupsd_printer_t *)context;
+                                       /* Printer */
+  cupsd_loglevel_t     level;          /* Log level */
+
+
+  if (result == _CUPS_FILE_CHECK_OK)
+    level = CUPSD_LOG_DEBUG2;
+  else
+    level = CUPSD_LOG_ERROR;
+
+  if (p)
+  {
+    cupsdLogMessage(level, "%s: %s", p->name, message);
+
+    if (result == _CUPS_FILE_CHECK_MISSING ||
+        result == _CUPS_FILE_CHECK_WRONG_TYPE)
+    {
+      strlcpy(p->state_message, message, sizeof(p->state_message));
+
+      if (cupsdSetPrinterReasons(p, "+cups-missing-filter-warning"))
+        cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE, p, NULL, "%s", message);
+    }
+    else if (result == _CUPS_FILE_CHECK_PERMISSIONS ||
+             result == _CUPS_FILE_CHECK_RELATIVE_PATH)
+    {
+      strlcpy(p->state_message, message, sizeof(p->state_message));
+
+      if (cupsdSetPrinterReasons(p, "+cups-insecure-filter-warning"))
+        cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE, p, NULL, "%s", message);
+    }
+  }
+  else
+    cupsdLogMessage(level, "%s", message);
+}
+
+
 #ifdef HAVE_GSSAPI
 /*
  * 'cupsdLogGSSMessage()' - Log a GSSAPI error...
@@ -156,7 +395,23 @@ cupsdLogGSSMessage(
                minor_status_string = GSS_C_EMPTY_BUFFER;
                                        /* Minor status message */
   int          ret;                    /* Return value */
+  char         buffer[8192];           /* Buffer for vsnprintf */
+
+
+  if (strchr(message, '%'))
+  {
+   /*
+    * Format the message string...
+    */
 
+    va_list    ap;                     /* Pointer to arguments */
+
+    va_start(ap, message);
+    vsnprintf(buffer, sizeof(buffer), message, ap);
+    va_end(ap);
+
+    message = buffer;
+  }
 
   msg_ctx             = 0;
   err_major_status    = gss_display_status(&err_minor_status,
@@ -191,7 +446,7 @@ cupsdLogJob(cupsd_job_t *job,               /* I - Job */
            const char  *message,       /* I - Printf-style message string */
            ...)                        /* I - Additional arguments as needed */
 {
-  va_list              ap;             /* Argument pointer */
+  va_list              ap, ap2;        /* Argument pointers */
   char                 jobmsg[1024];   /* Format string for job message */
   int                  status;         /* Formatting status */
 
@@ -200,25 +455,84 @@ cupsdLogJob(cupsd_job_t *job,             /* I - Job */
   * See if we want to log this message...
   */
 
-  if (TestConfigFile || level > LogLevel || !ErrorLog)
+  if (TestConfigFile || !ErrorLog)
+    return (1);
+
+  if ((level > LogLevel ||
+       (level == CUPSD_LOG_INFO && LogLevel < CUPSD_LOG_DEBUG)) &&
+      LogDebugHistory <= 0)
     return (1);
 
  /*
   * Format and write the log message...
   */
 
-  snprintf(jobmsg, sizeof(jobmsg), "[Job %d] %s", job->id, message);
+  if (job)
+    snprintf(jobmsg, sizeof(jobmsg), "[Job %d] %s", job->id, message);
+  else
+    strlcpy(jobmsg, message, sizeof(jobmsg));
+
+  va_start(ap, message);
 
   do
   {
-    va_start(ap, message);
-    status = format_log_line(jobmsg, ap);
-    va_end(ap);
+    va_copy(ap2, ap);
+    status = format_log_line(jobmsg, ap2);
+    va_end(ap2);
   }
   while (status == 0);
 
+  va_end(ap);
+
   if (status > 0)
-    return (cupsdWriteErrorLog(level, log_line));
+  {
+    if (job &&
+        (level > LogLevel ||
+         (level == CUPSD_LOG_INFO && LogLevel < CUPSD_LOG_DEBUG)) &&
+       LogDebugHistory > 0)
+    {
+     /*
+      * Add message to the job history...
+      */
+
+      cupsd_joblog_t *temp;            /* Copy of log message */
+
+
+      if ((temp = malloc(sizeof(cupsd_joblog_t) + strlen(log_line))) != NULL)
+      {
+        temp->time = time(NULL);
+       strlcpy(temp->message, log_line, sizeof(temp->message));
+      }
+
+      if (!job->history)
+       job->history = cupsArrayNew(NULL, NULL);
+
+      if (job->history && temp)
+      {
+       cupsArrayAdd(job->history, temp);
+
+       if (cupsArrayCount(job->history) > LogDebugHistory)
+       {
+        /*
+         * Remove excess messages...
+         */
+
+         temp = cupsArrayFirst(job->history);
+         cupsArrayRemove(job->history, temp);
+         free(temp);
+       }
+      }
+      else if (temp)
+       free(temp);
+
+      return (1);
+    }
+    else if (level <= LogLevel &&
+             (level != CUPSD_LOG_INFO || LogLevel >= CUPSD_LOG_DEBUG))
+      return (cupsdWriteErrorLog(level, log_line));
+    else
+      return (1);
+  }
   else
     return (cupsdWriteErrorLog(CUPSD_LOG_ERROR,
                                "Unable to allocate memory for log line!"));
@@ -234,7 +548,7 @@ cupsdLogMessage(int        level,   /* I - Log level */
                 const char *message,   /* I - printf-style message string */
                ...)                    /* I - Additional args as needed */
 {
-  va_list              ap;             /* Argument pointer */
+  va_list              ap, ap2;        /* Argument pointers */
   int                  status;         /* Formatting status */
 
 
@@ -242,15 +556,16 @@ cupsdLogMessage(int        level, /* I - Log level */
   * See if we want to log this message...
   */
 
-  if (TestConfigFile)
+  if ((TestConfigFile || !ErrorLog) && level <= CUPSD_LOG_WARN)
   {
-    if (level <= CUPSD_LOG_WARN)
-    {
-      va_start(ap, message);
-      vfprintf(stderr, message, ap);
-      putc('\n', stderr);
-      va_end(ap);
-    }
+    va_start(ap, message);
+#ifdef HAVE_VSYSLOG
+    vsyslog(LOG_LPR | syslevels[level], message, ap);
+#else
+    vfprintf(stderr, message, ap);
+    putc('\n', stderr);
+#endif /* HAVE_VSYSLOG */
+    va_end(ap);
 
     return (1);
   }
@@ -262,14 +577,18 @@ cupsdLogMessage(int        level, /* I - Log level */
   * Format and write the log message...
   */
 
+  va_start(ap, message);
+
   do
   {
-    va_start(ap, message);
-    status = format_log_line(message, ap);
-    va_end(ap);
+    va_copy(ap2, ap);
+    status = format_log_line(message, ap2);
+    va_end(ap2);
   }
   while (status == 0);
 
+  va_end(ap);
+
   if (status > 0)
     return (cupsdWriteErrorLog(level, log_line));
   else
@@ -293,8 +612,8 @@ cupsdLogPage(cupsd_job_t *job,              /* I - Job being printed */
   const char           *format,        /* Pointer into PageLogFormat */
                        *nameend;       /* End of attribute name */
   ipp_attribute_t      *attr;          /* Current attribute */
-  int                  number;         /* Page number */
-  char                 copies[256];    /* Number of copies */
+  char                 number[256];    /* Page number */
+  int                  copies;         /* Number of copies */
 
 
  /*
@@ -304,9 +623,9 @@ cupsdLogPage(cupsd_job_t *job,              /* I - Job being printed */
   if (!PageLogFormat)
     return (1);
 
-  number = 1;
-  strcpy(copies, "1");
-  sscanf(page, "%d%255s", &number, copies);
+  strlcpy(number, "1", sizeof(number));
+  copies = 1;
+  sscanf(page, "%255s%d", number, &copies);
 
   for (format = PageLogFormat, bufptr = buffer; *format; format ++)
   {
@@ -345,12 +664,12 @@ cupsdLogPage(cupsd_job_t *job,            /* I - Job being printed */
            break;
 
         case 'P' :                     /* Page number */
-           snprintf(bufptr, sizeof(buffer) - (bufptr - buffer), "%d", number);
+           strlcpy(bufptr, number, sizeof(buffer) - (bufptr - buffer));
            bufptr += strlen(bufptr);
            break;
 
         case 'C' :                     /* Number of copies */
-           strlcpy(bufptr, copies, sizeof(buffer) - (bufptr - buffer));
+           snprintf(bufptr, sizeof(buffer) - (bufptr - buffer), "%d", copies);
            bufptr += strlen(bufptr);
            break;
 
@@ -439,7 +758,7 @@ cupsdLogPage(cupsd_job_t *job,              /* I - Job being printed */
   }
 
   *bufptr = '\0';
-      
+
 #ifdef HAVE_VSYSLOG
  /*
   * See if we are logging pages via syslog...
@@ -457,7 +776,7 @@ cupsdLogPage(cupsd_job_t *job,              /* I - Job being printed */
   * Not using syslog; check the log file...
   */
 
-  if (!check_log_file(&PageFile, PageLog))
+  if (!cupsdCheckLogFile(&PageFile, PageLog))
     return (0);
 
  /*
@@ -509,7 +828,7 @@ cupsdLogRequest(cupsd_client_t *con,        /* I - Request to log */
   if (AccessLogLevel < CUPSD_ACCESSLOG_ALL)
   {
    /*
-    * Eliminate simple GET requests...
+    * Eliminate simple GET, POST, and PUT requests...
     */
 
     if ((con->operation == HTTP_GET &&
@@ -517,11 +836,13 @@ cupsdLogRequest(cupsd_client_t *con,      /* I - Request to log */
         strncmp(con->uri, "/admin/log", 10)) ||
        (con->operation == HTTP_POST && !con->request &&
         strncmp(con->uri, "/admin", 6)) ||
-       (con->operation != HTTP_POST && con->operation != HTTP_PUT))
+       (con->operation != HTTP_GET && con->operation != HTTP_POST &&
+        con->operation != HTTP_PUT))
       return (1);
 
     if (con->request && con->response &&
-        con->response->request.status.status_code < IPP_REDIRECTION_OTHER_SITE)
+        (con->response->request.status.status_code < IPP_REDIRECTION_OTHER_SITE ||
+        con->response->request.status.status_code == IPP_NOT_FOUND))
     {
      /*
       * Check successful requests...
@@ -599,7 +920,7 @@ cupsdLogRequest(cupsd_client_t *con,        /* I - Request to log */
         CUPSD_ACCESSLOG_ACTIONS,/* CUPS-Authenticate-Job */
         CUPSD_ACCESSLOG_ALL    /* CUPS-Get-PPD */
       };
-      
+
 
       if ((op <= IPP_SCHEDULE_JOB_AFTER && standard_ops[op] > AccessLogLevel) ||
           (op >= CUPS_GET_DEFAULT && op <= CUPS_GET_PPD &&
@@ -634,7 +955,7 @@ cupsdLogRequest(cupsd_client_t *con,        /* I - Request to log */
   * Not using syslog; check the log file...
   */
 
-  if (!check_log_file(&AccessFile, AccessLog))
+  if (!cupsdCheckLogFile(&AccessFile, AccessLog))
     return (0);
 
  /*
@@ -643,7 +964,8 @@ cupsdLogRequest(cupsd_client_t *con,        /* I - Request to log */
 
   cupsFilePrintf(AccessFile,
                  "%s - %s %s \"%s %s HTTP/%d.%d\" %d " CUPS_LLFMT " %s %s\n",
-                con->http.hostname, con->username[0] != '\0' ? con->username : "-",
+                con->http.hostname,
+                con->username[0] != '\0' ? con->username : "-",
                 cupsdGetDateTime(&(con->start), LogTimeFormat),
                 states[con->operation],
                 _httpEncodeURI(temp, con->uri, sizeof(temp)),
@@ -682,21 +1004,6 @@ cupsdWriteErrorLog(int        level,      /* I - Log level */
                  'D',
                  'd'
                };
-#ifdef HAVE_VSYSLOG
-  static const int     syslevels[] =   /* SYSLOG levels... */
-               {
-                 0,
-                 LOG_EMERG,
-                 LOG_ALERT,
-                 LOG_CRIT,
-                 LOG_ERR,
-                 LOG_WARNING,
-                 LOG_NOTICE,
-                 LOG_INFO,
-                 LOG_DEBUG,
-                 LOG_DEBUG
-               };
-#endif /* HAVE_VSYSLOG */
 
 
 #ifdef HAVE_VSYSLOG
@@ -715,7 +1022,7 @@ cupsdWriteErrorLog(int        level,       /* I - Log level */
   * Not using syslog; check the log file...
   */
 
-  if (!check_log_file(&ErrorFile, ErrorLog))
+  if (!cupsdCheckLogFile(&ErrorFile, ErrorLog))
     return (0);
 
  /*
@@ -730,184 +1037,6 @@ cupsdWriteErrorLog(int        level,     /* I - Log level */
 }
 
 
-/*
- * 'check_log_file()' - Open/rotate a log file if it needs it.
- */
-
-static int                             /* O  - 1 if log file open */
-check_log_file(cups_file_t **lf,       /* IO - Log file */
-              const char  *logname)    /* I  - Log filename */
-{
-  char         backname[1024],         /* Backup log filename */
-               filename[1024],         /* Formatted log filename */
-               *ptr;                   /* Pointer into filename */
-  const char   *logptr;                /* Pointer into log filename */
-
-
- /*
-  * See if we have a log file to check...
-  */
-
-  if (!lf || !logname || !logname[0])
-    return (1);
-
- /*
-  * Format the filename as needed...
-  */
-
-  if (!*lf ||
-      (strncmp(logname, "/dev/", 5) && cupsFileTell(*lf) > MaxLogSize &&
-       MaxLogSize > 0))
-  {
-   /*
-    * Handle format strings...
-    */
-
-    filename[sizeof(filename) - 1] = '\0';
-
-    if (logname[0] != '/')
-    {
-      strlcpy(filename, ServerRoot, sizeof(filename));
-      strlcat(filename, "/", sizeof(filename));
-    }
-    else
-      filename[0] = '\0';
-
-    for (logptr = logname, ptr = filename + strlen(filename);
-         *logptr && ptr < (filename + sizeof(filename) - 1);
-        logptr ++)
-      if (*logptr == '%')
-      {
-       /*
-        * Format spec...
-       */
-
-        logptr ++;
-       if (*logptr == 's')
-       {
-        /*
-         * Insert the server name...
-         */
-
-         strlcpy(ptr, ServerName, sizeof(filename) - (ptr - filename));
-         ptr += strlen(ptr);
-       }
-        else
-       {
-        /*
-         * Otherwise just insert the character...
-         */
-
-         *ptr++ = *logptr;
-       }
-      }
-      else
-       *ptr++ = *logptr;
-
-    *ptr = '\0';
-  }
-
- /*
-  * See if the log file is open...
-  */
-
-  if (!*lf)
-  {
-   /*
-    * Nope, open the log file...
-    */
-
-    if ((*lf = cupsFileOpen(filename, "a")) == NULL)
-    {
-     /*
-      * If the file is in CUPS_LOGDIR then try to create a missing directory...
-      */
-
-      if (!strncmp(filename, CUPS_LOGDIR, strlen(CUPS_LOGDIR)))
-      {
-       /*
-        * Try updating the permissions of the containing log directory, using
-       * the log file permissions as a basis...
-       */
-
-        int log_dir_perm = 0300 | LogFilePerm;
-                                       /* LogFilePerm + owner write/search */
-       if (log_dir_perm & 0040)
-         log_dir_perm |= 0010;         /* Add group search */
-       if (log_dir_perm & 0004)
-         log_dir_perm |= 0001;         /* Add other search */
-
-        cupsdCheckPermissions(CUPS_LOGDIR, NULL, log_dir_perm, RunUser, Group,
-                             1, -1);
-
-        *lf = cupsFileOpen(filename, "a");
-      }
-
-      if (*lf == NULL)
-      {
-       syslog(LOG_ERR, "Unable to open log file \"%s\" - %s", filename,
-              strerror(errno));
-
-        if (FatalErrors & CUPSD_FATAL_LOG)
-         cupsdEndProcess(getpid(), 0);
-
-       return (0);
-      }
-    }
-
-    if (strncmp(filename, "/dev/", 5))
-    {
-     /*
-      * Change ownership and permissions of non-device logs...
-      */
-
-      fchown(cupsFileNumber(*lf), RunUser, Group);
-      fchmod(cupsFileNumber(*lf), LogFilePerm);
-    }
-  }
-
- /*
-  * Do we need to rotate the log?
-  */
-
-  if (strncmp(logname, "/dev/", 5) && cupsFileTell(*lf) > MaxLogSize &&
-      MaxLogSize > 0)
-  {
-   /*
-    * Rotate log file...
-    */
-
-    cupsFileClose(*lf);
-
-    strcpy(backname, filename);
-    strlcat(backname, ".O", sizeof(backname));
-
-    unlink(backname);
-    rename(filename, backname);
-
-    if ((*lf = cupsFileOpen(filename, "a")) == NULL)
-    {
-      syslog(LOG_ERR, "Unable to open log file \"%s\" - %s", filename,
-             strerror(errno));
-
-      if (FatalErrors & CUPSD_FATAL_LOG)
-       cupsdEndProcess(getpid(), 0);
-
-      return (0);
-    }
-
-   /*
-    * Change ownership and permissions of non-device logs...
-    */
-
-    fchown(cupsFileNumber(*lf), RunUser, Group);
-    fchmod(cupsFileNumber(*lf), LogFilePerm);
-  }
-
-  return (1);
-}
-
-
 /*
  * 'format_log_line()' - Format a line for a log file.
  *
@@ -974,5 +1103,5 @@ format_log_line(const char *message,       /* I - Printf-style format string */
 
 
 /*
- * End of "$Id: log.c 7918 2008-09-08 22:03:01Z mike $".
+ * End of "$Id$".
  */