4c07778
diff -up cups-1.7.0/Makedefs.in.journal cups-1.7.0/Makedefs.in
4c07778
--- cups-1.7.0/Makedefs.in.journal	2013-10-24 16:35:59.103969053 +0100
4c07778
+++ cups-1.7.0/Makedefs.in	2013-10-24 16:35:59.175969379 +0100
4fb45e1
@@ -143,6 +143,7 @@ IPPFIND_BIN	=	@IPPFIND_BIN@
4fb45e1
 IPPFIND_MAN	=	@IPPFIND_MAN@
4fb45e1
 LAUNCHDLIBS	=	@LAUNCHDLIBS@
4fb45e1
 SDLIBS		=	@SDLIBS@
4fb45e1
+SDJLIBS		=	@SDJLIBS@
4fb45e1
 LDFLAGS		=	-L../cgi-bin -L../cups -L../filter -L../ppdc \
4fb45e1
 			-L../scheduler @LDARCHFLAGS@ \
4fb45e1
 			@LDFLAGS@ @RELROFLAGS@ @PIEFLAGS@ $(OPTIM)
4c07778
diff -up cups-1.7.0/config-scripts/cups-systemd.m4.journal cups-1.7.0/config-scripts/cups-systemd.m4
4c07778
--- cups-1.7.0/config-scripts/cups-systemd.m4.journal	2013-10-24 16:35:59.101969044 +0100
4c07778
+++ cups-1.7.0/config-scripts/cups-systemd.m4	2013-10-24 16:35:59.175969379 +0100
4fb45e1
@@ -22,6 +22,15 @@ if test "x$with_systemdsystemunitdir" !=
4fb45e1
 	fi
4fb45e1
 fi
4fb45e1
 
4fb45e1
+SDJLIBS=""
4fb45e1
+AC_MSG_CHECKING(for libsystemd-journal)
4fb45e1
+if $PKGCONFIG --exists libsystemd-journal; then
4fb45e1
+	AC_MSG_RESULT(yes)
4fb45e1
+	SDJLIBS=`$PKGCONFIG --libs libsystemd-journal`
4fb45e1
+	AC_DEFINE(HAVE_JOURNAL)
4fb45e1
+else
4fb45e1
+	AC_MSG_RESULT(no)
4fb45e1
+fi
4fb45e1
 if test -n "$with_systemdsystemunitdir" -a "x$with_systemdsystemunitdir" != xno ; then
4fb45e1
         SYSTEMD_UNITS="cups.service cups.socket cups.path"
4fb45e1
 else
4fb45e1
@@ -30,6 +39,7 @@ fi
4fb45e1
 
4fb45e1
 AC_SUBST(SYSTEMD_UNITS)
4fb45e1
 AC_SUBST(SDLIBS)
4fb45e1
+AC_SUBST(SDJLIBS)
4fb45e1
 
4fb45e1
 dnl
4fb45e1
 dnl "$Id$"
4c07778
diff -up cups-1.7.0/config.h.in.journal cups-1.7.0/config.h.in
4c07778
--- cups-1.7.0/config.h.in.journal	2013-10-24 16:35:59.101969044 +0100
4c07778
+++ cups-1.7.0/config.h.in	2013-10-24 16:35:59.176969383 +0100
4fb45e1
@@ -458,6 +458,13 @@
4fb45e1
 
4fb45e1
 
4fb45e1
 /*
4fb45e1
+ * Do we have systemd-journal support?
4fb45e1
+ */
4fb45e1
+
4fb45e1
+#undef HAVE_JOURNAL
4fb45e1
+
4fb45e1
+
4fb45e1
+/*
4fb45e1
  * Various scripting languages...
4fb45e1
  */
4fb45e1
 
4c07778
diff -up cups-1.7.0/scheduler/Makefile.journal cups-1.7.0/scheduler/Makefile
4c07778
--- cups-1.7.0/scheduler/Makefile.journal	2013-10-24 16:35:59.133969189 +0100
4c07778
+++ cups-1.7.0/scheduler/Makefile	2013-10-24 16:35:59.176969383 +0100
4fb45e1
@@ -383,7 +383,7 @@ cupsd:	$(CUPSDOBJS) $(LIBCUPSMIME) ../cu
4fb45e1
 	$(CC) $(LDFLAGS) -o cupsd $(CUPSDOBJS) -L. -lcupsmime \
