]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - scheduler/job.c
Fix build failures.
[thirdparty/cups.git] / scheduler / job.c
index bc2bd927a7856fbfd769e95edfbfc53605a77edd..d62fb2f407f146add938da5b896c75a79da230e6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: job.c 7902 2008-09-03 14:20:17Z mike $"
+ * "$Id$"
  *
  *   Job management routines for the CUPS scheduler.
  *
@@ -560,7 +560,7 @@ cupsdContinueJob(cupsd_job_t *job)  /* I - Job */
                                        /* 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__
@@ -598,7 +598,6 @@ cupsdContinueJob(cupsd_job_t *job)  /* I - Job */
 
   memset(job->filters, 0, sizeof(job->filters));
 
-
   if (job->printer->raw)
   {
    /*
@@ -636,6 +635,47 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */
       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...
     */
@@ -1034,25 +1074,8 @@ cupsdContinueJob(cupsd_job_t *job)       /* I - Job */
   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)
   {
@@ -1111,9 +1134,6 @@ cupsdContinueJob(cupsd_job_t *job)        /* I - Job */
   * 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))
@@ -1872,6 +1892,12 @@ cupsdLoadJob(cupsd_job_t *job)           /* I - Job */
                                                 fileid);
         }
 
+       if (compressions)
+         job->compressions = compressions;
+
+       if (filetypes)
+         job->filetypes = filetypes;
+
         if (!compressions || !filetypes)
        {
           cupsdLogMessage(CUPSD_LOG_ERROR,
@@ -1881,12 +1907,6 @@ cupsdLoadJob(cupsd_job_t *job)           /* I - Job */
          ippDelete(job->attrs);
          job->attrs = NULL;
 
-         if (compressions)
-           free(compressions);
-
-         if (filetypes)
-           free(filetypes);
-
          if (job->compressions)
          {
            free(job->compressions);
@@ -1903,9 +1923,7 @@ cupsdLoadJob(cupsd_job_t *job)            /* I - Job */
          return (0);
        }
 
-        job->compressions = compressions;
-        job->filetypes    = filetypes;
-       job->num_files    = fileid;
+       job->num_files = fileid;
       }
 
       job->filetypes[fileid - 1] = mimeFileType(MimeDatabase, jobfile, NULL,
@@ -1941,7 +1959,7 @@ cupsdLoadJob(cupsd_job_t *job)            /* I - Job */
 
 
       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))
@@ -1950,8 +1968,11 @@ cupsdLoadJob(cupsd_job_t *job)           /* I - Job */
           * 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...
@@ -1972,7 +1993,7 @@ cupsdLoadJob(cupsd_job_t *job)            /* I - Job */
          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;
 
@@ -2196,7 +2217,16 @@ cupsdSaveJob(cupsd_job_t *job)           /* I - Job */
   }
 
   if (!cupsdCloseCreatedConfFile(fp, filename))
+  {
+   /*
+    * Remove backup file and mark this job as clean...
+    */
+
+    strlcat(filename, ".O", sizeof(filename));
+    unlink(filename);
+
     job->dirty = 0;
+  }
 }
 
 
@@ -3036,8 +3066,9 @@ finalize_job(cupsd_job_t *job,            /* I - Job */
        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 :
@@ -3223,13 +3254,48 @@ finalize_job(cupsd_job_t *job,          /* I - Job */
            * 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;
 
@@ -4154,6 +4220,13 @@ load_job_cache(const char *filename)     /* I - job.cache filename */
                       line, linenum);
   }
 
+  if (job)
+  {
+    cupsdLogMessage(CUPSD_LOG_ERROR,
+                   "Missing </Job> directive on line %d.", linenum);
+    cupsdDeleteJob(job, CUPSD_JOB_PURGE);
+  }
+
   cupsFileClose(fp);
 }
 
@@ -4315,10 +4388,7 @@ remove_job_files(cupsd_job_t *job)       /* I - Job */
   {
     snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot,
             job->id, i);
-    if (Classification)
-      cupsdRemoveFile(filename);
-    else
-      unlink(filename);
+    cupsdUnlinkOrRemoveFile(filename);
   }
 
   free(job->filetypes);
@@ -4349,10 +4419,7 @@ remove_job_history(cupsd_job_t *job)     /* I - Job */
 
   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;
 }
@@ -4412,6 +4479,9 @@ static void
 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);
 
@@ -4465,6 +4535,25 @@ start_job(cupsd_job_t     *job,          /* I - Job ID */
   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...
   */
@@ -5114,5 +5203,5 @@ update_job_attrs(cupsd_job_t *job,        /* I - Job to update */
 
 
 /*
- * End of "$Id: job.c 7902 2008-09-03 14:20:17Z mike $".
+ * End of "$Id$".
  */