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