]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - systemv/lp.c
Full sweep of all Clang warnings, plus some bug fixes for incorrect memcpy usage.
[thirdparty/cups.git] / systemv / lp.c
index 13acd16761a1e1daba02410abfd0498d60e6ea4a..9e895d4d6400be9518625da5a37027ae1db91ed7 100644 (file)
@@ -1,66 +1,32 @@
 /*
- * "$Id: lp.c 4906 2006-01-10 20:53:28Z mike $"
+ * "$Id$"
  *
- *   "lp" command for the Common UNIX Printing System (CUPS).
+ * "lp" command for CUPS.
  *
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Easy Software Products and are protected by Federal
- *   copyright law.  Distribution and use rights are outlined in the file
- *   "LICENSE.txt" which should have been included with this file.  If this
- *   file is missing or damaged please contact Easy Software Products
- *   at:
- *
- *       Attn: CUPS Licensing Information
- *       Easy Software Products
- *       44141 Airport View Drive, Suite 204
- *       Hollywood, Maryland 20636 USA
- *
- *       Voice: (301) 373-9600
- *       EMail: cups-info@cups.org
- *         WWW: http://www.cups.org
- *
- * Contents:
- *
- *   main()          - Parse options and send files for printing.
- *   restart_job()   - Restart a job.
- *   set_job_attrs() - Set job attributes.
- *   sighandler()    - Signal catcher for when we print from stdin...
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
  * Include necessary headers...
  */
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <cups/string.h>
-#include <cups/cups.h>
-#include <cups/i18n.h>
-
-
-#ifndef WIN32
-#  include <unistd.h>
-#  include <signal.h>
+#include <cups/cups-private.h>
 
 
 /*
  * Local functions.
  */
 
-void   sighandler(int);
-#endif /* !WIN32 */
-int    restart_job(int job_id);
-int    set_job_attrs(int job_id, int num_options, cups_option_t *options);
-
-
-/*
- * Globals...
- */
-
-char   tempfile[1024];         /* Temporary file for printing from stdin */
+int    restart_job(const char *command, int job_id);
+int    set_job_attrs(const char *command, int job_id, int num_options,
+                     cups_option_t *options);
 
 
 /*
@@ -74,25 +40,19 @@ main(int  argc,                             /* I - Number of command-line arguments */
   int          i, j;                   /* Looping vars */
   int          job_id;                 /* Job ID */
   char         *printer,               /* Printer name */
-               *instance,              /* Instance name */ 
+               *instance,              /* Instance name */
                *val,                   /* Option value */
                *title;                 /* Job title */
   int          priority;               /* Job priority (1-100) */
   int          num_copies;             /* Number of copies per file */
   int          num_files;              /* Number of files to print */
   const char   *files[1000];           /* Files to print */
-  int          num_dests;              /* Number of destinations */
-  cups_dest_t  *dests,                 /* Destinations */
-               *dest;                  /* Selected destination */
+  cups_dest_t  *dest;                  /* Selected destination */
   int          num_options;            /* Number of options */
   cups_option_t        *options;               /* Options */
+  int          end_options;            /* No more options? */
   int          silent;                 /* Silent or verbose output? */
   char         buffer[8192];           /* Copy buffer */
-  int          temp;                   /* Temporary file descriptor */
-#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
-  struct sigaction action;             /* Signal action */
-  struct sigaction oldaction;          /* Old signal action */
-#endif /* HAVE_SIGACTION && !HAVE_SIGSET*/
 
 
 #ifdef __sun