4fb45e1
 		$(LIBZ) $(SSLLIBS) $(LIBSLP) $(LIBLDAP) $(PAMLIBS) \
4fb45e1
 		$(LIBPAPER) $(LIBMALLOC) $(SERVERLIBS) $(DNSSDLIBS) $(LIBS) \
4fb45e1
-		$(LIBGSSAPI) $(LIBWRAP) $(SDLIBS)
4fb45e1
+		$(LIBGSSAPI) $(LIBWRAP) $(SDLIBS) $(SDJLIBS)
4fb45e1
 
4fb45e1
 cupsd-static:	$(CUPSDOBJS) libcupsmime.a ../cups/$(LIBCUPSSTATIC)
4fb45e1
 	echo Linking $@...
4fb45e1
@@ -391,7 +391,7 @@ cupsd-static:	$(CUPSDOBJS) libcupsmime.a
4fb45e1
 		$(LIBZ) $(SSLLIBS) $(LIBSLP) $(LIBLDAP) $(PAMLIBS) \
4fb45e1
 		../cups/$(LIBCUPSSTATIC) $(COMMONLIBS) $(LIBZ) $(LIBPAPER) \
4fb45e1
 		$(LIBMALLOC) $(SERVERLIBS) $(DNSSDLIBS) $(LIBGSSAPI) \
4fb45e1
-		$(LIBWRAP)  $(SDLIBS)
4fb45e1
+		$(LIBWRAP)  $(SDLIBS) $(SDJLIBS)
4fb45e1
 
4fb45e1
 tls.o:	tls-darwin.c tls-gnutls.c tls-openssl.c
4fb45e1
 
4c07778
diff -up cups-1.7.0/scheduler/conf.c.journal cups-1.7.0/scheduler/conf.c
4c07778
--- cups-1.7.0/scheduler/conf.c.journal	2013-10-24 16:35:59.058968850 +0100
4c07778
+++ cups-1.7.0/scheduler/conf.c	2013-10-24 16:35:59.176969383 +0100
4fb45e1
@@ -973,9 +973,9 @@ cupsdReadConfiguration(void)
4fb45e1
   */
4fb45e1
 
4fb45e1
 #ifdef HAVE_VSYSLOG
4fb45e1
-  if (!strcmp(AccessLog, "syslog") ||
4fb45e1
-      !strcmp(ErrorLog, "syslog") ||
4fb45e1
-      !strcmp(PageLog, "syslog"))
4fb45e1
+  if (!strcmp(AccessLog, "syslog") || !strcmp(AccessLog, "journal") ||
4fb45e1
+      !strcmp(ErrorLog, "syslog") || !strcmp(ErrorLog, "journal") ||
4fb45e1
+      !strcmp(PageLog, "syslog") || !strcmp(PageLog, "journal"))
4fb45e1
     openlog("cupsd", LOG_PID | LOG_NOWAIT | LOG_NDELAY, LOG_LPR);
4fb45e1
 #endif /* HAVE_VSYSLOG */
4fb45e1
 
4fb45e1
@@ -983,13 +983,13 @@ cupsdReadConfiguration(void)
4fb45e1
   * Make sure each of the log files exists and gets rotated as necessary...
4fb45e1
   */
4fb45e1
 
4fb45e1
-  if (strcmp(AccessLog, "syslog"))
4fb45e1
+  if (strcmp(AccessLog, "syslog") && strcmp(AccessLog, "journal"))
4fb45e1
     cupsdCheckLogFile(&AccessFile, AccessLog);
4fb45e1
 
4fb45e1
-  if (strcmp(ErrorLog, "syslog"))
4fb45e1
+  if (strcmp(ErrorLog, "syslog") && strcmp(ErrorLog, "journal"))
4fb45e1
     cupsdCheckLogFile(&ErrorFile, ErrorLog);
4fb45e1
 
4fb45e1
-  if (strcmp(PageLog, "syslog"))
4fb45e1
+  if (strcmp(PageLog, "syslog") && strcmp(PageLog, "journal"))
4fb45e1
     cupsdCheckLogFile(&PageFile, PageLog);
