/*
- * "$Id: job.c 7902 2008-09-03 14:20:17Z mike $"
+ * "$Id$"
*
* Job management routines for the CUPS scheduler.
*
/* CONTENT_TYPE env variable */
device_uri[1024],
/* DEVICE_URI env variable */
- final_content_type[1024],
+ final_content_type[1024] = "",
/* FINAL_CONTENT_TYPE env variable */
lang[255], /* LANG env variable */
#ifdef __APPLE__
memset(job->filters, 0, sizeof(job->filters));
-
if (job->printer->raw)
{
/*
goto abort_job;
}
+ /*
+ * Figure out the final content type...
+ */
+
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "%d filters for job:",
+ cupsArrayCount(filters));
+ for (filter = (mime_filter_t *)cupsArrayFirst(filters);
+ filter;
+ filter = (mime_filter_t *)cupsArrayNext(filters))
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "%s (%s/%s to %s/%s, cost %d)",
+ filter->filter,
+ filter->src ? filter->src->super : "???",
+ filter->src ? filter->src->type : "???",
+ filter->dst ? filter->dst->super : "???",
+ filter->dst ? filter->dst->type : "???",
+ filter->cost);
+
+ if (!job->printer->remote)
+ {
+ for (filter = (mime_filter_t *)cupsArrayLast(filters);
+ filter && filter->dst;
+ filter = (mime_filter_t *)cupsArrayPrev(filters))
+ if (strcmp(filter->dst->super, "printer") ||
+ strcmp(filter->dst->type, job->printer->name))
+ break;
+
+ if (filter && filter->dst)
+ {
+ if ((ptr = strchr(filter->dst->type, '/')) != NULL)
+ snprintf(final_content_type, sizeof(final_content_type),
+ "FINAL_CONTENT_TYPE=%s", ptr + 1);
+ else
+ snprintf(final_content_type, sizeof(final_content_type),
+ "FINAL_CONTENT_TYPE=%s/%s", filter->dst->super,
+ filter->dst->type);
+ }
+ else
+ snprintf(final_content_type, sizeof(final_content_type),
+ "FINAL_CONTENT_TYPE=printer/%s", job->printer->name);
+ }
+
/*
* Remove NULL ("-") filters...
*/
envp[envc ++] = banner_page ? "CUPS_FILETYPE=job-sheet" :
"CUPS_FILETYPE=document";
- if (!job->printer->remote && !job->printer->raw)
- {
- filter = (mime_filter_t *)cupsArrayLast(filters);
-
- if (job->printer->port_monitor)
- filter = (mime_filter_t *)cupsArrayPrev(filters);
-
- if (filter && filter->dst)
- {
- if ((ptr = strchr(filter->dst->type, '/')) != NULL)
- snprintf(final_content_type, sizeof(final_content_type),
- "FINAL_CONTENT_TYPE=%s", ptr + 1);
- else
- 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 (final_content_type[0])
+ envp[envc ++] = final_content_type;
if (Classification && !banner_page)
{
* Now create processes for all of the filters...
*/
- cupsdSetPrinterReasons(job->printer, "-cups-missing-filter-warning,"
- "cups-insecure-filter-warning");
-
for (i = 0, slot = 0, filter = (mime_filter_t *)cupsArrayFirst(filters);
filter;
i ++, filter = (mime_filter_t *)cupsArrayNext(filters))
fileid);
}
+ if (compressions)
+ job->compressions = compressions;
+
+ if (filetypes)
+ job->filetypes = filetypes;
+
if (!compressions || !filetypes)
{
cupsdLogMessage(CUPSD_LOG_ERROR,
ippDelete(job->attrs);
job->attrs = NULL;
- if (compressions)
- free(compressions);
-
- if (filetypes)
- free(filetypes);
-
if (job->compressions)
{
free(job->compressions);
return (0);
}
- job->compressions = compressions;
- job->filetypes = filetypes;
- job->num_files = fileid;
+ job->num_files = fileid;
}
job->filetypes[fileid - 1] = mimeFileType(MimeDatabase, jobfile, NULL,
if (cupsFileGets(fp, line, sizeof(line)) &&
- !strcmp(line, "CUPSD-AUTH-V2"))
+ !strcmp(line, "CUPSD-AUTH-V3"))
{
i = 0;
while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum))
* Decode value...
*/
- bytes = sizeof(data);
- httpDecode64_2(data, &bytes, value);
+ if (strcmp(line, "negotiate") && strcmp(line, "uid"))
+ {
+ bytes = sizeof(data);
+ httpDecode64_2(data, &bytes, value);
+ }
/*
* Assign environment variables...
else if (!strcmp(line, "password"))
cupsdSetStringf(job->auth_env + i, "AUTH_PASSWORD=%s", data);
else if (!strcmp(line, "negotiate"))
- cupsdSetStringf(job->auth_env + i, "AUTH_NEGOTIATE=%s", data);
+ cupsdSetStringf(job->auth_env + i, "AUTH_NEGOTIATE=%s", value);
else
continue;
}
if (!cupsdCloseCreatedConfFile(fp, filename))
+ {
+ /*
+ * Remove backup file and mark this job as clean...
+ */
+
+ strlcat(filename, ".O", sizeof(filename));
+ unlink(filename);
+
job->dirty = 0;
+ }
}
job_state = IPP_JOB_COMPLETED;
message = "Job completed.";
- ippSetString(job->attrs, &job->reasons, 0,
- "job-completed-successfully");
+ if (!job->status)
+ ippSetString(job->attrs, &job->reasons, 0,
+ "job-completed-successfully");
break;
case IPP_JOB_STOPPED :
* Hold the job...
*/
- cupsdSetJobHoldUntil(job, "indefinite", 1);
- ippSetString(job->attrs, &job->reasons, 0,
- "job-hold-until-specified");
+ const char *reason = ippGetString(job->reasons, 0, NULL);
- job_state = IPP_JOB_HELD;
- message = "Job held indefinitely due to backend errors; please "
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "job-state-reasons=\"%s\"",
+ reason);
+
+ if (!reason || strncmp(reason, "account-", 8))
+ {
+ cupsdSetJobHoldUntil(job, "indefinite", 1);
+
+ ippSetString(job->attrs, &job->reasons, 0,
+ "job-hold-until-specified");
+ message = "Job held indefinitely due to backend errors; please "
"consult the error_log file for details.";
+ }
+ else if (!strcmp(reason, "account-info-needed"))
+ {
+ cupsdSetJobHoldUntil(job, "indefinite", 0);
+
+ message = "Job held indefinitely - account information is "
+ "required.";
+ }
+ else if (!strcmp(reason, "account-closed"))
+ {
+ cupsdSetJobHoldUntil(job, "indefinite", 0);
+
+ message = "Job held indefinitely - account has been closed.";
+ }
+ else if (!strcmp(reason, "account-limit-reached"))
+ {
+ cupsdSetJobHoldUntil(job, "indefinite", 0);
+
+ message = "Job held indefinitely - account limit has been "
+ "reached.";
+ }
+ else
+ {
+ cupsdSetJobHoldUntil(job, "indefinite", 0);
+
+ message = "Job held indefinitely - account authorization failed.";
+ }
+
+ job_state = IPP_JOB_HELD;
}
break;
line, linenum);
}
+ if (job)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Missing </Job> directive on line %d.", linenum);
+ cupsdDeleteJob(job, CUPSD_JOB_PURGE);
+ }
+
cupsFileClose(fp);
}
{
snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot,
job->id, i);
- if (Classification)
- cupsdRemoveFile(filename);
- else
- unlink(filename);
+ cupsdUnlinkOrRemoveFile(filename);
}
free(job->filetypes);
snprintf(filename, sizeof(filename), "%s/c%05d", RequestRoot,
job->id);
- if (Classification)
- cupsdRemoveFile(filename);
- else
- unlink(filename);
+ cupsdUnlinkOrRemoveFile(filename);
LastEvent |= CUPSD_EVENT_PRINTER_STATE_CHANGED;
}
start_job(cupsd_job_t *job, /* I - Job ID */
cupsd_printer_t *printer) /* I - Printer to print job */
{
+ const char *filename; /* Support filename */
+
+
cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_job(job=%p(%d), printer=%p(%s))",
job, job->id, printer, printer->name);
else
job->cancel_time = 0;
+ /*
+ * Check for support files...
+ */
+
+ cupsdSetPrinterReasons(job->printer, "-cups-missing-filter-warning,"
+ "cups-insecure-filter-warning");
+
+ if (printer->pc)
+ {
+ for (filename = (const char *)cupsArrayFirst(printer->pc->support_files);
+ filename;
+ filename = (const char *)cupsArrayNext(printer->pc->support_files))
+ {
+ if (_cupsFileCheck(filename, _CUPS_FILE_CHECK_FILE, !RunUser,
+ cupsdLogFCMessage, printer))
+ break;
+ }
+ }
+
/*
* Setup the last exit status and security profiles...
*/
/*
- * End of "$Id: job.c 7902 2008-09-03 14:20:17Z mike $".
+ * End of "$Id$".
*/