/*
- * "$Id: job.c 7005 2007-10-01 23:45:48Z mike $"
+ * "$Id: job.c 7682 2008-06-21 00:06:02Z mike $"
*
* Job management routines for the Common UNIX Printing System (CUPS).
*
* cupsdCheckJobs() - Check the pending jobs and start any if
* the destination is available.
* cupsdCleanJobs() - Clean out old jobs.
+ * cupsdDeleteJob() - Free all memory used by a job.
* cupsdFinishJob() - Finish a job.
* cupsdFreeAllJobs() - Free all jobs from memory.
* cupsdFindJob() - Find the specified job.
* compare_active_jobs() - Compare the job IDs and priorities of two
* jobs.
* compare_jobs() - Compare the job IDs of two jobs.
- * free_job() - Free all memory used by a job.
* ipp_length() - Compute the size of the buffer needed to
* hold the textual IPP attributes.
* load_job_cache() - Load jobs from the job.cache file.
static int compare_active_jobs(void *first, void *second, void *data);
static int compare_jobs(void *first, void *second, void *data);
-static void free_job(cupsd_job_t *job);
static int ipp_length(ipp_t *ipp);
static void load_job_cache(const char *filename);
static void load_next_job_id(const char *filename);
static void start_job(cupsd_job_t *job, cupsd_printer_t *printer);
static void unload_job(cupsd_job_t *job);
static void update_job(cupsd_job_t *job);
-static void update_job_attrs(cupsd_job_t *job);
+static void update_job_attrs(cupsd_job_t *job, int do_message);
/*
cupsdExpireSubscriptions(NULL, job);
/*
- * Remove the job from the active list...
+ * Remove the job from the active and printing lists...
*/
cupsArrayRemove(ActiveJobs, job);
+ cupsArrayRemove(PrintingJobs, job);
/*
* Remove any authentication data...
* Save job state info...
*/
- cupsdSaveJob(job);
+ job->dirty = 1;
+ cupsdMarkDirty(CUPSD_DIRTY_JOBS);
}
else
{
* Free all memory used...
*/
- free_job(job);
+ cupsdDeleteJob(job);
}
+
+ cupsdSetBusyState();
}
cupsd_job_t *job; /* Current job in queue */
cupsd_printer_t *printer, /* Printer destination */
*pclass; /* Printer class destination */
+ ipp_attribute_t *attr; /* Job attribute */
DEBUG_puts("cupsdCheckJobs()");
*/
cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdCheckJobs: Job %d: state_value=%d, loaded=%s",
- job->id, job->state_value, job->attrs ? "yes" : "no");
+ "cupsdCheckJobs: Job %d: dest=%s, dtype=%x, "
+ "state_value=%d, loaded=%s", job->id, job->dest, job->dtype,
+ job->state_value, job->attrs ? "yes" : "no");
if (job->state_value == IPP_JOB_HELD &&
job->hold_until &&
job->state->values[0].integer = IPP_JOB_PENDING;
job->state_value = IPP_JOB_PENDING;
+
+ if ((attr = ippFindAttribute(job->attrs, "job-hold-until",
+ IPP_TAG_KEYWORD)) == NULL)
+ attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME);
+
+ if (attr)
+ {
+ attr->value_tag = IPP_TAG_KEYWORD;
+ cupsdSetString(&(attr->values[0].string.text), "no-hold");
+ job->dirty = 1;
+ cupsdMarkDirty(CUPSD_DIRTY_JOBS);
+ }
}
/*
* cancel the job...
*/
- cupsdLogMessage(CUPSD_LOG_WARN,
- "[Job %d] Printer/class %s has gone away; canceling job!",
- job->id, job->dest);
+ cupsdLogJob(job, CUPSD_LOG_WARN,
+ "Printer/class %s has gone away; canceling job!",
+ job->dest);
cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job,
"Job canceled because the destination printer/class has "
* so that we know which printer actually printed the job...
*/
- ipp_attribute_t *attr; /* job-actual-printer-uri attribute */
-
-
if ((attr = ippFindAttribute(job->attrs, "job-actual-printer-uri",
IPP_TAG_URI)) != NULL)
cupsdSetString(&attr->values[0].string.text, printer->uri);
else
ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI,
"job-actual-printer-uri", NULL, printer->uri);
+
+ job->dirty = 1;
+ cupsdMarkDirty(CUPSD_DIRTY_JOBS);
}
if ((!(printer->type & CUPS_PRINTER_DISCOVERED) && /* Printer is local */
}
+/*
+ * 'cupsdDeleteJob()' - Free all memory used by a job.
+ */
+
+void
+cupsdDeleteJob(cupsd_job_t *job) /* I - Job */
+{
+ cupsdClearString(&job->username);
+ cupsdClearString(&job->dest);
+ cupsdClearString(&job->auth_username);
+ cupsdClearString(&job->auth_domain);
+ cupsdClearString(&job->auth_password);
+
+#ifdef HAVE_GSSAPI
+ /*
+ * Destroy the credential cache and clear the KRB5CCNAME env var string.
+ */
+
+ if (job->ccache)
+ {
+ krb5_cc_destroy(KerberosContext, job->ccache);
+ job->ccache = NULL;
+ }
+
+ cupsdClearString(&job->ccname);
+#endif /* HAVE_GSSAPI */
+
+ if (job->num_files > 0)
+ {
+ free(job->compressions);
+ free(job->filetypes);
+ }
+
+ ippDelete(job->attrs);
+
+ free(job);
+}
+
+
/*
* 'cupsdFinishJob()' - Finish a job.
*/
ipp_attribute_t *attr; /* job-hold-until attribute */
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] File %d is complete.",
- job->id, job->current_file - 1);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "File %d is complete.",
+ job->current_file - 1);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Job %d] cupsdFinishJob: job->status is %d",
- job->id, job->status);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2,
+ "cupsdFinishJob: job->status is %d",
+ job->status);
if (job->status_buffer &&
(job->status < 0 || job->current_file >= job->num_files))
cupsdRemoveSelect(job->status_buffer->fd);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Job %d] cupsdFinishJob: Closing status pipes [ %d %d ]...",
- job->id, job->status_pipes[0], job->status_pipes[1]);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2,
+ "cupsdFinishJob: Closing status pipes [ %d %d ]...",
+ job->status_pipes[0], job->status_pipes[1]);
cupsdClosePipe(job->status_pipes);
cupsdStatBufDelete(job->status_buffer);
printer = job->printer;
- update_job_attrs(job);
+ update_job_attrs(job, 0);
if (job->status < 0)
{
else
exit_code = job->status;
- cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Backend returned status %d (%s)",
- job->id, exit_code,
- exit_code == CUPS_BACKEND_FAILED ? "failed" :
- exit_code == CUPS_BACKEND_AUTH_REQUIRED ?
- "authentication required" :
- exit_code == CUPS_BACKEND_HOLD ? "hold job" :
- exit_code == CUPS_BACKEND_STOP ? "stop printer" :
- exit_code == CUPS_BACKEND_CANCEL ? "cancel job" :
- exit_code < 0 ? "crashed" : "unknown");
+ cupsdLogJob(job, CUPSD_LOG_INFO, "Backend returned status %d (%s)",
+ exit_code,
+ exit_code == CUPS_BACKEND_FAILED ? "failed" :
+ exit_code == CUPS_BACKEND_AUTH_REQUIRED ?
+ "authentication required" :
+ exit_code == CUPS_BACKEND_HOLD ? "hold job" :
+ exit_code == CUPS_BACKEND_STOP ? "stop printer" :
+ exit_code == CUPS_BACKEND_CANCEL ? "cancel job" :
+ exit_code < 0 ? "crashed" : "unknown");
/*
* Do what needs to be done...
job->state_value = IPP_JOB_PENDING;
}
- cupsdSaveJob(job);
+ job->dirty = 1;
+ cupsdMarkDirty(CUPSD_DIRTY_JOBS);
/*
- * If the job was queued to a class, try requeuing it... For
- * faxes and retry-job queues, hold the current job for 5 minutes.
+ * If the job was queued to a class or the error policy is
+ * "retry-current-job", try requeuing it... For faxes and retry-job
+ * queues, hold the current job for 5 minutes.
*/
- if (job->dtype & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT))
+ if ((job->dtype & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT)) ||
+ !strcmp(printer->error_policy, "retry-current-job"))
cupsdCheckJobs();
else if ((printer->type & CUPS_PRINTER_FAX) ||
!strcmp(printer->error_policy, "retry-job"))
* Too many tries...
*/
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Canceling job since it could not be "
- "sent after %d tries.",
- job->id, JobRetryLimit);
+ cupsdLogJob(job, CUPSD_LOG_ERROR,
+ "Canceling job since it could not be "
+ "sent after %d tries.",
+ JobRetryLimit);
cupsdCancelJob(job, 0, IPP_JOB_ABORTED);
}
job->state->values[0].integer = IPP_JOB_HELD;
job->state_value = IPP_JOB_HELD;
- cupsdSaveJob(job);
+ job->dirty = 1;
+ cupsdMarkDirty(CUPSD_DIRTY_JOBS);
cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, printer, job,
"Job held due to backend errors; please consult "
job->state->values[0].integer = IPP_JOB_PENDING;
job->state_value = IPP_JOB_PENDING;
- cupsdSaveJob(job);
+ job->dirty = 1;
+ cupsdMarkDirty(CUPSD_DIRTY_JOBS);
+
cupsdSetPrinterState(printer, IPP_PRINTER_STOPPED, 1);
cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, printer, job,
job->state->values[0].integer = IPP_JOB_HELD;
job->state_value = IPP_JOB_HELD;
- cupsdSaveJob(job);
+ job->dirty = 1;
+ cupsdMarkDirty(CUPSD_DIRTY_JOBS);
cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, printer, job,
"Authentication is required for job %d.", job->id);
* Filter had errors; stop job...
*/
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Job stopped due to filter errors.", job->id);
+ cupsdLogJob(job, CUPSD_LOG_ERROR, "Job stopped due to filter errors.");
cupsdStopJob(job, 1);
- cupsdSaveJob(job);
+ job->dirty = 1;
+ cupsdMarkDirty(CUPSD_DIRTY_JOBS);
cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, printer, job,
"Job stopped due to filter errors; please consult the "
"error_log file for details.");
* Close out this job...
*/
- cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Completed successfully.",
- job->id);
+ cupsdLogJob(job, CUPSD_LOG_INFO, "Completed successfully.");
cupsdCancelJob(job, 0, IPP_JOB_COMPLETED);
cupsdCheckJobs();
}
{
cupsArrayRemove(Jobs, job);
cupsArrayRemove(ActiveJobs, job);
+ cupsArrayRemove(PrintingJobs, job);
- free_job(job);
+ cupsdDeleteJob(job);
}
cupsdReleaseSignals();
job->state_value = IPP_JOB_HELD;
job->current_file = 0;
- cupsdSaveJob(job);
-
- cupsdCheckJobs();
+ job->dirty = 1;
+ cupsdMarkDirty(CUPSD_DIRTY_JOBS);
}
if (!ActiveJobs)
ActiveJobs = cupsArrayNew(compare_active_jobs, NULL);
+ if (!PrintingJobs)
+ PrintingJobs = cupsArrayNew(compare_jobs, NULL);
+
/*
* See whether the job.cache file is older than the RequestRoot directory...
*/
if ((job->attrs = ippNew()) == NULL)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Ran out of memory for job attributes!", job->id);
+ cupsdLogJob(job, CUPSD_LOG_ERROR, "Ran out of memory for job attributes!");
return;
}
* 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 = cupsFileOpen(jobfile, "r")) == NULL)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Unable to open job control file \"%s\" - %s!",
- job->id, jobfile, strerror(errno));
+ cupsdLogJob(job, CUPSD_LOG_ERROR,
+ "Unable to open job control file \"%s\" - %s!",
+ jobfile, strerror(errno));
ippDelete(job->attrs);
job->attrs = NULL;
return;
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);
ippDelete(job->attrs);
job->attrs = NULL;
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!");
ippDelete(job->attrs);
job->attrs = NULL;
unlink(jobfile);
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!");
ippDelete(job->attrs);
job->attrs = NULL;
unlink(jobfile);
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);
ippDelete(job->attrs);
job->attrs = NULL;
unlink(jobfile);
}
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);
ippDelete(job->attrs);
job->attrs = NULL;
unlink(jobfile);
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!");
ippDelete(job->attrs);
job->attrs = NULL;
unlink(jobfile);
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!");
ippDelete(job->attrs);
job->attrs = NULL;
unlink(jobfile);
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)
{
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!");
return;
}
"Job #%d moved from %s to %s.", job->id, olddest,
p->name);
- cupsdSaveJob(job);
+ job->dirty = 1;
+ cupsdMarkDirty(CUPSD_DIRTY_JOBS);
}
if (job->state_value == IPP_JOB_HELD)
{
+ /*
+ * Add trailing banner as needed...
+ */
+
+ if (job->pending_timeout)
+ cupsdTimeoutJob(job);
+
DEBUG_puts("cupsdReleaseJob: setting state to pending...");
job->state->values[0].integer = IPP_JOB_PENDING;
job->state_value = IPP_JOB_PENDING;
- cupsdSaveJob(job);
- cupsdCheckJobs();
+ job->dirty = 1;
+ cupsdMarkDirty(CUPSD_DIRTY_JOBS);
}
}
job->state->values[0].integer = IPP_JOB_PENDING;
job->state_value = IPP_JOB_PENDING;
- cupsdSaveJob(job);
+ job->dirty = 1;
+ cupsdMarkDirty(CUPSD_DIRTY_JOBS);
if (old_state > IPP_JOB_STOPPED)
cupsArrayAdd(ActiveJobs, job);
-
- cupsdCheckJobs();
}
}
if ((fp = cupsFileOpen(filename, "w")) == NULL)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Unable to create job control file \"%s\" - %s.",
- job->id, filename, strerror(errno));
+ cupsdLogJob(job, CUPSD_LOG_ERROR,
+ "Unable to create job control file \"%s\" - %s.",
+ filename, strerror(errno));
return;
}
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);
+
+ job->dirty = 0;
}
cupsArrayAdd(ActiveJobs, job);
- cupsdSaveJob(job);
+ job->dirty = 1;
+ cupsdMarkDirty(CUPSD_DIRTY_JOBS);
}
int i; /* Looping var */
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Job %d] cupsdStopJob: force = %d", job->id, force);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2, "cupsdStopJob: force = %d", force);
if (job->state_value != IPP_JOB_PROCESSING)
return;
cupsdDestroyProfile(job->profile);
job->profile = NULL;
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "[Job %d] Closing print pipes [ %d %d ]...",
- job->id, job->print_pipes[0], job->print_pipes[1]);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2, "Closing print pipes [ %d %d ]...",
+ job->print_pipes[0], job->print_pipes[1]);
cupsdClosePipe(job->print_pipes);
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "[Job %d] Closing back pipes [ %d %d ]...",
- job->id, job->back_pipes[0], job->back_pipes[1]);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2, "Closing back pipes [ %d %d ]...",
+ job->back_pipes[0], job->back_pipes[1]);
cupsdClosePipe(job->back_pipes);
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "[Job %d] Closing side pipes [ %d %d ]...",
- job->id, job->side_pipes[0], job->side_pipes[1]);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2, "Closing side pipes [ %d %d ]...",
+ job->side_pipes[0], job->side_pipes[1]);
cupsdClosePipe(job->side_pipes);
cupsdRemoveSelect(job->status_buffer->fd);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Job %d] Closing status pipes [ %d %d ]...", job->id,
- job->status_pipes[0], job->status_pipes[1]);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2, "Closing status pipes [ %d %d ]...",
+ job->status_pipes[0], job->status_pipes[1]);
cupsdClosePipe(job->status_pipes);
cupsdStatBufDelete(job->status_buffer);
job = (cupsd_job_t *)cupsArrayNext(Jobs))
if (job->attrs && job->state_value >= IPP_JOB_STOPPED &&
job->access_time < expire)
+ {
+ if (job->dirty)
+ cupsdSaveJob(job);
+
unload_job(job);
+ }
}
}
-/*
- * 'free_job()' - Free all memory used by a job.
- */
-
-static void
-free_job(cupsd_job_t *job) /* I - Job */
-{
- cupsdClearString(&job->username);
- cupsdClearString(&job->dest);
- cupsdClearString(&job->auth_username);
- cupsdClearString(&job->auth_domain);
- cupsdClearString(&job->auth_password);
-
-#ifdef HAVE_GSSAPI
- /*
- * Destroy the credential cache and clear the KRB5CCNAME env var string.
- */
-
- if (job->ccache)
- {
- krb5_cc_destroy(KerberosContext, job->ccache);
- job->ccache = NULL;
- }
-
- cupsdClearString(&job->ccname);
-#endif /* HAVE_GSSAPI */
-
- if (job->num_files > 0)
- {
- free(job->compressions);
- free(job->filetypes);
- }
-
- ippDelete(job->attrs);
-
- free(job);
-}
-
-
/*
* 'ipp_length()' - Compute the size of the buffer needed to hold
* the textual IPP attributes.
if (!job)
{
cupsdLogMessage(CUPSD_LOG_EMERG,
- "[Job %d] Unable to allocate memory for job!", jobid);
+ "[Job %d] Unable to allocate memory for job!", jobid);
break;
}
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)
{
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;
}
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;
}
}
* 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);
*/
if (attr == NULL)
- attr = ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_KEYWORD,
- "job-hold-until", NULL, holdstr);
+ ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_KEYWORD, "job-hold-until",
+ NULL, holdstr);
else
cupsdSetString(&attr->values[0].string.text, holdstr);
- cupsdSaveJob(job);
+ job->dirty = 1;
+ cupsdMarkDirty(CUPSD_DIRTY_JOBS);
}
static int optlength = 0; /* Length of option buffer */
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "[Job %d] start_job: file = %d/%d",
- job->id, job->current_file, job->num_files);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2, "start_job: file = %d/%d",
+ job->current_file, job->num_files);
if (job->num_files == 0)
{
- cupsdLogMessage(CUPSD_LOG_ERROR, "[Job %d] No files, canceling job!",
- job->id);
-
+ cupsdLogJob(job, CUPSD_LOG_ERROR, "No files, canceling job!");
cupsdCancelJob(job, 0, IPP_JOB_ABORTED);
return;
}
* filtering...
*/
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Job %d] Sending job to queue tagged as raw...", job->id);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "Sending job to queue tagged as raw...");
filters = NULL;
}
if (!filters)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Unable to convert file %d to printable format!",
- job->current_file, job->id);
+ cupsdLogJob(job, CUPSD_LOG_ERROR,
+ "Unable to convert file %d to printable format!",
+ job->current_file);
cupsdLogMessage(CUPSD_LOG_INFO,
- "Hint: Do you have ESP Ghostscript installed?");
+ "Hint: Do you have Ghostscript installed?");
if (LogLevel < CUPSD_LOG_DEBUG)
cupsdLogMessage(CUPSD_LOG_INFO,
cupsArrayDelete(filters);
- cupsdLogMessage(CUPSD_LOG_INFO,
- "[Job %d] Holding because filter limit has been reached.",
- job->id);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Job %d] start_job: file=%d, cost=%d, level=%d, limit=%d",
- job->id, job->current_file, job->cost, FilterLevel,
- FilterLimit);
+ cupsdLogJob(job, CUPSD_LOG_INFO,
+ "Holding because filter limit has been reached.");
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2,
+ "start_job: file=%d, cost=%d, level=%d, limit=%d",
+ job->current_file, job->cost, FilterLevel,
+ FilterLimit);
return;
}
if (!cupsArrayInsert(filters, &gziptoany_filter))
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Unable to add decompression filter - %s",
- job->id, strerror(errno));
+ cupsdLogJob(job, CUPSD_LOG_ERROR,
+ "Unable to add decompression filter - %s", strerror(errno));
cupsArrayDelete(filters);
if (!filters)
filters = cupsArrayNew(NULL, NULL);
+ port_monitor.src = NULL;
+ port_monitor.dst = NULL;
+ port_monitor.cost = 0;
+
+ snprintf(port_monitor.filter, sizeof(port_monitor.filter),
+ "%s/monitor/%s", ServerBin, printer->port_monitor);
+
if (!cupsArrayAdd(filters, &port_monitor))
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Unable to add port monitor - %s",
- job->id, strerror(errno));
+ cupsdLogJob(job, CUPSD_LOG_ERROR,
+ "Unable to add port monitor - %s", strerror(errno));
cupsArrayDelete(filters);
return;
}
+ }
- snprintf(port_monitor.filter, sizeof(port_monitor.filter),
- "%s/monitor/%s", ServerBin, printer->port_monitor);
+ /*
+ * Make sure we don't go over the "MAX_FILTERS" limit...
+ */
+
+ if (cupsArrayCount(filters) > MAX_FILTERS)
+ {
+ cupsdLogJob(job, CUPSD_LOG_ERROR,
+ "Too many filters (%d > %d), unable to print!",
+ cupsArrayCount(filters), MAX_FILTERS);
+
+ cupsArrayDelete(filters);
+ cupsdCancelJob(job, 0, IPP_JOB_STOPPED);
+
+ return;
}
/*
if (job->current_file == 0)
{
+ /*
+ * Add to the printing list...
+ */
+
+ cupsArrayAdd(PrintingJobs, job);
+ cupsdSetBusyState();
+
/*
* Set the processing time...
*/
if (job->job_sheets == NULL)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] No job-sheets attribute.",
- job->id);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "No job-sheets attribute.");
if ((job->job_sheets =
ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_ZERO)) != NULL)
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Job %d] ... but someone added one without setting "
- "job_sheets!", job->id);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG,
+ "... but someone added one without setting job_sheets!");
}
else if (job->job_sheets->num_values == 1)
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] job-sheets=%s", job->id,
- job->job_sheets->values[0].string.text);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "job-sheets=%s",
+ job->job_sheets->values[0].string.text);
else
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] job-sheets=%s,%s", job->id,
- job->job_sheets->values[0].string.text,
- job->job_sheets->values[1].string.text);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "job-sheets=%s,%s",
+ job->job_sheets->values[0].string.text,
+ job->job_sheets->values[1].string.text);
if (printer->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT))
banner_page = 0;
else
banner_page = 0;
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] banner_page = %d", job->id,
- banner_page);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "banner_page = %d", banner_page);
/*
* Building the options string is harder than it needs to be, but
i = ipp_length(job->attrs);
- if (i > optlength)
+ if (i > optlength || !options)
{
if (optlength == 0)
optptr = malloc(i);
if (optptr == NULL)
{
- cupsdLogMessage(CUPSD_LOG_CRIT,
- "[Job %d] Unable to allocate %d bytes for option buffer!",
- job->id, i);
+ cupsdLogJob(job, CUPSD_LOG_CRIT,
+ "Unable to allocate %d bytes for option buffer!", i);
cupsArrayDelete(filters);
continue;
if (!strncmp(attr->name, "job-", 4) && strcmp(attr->name, "job-uuid") &&
+ strcmp(attr->name, "job-impressions") &&
+ strcmp(attr->name, "job-originating-host-name") &&
!(printer->type & CUPS_PRINTER_REMOTE))
continue;
if (!strncmp(attr->name, "job-", 4) &&
strcmp(attr->name, "job-uuid") &&
strcmp(attr->name, "job-billing") &&
+ strcmp(attr->name, "job-impressions") &&
strcmp(attr->name, "job-sheets") &&
strcmp(attr->name, "job-hold-until") &&
strcmp(attr->name, "job-priority"))
continue;
- if ((!strcmp(attr->name, "page-label") ||
+ if ((!strcmp(attr->name, "job-impressions") ||
+ !strcmp(attr->name, "page-label") ||
!strcmp(attr->name, "page-border") ||
!strncmp(attr->name, "number-up", 9) ||
!strcmp(attr->name, "page-ranges") ||
}
for (i = 0; argv[i]; i ++)
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Job %d] argv[%d]=\"%s\"", job->id, i, argv[i]);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG,
+ "argv[%d]=\"%s\"", i, argv[i]);
/*
* Create environment variable strings for the filters...
envp[envc ++] = device_uri;
envp[envc ++] = printer_name;
- if (!printer->remote && !printer->raw &&
- (filter = (mime_filter_t *)cupsArrayLast(filters)) != NULL &&
- filter->dst)
+ if (!printer->remote && !printer->raw)
{
- snprintf(final_content_type, sizeof(final_content_type),
- "FINAL_CONTENT_TYPE=%s/%s",
- filter->dst->super, filter->dst->type);
- envp[envc ++] = final_content_type;
+ filter = (mime_filter_t *)cupsArrayLast(filters);
+
+ if (printer->port_monitor)
+ filter = (mime_filter_t *)cupsArrayPrev(filters);
+
+ if (filter && filter->dst)
+ {
+ snprintf(final_content_type, sizeof(final_content_type),
+ "FINAL_CONTENT_TYPE=%s/%s",
+ filter->dst->super, filter->dst->type);
+ envp[envc ++] = final_content_type;
+ }
}
if (Classification && !banner_page)
envp[envc] = NULL;
for (i = 0; i < envc; i ++)
- if (!strncmp(envp[i], "CUPSD_AUTH_", 5))
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] envp[%d]=\"CUPSD_AUTH_%c****\"",
- job->id, i, envp[i][5]);
+ if (!strncmp(envp[i], "AUTH_", 5))
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "envp[%d]=\"AUTH_%c****\"", i,
+ envp[i][5]);
else if (strncmp(envp[i], "DEVICE_URI=", 11))
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] envp[%d]=\"%s\"",
- job->id, i, envp[i]);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "envp[%d]=\"%s\"", i, envp[i]);
else
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] envp[%d]=\"DEVICE_URI=%s\"",
- job->id, i, sani_uri);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "envp[%d]=\"DEVICE_URI=%s\"", i,
+ sani_uri);
if (printer->remote)
job->current_file = job->num_files;
{
if (cupsdOpenPipe(job->status_pipes))
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Unable to create job status pipes - %s.",
- job->id, strerror(errno));
+ cupsdLogJob(job, CUPSD_LOG_ERROR,
+ "Unable to create job status pipes - %s.", strerror(errno));
snprintf(printer->state_message, sizeof(printer->state_message),
"Unable to create status pipes - %s.", strerror(errno));
goto abort_job;
}
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Job %d] start_job: status_pipes = [ %d %d ]",
- job->id, job->status_pipes[0], job->status_pipes[1]);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2,
+ "start_job: status_pipes = [ %d %d ]",
+ job->status_pipes[0], job->status_pipes[1]);
- job->status_buffer = cupsdStatBufNew(job->status_pipes[0], "[Job %d]",
- job->id);
+ job->status_buffer = cupsdStatBufNew(job->status_pipes[0], NULL);
job->status_level = CUPSD_LOG_INFO;
}
{
if (cupsdOpenPipe(filterfds[slot]))
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Unable to create job filter pipes - %s.",
- job->id, strerror(errno));
+ cupsdLogJob(job, CUPSD_LOG_ERROR,
+ "Unable to create job filter pipes - %s.", strerror(errno));
snprintf(printer->state_message, sizeof(printer->state_message),
"Unable to create filter pipes - %s.", strerror(errno));
cupsdAddPrinterHistory(printer);
{
if (cupsdOpenPipe(job->print_pipes))
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Unable to create job backend pipes - %s.",
- job->id, strerror(errno));
+ cupsdLogJob(job, CUPSD_LOG_ERROR,
+ "Unable to create job backend pipes - %s.",
+ strerror(errno));
snprintf(printer->state_message, sizeof(printer->state_message),
"Unable to create backend pipes - %s.", strerror(errno));
cupsdAddPrinterHistory(printer);
if (job->print_pipes[1] < 0)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Unable to open output file \"%s\" - %s.",
- job->id, printer->device_uri, strerror(errno));
+ cupsdLogJob(job, CUPSD_LOG_ERROR,
+ "Unable to open output file \"%s\" - %s.",
+ printer->device_uri, strerror(errno));
snprintf(printer->state_message, sizeof(printer->state_message),
"Unable to open output file \"%s\" - %s.",
printer->device_uri, strerror(errno));
}
}
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Job %d] start_job: print_pipes = [ %d %d ]",
- job->id, job->print_pipes[0], job->print_pipes[1]);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2,
+ "start_job: print_pipes = [ %d %d ]",
+ job->print_pipes[0], job->print_pipes[1]);
}
filterfds[slot][0] = job->print_pipes[0];
filterfds[slot][1] = job->print_pipes[1];
}
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "[Job %d] start_job: filter=\"%s\"",
- job->id, command);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Job %d] start_job: filterfds[%d]=[ %d %d ]",
- job->id, slot, filterfds[slot][0], filterfds[slot][1]);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2, "start_job: filter=\"%s\"", command);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2, "start_job: filterfds[%d]=[ %d %d ]",
+ slot, filterfds[slot][0], filterfds[slot][1]);
pid = cupsdStartProcess(command, argv, envp, filterfds[!slot][0],
filterfds[slot][1], job->status_pipes[1],
job->back_pipes[0], job->side_pipes[0], 0,
job->profile, job->filters + i);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Job %d] start_job: Closing filter pipes for slot %d "
- "[ %d %d ]...",
- job->id, !slot, filterfds[!slot][0], filterfds[!slot][1]);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2,
+ "start_job: Closing filter pipes for slot %d [ %d %d ]...",
+ !slot, filterfds[!slot][0], filterfds[!slot][1]);
cupsdClosePipe(filterfds[!slot]);
if (pid == 0)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Unable to start filter \"%s\" - %s.",
- job->id, filter->filter, strerror(errno));
+ cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to start filter \"%s\" - %s.",
+ filter->filter, strerror(errno));
snprintf(printer->state_message, sizeof(printer->state_message),
"Unable to start filter \"%s\" - %s.",
filter->filter, strerror(errno));
goto abort_job;
}
- cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Started filter %s (PID %d)",
- job->id, command, pid);
+ cupsdLogJob(job, CUPSD_LOG_INFO, "Started filter %s (PID %d)", command,
+ pid);
argv[6] = NULL;
slot = !slot;
}
cupsArrayDelete(filters);
+ filters = NULL;
/*
* Finally, pipe the final output into a backend process if needed...
if (strncmp(printer->device_uri, "file:", 5) != 0)
{
- if (job->current_file == 1)
+ if (job->current_file == 1 || printer->remote)
{
sscanf(printer->device_uri, "%254[^:]", method);
snprintf(command, sizeof(command), "%s/backend/%s", ServerBin, method);
filterfds[slot][0] = -1;
filterfds[slot][1] = -1;
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "[Job %d] start_job: backend=\"%s\"",
- job->id, command);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Job %d] start_job: filterfds[%d] = [ %d %d ]", job->id,
- slot, filterfds[slot][0], filterfds[slot][1]);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2, "start_job: backend=\"%s\"", command);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2, "start_job: filterfds[%d] = [ %d %d ]",
+ slot, filterfds[slot][0], filterfds[slot][1]);
pid = cupsdStartProcess(command, argv, envp, filterfds[!slot][0],
filterfds[slot][1], job->status_pipes[1],
if (pid == 0)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Unable to start backend \"%s\" - %s.",
- job->id, method, strerror(errno));
+ cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to start backend \"%s\" - %s.",
+ method, strerror(errno));
snprintf(printer->state_message, sizeof(printer->state_message),
"Unable to start backend \"%s\" - %s.", method,
strerror(errno));
}
else
{
- cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Started backend %s (PID %d)",
- job->id, command, pid);
+ cupsdLogJob(job, CUPSD_LOG_INFO, "Started backend %s (PID %d)",
+ command, pid);
}
}
if (job->current_file == job->num_files)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Job %d] start_job: Closing print pipes [ %d %d ]...",
- job->id, job->print_pipes[0], job->print_pipes[1]);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2,
+ "start_job: Closing print pipes [ %d %d ]...",
+ job->print_pipes[0], job->print_pipes[1]);
cupsdClosePipe(job->print_pipes);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Job %d] start_job: Closing back pipes [ %d %d ]...",
- job->id, job->back_pipes[0], job->back_pipes[1]);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2,
+ "start_job: Closing back pipes [ %d %d ]...",
+ job->back_pipes[0], job->back_pipes[1]);
cupsdClosePipe(job->back_pipes);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Job %d] start_job: Closing side pipes [ %d %d ]...",
- job->id, job->side_pipes[0], job->side_pipes[1]);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2,
+ "start_job: Closing side pipes [ %d %d ]...",
+ job->side_pipes[0], job->side_pipes[1]);
cupsdClosePipe(job->side_pipes);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Job %d] start_job: Closing status output pipe %d...",
- job->id, job->status_pipes[1]);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2,
+ "start_job: Closing status output pipe %d...",
+ job->status_pipes[1]);
close(job->status_pipes[1]);
job->status_pipes[1] = -1;
if (job->current_file == job->num_files)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Job %d] start_job: Closing print pipes [ %d %d ]...",
- job->id, job->print_pipes[0], job->print_pipes[1]);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2,
+ "start_job: Closing print pipes [ %d %d ]...",
+ job->print_pipes[0], job->print_pipes[1]);
cupsdClosePipe(job->print_pipes);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Job %d] start_job: Closing status output pipe %d...",
- job->id, job->status_pipes[1]);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2,
+ "start_job: Closing status output pipe %d...",
+ job->status_pipes[1]);
close(job->status_pipes[1]);
job->status_pipes[1] = -1;
}
}
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Job %d] start_job: Closing filter pipes for slot %d "
- "[ %d %d ]...",
- job->id, slot, filterfds[slot][0], filterfds[slot][1]);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2,
+ "start_job: Closing filter pipes for slot %d [ %d %d ]...",
+ slot, filterfds[slot][0], filterfds[slot][1]);
cupsdClosePipe(filterfds[slot]);
if (printer->remote && job->num_files > 1)
for (slot = 0; slot < 2; slot ++)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Job %d] start_job: Closing filter pipes for slot %d "
- "[ %d %d ]...",
- job->id, slot, filterfds[slot][0], filterfds[slot][1]);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2,
+ "start_job: Closing filter pipes for slot %d [ %d %d ]...",
+ slot, filterfds[slot][0], filterfds[slot][1]);
cupsdClosePipe(filterfds[slot]);
}
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Job %d] start_job: Closing status pipes [ %d %d ]...",
- job->id, job->status_pipes[0], job->status_pipes[1]);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2,
+ "start_job: Closing status pipes [ %d %d ]...",
+ job->status_pipes[0], job->status_pipes[1]);
cupsdClosePipe(job->status_pipes);
cupsdStatBufDelete(job->status_buffer);
if (!job->attrs)
return;
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Unloading...", job->id);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "Unloading...");
ippDelete(job->attrs);
* job sheet count...
*/
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "PAGE: %s", message);
+
if (job->sheets)
{
if (!strncasecmp(message, "total ", 6))
* Quota limit exceeded, cancel job in progress immediately...
*/
- cupsdLogMessage(CUPSD_LOG_INFO,
- "[Job %d] Canceled because pages exceed user %s "
- "quota limit on printer %s (%s).",
- job->id, job->username, job->printer->name,
- job->printer->info);
+ cupsdLogJob(job, CUPSD_LOG_INFO,
+ "Canceled because pages exceed user %s "
+ "quota limit on printer %s (%s).",
+ job->username, job->printer->name,
+ job->printer->info);
cupsdCancelJob(job, 1, IPP_JOB_CANCELED);
return;
}
else if (loglevel == CUPSD_LOG_STATE)
{
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "STATE: %s", message);
+
if (!strcmp(message, "paused"))
{
cupsdStopPrinter(job->printer, 1);
{
cupsdSetPrinterReasons(job->printer, message);
cupsdAddPrinterHistory(job->printer);
- event |= CUPSD_EVENT_PRINTER_STATE_CHANGED;
+ event |= CUPSD_EVENT_PRINTER_STATE;
}
- update_job_attrs(job);
+ update_job_attrs(job, 0);
}
else if (loglevel == CUPSD_LOG_ATTR)
{
const char *attr; /* Attribute */
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "ATTR: %s", message);
+
num_attrs = cupsParseOptions(message, 0, &attrs);
if ((attr = cupsGetOption("auth-info-required", num_attrs,
{
cupsdSetAuthInfoRequired(job->printer, attr, NULL);
cupsdSetPrinterAttrs(job->printer);
- cupsdSaveAllPrinters();
+
+ if (job->printer->type & CUPS_PRINTER_DISCOVERED)
+ cupsdMarkDirty(CUPSD_DIRTY_REMOTE);
+ else
+ cupsdMarkDirty(CUPSD_DIRTY_PRINTERS);
}
if ((attr = cupsGetOption("printer-alert", num_attrs, attrs)) != NULL)
{
cupsdSetString(&job->printer->alert, attr);
- event |= CUPSD_EVENT_PRINTER_STATE_CHANGED;
+ event |= CUPSD_EVENT_PRINTER_STATE;
}
if ((attr = cupsGetOption("printer-alert-description", num_attrs,
attrs)) != NULL)
{
cupsdSetString(&job->printer->alert_description, attr);
- event |= CUPSD_EVENT_PRINTER_STATE_CHANGED;
+ event |= CUPSD_EVENT_PRINTER_STATE;
+ }
+
+ if ((attr = cupsGetOption("marker-colors", num_attrs, attrs)) != NULL)
+ {
+ cupsdSetPrinterAttr(job->printer, "marker-colors", (char *)attr);
+ job->printer->marker_time = time(NULL);
+ event |= CUPSD_EVENT_PRINTER_STATE;
+ }
+
+ if ((attr = cupsGetOption("marker-levels", num_attrs, attrs)) != NULL)
+ {
+ cupsdSetPrinterAttr(job->printer, "marker-levels", (char *)attr);
+ job->printer->marker_time = time(NULL);
+ event |= CUPSD_EVENT_PRINTER_STATE;
+ }
+
+ if ((attr = cupsGetOption("marker-message", num_attrs, attrs)) != NULL)
+ {
+ cupsdSetPrinterAttr(job->printer, "marker-message", (char *)attr);
+ job->printer->marker_time = time(NULL);
+ event |= CUPSD_EVENT_PRINTER_STATE;
+ }
+
+ if ((attr = cupsGetOption("marker-names", num_attrs, attrs)) != NULL)
+ {
+ cupsdSetPrinterAttr(job->printer, "marker-names", (char *)attr);
+ job->printer->marker_time = time(NULL);
+ event |= CUPSD_EVENT_PRINTER_STATE;
+ }
+
+ if ((attr = cupsGetOption("marker-types", num_attrs, attrs)) != NULL)
+ {
+ cupsdSetPrinterAttr(job->printer, "marker-types", (char *)attr);
+ job->printer->marker_time = time(NULL);
+ event |= CUPSD_EVENT_PRINTER_STATE;
}
cupsFreeOptions(num_attrs, attrs);
}
+ else if (loglevel == CUPSD_LOG_PPD)
+ {
+ /*
+ * Set attribute(s)...
+ */
+
+ int num_keywords; /* Number of keywords */
+ cups_option_t *keywords; /* Keywords */
+
+
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "PPD: %s", message);
+
+ num_keywords = cupsParseOptions(message, 0, &keywords);
+
+ if (cupsdUpdatePrinterPPD(job->printer, num_keywords, keywords))
+ cupsdSetPrinterAttrs(job->printer);
+
+ cupsFreeOptions(num_keywords, keywords);
+ }
#ifdef __APPLE__
else if (!strncmp(message, "recoverable:", 12))
{
cupsdSetString(&job->printer->recoverable, ptr);
cupsdAddPrinterHistory(job->printer);
- event |= CUPSD_EVENT_PRINTER_STATE_CHANGED;
+ event |= CUPSD_EVENT_PRINTER_STATE;
}
else if (!strncmp(message, "recovered:", 10))
{
cupsdSetString(&job->printer->recoverable, ptr);
cupsdAddPrinterHistory(job->printer);
- event |= CUPSD_EVENT_PRINTER_STATE_CHANGED;
+ event |= CUPSD_EVENT_PRINTER_STATE;
}
#endif /* __APPLE__ */
- else if (loglevel <= job->status_level)
+ else
{
- /*
- * Some message to show in the printer-state-message attribute...
- */
+ cupsdLogJob(job, loglevel, "%s", message);
+
+ if (loglevel < CUPSD_LOG_DEBUG)
+ {
+ strlcpy(job->printer->state_message, message,
+ sizeof(job->printer->state_message));
+ cupsdAddPrinterHistory(job->printer);
- if (loglevel != CUPSD_LOG_NOTICE)
- job->status_level = loglevel;
+ event |= CUPSD_EVENT_PRINTER_STATE;
- strlcpy(job->printer->state_message, message,
- sizeof(job->printer->state_message));
- cupsdAddPrinterHistory(job->printer);
- event |= CUPSD_EVENT_PRINTER_STATE_CHANGED;
+ if (loglevel <= job->status_level)
+ {
+ /*
+ * Some messages show in the printer-state-message attribute...
+ */
- update_job_attrs(job);
+ if (loglevel != CUPSD_LOG_NOTICE)
+ job->status_level = loglevel;
+
+ update_job_attrs(job, 1);
+ }
+ }
}
if (!strchr(job->status_buffer->buffer, '\n'))
break;
}
- if ((event & CUPSD_EVENT_PRINTER_STATE_CHANGED))
- cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE_CHANGED, job->printer, NULL,
+ if (event & CUPSD_EVENT_PRINTER_STATE)
+ cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE, job->printer, NULL,
(job->printer->type & CUPS_PRINTER_CLASS) ?
"Class \"%s\" state changed." :
"Printer \"%s\" state changed.",
*/
void
-update_job_attrs(cupsd_job_t *job) /* I - Job to update */
+update_job_attrs(cupsd_job_t *job, /* I - Job to update */
+ int do_message)/* I - 1 = update job-printer-state message */
{
int i; /* Looping var */
int num_reasons; /* Actual number of reasons */
* Otherwise copy the printer-state-message value...
*/
- if (job->printer->state_message[0])
+ if (job->printer->state_message[0] &&
+ (do_message || !job->printer_message->values[0].string.text[0]))
cupsdSetString(&(job->printer_message->values[0].string.text),
job->printer->state_message);
/*
- * End of "$Id: job.c 7005 2007-10-01 23:45:48Z mike $".
+ * End of "$Id: job.c 7682 2008-06-21 00:06:02Z mike $".
*/