4fb45e1
 
4fb45e1
  /*
4c07778
diff -up cups-1.7.0/scheduler/conf.h.journal cups-1.7.0/scheduler/conf.h
4c07778
--- cups-1.7.0/scheduler/conf.h.journal	2013-10-24 16:35:59.058968850 +0100
4c07778
+++ cups-1.7.0/scheduler/conf.h	2013-10-24 16:35:59.177969388 +0100
4fb45e1
@@ -297,6 +297,8 @@ extern int	cupsdLogMessage(int level, co
4fb45e1
 extern int	cupsdLogPage(cupsd_job_t *job, const char *page);
4fb45e1
 extern int	cupsdLogRequest(cupsd_client_t *con, http_status_t code);
4fb45e1
 extern int	cupsdReadConfiguration(void);
4fb45e1
+extern int	cupsdWriteErrorLogJob(cupsd_job_t *job, int level,
4fb45e1
+				      const char *message);
4fb45e1
 extern int	cupsdWriteErrorLog(int level, const char *message);
4fb45e1
 
4fb45e1
 
4c07778
diff -up cups-1.7.0/scheduler/job.c.journal cups-1.7.0/scheduler/job.c
4c07778
--- cups-1.7.0/scheduler/job.c.journal	2013-10-24 16:35:59.144969239 +0100
4c07778
+++ cups-1.7.0/scheduler/job.c	2013-10-24 16:35:59.178969392 +0100
4fb45e1
@@ -312,8 +312,7 @@ cupsdCheckJobs(void)
4fb45e1
 
4fb45e1
     if (job->kill_time && job->kill_time <= curtime)
4fb45e1
     {
4fb45e1
-      cupsdLogMessage(CUPSD_LOG_ERROR, "[Job %d] Stopping unresponsive job.",
4fb45e1
-		      job->id);
4fb45e1
+      cupsdLogJob(job, CUPSD_LOG_ERROR, "Stopping unresponsive job.");
4fb45e1
 
4fb45e1
       stop_job(job, CUPSD_JOB_FORCE);
4fb45e1
       continue;
4c07778
@@ -1699,7 +1698,7 @@ cupsdLoadJob(cupsd_job_t *job)		/* I - J
4fb45e1
   * Load job attributes...
4fb45e1
   */
4fb45e1
 
4fb45e1
-  cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Loading attributes...", job->id);
4fb45e1
+  cupsdLogJob(job, CUPSD_LOG_DEBUG, "Loading attributes...");
4fb45e1
 
4fb45e1
   snprintf(jobfile, sizeof(jobfile), "%s/c%05d", RequestRoot, job->id);
4fb45e1
   if ((fp = cupsdOpenConfFile(jobfile)) == NULL)