@@ -113,30 +73,49 @@ main(int  argc,                            /* I - Number of command-line arguments */
     return (0);
 #endif /* __sun */
 
+  _cupsSetLocale(argv);
+
   silent      = 0;
   printer     = NULL;
-  num_dests   = 0;
-  dests       = NULL;
+  dest        = NULL;
   num_options = 0;
   options     = NULL;
   num_files   = 0;
   title       = NULL;
   job_id      = 0;
+  end_options = 0;
 
   for (i = 1; i < argc; i ++)
-    if (argv[i][0] == '-' && argv[i][1])
+    if (argv[i][0] == '-' && argv[i][1] && !end_options)
       switch (argv[i][1])
       {
         case 'E' : /* Encrypt */
 #ifdef HAVE_SSL
            cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
 #else
-            _cupsLangPrintf(stderr, NULL,
-                           _("%s: Sorry, no encryption support compiled in!\n"),
+            _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."),
                            argv[0]);
 #endif /* HAVE_SSL */
            break;
 
+        case 'U' : /* Username */
+           if (argv[i][2] != '\0')
+             cupsSetUser(argv[i] + 2);
+           else
+           {
+             i ++;
+             if (i >= argc)
+             {
+               _cupsLangPrintf(stderr,
+                               _("%s: Error - expected username after \"-U\" "
+                                 "option."), argv[0]);
+               return (1);
+             }
+
+              cupsSetUser(argv[i]);
+           }
+           break;
+
         case 'c' : /* Copy to spool dir (always enabled) */
            break;
 
@@ -149,8 +128,9 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
              if (i >= argc)
              {
-               _cupsLangPuts(stderr, NULL,
-                             _("lp: Expected destination after -d option!\n"));
+               _cupsLangPrintf(stderr,
+                               _("%s: Error - expected destination after "
+                                 "\"-d\" option."), argv[0]);
                return (1);
               }
 
@@ -160,17 +140,24 @@ main(int  argc,                           /* I - Number of command-line arguments */
             if ((instance = strrchr(printer, '/')) != NULL)
              *instance++ = '\0';
 
-           if (num_dests == 0)
-             num_dests = cupsGetDests(&dests);
-
-            if ((dest = cupsGetDest(printer, instance, num_dests, dests)) != NULL)
+            if ((dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, printer,
+                                         instance)) != NULL)
            {
              for (j = 0; j < dest->num_options; j ++)
-               if (cupsGetOption(dest->options[j].name, num_options, options) == NULL)
+               if (cupsGetOption(dest->options[j].name, num_options,
+                                 options) == NULL)
                  num_options = cupsAddOption(dest->options[j].name,
                                              dest->options[j].value,
                                              num_options, &options);
            }
+           else if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+                    cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
+           {
+             _cupsLangPrintf(stderr,
+                             _("%s: Error - add '/version=1.1' to server "
+                               "name."), argv[0]);
+             return (1);
+           }
            break;
 
         case 'f' : /* Form */
@@ -180,13 +167,16 @@ main(int  argc,                           /* I - Number of command-line arguments */
 
              if (i >= argc)
              {
-               _cupsLangPuts(stderr, NULL,
-                             _("lp: Expected form after -f option!\n"));
+               _cupsLangPrintf(stderr,
+                               _("%s: Error - expected form after \"-f\" "
+                                 "option."),
+                               argv[0]);
                return (1);
               }
            }
 
-           fputs("lp: Warning - form option ignored!\n", stderr);
+           _cupsLangPrintf(stderr, _("%s: Warning - form option ignored."),
+                           argv[0]);
            break;
 
         case 'h' : /* Destination host */
@@ -198,8 +188,9 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
              if (i >= argc)
              {
-               _cupsLangPuts(stderr, NULL,
-                             _("lp: Expected hostname after -h option!\n"));
+               _cupsLangPrintf(stderr,
+                               _("%s: Error - expected hostname after "
+                                 "\"-h\" option."), argv[0]);
                return (1);
               }
 
@@ -216,8 +207,9 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
              if (i >= argc)
              {
-               _cupsLangPuts(stderr, NULL,
-                             _("lp: Expected job ID after -i option!\n"));
+               _cupsLangPrintf(stderr,
+                               _("%s: Expected job ID after \"-i\" option."),
+                               argv[0]);
                return (1);
               }
 
@@ -226,9 +218,9 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
             if (num_files > 0)
            {
-             _cupsLangPuts(stderr, NULL,
-                             _("lp: Error - cannot print files and alter "
-                               "jobs simultaneously!\n"));
+             _cupsLangPrintf(stderr,
+                             _("%s: Error - cannot print files and alter "
+                               "jobs simultaneously."), argv[0]);
              return (1);
            }
 
@@ -239,7 +231,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
             if (job_id < 0)
            {
-             _cupsLangPuts(stderr, NULL, _("lp: Error - bad job ID!\n"));
+             _cupsLangPrintf(stderr, _("%s: Error - bad job ID."), argv[0]);
              break;
            }
            break;
@@ -249,6 +241,17 @@ main(int  argc,                            /* I - Number of command-line arguments */
        case 'p' : /* Notify on completion */
 #endif /* __sun */
        case 'w' : /* Write to console or email */
+           {
+             char      email[1024];    /* EMail address */
+
+
+             snprintf(email, sizeof(email), "mailto:%s@%s", cupsUser(),
+                      httpGetHostname(NULL, buffer, sizeof(buffer)));
+             num_options = cupsAddOption("notify-recipient-uri", email,
+                                         num_options, &options);
+           }
+
+           silent = 1;
            break;
 
        case 'n' : /* Number of copies */
@@ -260,8 +263,9 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
              if (i >= argc)
              {
-               _cupsLangPuts(stderr, NULL,
-                             _("lp: Expected copies after -n option!\n"));
+               _cupsLangPrintf(stderr,
+                               _("%s: Error - expected copies after "
+                                 "\"-n\" option."), argv[0]);
                return (1);
               }
 
@@ -269,20 +273,23 @@ main(int  argc,                           /* I - Number of command-line arguments */
            }
 
             sprintf(buffer, "%d", num_copies);
-            num_options = cupsAddOption("copies", buffer, num_options, &options);
+            num_options = cupsAddOption("copies", buffer, num_options,
+                                       &options);
            break;
 
        case 'o' : /* Option */
            if (argv[i][2] != '\0')
-             num_options = cupsParseOptions(argv[i] + 2, num_options, &options);
+             num_options = cupsParseOptions(argv[i] + 2, num_options,
+                                            &options);
            else
            {
              i ++;
 
              if (i >= argc)
              {
-               _cupsLangPuts(stderr, NULL,
-                             _("lp: Expected option string after -o option!\n"));
+               _cupsLangPrintf(stderr,
+                               _("%s: Error - expected option=value after "
+                                 "\"-o\" option."), argv[0]);
                return (1);
               }
 
@@ -300,9 +307,9 @@ main(int  argc,                             /* I - Number of command-line arguments */
            {
              if ((i + 1) >= argc)
              {
-               _cupsLangPrintf(stderr, NULL,
-                               _("lp: Expected priority after -%c option!\n"),
-                               argv[i][1]);
+               _cupsLangPrintf(stderr,
+                               _("%s: Error - expected priority after "
+                                 "\"-%c\" option."), argv[0], argv[i][1]);
                return (1);
               }
 
@@ -322,13 +329,15 @@ main(int  argc,                           /* I - Number of command-line arguments */
 
            if (priority < 1 || priority > 100)
            {
-             _cupsLangPuts(stderr, NULL,
-                           _("lp: Priority must be between 1 and 100.\n"));
+             _cupsLangPrintf(stderr,
+                             _("%s: Error - priority must be between 1 and "
+                               "100."), argv[0]);
              return (1);
            }
 
             sprintf(buffer, "%d", priority);
-            num_options = cupsAddOption("job-priority", buffer, num_options, &options);
+            num_options = cupsAddOption("job-priority", buffer, num_options,
+                                       &options);
            break;
 
        case 's' : /* Silent */
@@ -344,8 +353,9 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
              if (i >= argc)
              {
-               _cupsLangPuts(stderr, NULL,
-                             _("lp: Expected title after -t option!\n"));
+               _cupsLangPrintf(stderr,
+                               _("%s: Error - expected title after "
+                                 "\"-t\" option."), argv[0]);
                return (1);
               }
 
@@ -360,14 +370,15 @@ main(int  argc,                           /* I - Number of command-line arguments */
 
              if (i >= argc)
              {
-               _cupsLangPuts(stderr, NULL,
-                             _("lp: Expected mode list after -y option!\n"));
+               _cupsLangPrintf(stderr,
+                               _("%s: Error - expected mode list after "
+                                 "\"-y\" option."), argv[0]);
                return (1);
               }
            }
 
-           _cupsLangPuts(stderr, NULL,
-                         _("lp: Warning - mode option ignored!\n"));
+           _cupsLangPrintf(stderr,
+                           _("%s: Warning - mode option ignored."), argv[0]);
            break;
 
         case 'H' : /* Hold job */
@@ -379,8 +390,9 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
              if (i >= argc)
              {
-               _cupsLangPuts(stderr, NULL,
-                             _("lp: Expected hold name after -H option!\n"));
+               _cupsLangPrintf(stderr,
+                               _("%s: Error - expected hold name after "
+                                 "\"-H\" option."), argv[0]);
                return (1);
               }
 
@@ -395,18 +407,23 @@ main(int  argc,                           /* I - Number of command-line arguments */
               num_options = cupsAddOption("job-hold-until", "no-hold",
                                          num_options, &options);
            else if (!strcmp(val, "immediate"))
+           {
+              num_options = cupsAddOption("job-hold-until", "no-hold",
+                                         num_options, &options);
               num_options = cupsAddOption("job-priority", "100",
                                          num_options, &options);
+           }
            else if (!strcmp(val, "restart"))
            {
              if (job_id < 1)
              {
-               _cupsLangPuts(stderr, NULL,
-                             _("lp: Need job ID (-i) before \"-H restart\"!\n"));
+               _cupsLangPrintf(stderr,
+                               _("%s: Need job ID (\"-i jobid\") before "
+                                 "\"-H restart\"."), argv[0]);
                return (1);
              }
 
-             if (restart_job(job_id))
+             if (restart_job(argv[0], job_id))
                return (1);
            }
            else
@@ -423,8 +440,9 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
              if (i >= argc)
              {
-               _cupsLangPuts(stderr, NULL,
-                             _("lp: Expected page list after -P option!\n"));
+               _cupsLangPrintf(stderr,
+                               _("%s: Error - expected page list after "
+                                 "\"-P\" option."), argv[0]);
                return (1);
               }
 
@@ -442,14 +460,16 @@ main(int  argc,                           /* I - Number of command-line arguments */
 
              if (i >= argc)
              {
-               _cupsLangPuts(stderr, NULL,
-                             _("lp: Expected character set after -S option!\n"));
+               _cupsLangPrintf(stderr,
+                               _("%s: Error - expected character set after "
+                                 "\"-S\" option."), argv[0]);
                return (1);
               }
            }
 
-           _cupsLangPuts(stderr, NULL,
-                         _("lp: Warning - character set option ignored!\n"));
+           _cupsLangPrintf(stderr,
+                           _("%s: Warning - character set option ignored."),
+                           argv[0]);
            break;
 
         case 'T' : /* Content-Type */
@@ -459,28 +479,41 @@ main(int  argc,                           /* I - Number of command-line arguments */
 
              if (i >= argc)
              {
-               _cupsLangPuts(stderr, NULL,
-                             _("lp: Expected content type after -T option!\n"));
+               _cupsLangPrintf(stderr,
+                               _("%s: Error - expected content type after "
+                                 "\"-T\" option."), argv[0]);
                return (1);
               }
            }
 
-           _cupsLangPuts(stderr, NULL,
-                         _("lp: Warning - content type option ignored!\n"));
+           _cupsLangPrintf(stderr,
+                           _("%s: Warning - content type option ignored."),
+                           argv[0]);
+           break;
+
+        case '-' : /* Stop processing options */
+            if (argv[i][2])
+            {
+             _cupsLangPrintf(stderr, _("%s: Error - unknown option \"%s\"."),
+                             argv[0], argv[i]);
+             return (1);
+           }
+
+           end_options = 1;
            break;
 
        default :
-           _cupsLangPrintf(stderr, NULL, _("lp: Unknown option \'%c\'!\n"),
-                           argv[i][1]);
+           _cupsLangPrintf(stderr, _("%s: Error - unknown option \"%c\"."),
+                           argv[0], argv[i][1]);
            return (1);
       }
     else if (!strcmp(argv[i], "-"))
     {
       if (num_files || job_id)
       {
-        _cupsLangPuts(stderr, NULL,
-                     _("lp: Error - cannot print from stdin if files or a "
-                       "job ID are provided!\n"));
+        _cupsLangPrintf(stderr,
+                       _("%s: Error - cannot print from stdin if files or a "
+                         "job ID are provided."), argv[0]);
        return (1);
       }
 
@@ -494,8 +527,8 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
       if (access(argv[i], R_OK) != 0)
       {
-        _cupsLangPrintf(stderr, NULL, _("lp: Unable to access \"%s\" - %s\n"),
-                       argv[i], strerror(errno));
+        _cupsLangPrintf(stderr, _("%s: Error - unable to access \"%s\" - %s"),
+                       argv[0], argv[i], strerror(errno));
         return (1);
       }
 
@@ -511,15 +544,15 @@ main(int  argc,                           /* I - Number of command-line arguments */
       }
     }
     else
-      _cupsLangPrintf(stderr, NULL, _("lp: Too many files - \"%s\"\n"),
-                      argv[i]);
+      _cupsLangPrintf(stderr, _("%s: Error - too many files - \"%s\"."),
+                      argv[0], argv[i]);
 
  /*
   * See if we are altering an existing job...
   */
 
   if (job_id)
-    return (set_job_attrs(job_id, num_options, options));
+    return (set_job_attrs(argv[0], job_id, num_options, options));
 
  /*
   * See if we have any files to print; if not, print from stdin...
@@ -527,10 +560,7 @@ main(int  argc,                            /* I - Number of command-line arguments */
 
   if (printer == NULL)
   {
-    if (num_dests == 0)
-      num_dests = cupsGetDests(&dests);
-
-    if ((dest = cupsGetDest(NULL, NULL, num_dests, dests)) != NULL)
+    if ((dest = cupsGetNamedDest(NULL, NULL, NULL)) != NULL)
     {
       printer = dest->name;
 
@@ -540,6 +570,14 @@ main(int  argc,                            /* I - Number of command-line arguments */
                                      dest->options[j].value,
                                      num_options, &options);
     }
+    else if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+            cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
+    {
+      _cupsLangPrintf(stderr,
+                     _("%s: Error - add '/version=1.1' to server "
+                       "name."), argv[0]);
+      return (1);
+    }
   }
 
   if (printer == NULL)
@@ -559,101 +597,69 @@ main(int  argc,                          /* I - Number of command-line arguments */
     else
       val = "LPDEST";
 
-    if (printer && !cupsGetDest(printer, NULL, num_dests, dests))
-      _cupsLangPrintf(stderr, NULL,
-                     _("lp: error - %s environment variable names "
-                       "non-existent destination \"%s\"!\n"),
-                     val, printer);
+    if (printer && !cupsGetNamedDest(NULL, printer, NULL))
+      _cupsLangPrintf(stderr,
+                     _("%s: Error - %s environment variable names "
+                       "non-existent destination \"%s\"."), argv[0], val,
+                     printer);
     else if (cupsLastError() == IPP_NOT_FOUND)
-      _cupsLangPuts(stderr, NULL,
-                   _("lp: error - no default destination available.\n"));
+      _cupsLangPrintf(stderr,
+                     _("%s: Error - no default destination available."),
+                     argv[0]);
     else
-      _cupsLangPuts(stderr, NULL,
-                   _("lp: error - scheduler not responding!\n"));
+      _cupsLangPrintf(stderr, _("%s: Error - scheduler not responding."),
+                     argv[0]);
 
     return (1);
   }
 
   if (num_files > 0)
     job_id = cupsPrintFiles(printer, num_files, files, title, num_options, options);
-  else
+  else if ((job_id = cupsCreateJob(CUPS_HTTP_DEFAULT, printer,
+                                   title ? title : "(stdin)",
+                                   num_options, options)) > 0)
   {
-    num_files = 1;
-
-#ifndef WIN32
-#  if defined(HAVE_SIGSET)
-    sigset(SIGHUP, sighandler);
-    if (sigset(SIGINT, sighandler) == SIG_IGN)
-      sigset(SIGINT, SIG_IGN);
-    sigset(SIGTERM, sighandler);
-#  elif defined(HAVE_SIGACTION)
-    memset(&action, 0, sizeof(action));
-    action.sa_handler = sighandler;
-
-    sigaction(SIGHUP, &action, NULL);
-    sigaction(SIGINT, NULL, &oldaction);
-    if (oldaction.sa_handler != SIG_IGN)
-      sigaction(SIGINT, &action, NULL);
-    sigaction(SIGTERM, &action, NULL);
-#  else
-    signal(SIGHUP, sighandler);
-    if (signal(SIGINT, sighandler) == SIG_IGN)
-      signal(SIGINT, SIG_IGN);
-    signal(SIGTERM, sighandler);
-#  endif
-#endif /* !WIN32 */
-
-    temp = cupsTempFd(tempfile, sizeof(tempfile));
-
-    if (temp < 0)
-    {
-      _cupsLangPrintf(stderr, NULL,
-                     _("lp: unable to create temporary file \"%s\" - %s\n"),
-                     tempfile, strerror(errno));
-      return (1);
-    }
+    http_status_t      status;         /* Write status */
+    const char         *format;        /* Document format */
+    ssize_t            bytes;          /* Bytes read */
 
-    while ((i = read(0, buffer, sizeof(buffer))) > 0)
-      if (write(temp, buffer, i) < 0)
-      {
-       _cupsLangPrintf(stderr, NULL,
-                       _("lp: error - unable to write to temporary file "
-                         "\"%s\" - %s\n"),
-                       tempfile, strerror(errno));
-        close(temp);
-        unlink(tempfile);
-       return (1);
-      }
+    if (cupsGetOption("raw", num_options, options))
+      format = CUPS_FORMAT_RAW;
+    else if ((format = cupsGetOption("document-format", num_options,
+                                     options)) == NULL)
+      format = CUPS_FORMAT_AUTO;
+
+    status = cupsStartDocument(CUPS_HTTP_DEFAULT, printer, job_id, NULL,
+                               format, 1);
 
-    i = lseek(temp, 0, SEEK_CUR);
-    close(temp);
+    while (status == HTTP_CONTINUE &&
+           (bytes = read(0, buffer, sizeof(buffer))) > 0)
+      status = cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer, (size_t)bytes);
 
-    if (i == 0)
+    if (status != HTTP_CONTINUE)
     {
-      _cupsLangPuts(stderr, NULL,
-                   _("lp: stdin is empty, so no job has been sent.\n"));
-      unlink(tempfile);
+      _cupsLangPrintf(stderr, _("%s: Error - unable to queue from stdin - %s."),
+                     argv[0], httpStatus(status));
+      cupsFinishDocument(CUPS_HTTP_DEFAULT, printer);
+      cupsCancelJob2(CUPS_HTTP_DEFAULT, printer, job_id, 0);
       return (1);
     }
 
-    if (title)
-      job_id = cupsPrintFile(printer, tempfile, title, num_options, options);
-    else
-      job_id = cupsPrintFile(printer, tempfile, "(stdin)", num_options, options);
-
-    unlink(tempfile);
+    if (cupsFinishDocument(CUPS_HTTP_DEFAULT, printer) != IPP_OK)
+    {
+      _cupsLangPrintf(stderr, "%s: %s", argv[0], cupsLastErrorString());
+      cupsCancelJob2(CUPS_HTTP_DEFAULT, printer, job_id, 0);
+      return (1);
+    }
   }
 
   if (job_id < 1)
   {
-    _cupsLangPrintf(stderr, NULL,
-                   _("lp: unable to print file: %s\n"),
-                   ippErrorString(cupsLastError()));
+    _cupsLangPrintf(stderr, "%s: %s", argv[0], cupsLastErrorString());
     return (1);
   }
   else if (!silent)
-    _cupsLangPrintf(stdout, NULL,
-                   _("request id is %s-%d (%d file(s))\n"),
+    _cupsLangPrintf(stdout, _("request id is %s-%d (%d file(s))"),
                    printer, job_id, num_files);
 
   return (0);
@@ -665,28 +671,14 @@ main(int  argc,                           /* I - Number of command-line arguments */
  */
 
 int                                    /* O - Exit status */
-restart_job(int job_id)                        /* I - Job ID */
+restart_job(const char *command,       /* I - Command name */
+            int        job_id)         /* I - Job ID */
 {
-  http_t       *http;                  /* HTTP connection to server */
-  ipp_t                *request,               /* IPP request */
-               *response;              /* IPP response */
-  cups_lang_t  *language;              /* Language for request */
+  ipp_t                *request;               /* IPP request */
   char         uri[HTTP_MAX_URI];      /* URI for job */
 
 
-  http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
-
-  language = cupsLangDefault();
-
-  request = ippNew();
-  request->request.op.operation_id = IPP_RESTART_JOB;
-  request->request.op.request_id   = 1;
-
-  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
-               "attributes-charset", NULL, cupsLangEncoding(language));
-
-  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
-               "attributes-natural-language", NULL, language->language);
+  request = ippNewRequest(IPP_RESTART_JOB);
 
   sprintf(uri, "ipp://localhost/jobs/%d", job_id);
 
@@ -696,22 +688,19 @@ restart_job(int job_id)                   /* I - Job ID */
   ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
                "requesting-user-name", NULL, cupsUser());
 
-  if ((response = cupsDoRequest(http, request, "/jobs")) != NULL)
-  {
-    if (response->request.status.status_code > IPP_OK_CONFLICT)
-    {
-      _cupsLangPrintf(stderr, NULL, _("lp: restart-job failed: %s\n"),
-                      ippErrorString(response->request.status.status_code));
-      ippDelete(response);
-      return (1);
-    }
+  ippDelete(cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/jobs"));
 
-    ippDelete(response);
+  if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+      cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
+  {
+    _cupsLangPrintf(stderr,
+                   _("%s: Error - add '/version=1.1' to server "
+                     "name."), command);
+    return (1);
   }
-  else
+  else if (cupsLastError() > IPP_OK_CONFLICT)
   {
-    _cupsLangPrintf(stderr, NULL, _("lp: restart-job failed: %s\n"),
-                   ippErrorString(cupsLastError()));
+    _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString());
     return (1);
   }
 
@@ -724,33 +713,19 @@ restart_job(int job_id)                   /* I - Job ID */
  */
 
 int                                    /* O - Exit status */
-set_job_attrs(int           job_id,    /* I - Job ID */
+set_job_attrs(const char    *command,  /* I - Command name */
+              int           job_id,    /* I - Job ID */
               int           num_options,/* I - Number of options */
              cups_option_t *options)   /* I - Options */
 {
-  http_t       *http;                  /* HTTP connection to server */
-  ipp_t                *request,               /* IPP request */
-               *response;              /* IPP response */
-  cups_lang_t  *language;              /* Language for request */
+  ipp_t                *request;               /* IPP request */
   char         uri[HTTP_MAX_URI];      /* URI for job */
 
 
   if (num_options == 0)
     return (0);
 
-  http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
-
-  language = cupsLangDefault();
-
-  request = ippNew();
-  request->request.op.operation_id = IPP_SET_JOB_ATTRIBUTES;
-  request->request.op.request_id   = 1;
-
-  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
-               "attributes-charset", NULL, cupsLangEncoding(language));
-
-  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
-               "attributes-natural-language", NULL, language->language);
+  request = ippNewRequest(IPP_SET_JOB_ATTRIBUTES);
 
   sprintf(uri, "ipp://localhost/jobs/%d", job_id);
 
@@ -762,22 +737,19 @@ set_job_attrs(int           job_id,       /* I - Job ID */
 
   cupsEncodeOptions(request, num_options, options);
 
-  if ((response = cupsDoRequest(http, request, "/jobs")) != NULL)
-  {
-    if (response->request.status.status_code > IPP_OK_CONFLICT)
-    {
-      _cupsLangPrintf(stderr, NULL, _("lp: set-job-attributes failed: %s\n"),
-                     ippErrorString(response->request.status.status_code));
-      ippDelete(response);
-      return (1);
-    }
+  ippDelete(cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/jobs"));
 
-    ippDelete(response);
+  if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+      cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
+  {
+    _cupsLangPrintf(stderr,
+                   _("%s: Error - add '/version=1.1' to server "
+                     "name."), command);
+    return (1);
   }
-  else
+  else if (cupsLastError() > IPP_OK_CONFLICT)
   {
-    _cupsLangPrintf(stderr, NULL, _("lp: set-job-attributes failed: %s\n"),
-                   ippErrorString(cupsLastError()));
+    _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString());
     return (1);
   }
 
@@ -785,29 +757,6 @@ set_job_attrs(int           job_id,        /* I - Job ID */
 }
 
 
-#ifndef WIN32
-/*
- * 'sighandler()' - Signal catcher for when we print from stdin...
- */
-
-void
-sighandler(int s)      /* I - Signal number */
-{
- /*
-  * Remove the temporary file we're using to print from stdin...
-  */
-
-  unlink(tempfile);
-
- /*
-  * Exit...
-  */
-
-  exit(s);
-}
-#endif /* !WIN32 */
-
-
 /*
- * End of "$Id: lp.c 4906 2006-01-10 20:53:28Z mike $".
+ * End of "$Id$".
  */