4c07778
@@ -1707,9 +1706,8 @@ cupsdLoadJob(cupsd_job_t *job)		/* I - J
4fb45e1
 
4fb45e1
   if (ippReadIO(fp, (ipp_iocb_t)cupsFileRead, 1, NULL, job->attrs) != IPP_DATA)
4fb45e1
   {
4fb45e1
-    cupsdLogMessage(CUPSD_LOG_ERROR,
4fb45e1
-		    "[Job %d] Unable to read job control file \"%s\".", job->id,
4fb45e1
-		    jobfile);
4fb45e1
+    cupsdLogJob(job, CUPSD_LOG_ERROR,
4fb45e1
+		"Unable to read job control file \"%s\".", jobfile);
4fb45e1
     cupsFileClose(fp);
4fb45e1
     goto error;
4fb45e1
   }
4c07778
@@ -1722,18 +1720,16 @@ cupsdLoadJob(cupsd_job_t *job)		/* I - J
4fb45e1
 
4fb45e1
   if (!ippFindAttribute(job->attrs, "time-at-creation", IPP_TAG_INTEGER))
4fb45e1
   {
4fb45e1
-    cupsdLogMessage(CUPSD_LOG_ERROR,
4fb45e1
-		    "[Job %d] Missing or bad time-at-creation attribute in "
4fb45e1
-		    "control file.", job->id);
4fb45e1
+    cupsdLogJob(job, CUPSD_LOG_ERROR,
4fb45e1
+		"Missing or bad time-at-creation attribute in control file.");
4fb45e1
     goto error;
4fb45e1
   }
4fb45e1
 
4fb45e1
   if ((job->state = ippFindAttribute(job->attrs, "job-state",
4fb45e1
                                      IPP_TAG_ENUM)) == NULL)
4fb45e1
   {
4fb45e1
-    cupsdLogMessage(CUPSD_LOG_ERROR,
4fb45e1
-		    "[Job %d] Missing or bad job-state attribute in control "
4fb45e1
-		    "file.", job->id);
4fb45e1
+    cupsdLogJob(job, CUPSD_LOG_ERROR,
4fb45e1
+		"Missing or bad job-state attribute in control file.");
4fb45e1
     goto error;
4fb45e1
   }
4fb45e1
 
4c07778
@@ -1773,18 +1769,17 @@ cupsdLoadJob(cupsd_job_t *job)		/* I - J
4fb45e1
     if ((attr = ippFindAttribute(job->attrs, "job-printer-uri",
4fb45e1
                                  IPP_TAG_URI)) == NULL)
4fb45e1
     {
4fb45e1
-      cupsdLogMessage(CUPSD_LOG_ERROR,
4fb45e1
-		      "[Job %d] No job-printer-uri attribute in control file.",
4fb45e1
-		      job->id);
4fb45e1
+      cupsdLogJob(job, CUPSD_LOG_ERROR,
4fb45e1
+		  "No job-printer-uri attribute in control file.");
4fb45e1
       goto error;
4fb45e1
     }
4fb45e1
 
4fb45e1
     if ((dest = cupsdValidateDest(attr->values[0].string.text, &(job->dtype),
4fb45e1
                                   &destptr)) == NULL)
4fb45e1
     {
4fb45e1
-      cupsdLogMessage(CUPSD_LOG_ERROR,
4fb45e1
-		      "[Job %d] Unable to queue job for destination \"%s\".",
4fb45e1
-		      job->id, attr->values[0].string.text);
4fb45e1
+      cupsdLogJob(job, CUPSD_LOG_ERROR,
4fb45e1
+		  "Unable to queue job for destination \"%s\".",
4fb45e1
+		  attr->values[0].string.text);
4fb45e1
       goto error;
4fb45e1
     }
4fb45e1
 
4c07778
@@ -1792,9 +1787,9 @@ cupsdLoadJob(cupsd_job_t *job)		/* I - J
4fb45e1
   }
4fb45e1
   else if ((destptr = cupsdFindDest(job->dest)) == NULL)
4fb45e1
   {
4fb45e1
-    cupsdLogMessage(CUPSD_LOG_ERROR,
4fb45e1
-		    "[Job %d] Unable to queue job for destination \"%s\".",
4fb45e1
-		    job->id, job->dest);
4fb45e1
+    cupsdLogJob(job, CUPSD_LOG_ERROR,
4fb45e1
+		"Unable to queue job for destination \"%s\".",
4fb45e1
+		job->dest);
4fb45e1
     goto error;
4fb45e1
   }
4fb45e1
 
4c07778
@@ -1803,9 +1798,8 @@ cupsdLoadJob(cupsd_job_t *job)		/* I - J
4fb45e1
   {
4fb45e1
     const char	*reason;		/* job-state-reason keyword */
4fb45e1
 
4fb45e1
-    cupsdLogMessage(CUPSD_LOG_DEBUG,
4fb45e1
-		    "[Job %d] Adding missing job-state-reasons attribute to "
4fb45e1
-		    " control file.", job->id);
4fb45e1
+    cupsdLogJob(job, CUPSD_LOG_DEBUG,
4fb45e1
+		"Adding missing job-state-reasons attribute to  control file.");
4fb45e1
 
4fb45e1
     switch (job->state_value)
4fb45e1
     {
4c07778
@@ -1870,9 +1864,8 @@ cupsdLoadJob(cupsd_job_t *job)		/* I - J
4fb45e1
     if ((attr = ippFindAttribute(job->attrs, "job-priority",
4fb45e1
                         	 IPP_TAG_INTEGER)) == NULL)
4fb45e1
     {
4fb45e1
-      cupsdLogMessage(CUPSD_LOG_ERROR,
4fb45e1
-		      "[Job %d] Missing or bad job-priority attribute in "
4fb45e1
-		      "control file.", job->id);
4fb45e1
+      cupsdLogJob(job, CUPSD_LOG_ERROR,
4fb45e1
+		  "Missing or bad job-priority attribute in control file.");
4fb45e1
       goto error;
4fb45e1
     }
4fb45e1
 
4c07778
@@ -1884,9 +1877,9 @@ cupsdLoadJob(cupsd_job_t *job)		/* I - J
4fb45e1
     if ((attr = ippFindAttribute(job->attrs, "job-originating-user-name",
4fb45e1
                         	 IPP_TAG_NAME)) == NULL)
4fb45e1
     {
4fb45e1
-      cupsdLogMessage(CUPSD_LOG_ERROR,
4fb45e1
-		      "[Job %d] Missing or bad job-originating-user-name "
4fb45e1
-		      "attribute in control file.", job->id);
4fb45e1
+      cupsdLogJob(job, CUPSD_LOG_ERROR,
4fb45e1
+		  "Missing or bad job-originating-user-name "
4fb45e1
+		  "attribute in control file.");
4fb45e1
       goto error;
4fb45e1
     }
4fb45e1
 
4c07778
@@ -1931,9 +1924,8 @@ cupsdLoadJob(cupsd_job_t *job)		/* I - J
4fb45e1
       if (access(jobfile, 0))
4fb45e1
         break;
4fb45e1
 
4fb45e1
-      cupsdLogMessage(CUPSD_LOG_DEBUG,
4fb45e1
-		      "[Job %d] Auto-typing document file \"%s\"...", job->id,
4fb45e1
-		      jobfile);
4fb45e1
+      cupsdLogJob(job, CUPSD_LOG_DEBUG,
4fb45e1
+		  "Auto-typing document file \"%s\"...", jobfile);
4fb45e1
 
4fb45e1
       if (fileid > job->num_files)
4fb45e1
       {
4c07778
@@ -1959,9 +1951,8 @@ cupsdLoadJob(cupsd_job_t *job)		/* I - J
4fb45e1
 
4fb45e1
         if (!compressions || !filetypes)
4fb45e1
 	{
4fb45e1
-          cupsdLogMessage(CUPSD_LOG_ERROR,
4fb45e1
-	                  "[Job %d] Ran out of memory for job file types.",
4fb45e1
-			  job->id);
4fb45e1
+          cupsdLogJob(job, CUPSD_LOG_ERROR,
4fb45e1
+		      "Ran out of memory for job file types.");
4fb45e1
 
4fb45e1
 	  ippDelete(job->attrs);
4fb45e1
 	  job->attrs = NULL;
4c07778
@@ -2269,8 +2260,7 @@ cupsdSaveJob(cupsd_job_t *job)		/* I - J
4fb45e1
   if (ippWriteIO(fp, (ipp_iocb_t)cupsFileWrite, 1, NULL,
4fb45e1
                  job->attrs) != IPP_DATA)
4fb45e1
   {
4fb45e1
-    cupsdLogMessage(CUPSD_LOG_ERROR,
4fb45e1
-                    "[Job %d] Unable to write job control file.", job->id);
4fb45e1
+    cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to write job control file.");
4fb45e1
     cupsFileClose(fp);
4fb45e1
     return;
4fb45e1
   }
4c07778
@@ -2947,15 +2937,15 @@ dump_job_history(cupsd_job_t *job)	/* I
4fb45e1
   snprintf(temp, sizeof(temp),
4fb45e1
            "[Job %d] The following messages were recorded from %s to %s",
4fb45e1
            job->id, start, end);
4fb45e1
-  cupsdWriteErrorLog(CUPSD_LOG_DEBUG, temp);
4fb45e1
+  cupsdWriteErrorLogJob(job, CUPSD_LOG_DEBUG, temp);
4fb45e1
 
4fb45e1
   for (message = (cupsd_joblog_t *)cupsArrayFirst(job->history);
4fb45e1
        message;
4fb45e1
        message = (cupsd_joblog_t *)cupsArrayNext(job->history))
4fb45e1
-    cupsdWriteErrorLog(CUPSD_LOG_DEBUG, message->message);
4fb45e1
+    cupsdWriteErrorLogJob(job, CUPSD_LOG_DEBUG, message->message);
4fb45e1
 
4fb45e1
   snprintf(temp, sizeof(temp), "[Job %d] End of messages", job->id);
4fb45e1
-  cupsdWriteErrorLog(CUPSD_LOG_DEBUG, temp);
4fb45e1
+  cupsdWriteErrorLogJob(job, CUPSD_LOG_DEBUG, temp);
4fb45e1
 
4fb45e1
  /*
4fb45e1
   * Log the printer state values...
4c07778
@@ -2971,11 +2961,11 @@ dump_job_history(cupsd_job_t *job)	/* I
4fb45e1
 	     printer->state == IPP_PRINTER_IDLE ? "idle" :
4fb45e1
 	         printer->state == IPP_PRINTER_PROCESSING ? "processing" :
4fb45e1
 		 "stopped");
4fb45e1
-    cupsdWriteErrorLog(CUPSD_LOG_DEBUG, temp);
4fb45e1
+    cupsdWriteErrorLogJob(job, CUPSD_LOG_DEBUG, temp);
4fb45e1
 
4fb45e1
     snprintf(temp, sizeof(temp), "[Job %d] printer-state-message=\"%s\"",
4fb45e1
              job->id, printer->state_message);
4fb45e1
-    cupsdWriteErrorLog(CUPSD_LOG_DEBUG, temp);
4fb45e1
+    cupsdWriteErrorLogJob(job, CUPSD_LOG_DEBUG, temp);
4fb45e1
 
4fb45e1
     snprintf(temp, sizeof(temp), "[Job %d] printer-state-reasons=", job->id);
4fb45e1
     ptr = temp + strlen(temp);
4c07778
@@ -2994,7 +2984,7 @@ dump_job_history(cupsd_job_t *job)	/* I
4fb45e1
 	ptr += strlen(ptr);
4fb45e1
       }
4fb45e1
     }
4fb45e1
-    cupsdWriteErrorLog(CUPSD_LOG_DEBUG, temp);
4fb45e1
+    cupsdWriteErrorLogJob(job, CUPSD_LOG_DEBUG, temp);
4fb45e1
   }
4fb45e1
 
4fb45e1
  /*
4c07778
@@ -4135,8 +4125,7 @@ load_job_cache(const char *filename)	/*
4fb45e1
       job->status_pipes[0] = -1;
4fb45e1
       job->status_pipes[1] = -1;
4fb45e1
 
4fb45e1
-      cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Loading from cache...",
4fb45e1
-                      job->id);
4fb45e1
+      cupsdLogJob(job, CUPSD_LOG_DEBUG, "Loading from cache...");
4fb45e1
     }
4fb45e1
     else if (!job)
4fb45e1
     {
4c07778
@@ -4205,8 +4194,7 @@ load_job_cache(const char *filename)	/*
4fb45e1
 	         job->id);
4fb45e1
         if (access(jobfile, 0))
4fb45e1
 	{
4fb45e1
-	  cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Data files have gone away.",
4fb45e1
-	                  job->id);
4fb45e1
+	  cupsdLogJob(job, CUPSD_LOG_INFO, "Data files have gone away.");
4fb45e1
           job->num_files = 0;
4fb45e1
 	  continue;
4fb45e1
 	}
4c07778
@@ -4216,9 +4204,9 @@ load_job_cache(const char *filename)	/*
4fb45e1
 
4fb45e1
         if (!job->filetypes || !job->compressions)
4fb45e1
 	{
4fb45e1
-	  cupsdLogMessage(CUPSD_LOG_EMERG,
4fb45e1
-		          "[Job %d] Unable to allocate memory for %d files.",
4fb45e1
-		          job->id, job->num_files);
4fb45e1
+	  cupsdLogJob(job, CUPSD_LOG_EMERG,
4fb45e1
+		      "Unable to allocate memory for %d files.",
4fb45e1
+		      job->num_files);
4fb45e1
           break;
4fb45e1
 	}
4fb45e1
       }
4c07778
@@ -4256,9 +4244,9 @@ load_job_cache(const char *filename)	/*
4fb45e1
         * If the original MIME type is unknown, auto-type it!
4fb45e1
 	*/
4fb45e1
 
4fb45e1
-        cupsdLogMessage(CUPSD_LOG_ERROR,
4fb45e1
-		        "[Job %d] Unknown MIME type %s/%s for file %d.",
4fb45e1
-		        job->id, super, type, number + 1);
4fb45e1
+        cupsdLogJob(job, CUPSD_LOG_ERROR,
4fb45e1
+		    "Unknown MIME type %s/%s for file %d.",
4fb45e1
+		    super, type, number + 1);
4fb45e1
 
4fb45e1
         snprintf(jobfile, sizeof(jobfile), "%s/d%05d-%03d", RequestRoot,
4fb45e1
 	         job->id, number + 1);
4c07778
@@ -4770,7 +4758,7 @@ unload_job(cupsd_job_t *job)		/* I - Job
4fb45e1
   if (!job->attrs)
4fb45e1
     return;
4fb45e1
 
4fb45e1
-  cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Unloading...", job->id);
4fb45e1
+  cupsdLogJob(job, CUPSD_LOG_DEBUG, "Unloading...");
4fb45e1
 
4fb45e1
   ippDelete(job->attrs);
4fb45e1
 
4c07778
diff -up cups-1.7.0/scheduler/log.c.journal cups-1.7.0/scheduler/log.c
4c07778
--- cups-1.7.0/scheduler/log.c.journal	2013-10-24 16:35:59.083968963 +0100
4c07778
+++ cups-1.7.0/scheduler/log.c	2013-10-24 16:38:02.352526508 +0100
4fb45e1
@@ -21,6 +21,7 @@
4fb45e1
  *   cupsdLogMessage()    - Log a message to the error log file.
4fb45e1
  *   cupsdLogPage()       - Log a page to the page log file.
4fb45e1
  *   cupsdLogRequest()    - Log an HTTP request in Common Log Format.
4fb45e1
+ *   cupsdWriteErrorLogJob() - Write a job message to the ErrorLog.
4fb45e1
  *   cupsdWriteErrorLog() - Write a line to the ErrorLog.
4fb45e1
  *   format_log_line()    - Format a line for a log file.
4fb45e1
  */
4fb45e1
@@ -35,6 +36,9 @@
4fb45e1
 #include <sys/types.h>
4fb45e1
 #include <sys/stat.h>
4fb45e1
 #include <unistd.h>
4fb45e1
+#ifdef HAVE_JOURNAL
4fb45e1
+# include <systemd/sd-journal.h>
4fb45e1
+#endif /* HAVE_JOURNAL */
4fb45e1
 
4fb45e1
 
4fb45e1
 /*
4fb45e1
@@ -558,8 +562,17 @@ cupsdLogJob(cupsd_job_t *job,		/* I - Jo
4fb45e1
     }
4fb45e1
     else if (level <= LogLevel &&
4fb45e1
              (level != CUPSD_LOG_INFO || LogLevel >= CUPSD_LOG_DEBUG))
4fb45e1
-      return (cupsdWriteErrorLog(level, log_line));
4fb45e1
-    else
4fb45e1
+    {
4fb45e1
+      if (!strcmp (ErrorLog, "journal"))
4fb45e1
+#ifdef HAVE_JOURNAL
4fb45e1
+	return (sd_journal_send ("MESSAGE=%s", log_line,
4fb45e1
+				 "PRIORITY=%d", syslevels[level],
4fb45e1
+				 "CUPS_JOB_ID=%d", job ? job->id : -1,
4fb45e1
+				 NULL)) ? 0 : 1;
4fb45e1
+      else
4fb45e1
+#endif /* HAVE_JOURNAL */
4fb45e1
+	return (cupsdWriteErrorLog(level, log_line));
4fb45e1
+    } else
4fb45e1
       return (1);
4fb45e1
   }
4fb45e1
   else
4fb45e1
@@ -788,6 +801,15 @@ cupsdLogPage(cupsd_job_t *job,		/* I - J
4fb45e1
 
4fb45e1
   *bufptr = '\0';
4fb45e1
 
4fb45e1
+#ifdef HAVE_JOURNAL
4fb45e1
+  if (!strcmp(PageLog, "journal"))
4fb45e1
+    return (sd_journal_send ("MESSAGE=%s", buffer,
4fb45e1
+			     "PRIORITY=%d", LOG_INFO,
4fb45e1
+			     "CUPS_JOB_ID=%d", job->id,
4c07778
+			     "CUPS_PAGE_NUMBER=%s", number,
4fb45e1
+			     NULL) ? 0 : 1);
4fb45e1
+#endif /* HAVE_JOURNAL */
4fb45e1
+
4fb45e1
 #ifdef HAVE_VSYSLOG
4fb45e1
  /*
4fb45e1
   * See if we are logging pages via syslog...
4fb45e1
@@ -963,7 +985,7 @@ cupsdLogRequest(cupsd_client_t *con,	/*
4fb45e1
   * See if we are logging accesses via syslog...
4fb45e1
   */
4fb45e1
 
4fb45e1
-  if (!strcmp(AccessLog, "syslog"))
4fb45e1
+  if (!strcmp(AccessLog, "syslog") || !strcmp(AccessLog, "journal"))
4fb45e1
   {
4fb45e1
     syslog(LOG_INFO,
4fb45e1
            "REQUEST %s - %s \"%s %s HTTP/%d.%d\" %d " CUPS_LLFMT " %s %s\n",
4c07778
@@ -1017,8 +1039,9 @@ cupsdLogRequest(cupsd_client_t *con,	/*
4fb45e1
  */
4fb45e1
 
4fb45e1
 int					/* O - 1 on success, 0 on failure */
4fb45e1
-cupsdWriteErrorLog(int        level,	/* I - Log level */
4fb45e1
-                   const char *message)	/* I - Message string */
4fb45e1
+cupsdWriteErrorLogJob(cupsd_job_t *job,	/* I - Job or NULL */
4fb45e1
+		      int          level, /* I - Log level */
4fb45e1
+		      const char  *message) /* I - Message string */
4fb45e1
 {
4fb45e1
   static const char	levels[] =	/* Log levels... */
4fb45e1
 		{
4c07778
@@ -1035,12 +1058,25 @@ cupsdWriteErrorLog(int        level,	/*
4fb45e1
 		};
4fb45e1
 
4fb45e1
 
4fb45e1
+#ifdef HAVE_JOURNAL
4fb45e1
+  if (!strcmp(ErrorLog, "journal"))
4fb45e1
+  {
4fb45e1
+    if (job)
4fb45e1
+    {
4c07778
+      return (sd_journal_send ("MESSAGE=%s", message,
4fb45e1
+			       "PRIORITY=%d", syslevels[level],
4fb45e1
+			       "CUPS_JOB_ID=%d", job->id,
4fb45e1
+			       NULL) ? 0 : 1);
4fb45e1
+    } else
618d1c8
+      return (sd_journal_print (syslevels[level], "%s", message) ? 0 : 1);
4fb45e1
+  }
4fb45e1
+#endif /* HAVE_JOURNAL */
4fb45e1
 #ifdef HAVE_VSYSLOG
4fb45e1
  /*
4fb45e1
   * See if we are logging errors via syslog...
4fb45e1
   */
4fb45e1
 
4fb45e1
-  if (!strcmp(ErrorLog, "syslog"))
4fb45e1
+  if (!strcmp(ErrorLog, "syslog") || !strcmp(ErrorLog, "journal"))
4fb45e1
   {
4fb45e1
     syslog(syslevels[level], "%s", message);
4fb45e1
     return (1);
4c07778
@@ -1066,6 +1102,18 @@ cupsdWriteErrorLog(int        level,	/*
4fb45e1
 }
4fb45e1
 
4fb45e1
 
4fb45e1
+/*
4fb45e1
+ * 'cupsdWriteErrorLog()' - Write a line to the ErrorLog.
4fb45e1
+ */
4fb45e1
+
4fb45e1
+int					/* O - 1 on success, 0 on failure */
4fb45e1
+cupsdWriteErrorLog(int          level,	/* I - Log level */
4fb45e1
+		   const char  *message) /* I - Message string */
4fb45e1
+{
4fb45e1
+  return (cupsdWriteErrorLogJob(NULL, level, message));
4fb45e1
+}
4fb45e1
+
4fb45e1
+
4fb45e1
 /*
4fb45e1
  * 'format_log_line()' - Format a line for a log file.
4fb45e1
  *